From c20a2d5db7730344b7d7f0155c8461c501cdd287 Mon Sep 17 00:00:00 2001
From: yihong <zouzou0208@gmail.com>
Date: Sun, 12 Jan 2020 14:13:10 +0800
Subject: [PATCH 01/47] add thrid party login -- GitHub and LinkedIn (#496)

---
 README.md              |  4 +--
 docs/README_zh-CN.md   |  2 --
 package.json           |  8 +----
 src/extension.ts       |  1 -
 src/leetCodeManager.ts | 72 +++++++++++++++++++++++++++++++++---------
 src/shared.ts          |  7 ++++
 6 files changed, 66 insertions(+), 28 deletions(-)

diff --git a/README.md b/README.md
index b8aac1e3..1d8d21f3 100644
--- a/README.md
+++ b/README.md
@@ -51,11 +51,9 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 
 - Simply click `Sign in to LeetCode` in the `LeetCode Explorer` will let you **sign in** with your LeetCode account.
 
-- You can also use the following command to sign in/sign in (by cookie)/out:
+- You can also use the following command to sign in/out:
   - **LeetCode: Sign in**
-  - **LeetCode: Sign in (by cookie)**
   - **LeetCode: Sign out**
-
 ---
 
 ### Switch Endpoint
diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md
index 81c98fe7..23faf30c 100644
--- a/docs/README_zh-CN.md
+++ b/docs/README_zh-CN.md
@@ -53,9 +53,7 @@
 
 - 你也可以使用下来命令登入或利用cookie登入或登出:
   - **LeetCode: Sign in**
-  - **LeetCode: Sign in (by cookie)**
   - **LeetCode: Sign out**
-
 ---
 
 ### 切换 LeetCode 版本
diff --git a/package.json b/package.json
index 23ab4685..743b2803 100644
--- a/package.json
+++ b/package.json
@@ -38,17 +38,11 @@
         "onCommand:leetcode.testSolution",
         "onCommand:leetcode.submitSolution",
         "onCommand:leetcode.switchDefaultLanguage",
-        "onCommand:leetcode.signinByCookie",
         "onView:leetCodeExplorer"
     ],
     "main": "./out/src/extension",
     "contributes": {
         "commands": [
-            {
-                "command": "leetcode.signinByCookie",
-                "title": "Sign In by Cookie",
-                "category": "LeetCode"
-            },
             {
                 "command": "leetcode.deleteCache",
                 "title": "Delete Cache",
@@ -689,6 +683,6 @@
         "markdown-it": "^8.4.2",
         "require-from-string": "^2.0.2",
         "unescape-js": "^1.1.1",
-        "vsc-leetcode-cli": "2.6.19"
+        "vsc-leetcode-cli": "2.6.20"
     }
 }
diff --git a/src/extension.ts b/src/extension.ts
index 45de4a70..9bb3ad41 100644
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -51,7 +51,6 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
             vscode.commands.registerCommand("leetcode.deleteCache", () => cache.deleteCache()),
             vscode.commands.registerCommand("leetcode.toggleLeetCodeCn", () => plugin.switchEndpoint()),
             vscode.commands.registerCommand("leetcode.signin", () => leetCodeManager.signIn()),
-            vscode.commands.registerCommand("leetcode.signinByCookie", () => leetCodeManager.signIn(true)),
             vscode.commands.registerCommand("leetcode.signout", () => leetCodeManager.signOut()),
             vscode.commands.registerCommand("leetcode.manageSessions", () => session.manageSessions()),
             vscode.commands.registerCommand("leetcode.previewProblem", (node: LeetCodeNode) => show.previewProblem(node)),
diff --git a/src/leetCodeManager.ts b/src/leetCodeManager.ts
index 0b70080e..25439048 100644
--- a/src/leetCodeManager.ts
+++ b/src/leetCodeManager.ts
@@ -6,7 +6,7 @@ import { EventEmitter } from "events";
 import * as vscode from "vscode";
 import { leetCodeChannel } from "./leetCodeChannel";
 import { leetCodeExecutor } from "./leetCodeExecutor";
-import { UserStatus } from "./shared";
+import { IQuickItemEx, loginArgsMapping, UserStatus } from "./shared";
 import { createEnvOption } from "./utils/cpUtils";
 import { DialogType, promptForOpenOutputChannel } from "./utils/uiUtils";
 import * as wsl from "./utils/wslUtils";
@@ -34,14 +34,43 @@ class LeetCodeManager extends EventEmitter {
         }
     }
 
-    public async signIn(isByCookie: boolean = false): Promise<void> {
-        const loginArg: string = "-l";
-        const cookieArg: string = "-c";
-        const commandArg: string = isByCookie ? cookieArg : loginArg;
+    public async signIn(): Promise<void> {
+        const picks: Array<IQuickItemEx<string>> = [];
+        picks.push(
+            {
+                label: "LeetCode Account",
+                detail: "Use LeetCode account to login",
+                value: "LeetCode",
+            },
+            {
+                label: "LeetCode Cookie",
+                detail: "Use LeetCode cookie copied from browser to login",
+                value: "Cookie",
+            },
+            {
+                label: "Third-Party: GitHub",
+                detail: "Use GitHub account to login",
+                value: "GitHub",
+            },
+            {
+                label: "Third-Party: LinkedIn",
+                detail: "Use LinkedIn account to login",
+                value: "LinkedIn",
+            },
+        );
+        const choice: IQuickItemEx<string> | undefined = await vscode.window.showQuickPick(picks);
+        if (!choice) {
+            return;
+        }
+        const loginMethod: string = choice.value;
+        const commandArg: string | undefined = loginArgsMapping.get(loginMethod);
+        if (!commandArg) {
+            throw new Error(`The login method "${loginMethod}" is not supported.`);
+        }
+        const isByCookie: boolean = loginMethod === "Cookie";
         const inMessage: string = isByCookie ? "sign in by cookie" : "sign in";
         try {
             const userName: string | undefined = await new Promise(async (resolve: (res: string | undefined) => void, reject: (e: Error) => void): Promise<void> => {
-                let result: string = "";
 
                 const leetCodeBinaryPath: string = await leetCodeExecutor.getLeetCodeBinaryPath();
 
@@ -52,10 +81,27 @@ class LeetCodeManager extends EventEmitter {
                         env: createEnvOption(),
                     });
 
-                childProc.stdout.on("data", (data: string | Buffer) => {
+                childProc.stdout.on("data", async (data: string | Buffer) => {
                     data = data.toString();
-                    result = result.concat(data);
                     leetCodeChannel.append(data);
+                    if (data.includes("twoFactorCode")) {
+                        const twoFactor: string | undefined = await vscode.window.showInputBox({
+                            prompt: "Enter two-factor code.",
+                            validateInput: (s: string): string | undefined => s && s.trim() ? undefined : "The input must not be empty",
+                        });
+                        if (!twoFactor) {
+                            childProc.kill();
+                            return resolve(undefined);
+                        }
+                        childProc.stdin.write(`${twoFactor}\n`);
+                        childProc.stdin.end();
+                    } else {
+                        const match: RegExpMatchArray | null = data.match(/(?:.*)Successfully .*login as (.*)/i);
+                        if (match && match[1]) {
+                            childProc.stdin.end();
+                            return resolve(match[1]);
+                        }
+                    }
                 });
 
                 childProc.stderr.on("data", (data: string | Buffer) => leetCodeChannel.append(data.toString()));
@@ -80,13 +126,9 @@ class LeetCodeManager extends EventEmitter {
                     return resolve(undefined);
                 }
                 childProc.stdin.write(`${pwd}\n`);
-                childProc.stdin.end();
-                childProc.on("close", () => {
-                    const match: RegExpMatchArray | null = result.match(/(?:.*) Successfully (login|cookie login) as (.*)/i);
-                    if (match && match[2]) {
-                        resolve(match[2]);
-                    } else {
-                        reject(new Error(`Failed to ${inMessage}.`));
+                childProc.on("close", (code: number) => {
+                    if (code !== 0) {
+                        reject(new Error("Failed to login."));
                     }
                 });
             });
diff --git a/src/shared.ts b/src/shared.ts
index 78518454..5f1039e4 100644
--- a/src/shared.ts
+++ b/src/shared.ts
@@ -12,6 +12,13 @@ export enum UserStatus {
     SignedOut = 2,
 }
 
+export const loginArgsMapping: Map<string, string> = new Map([
+    ["LeetCode", "-l"],
+    ["Cookie", "-c"],
+    ["GitHub", "-g"],
+    ["LinkedIn", "-i"],
+]);
+
 export const languages: string[] = [
     "bash",
     "c",

From 9017eda6f6ee2476e0da9318b0485bb7f34f39b0 Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Sun, 12 Jan 2020 17:15:00 +0800
Subject: [PATCH 02/47] Refine the result parsing logic (#501)

---
 package-lock.json      | 18 +++++++++---------
 package.json           |  2 +-
 src/leetCodeManager.ts | 33 +++++++++++++++++----------------
 3 files changed, 27 insertions(+), 26 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 029e6498..4c5bf850 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -518,9 +518,9 @@
             "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
         },
         "escodegen": {
-            "version": "1.12.0",
-            "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz",
-            "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==",
+            "version": "1.12.1",
+            "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.1.tgz",
+            "integrity": "sha512-Q8t2YZ+0e0pc7NRVj3B4tSQ9rim1oi4Fh46k2xhJ2qOiEwhQfdjyEQddWdj7ZFaKmU+5104vn1qrcjEPWq+bgQ==",
             "optional": true,
             "requires": {
                 "esprima": "^3.1.3",
@@ -1284,9 +1284,9 @@
             "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg=="
         },
         "p-limit": {
-            "version": "2.2.1",
-            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
-            "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
+            "version": "2.2.2",
+            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
+            "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
             "requires": {
                 "p-try": "^2.0.0"
             }
@@ -1797,9 +1797,9 @@
             }
         },
         "vsc-leetcode-cli": {
-            "version": "2.6.19",
-            "resolved": "https://registry.npmjs.org/vsc-leetcode-cli/-/vsc-leetcode-cli-2.6.19.tgz",
-            "integrity": "sha512-xvfdNe98N/mPR7VLCg1z0J5pn6QBVfI9kPqxFt6tZEIQNMeHrPlG6L5JA0LDJNVSCDWOyDsT77w3spA533XFPg==",
+            "version": "2.6.22",
+            "resolved": "https://registry.npmjs.org/vsc-leetcode-cli/-/vsc-leetcode-cli-2.6.22.tgz",
+            "integrity": "sha512-/mKAQtwabtzZfbQlJO9k9qotx7qgtDFZnZ6TkO3NrfUyne2jTXLzDBN+/66fcXUyX5fpxKYBx81icChGRnT7CQ==",
             "requires": {
                 "ansi-styles": "3.2.1",
                 "cheerio": "0.20.0",
diff --git a/package.json b/package.json
index 743b2803..315f86eb 100644
--- a/package.json
+++ b/package.json
@@ -683,6 +683,6 @@
         "markdown-it": "^8.4.2",
         "require-from-string": "^2.0.2",
         "unescape-js": "^1.1.1",
-        "vsc-leetcode-cli": "2.6.20"
+        "vsc-leetcode-cli": "2.6.22"
     }
 }
diff --git a/src/leetCodeManager.ts b/src/leetCodeManager.ts
index 25439048..27a17103 100644
--- a/src/leetCodeManager.ts
+++ b/src/leetCodeManager.ts
@@ -14,6 +14,8 @@ import * as wsl from "./utils/wslUtils";
 class LeetCodeManager extends EventEmitter {
     private currentUser: string | undefined;
     private userStatus: UserStatus;
+    private readonly successRegex: RegExp = /(?:.*)Successfully .*login as (.*)/i;
+    private readonly failRegex: RegExp = /.*\[ERROR\].*/i;
 
     constructor() {
         super();
@@ -42,11 +44,6 @@ class LeetCodeManager extends EventEmitter {
                 detail: "Use LeetCode account to login",
                 value: "LeetCode",
             },
-            {
-                label: "LeetCode Cookie",
-                detail: "Use LeetCode cookie copied from browser to login",
-                value: "Cookie",
-            },
             {
                 label: "Third-Party: GitHub",
                 detail: "Use GitHub account to login",
@@ -57,6 +54,11 @@ class LeetCodeManager extends EventEmitter {
                 detail: "Use LinkedIn account to login",
                 value: "LinkedIn",
             },
+            {
+                label: "LeetCode Cookie",
+                detail: "Use LeetCode cookie copied from browser to login",
+                value: "Cookie",
+            },
         );
         const choice: IQuickItemEx<string> | undefined = await vscode.window.showQuickPick(picks);
         if (!choice) {
@@ -87,6 +89,7 @@ class LeetCodeManager extends EventEmitter {
                     if (data.includes("twoFactorCode")) {
                         const twoFactor: string | undefined = await vscode.window.showInputBox({
                             prompt: "Enter two-factor code.",
+                            ignoreFocusOut: true,
                             validateInput: (s: string): string | undefined => s && s.trim() ? undefined : "The input must not be empty",
                         });
                         if (!twoFactor) {
@@ -94,13 +97,14 @@ class LeetCodeManager extends EventEmitter {
                             return resolve(undefined);
                         }
                         childProc.stdin.write(`${twoFactor}\n`);
+                    }
+                    const successMatch: RegExpMatchArray | null = data.match(this.successRegex);
+                    if (successMatch && successMatch[1]) {
                         childProc.stdin.end();
-                    } else {
-                        const match: RegExpMatchArray | null = data.match(/(?:.*)Successfully .*login as (.*)/i);
-                        if (match && match[1]) {
-                            childProc.stdin.end();
-                            return resolve(match[1]);
-                        }
+                        return resolve(successMatch[1]);
+                    } else if (data.match(this.failRegex)) {
+                        childProc.stdin.end();
+                        return reject(new Error("Faile to login"));
                     }
                 });
 
@@ -109,6 +113,7 @@ class LeetCodeManager extends EventEmitter {
                 childProc.on("error", reject);
                 const name: string | undefined = await vscode.window.showInputBox({
                     prompt: "Enter username or E-mail.",
+                    ignoreFocusOut: true,
                     validateInput: (s: string): string | undefined => s && s.trim() ? undefined : "The input must not be empty",
                 });
                 if (!name) {
@@ -119,6 +124,7 @@ class LeetCodeManager extends EventEmitter {
                 const pwd: string | undefined = await vscode.window.showInputBox({
                     prompt: isByCookie ? "Enter cookie" : "Enter password.",
                     password: true,
+                    ignoreFocusOut: true,
                     validateInput: (s: string): string | undefined => s ? undefined : isByCookie ? "Cookie must not be empty" : "Password must not be empty",
                 });
                 if (!pwd) {
@@ -126,11 +132,6 @@ class LeetCodeManager extends EventEmitter {
                     return resolve(undefined);
                 }
                 childProc.stdin.write(`${pwd}\n`);
-                childProc.on("close", (code: number) => {
-                    if (code !== 0) {
-                        reject(new Error("Failed to login."));
-                    }
-                });
             });
             if (userName) {
                 vscode.window.showInformationMessage(`Successfully ${inMessage}.`);

From 6efb683df281479622b9efb426d183f0a843efa6 Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Sun, 12 Jan 2020 19:22:56 +0800
Subject: [PATCH 03/47] Prepare for 0.16.0 (#502)

---
 CHANGELOG.md         | 4 ++++
 README.md            | 8 +++-----
 docs/README_zh-CN.md | 9 ++++-----
 package-lock.json    | 2 +-
 package.json         | 2 +-
 5 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 78bab546..6a57ff0f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,10 @@ All notable changes to the "leetcode" extension will be documented in this file.
 
 Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
 
+## [0.16.0]
+### Added
+- Support GitHub login and LinkedIn login [PR#496](https://github.com/jdneo/vscode-leetcode/pull/496)
+
 ## [0.15.8]
 ### Added
 - Add a new command `Sign In by Cookie` to workaround the issue that [users cannot login to LeetCode](https://github.com/jdneo/vscode-leetcode/issues/478). Please check the [workaround steps](https://github.com/jdneo/vscode-leetcode/tree/master#%EF%B8%8F-attention-%EF%B8%8F--workaround-to-login-to-leetcode-endpoint) for more details!
diff --git a/README.md b/README.md
index 1d8d21f3..454a2d46 100644
--- a/README.md
+++ b/README.md
@@ -27,11 +27,9 @@
 
 Recently we observed that [the extension cannot login to leetcode.com endpoint anymore](https://github.com/jdneo/vscode-leetcode/issues/478). The root cause of this issue is that leetcode.com changed its login mechanism and so far there is no ideal way to fix that issue.
 
-Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround which can somehow mitigate this by using the cookie to login. Here are the steps about what you should do if you want to login to `leetcode.com` endpoint using cookie:
-1. Logout from the extension
-2. Make sure current active endpoint is `leetcode.com` (Not leetcode-cn.com)
-3. Copy the cookie as mentioned [here](https://github.com/jdneo/vscode-leetcode/issues/478#issuecomment-560395305)
-4. Trigger the command `Sign In by Cookie` to login through the copied cookie.
+Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround which can somehow mitigate this. Now you can simply click the `Sign In` button and then select `Third Party` login or `Cookie` login.
+
+> Note: If you want to use third-party login(**Recommended**), please make sure your account has been connected to the thrid-party. If you want to use `Cookie` login, click [here](https://github.com/jdneo/vscode-leetcode/issues/478#issuecomment-564757098) to see the steps.
 
 ## Requirements
 - [VS Code 1.30.1+](https://code.visualstudio.com/)
diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md
index 23faf30c..d6b3b8f4 100644
--- a/docs/README_zh-CN.md
+++ b/docs/README_zh-CN.md
@@ -27,11 +27,10 @@
 
 近期我们发现插件出现了[无法登录 leetcode.com 节点的问题](https://github.com/jdneo/vscode-leetcode/issues/478)。原因是因为近期 leetcode.com 改变了登录机制,目前我们暂时没有找到解决该问题的完美解决方案。
 
-感谢 [@yihong0618](https://github.com/yihong0618) 提供了一个通过 cookie 登录的临时解决办法。你可以参考如下步骤实现通过 cookie 登录 `leetcode.com`:
-1. 登出账户
-2. 确保当前激活的节点为 `leetcode.com` (而非 leetcode-cn.com)
-3. 按照这里的方法,[从浏览器中拷贝 cookie](https://github.com/jdneo/vscode-leetcode/issues/478#issuecomment-560395305)
-4. 使用命令 `Sign In by Cookie` 登录。
+感谢 [@yihong0618](https://github.com/yihong0618) 提供了一个临时解决办法。现在你可以直接点击登录按钮并选择第三方登录或者 `Cookie` 登录。
+
+
+> 注意:如果你希望使用第三方登录(**推荐**),请确保你的账户已经与第三方账户连接。如果你希望通过 `Cookie` 登录,请点击[该连接](https://github.com/jdneo/vscode-leetcode/issues/478#issuecomment-564757098)查看登录步骤。
 
 ## 运行条件
 - [VS Code 1.23.0+](https://code.visualstudio.com/)
diff --git a/package-lock.json b/package-lock.json
index 4c5bf850..1c03578e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
 {
     "name": "vscode-leetcode",
-    "version": "0.15.8",
+    "version": "0.16.0",
     "lockfileVersion": 1,
     "requires": true,
     "dependencies": {
diff --git a/package.json b/package.json
index 315f86eb..ea64b44d 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
     "name": "vscode-leetcode",
     "displayName": "LeetCode",
     "description": "Solve LeetCode problems in VS Code",
-    "version": "0.15.8",
+    "version": "0.16.0",
     "author": "Sheng Chen",
     "publisher": "shengchen",
     "license": "MIT",

From 1c4a39ef0db9febeb3320c8f7a701e50374c10a2 Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Thu, 13 Feb 2020 15:45:17 +0800
Subject: [PATCH 04/47] Add more information for login (#508)

---
 src/leetCodeManager.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/leetCodeManager.ts b/src/leetCodeManager.ts
index 27a17103..44be87a9 100644
--- a/src/leetCodeManager.ts
+++ b/src/leetCodeManager.ts
@@ -41,7 +41,7 @@ class LeetCodeManager extends EventEmitter {
         picks.push(
             {
                 label: "LeetCode Account",
-                detail: "Use LeetCode account to login",
+                detail: "Use LeetCode account to login (US endpoint is not supported)",
                 value: "LeetCode",
             },
             {

From 1a129db5c569be16b184f5e045679cb1037ad374 Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Fri, 14 Feb 2020 09:56:48 +0800
Subject: [PATCH 05/47] feat: Can open the problem file directly (#511)

---
 src/utils/workspaceUtils.ts | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/utils/workspaceUtils.ts b/src/utils/workspaceUtils.ts
index b77fc3c7..c129f8db 100644
--- a/src/utils/workspaceUtils.ts
+++ b/src/utils/workspaceUtils.ts
@@ -29,14 +29,17 @@ export async function selectWorkspaceFolder(): Promise<string> {
     if (needAsk) {
         const choice: string | undefined = await vscode.window.showQuickPick(
             [
+                OpenOption.justOpenFile,
                 OpenOption.openInCurrentWindow,
                 OpenOption.openInNewWindow,
                 OpenOption.addToWorkspace,
             ],
-            { placeHolder: "Select how you would like to open your workspace folder" },
+            { placeHolder: "The LeetCode workspace folder is not opened in VS Code, would you like to open it?" },
         );
 
         switch (choice) {
+            case OpenOption.justOpenFile:
+                return workspaceFolderSetting;
             case OpenOption.openInCurrentWindow:
                 await vscode.commands.executeCommand("vscode.openFolder", vscode.Uri.file(workspaceFolderSetting), false);
                 return "";
@@ -117,6 +120,7 @@ async function determineLeetCodeFolder(): Promise<string> {
 }
 
 enum OpenOption {
+    justOpenFile = "Just open the problem file",
     openInCurrentWindow = "Open in current window",
     openInNewWindow = "Open in new window",
     addToWorkspace = "Add to workspace",

From d7e4c10d39c5480145f19fb8f3cd4408562e5070 Mon Sep 17 00:00:00 2001
From: LinkeyLeo <LinkeyLeo@outlook.com>
Date: Sat, 22 Feb 2020 12:28:02 +0800
Subject: [PATCH 06/47] bugfix: Correctly parse the WSL path to Windows path
 (#510)

---
 src/leetCodeExecutor.ts | 17 ++++-------------
 src/utils/wslUtils.ts   |  5 ++++-
 2 files changed, 8 insertions(+), 14 deletions(-)

diff --git a/src/leetCodeExecutor.ts b/src/leetCodeExecutor.ts
index ce4a84e8..271ca9a4 100644
--- a/src/leetCodeExecutor.ts
+++ b/src/leetCodeExecutor.ts
@@ -14,13 +14,11 @@ import { toWslPath, useWsl } from "./utils/wslUtils";
 
 class LeetCodeExecutor implements Disposable {
     private leetCodeRootPath: string;
-    private leetCodeRootPathInWsl: string;
     private nodeExecutable: string;
     private configurationChangeListener: Disposable;
 
     constructor() {
         this.leetCodeRootPath = path.join(__dirname, "..", "..", "node_modules", "vsc-leetcode-cli");
-        this.leetCodeRootPathInWsl = "";
         this.nodeExecutable = this.getNodePath();
         this.configurationChangeListener = workspace.onDidChangeConfiguration((event: ConfigurationChangeEvent) => {
             if (event.affectsConfiguration("leetcode.nodePath")) {
@@ -29,18 +27,11 @@ class LeetCodeExecutor implements Disposable {
         }, this);
     }
 
-    public async getLeetCodeRootPath(): Promise<string> { // not wrapped by ""
+    public async getLeetCodeBinaryPath(): Promise<string> {
         if (wsl.useWsl()) {
-            if (!this.leetCodeRootPathInWsl) {
-                this.leetCodeRootPathInWsl = `${await wsl.toWslPath(this.leetCodeRootPath)}`;
-            }
-            return `${this.leetCodeRootPathInWsl}`;
+            return `${await wsl.toWslPath(`"${path.join(this.leetCodeRootPath, "bin", "leetcode")}"`)}`;
         }
-        return `${this.leetCodeRootPath}`;
-    }
-
-    public async getLeetCodeBinaryPath(): Promise<string> { // wrapped by ""
-        return `"${path.join(await this.getLeetCodeRootPath(), "bin", "leetcode")}"`;
+        return `"${path.join(this.leetCodeRootPath, "bin", "leetcode")}"`;
     }
 
     public async meetRequirements(): Promise<boolean> {
@@ -168,7 +159,7 @@ class LeetCodeExecutor implements Disposable {
 
     public async getCompaniesAndTags(): Promise<{ companies: { [key: string]: string[] }, tags: { [key: string]: string[] } }> {
         // preprocess the plugin source
-        const companiesTagsPath: string = path.join(await leetCodeExecutor.getLeetCodeRootPath(), "lib", "plugins", "company.js");
+        const companiesTagsPath: string = path.join(this.leetCodeRootPath, "lib", "plugins", "company.js");
         const companiesTagsSrc: string = (await fse.readFile(companiesTagsPath, "utf8")).replace(
             "module.exports = plugin",
             "module.exports = { COMPONIES, TAGS }",
diff --git a/src/utils/wslUtils.ts b/src/utils/wslUtils.ts
index d496b038..16d83cde 100644
--- a/src/utils/wslUtils.ts
+++ b/src/utils/wslUtils.ts
@@ -15,5 +15,8 @@ export async function toWslPath(path: string): Promise<string> {
 }
 
 export async function toWinPath(path: string): Promise<string> {
-    return (await executeCommand("wsl", ["wslpath", "-w", `"${path}"`])).trim();
+    if (path.startsWith("\\mnt\\")) {
+        return (await executeCommand("wsl", ["wslpath", "-w", `"${path.replace(/\\/g, "/").substr(0, 6)}"`])).trim() + path.substr(7);
+    }
+    return (await executeCommand("wsl", ["wslpath", "-w", "/"])).trim() + path;
 }

From 63589211e9a9aadd99134c407961c81225d98ec2 Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Sat, 22 Feb 2020 12:50:30 +0800
Subject: [PATCH 07/47] chore: Reference the VS Code icons (#517)

---
 package-lock.json            | 221 ++---------------------------------
 package.json                 |  28 ++---
 resources/dark/endpoint.svg  |   3 -
 resources/dark/refresh.svg   |   4 -
 resources/dark/search.svg    |   3 -
 resources/dark/signin.svg    |   3 -
 resources/light/endpoint.svg |   3 -
 resources/light/refresh.svg  |   4 -
 resources/light/search.svg   |   3 -
 resources/light/signin.svg   |   3 -
 10 files changed, 15 insertions(+), 260 deletions(-)
 delete mode 100644 resources/dark/endpoint.svg
 delete mode 100644 resources/dark/refresh.svg
 delete mode 100644 resources/dark/search.svg
 delete mode 100644 resources/dark/signin.svg
 delete mode 100644 resources/light/endpoint.svg
 delete mode 100644 resources/light/refresh.svg
 delete mode 100644 resources/light/search.svg
 delete mode 100644 resources/light/signin.svg

diff --git a/package-lock.json b/package-lock.json
index 1c03578e..db2741ae 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -58,6 +58,12 @@
             "integrity": "sha512-5vE9WoOOC9/DoD3Zj53UISpM+5tSvh8k0mL4fe2zFI6vO715/W4IQ3EdVUrWVMrFi1/NZhyMvm2iKsDFkEGddQ==",
             "dev": true
         },
+        "@types/vscode": {
+            "version": "1.42.0",
+            "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.42.0.tgz",
+            "integrity": "sha512-ds6TceMsh77Fs0Mq0Vap6Y72JbGWB8Bay4DrnJlf5d9ui2RSe1wis13oQm+XhguOeH1HUfLGzaDAoupTUtgabw==",
+            "dev": true
+        },
         "abab": {
             "version": "1.0.4",
             "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
@@ -79,15 +85,6 @@
                 "acorn": "^2.1.0"
             }
         },
-        "agent-base": {
-            "version": "4.2.1",
-            "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
-            "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==",
-            "dev": true,
-            "requires": {
-                "es6-promisify": "^5.0.0"
-            }
-        },
         "ajv": {
             "version": "6.9.1",
             "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz",
@@ -218,18 +215,6 @@
                 "concat-map": "0.0.1"
             }
         },
-        "browser-stdout": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
-            "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
-            "dev": true
-        },
-        "buffer-from": {
-            "version": "1.1.1",
-            "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
-            "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
-            "dev": true
-        },
         "builtin-modules": {
             "version": "1.1.1",
             "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
@@ -400,15 +385,6 @@
                 "assert-plus": "^1.0.0"
             }
         },
-        "debug": {
-            "version": "3.1.0",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-            "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-            "dev": true,
-            "requires": {
-                "ms": "2.0.0"
-            }
-        },
         "decamelize": {
             "version": "1.2.0",
             "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
@@ -497,21 +473,6 @@
             "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
             "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
         },
-        "es6-promise": {
-            "version": "4.2.6",
-            "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz",
-            "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==",
-            "dev": true
-        },
-        "es6-promisify": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
-            "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
-            "dev": true,
-            "requires": {
-                "es6-promise": "^4.0.3"
-            }
-        },
         "escape-string-regexp": {
             "version": "1.0.5",
             "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -669,12 +630,6 @@
             "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
             "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
         },
-        "growl": {
-            "version": "1.10.3",
-            "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
-            "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==",
-            "dev": true
-        },
         "har-schema": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
@@ -732,16 +687,6 @@
                 }
             }
         },
-        "http-proxy-agent": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz",
-            "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==",
-            "dev": true,
-            "requires": {
-                "agent-base": "4",
-                "debug": "3.1.0"
-            }
-        },
         "http-signature": {
             "version": "1.2.0",
             "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
@@ -752,27 +697,6 @@
                 "sshpk": "^1.7.0"
             }
         },
-        "https-proxy-agent": {
-            "version": "2.2.4",
-            "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
-            "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
-            "dev": true,
-            "requires": {
-                "agent-base": "^4.3.0",
-                "debug": "^3.1.0"
-            },
-            "dependencies": {
-                "agent-base": {
-                    "version": "4.3.0",
-                    "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
-                    "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
-                    "dev": true,
-                    "requires": {
-                        "es6-promisify": "^5.0.0"
-                    }
-                }
-            }
-        },
         "i": {
             "version": "0.3.6",
             "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz",
@@ -1050,84 +974,11 @@
                 "minimist": "0.0.8"
             }
         },
-        "mocha": {
-            "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz",
-            "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==",
-            "dev": true,
-            "requires": {
-                "browser-stdout": "1.3.0",
-                "commander": "2.11.0",
-                "debug": "3.1.0",
-                "diff": "3.3.1",
-                "escape-string-regexp": "1.0.5",
-                "glob": "7.1.2",
-                "growl": "1.10.3",
-                "he": "1.1.1",
-                "mkdirp": "0.5.1",
-                "supports-color": "4.4.0"
-            },
-            "dependencies": {
-                "commander": {
-                    "version": "2.11.0",
-                    "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
-                    "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
-                    "dev": true
-                },
-                "diff": {
-                    "version": "3.3.1",
-                    "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz",
-                    "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==",
-                    "dev": true
-                },
-                "glob": {
-                    "version": "7.1.2",
-                    "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
-                    "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
-                    "dev": true,
-                    "requires": {
-                        "fs.realpath": "^1.0.0",
-                        "inflight": "^1.0.4",
-                        "inherits": "2",
-                        "minimatch": "^3.0.4",
-                        "once": "^1.3.0",
-                        "path-is-absolute": "^1.0.0"
-                    }
-                },
-                "has-flag": {
-                    "version": "2.0.0",
-                    "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
-                    "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
-                    "dev": true
-                },
-                "he": {
-                    "version": "1.1.1",
-                    "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
-                    "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
-                    "dev": true
-                },
-                "supports-color": {
-                    "version": "4.4.0",
-                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
-                    "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
-                    "dev": true,
-                    "requires": {
-                        "has-flag": "^2.0.0"
-                    }
-                }
-            }
-        },
         "moment": {
             "version": "2.24.0",
             "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
             "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
         },
-        "ms": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-            "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-            "dev": true
-        },
         "mute-stream": {
             "version": "0.0.8",
             "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
@@ -1384,12 +1235,6 @@
             "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
             "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
         },
-        "querystringify": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
-            "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==",
-            "dev": true
-        },
         "read": {
             "version": "1.0.7",
             "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
@@ -1467,12 +1312,6 @@
             "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
             "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
         },
-        "requires-port": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
-            "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
-            "dev": true
-        },
         "resolve": {
             "version": "1.10.0",
             "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz",
@@ -1556,17 +1395,8 @@
         "source-map": {
             "version": "0.6.1",
             "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-            "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
-        },
-        "source-map-support": {
-            "version": "0.5.12",
-            "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
-            "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
-            "dev": true,
-            "requires": {
-                "buffer-from": "^1.0.0",
-                "source-map": "^0.6.0"
-            }
+            "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+            "optional": true
         },
         "sprintf-js": {
             "version": "1.0.3",
@@ -1751,16 +1581,6 @@
                 "punycode": "^2.1.0"
             }
         },
-        "url-parse": {
-            "version": "1.4.6",
-            "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.6.tgz",
-            "integrity": "sha512-/B8AD9iQ01seoXmXf9z/MjLZQIdOoYl/+gvsQF6+mpnxaTfG9P7srYaiqaDMyKkR36XMXfhqSHss5MyFAO8lew==",
-            "dev": true,
-            "requires": {
-                "querystringify": "^2.0.0",
-                "requires-port": "^1.0.0"
-            }
-        },
         "utile": {
             "version": "0.3.0",
             "resolved": "https://registry.npmjs.org/utile/-/utile-0.3.0.tgz",
@@ -1816,31 +1636,6 @@
                 "yargs": "12.0.4"
             }
         },
-        "vscode": {
-            "version": "1.1.33",
-            "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.33.tgz",
-            "integrity": "sha512-sXedp2oF6y4ZvqrrFiZpeMzaCLSWV+PpYkIxjG/iYquNZ9KrLL2LujltGxPLvzn49xu2sZkyC+avVNFgcJD1Iw==",
-            "dev": true,
-            "requires": {
-                "glob": "^7.1.2",
-                "mocha": "^4.0.1",
-                "request": "^2.88.0",
-                "semver": "^5.4.1",
-                "source-map-support": "^0.5.0",
-                "url-parse": "^1.4.4",
-                "vscode-test": "^0.1.4"
-            }
-        },
-        "vscode-test": {
-            "version": "0.1.5",
-            "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.1.5.tgz",
-            "integrity": "sha512-s+lbF1Dtasc0yXVB9iQTexBe2JK6HJAUJe3fWezHKIjq+xRw5ZwCMEMBaonFIPy7s95qg2HPTRDR5W4h4kbxGw==",
-            "dev": true,
-            "requires": {
-                "http-proxy-agent": "^2.1.0",
-                "https-proxy-agent": "^2.2.1"
-            }
-        },
         "wcwidth": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
diff --git a/package.json b/package.json
index ea64b44d..9ec411af 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
     "license": "MIT",
     "icon": "resources/LeetCode.png",
     "engines": {
-        "vscode": "^1.30.1"
+        "vscode": "^1.42.0"
     },
     "repository": {
         "type": "git",
@@ -52,19 +52,13 @@
                 "command": "leetcode.toggleLeetCodeCn",
                 "title": "Switch Endpoint",
                 "category": "LeetCode",
-                "icon": {
-                    "light": "resources/light/endpoint.svg",
-                    "dark": "resources/dark/endpoint.svg"
-                }
+                "icon": "$(globe)"
             },
             {
                 "command": "leetcode.signin",
                 "title": "Sign In",
                 "category": "LeetCode",
-                "icon": {
-                    "light": "resources/light/signin.svg",
-                    "dark": "resources/dark/signin.svg"
-                }
+                "icon": "$(sign-in)"
             },
             {
                 "command": "leetcode.signout",
@@ -80,10 +74,7 @@
                 "command": "leetcode.refreshExplorer",
                 "title": "Refresh",
                 "category": "LeetCode",
-                "icon": {
-                    "light": "resources/light/refresh.svg",
-                    "dark": "resources/dark/refresh.svg"
-                }
+                "icon": "$(refresh)"
             },
             {
                 "command": "leetcode.pickOne",
@@ -104,10 +95,7 @@
                 "command": "leetcode.searchProblem",
                 "title": "Search Problem",
                 "category": "LeetCode",
-                "icon": {
-                    "light": "resources/light/search.svg",
-                    "dark": "resources/dark/search.svg"
-                }
+                "icon": "$(search)"
             },
             {
                 "command": "leetcode.showSolution",
@@ -660,8 +648,6 @@
         "vscode:prepublish": "npm run compile",
         "compile": "tsc -p ./",
         "watch": "tsc -watch -p ./",
-        "postinstall": "node ./node_modules/vscode/bin/install",
-        "test": "npm run compile && node ./node_modules/vscode/bin/test",
         "lint": "tslint --project tsconfig.json -e src/*.d.ts -t verbose"
     },
     "devDependencies": {
@@ -671,10 +657,10 @@
         "@types/markdown-it": "0.0.7",
         "@types/mocha": "^2.2.42",
         "@types/node": "^7.0.43",
+        "@types/vscode": "1.42.0",
         "@types/require-from-string": "^1.2.0",
         "tslint": "^5.9.1",
-        "typescript": "^2.6.1",
-        "vscode": "^1.1.33"
+        "typescript": "^2.6.1"
     },
     "dependencies": {
         "fs-extra": "^6.0.1",
diff --git a/resources/dark/endpoint.svg b/resources/dark/endpoint.svg
deleted file mode 100644
index 1ff60a53..00000000
--- a/resources/dark/endpoint.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path fill-rule="evenodd" clip-rule="evenodd" d="M8.5 1C9.78557 1 11.0423 1.38123 12.1112 2.09546C13.1801 2.80969 14.0132 3.82483 14.5052 5.01257C14.8972 5.95898 15.0586 6.98108 14.9811 7.99524C14.8962 9.10645 14.5267 10.1801 13.9046 11.1112C13.1903 12.1802 12.1752 13.0133 10.9874 13.5052C9.79973 13.9972 8.4928 14.126 7.23192 13.8751C5.97104 13.6243 4.81285 13.0052 3.90381 12.0962C2.99476 11.1871 2.3757 10.0289 2.12489 8.76807C1.8741 7.5072 2.00282 6.20032 2.49478 5.01257C2.98675 3.82483 3.81987 2.80969 4.88879 2.09546C5.95772 1.38123 7.21443 1 8.5 1ZM13.394 5C12.7527 3.75281 11.6613 2.79626 10.3412 2.32373C10.7845 3.16357 11.106 4.0647 11.294 5H13.394ZM13.9765 7.99524C13.9918 7.83081 13.9997 7.66553 14 7.5C13.999 6.99255 13.9273 6.48767 13.787 6H11.445C11.477 6.33105 11.5 6.66406 11.5 7C11.4997 7.12598 11.4971 7.25195 11.4921 7.37769C11.4917 7.38623 11.4914 7.39417 11.4911 7.40271C11.4834 7.58289 11.4709 7.76331 11.4536 7.94263C11.4192 8.29749 11.366 8.65039 11.294 9H13.787C13.8815 8.67139 13.9449 8.33496 13.9765 7.99524ZM10.4408 7.99524C10.4428 7.97815 10.4447 7.96106 10.4466 7.94397C10.4808 7.63074 10.4987 7.31567 10.5 7C10.4933 6.66553 10.4679 6.33167 10.424 6H6.576C6.53207 6.33167 6.5067 6.66553 6.5 7C6.50274 7.67334 6.5809 8.34412 6.733 9H10.267C10.3439 8.66833 10.4019 8.33289 10.4408 7.99524ZM10.249 5C10.1607 4.60352 10.0465 4.21399 9.90597 3.83447C9.67117 3.2019 9.36551 2.59644 8.994 2.03003C8.83 2.01599 8.666 2 8.5 2C8.39551 2 8.29182 2.00635 8.18843 2.01453C8.12755 2.01929 8.06677 2.02478 8.00599 2.03003L8 2.03918C7.40887 2.94299 6.98573 3.9458 6.75101 5H10.249ZM5.70601 5C5.89779 4.0647 6.22313 3.16174 6.672 2.31897C5.34599 2.78979 4.24946 3.74866 3.606 5H5.70601ZM3.213 6C3.07269 6.48767 3.00101 6.99255 3 7.5C3.00101 8.00745 3.07269 8.51233 3.213 9H5.70601C5.57043 8.34192 5.50142 7.67188 5.5 7C5.5 6.66406 5.52301 6.33105 5.55501 6H3.213ZM5.96701 10H3.60701C3.98501 10.7384 4.52472 11.382 5.18594 11.8829C5.84715 12.3838 6.61285 12.729 7.42601 12.8931C6.78598 12.0142 6.2932 11.0371 5.96701 10ZM8.5 12.644C9.13943 11.8531 9.63927 10.959 9.97799 10H7.022C7.36075 10.959 7.86058 11.8531 8.5 12.644ZM11.033 10C10.7068 11.0371 10.214 12.0142 9.574 12.8931C10.3872 12.729 11.1528 12.3838 11.8141 11.8829C12.4753 11.382 13.015 10.7384 13.393 10H11.033Z" fill="#C5C5C5"/>
-</svg>
diff --git a/resources/dark/refresh.svg b/resources/dark/refresh.svg
deleted file mode 100644
index 0442b2af..00000000
--- a/resources/dark/refresh.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path fill-rule="evenodd" clip-rule="evenodd" d="M5.56253 2.5158C3.46348 3.45013 2 5.55417 2 8.00002C2 11.3137 4.68629 14 8 14C11.3137 14 14 11.3137 14 8.00002C14 5.32522 12.2497 3.05922 9.83199 2.28485L9.52968 3.23835C11.5429 3.88457 13 5.77213 13 8.00002C13 10.7614 10.7614 13 8 13C5.23858 13 3 10.7614 3 8.00002C3 6.31107 3.83742 4.8177 5.11969 3.91248L5.56253 2.5158Z" fill="#C5C5C5"/>
-<path fill-rule="evenodd" clip-rule="evenodd" d="M5 3H2V2H5.5L6 2.5V6H5V3Z" fill="#C5C5C5"/>
-</svg>
diff --git a/resources/dark/search.svg b/resources/dark/search.svg
deleted file mode 100644
index e329b2d7..00000000
--- a/resources/dark/search.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path d="M15.25 1.02546e-06C13.6605 -0.000791296 12.1046 0.457574 10.7694 1.32007C9.43422 2.18256 8.37657 3.4124 7.72375 4.8617C7.07094 6.31099 6.85077 7.91801 7.0896 9.4895C7.32843 11.061 8.01604 12.5301 9.06995 13.72L1 22.88L2.12 23.88L10.17 14.76C11.2055 15.5693 12.4192 16.1196 13.7103 16.365C15.0014 16.6104 16.3325 16.5437 17.5927 16.1707C18.8528 15.7976 20.0055 15.1288 20.955 14.2201C21.9044 13.3114 22.623 12.1891 23.0509 10.9465C23.4789 9.70396 23.6038 8.37703 23.4153 7.07642C23.2267 5.77581 22.7302 4.53915 21.967 3.46924C21.2039 2.39933 20.1962 1.52711 19.0278 0.925416C17.8595 0.323719 16.5642 0.00991516 15.25 0.0100108V1.02546e-06ZM15.25 15C13.915 15 12.6099 14.6041 11.4999 13.8624C10.3898 13.1207 9.52469 12.0665 9.01379 10.8331C8.5029 9.59973 8.36919 8.24248 8.62964 6.93311C8.89009 5.62373 9.53305 4.42106 10.4771 3.47705C11.4211 2.53305 12.6237 1.89009 13.9331 1.62964C15.2425 1.36919 16.5997 1.5029 17.8331 2.01379C19.0665 2.52469 20.1207 3.38985 20.8624 4.49988C21.6041 5.60991 22 6.91498 22 8.25C22 10.0402 21.2888 11.7571 20.0229 13.023C18.7571 14.2888 17.0402 15 15.25 15V15Z" fill="#C5C5C5"/>
-</svg>
diff --git a/resources/dark/signin.svg b/resources/dark/signin.svg
deleted file mode 100644
index 2b96bb18..00000000
--- a/resources/dark/signin.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path fill-rule="evenodd" clip-rule="evenodd" d="M11.02 3.77L11.03 3.76L12.02 4.75V2.5L11.52 2H2.52001L2.01001 2.5V2.99301L2 3.00003V13.29L2.36 13.75L7.36 15.47L8 15V14H11.52L12.02 13.5V11.25L11.02 12.25V13H8V4.71003L7.67 4.25003L4.03619 3H7.01001H11.02V3.77ZM7 14.28L3 12.94V3.72003L7 5.06003V14.28ZM10.09 7.53005H15.06V8.53005H10.13L11.72 10.1301L11.01 10.8301L8.53998 8.37005V7.66005L11.03 5.18005L11.73 5.88005L10.09 7.53005Z" fill="#C5C5C5"/>
-</svg>
diff --git a/resources/light/endpoint.svg b/resources/light/endpoint.svg
deleted file mode 100644
index 91ad34f8..00000000
--- a/resources/light/endpoint.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path fill-rule="evenodd" clip-rule="evenodd" d="M8.5 1C9.78557 1 11.0423 1.38123 12.1112 2.09546C13.1801 2.80969 14.0132 3.82483 14.5052 5.01257C14.8972 5.95898 15.0586 6.98108 14.9811 7.99524C14.8962 9.10645 14.5267 10.1801 13.9046 11.1112C13.1903 12.1802 12.1752 13.0133 10.9874 13.5052C9.79973 13.9972 8.4928 14.126 7.23192 13.8751C5.97104 13.6243 4.81285 13.0052 3.90381 12.0962C2.99476 11.1871 2.3757 10.0289 2.12489 8.76807C1.8741 7.5072 2.00282 6.20032 2.49478 5.01257C2.98675 3.82483 3.81987 2.80969 4.88879 2.09546C5.95772 1.38123 7.21443 1 8.5 1ZM13.394 5C12.7527 3.75281 11.6613 2.79626 10.3412 2.32373C10.7845 3.16357 11.106 4.0647 11.294 5H13.394ZM13.9765 7.99524C13.9918 7.83081 13.9997 7.66553 14 7.5C13.999 6.99255 13.9273 6.48767 13.787 6H11.445C11.477 6.33105 11.5 6.66406 11.5 7C11.4997 7.12598 11.4971 7.25195 11.4921 7.37769C11.4917 7.38623 11.4914 7.39417 11.4911 7.40271C11.4834 7.58289 11.4709 7.76331 11.4536 7.94263C11.4192 8.29749 11.366 8.65039 11.294 9H13.787C13.8815 8.67139 13.9449 8.33496 13.9765 7.99524ZM10.4408 7.99524C10.4428 7.97815 10.4447 7.96106 10.4466 7.94397C10.4808 7.63074 10.4987 7.31567 10.5 7C10.4933 6.66553 10.4679 6.33167 10.424 6H6.576C6.53207 6.33167 6.5067 6.66553 6.5 7C6.50274 7.67334 6.5809 8.34412 6.733 9H10.267C10.3439 8.66833 10.4019 8.33289 10.4408 7.99524ZM10.249 5C10.1607 4.60352 10.0465 4.21399 9.90597 3.83447C9.67117 3.2019 9.36551 2.59644 8.994 2.03003C8.83 2.01599 8.666 2 8.5 2C8.39551 2 8.29182 2.00635 8.18843 2.01453C8.12755 2.01929 8.06677 2.02478 8.00599 2.03003L8 2.03918C7.40887 2.94299 6.98573 3.9458 6.75101 5H10.249ZM5.70601 5C5.89779 4.0647 6.22313 3.16174 6.672 2.31897C5.34599 2.78979 4.24946 3.74866 3.606 5H5.70601ZM3.213 6C3.07269 6.48767 3.00101 6.99255 3 7.5C3.00101 8.00745 3.07269 8.51233 3.213 9H5.70601C5.57043 8.34192 5.50142 7.67188 5.5 7C5.5 6.66406 5.52301 6.33105 5.55501 6H3.213ZM5.96701 10H3.60701C3.98501 10.7384 4.52472 11.382 5.18594 11.8829C5.84715 12.3838 6.61285 12.729 7.42601 12.8931C6.78598 12.0142 6.2932 11.0371 5.96701 10ZM8.5 12.644C9.13943 11.8531 9.63927 10.959 9.97799 10H7.022C7.36075 10.959 7.86058 11.8531 8.5 12.644ZM11.033 10C10.7068 11.0371 10.214 12.0142 9.574 12.8931C10.3872 12.729 11.1528 12.3838 11.8141 11.8829C12.4753 11.382 13.015 10.7384 13.393 10H11.033Z" fill="#424242"/>
-</svg>
diff --git a/resources/light/refresh.svg b/resources/light/refresh.svg
deleted file mode 100644
index 8ade09df..00000000
--- a/resources/light/refresh.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path fill-rule="evenodd" clip-rule="evenodd" d="M5.56253 2.5158C3.46348 3.45013 2 5.55417 2 8.00002C2 11.3137 4.68629 14 8 14C11.3137 14 14 11.3137 14 8.00002C14 5.32522 12.2497 3.05922 9.83199 2.28485L9.52968 3.23835C11.5429 3.88457 13 5.77213 13 8.00002C13 10.7614 10.7614 13 8 13C5.23858 13 3 10.7614 3 8.00002C3 6.31107 3.83742 4.8177 5.11969 3.91248L5.56253 2.5158Z" fill="#424242"/>
-<path fill-rule="evenodd" clip-rule="evenodd" d="M5 3H2V2H5.5L6 2.5V6H5V3Z" fill="#424242"/>
-</svg>
diff --git a/resources/light/search.svg b/resources/light/search.svg
deleted file mode 100644
index fa629e10..00000000
--- a/resources/light/search.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path d="M15.25 1.02546e-06C13.6605 -0.000791296 12.1046 0.457574 10.7694 1.32007C9.43422 2.18256 8.37657 3.4124 7.72375 4.8617C7.07094 6.31099 6.85077 7.91801 7.0896 9.4895C7.32843 11.061 8.01604 12.5301 9.06995 13.72L1 22.88L2.12 23.88L10.17 14.76C11.2055 15.5693 12.4192 16.1196 13.7103 16.365C15.0014 16.6104 16.3325 16.5437 17.5927 16.1707C18.8528 15.7976 20.0055 15.1288 20.955 14.2201C21.9044 13.3114 22.623 12.1891 23.0509 10.9465C23.4789 9.70396 23.6038 8.37703 23.4153 7.07642C23.2267 5.77581 22.7302 4.53915 21.967 3.46924C21.2039 2.39933 20.1962 1.52711 19.0278 0.925416C17.8595 0.323719 16.5642 0.00991516 15.25 0.0100108V1.02546e-06ZM15.25 15C13.915 15 12.6099 14.6041 11.4999 13.8624C10.3898 13.1207 9.52469 12.0665 9.01379 10.8331C8.5029 9.59973 8.36919 8.24248 8.62964 6.93311C8.89009 5.62373 9.53305 4.42106 10.4771 3.47705C11.4211 2.53305 12.6237 1.89009 13.9331 1.62964C15.2425 1.36919 16.5997 1.5029 17.8331 2.01379C19.0665 2.52469 20.1207 3.38985 20.8624 4.49988C21.6041 5.60991 22 6.91498 22 8.25C22 10.0402 21.2888 11.7571 20.0229 13.023C18.7571 14.2888 17.0402 15 15.25 15V15Z" fill="#424242"/>
-</svg>
diff --git a/resources/light/signin.svg b/resources/light/signin.svg
deleted file mode 100644
index c7033f31..00000000
--- a/resources/light/signin.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path fill-rule="evenodd" clip-rule="evenodd" d="M11.02 3.77L11.03 3.76L12.02 4.75V2.5L11.52 2H2.52001L2.01001 2.5V2.99301L2 3.00003V13.29L2.36 13.75L7.36 15.47L8 15V14H11.52L12.02 13.5V11.25L11.02 12.25V13H8V4.71003L7.67 4.25003L4.03619 3H7.01001H11.02V3.77ZM7 14.28L3 12.94V3.72003L7 5.06003V14.28ZM10.09 7.53005H15.06V8.53005H10.13L11.72 10.1301L11.01 10.8301L8.53998 8.37005V7.66005L11.03 5.18005L11.73 5.88005L10.09 7.53005Z" fill="#424242"/>
-</svg>

From d160d1ffccf31c270233a2d602b4d0563ffdd6cc Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Sat, 22 Feb 2020 14:04:53 +0800
Subject: [PATCH 08/47] chore: Prepare for 0.16.1 (#518)

---
 CHANGELOG.md      | 7 +++++++
 package-lock.json | 2 +-
 package.json      | 2 +-
 3 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6a57ff0f..bb9c73be 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,13 @@ All notable changes to the "leetcode" extension will be documented in this file.
 
 Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
 
+## [0.16.1]
+### Added
+- Can show the problem in current workspace even if it's not a LeetCode workspace [#373](https://github.com/jdneo/vscode-leetcode/issues/373)
+
+### Fixed
+[Bugs fixed](https://github.com/jdneo/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.16.1+is%3Aclosed+label%3Abug)
+
 ## [0.16.0]
 ### Added
 - Support GitHub login and LinkedIn login [PR#496](https://github.com/jdneo/vscode-leetcode/pull/496)
diff --git a/package-lock.json b/package-lock.json
index db2741ae..0a555853 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
 {
     "name": "vscode-leetcode",
-    "version": "0.16.0",
+    "version": "0.16.1",
     "lockfileVersion": 1,
     "requires": true,
     "dependencies": {
diff --git a/package.json b/package.json
index 9ec411af..59c5927b 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
     "name": "vscode-leetcode",
     "displayName": "LeetCode",
     "description": "Solve LeetCode problems in VS Code",
-    "version": "0.16.0",
+    "version": "0.16.1",
     "author": "Sheng Chen",
     "publisher": "shengchen",
     "license": "MIT",

From ac9df4d03ec4509310f89bdb7128da2077a9de15 Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Sun, 23 Feb 2020 12:04:55 +0800
Subject: [PATCH 09/47] Better config how to show the problem description
 (#519)

---
 package.json              | 19 ++++++++++++++++++-
 src/commands/show.ts      | 26 +++++++++++++++-----------
 src/leetCodeExecutor.ts   |  4 ++--
 src/shared.ts             |  7 +++++++
 src/utils/settingUtils.ts | 39 +++++++++++++++++++++++++++++++++++++++
 5 files changed, 81 insertions(+), 14 deletions(-)

diff --git a/package.json b/package.json
index 59c5927b..6397ef3a 100644
--- a/package.json
+++ b/package.json
@@ -300,11 +300,28 @@
                         "scope": "application",
                         "description": "Default language for solving the problems."
                     },
+                    "leetcode.showDescription": {
+                        "type": "string",
+                        "default": "In Webview",
+                        "enum": [
+                            "In Webview",
+                            "In File Comment",
+                            "Both",
+                            "None"
+                        ],
+                        "enumDescriptions": [
+                            "Show the problem description in a new webview window",
+                            "Show the problem description in the file's comment"
+                        ],
+                        "scope": "application",
+                        "description": "Specify where to show the description."
+                    },
                     "leetcode.showCommentDescription": {
                         "type": "boolean",
                         "default": false,
                         "scope": "application",
-                        "description": "Include problem description in comments."
+                        "description": "[Deprecated] Include problem description in comments.",
+                        "deprecationMessage": "This setting will be deprecated in 0.17.0, please use 'leetcode.showDescription' instead"
                     },
                     "leetcode.hint.setDefaultLanguage": {
                         "type": "boolean",
diff --git a/src/commands/show.ts b/src/commands/show.ts
index 3de4f89a..1265e6f7 100644
--- a/src/commands/show.ts
+++ b/src/commands/show.ts
@@ -12,6 +12,8 @@ import { leetCodeExecutor } from "../leetCodeExecutor";
 import { leetCodeManager } from "../leetCodeManager";
 import { IProblem, IQuickItemEx, languages, ProblemState } from "../shared";
 import { genFileExt, genFileName, getNodeIdFromFile } from "../utils/problemUtils";
+import * as settingUtils from "../utils/settingUtils";
+import { IDescriptionConfiguration } from "../utils/settingUtils";
 import { DialogOptions, DialogType, openSettingsEditor, promptForOpenOutputChannel, promptForSignIn, promptHintMessage } from "../utils/uiUtils";
 import { getActiveFilePath, selectWorkspaceFolder } from "../utils/workspaceUtils";
 import * as wsl from "../utils/wslUtils";
@@ -166,28 +168,30 @@ async function showProblemInternal(node: IProblem): Promise<void> {
 
         finalPath = wsl.useWsl() ? await wsl.toWinPath(finalPath) : finalPath;
 
-        await leetCodeExecutor.showProblem(node, language, finalPath, leetCodeConfig.get<boolean>("showCommentDescription"));
-        await Promise.all([
+        const descriptionConfig: IDescriptionConfiguration = settingUtils.getDescriptionConfiguration();
+        await leetCodeExecutor.showProblem(node, language, finalPath, descriptionConfig.showInComment);
+        const promises: any[] = [
             vscode.window.showTextDocument(vscode.Uri.file(finalPath), { preview: false, viewColumn: vscode.ViewColumn.One }),
-            movePreviewAsideIfNeeded(node),
             promptHintMessage(
                 "hint.commentDescription",
-                'You can generate the code file with problem description in the comments by enabling "leetcode.showCommentDescription".',
+                'You can config how to show the problem description through "leetcode.showDescription".',
                 "Open settings",
-                (): Promise<any> => openSettingsEditor("leetcode.showCommentDescription"),
+                (): Promise<any> => openSettingsEditor("leetcode.showDescription"),
             ),
-        ]);
+        ];
+        if (descriptionConfig.showInWebview) {
+            promises.push(showDescriptionView(node));
+        }
+
+        await Promise.all(promises);
     } catch (error) {
         await promptForOpenOutputChannel(`${error} Please open the output channel for details.`, DialogType.error);
     }
 }
 
-async function movePreviewAsideIfNeeded(node: IProblem): Promise<void> {
-    if (vscode.workspace.getConfiguration("leetcode").get<boolean>("enableSideMode", true)) {
-        return previewProblem(node, true);
-    }
+async function showDescriptionView(node: IProblem): Promise<void> {
+    return previewProblem(node, vscode.workspace.getConfiguration("leetcode").get<boolean>("enableSideMode", true));
 }
-
 async function parseProblemsToPicks(p: Promise<IProblem[]>): Promise<Array<IQuickItemEx<IProblem>>> {
     return new Promise(async (resolve: (res: Array<IQuickItemEx<IProblem>>) => void): Promise<void> => {
         const picks: Array<IQuickItemEx<IProblem>> = (await p).map((problem: IProblem) => Object.assign({}, {
diff --git a/src/leetCodeExecutor.ts b/src/leetCodeExecutor.ts
index 271ca9a4..4c0aa312 100644
--- a/src/leetCodeExecutor.ts
+++ b/src/leetCodeExecutor.ts
@@ -86,8 +86,8 @@ class LeetCodeExecutor implements Disposable {
         );
     }
 
-    public async showProblem(problemNode: IProblem, language: string, filePath: string, detailed: boolean = false): Promise<void> {
-        const templateType: string = detailed ? "-cx" : "-c";
+    public async showProblem(problemNode: IProblem, language: string, filePath: string, showDescriptionInComment: boolean = false): Promise<void> {
+        const templateType: string = showDescriptionInComment ? "-cx" : "-c";
 
         if (!await fse.pathExists(filePath)) {
             await fse.createFile(filePath);
diff --git a/src/shared.ts b/src/shared.ts
index 5f1039e4..d9d156d8 100644
--- a/src/shared.ts
+++ b/src/shared.ts
@@ -105,3 +105,10 @@ export const supportedPlugins: string[] = [
     "solution.discuss",
     "leetcode.cn",
 ];
+
+export enum DescriptionConfiguration {
+    InWebView = "In Webview",
+    InFileComment = "In File Comment",
+    Both = "Both",
+    None = "None",
+}
diff --git a/src/utils/settingUtils.ts b/src/utils/settingUtils.ts
index 388f31b8..8c94a95f 100644
--- a/src/utils/settingUtils.ts
+++ b/src/utils/settingUtils.ts
@@ -2,6 +2,7 @@
 // Licensed under the MIT license.
 
 import { workspace, WorkspaceConfiguration } from "vscode";
+import { DescriptionConfiguration } from "../shared";
 
 export function getWorkspaceConfiguration(): WorkspaceConfiguration {
     return workspace.getConfiguration("leetcode");
@@ -18,3 +19,41 @@ export function getWorkspaceFolder(): string {
 export function getEditorShortcuts(): string[] {
     return getWorkspaceConfiguration().get<string[]>("editor.shortcuts", ["submit", "test"]);
 }
+
+export function getDescriptionConfiguration(): IDescriptionConfiguration {
+    const setting: string = getWorkspaceConfiguration().get<string>("showDescription", DescriptionConfiguration.InWebView);
+    const config: IDescriptionConfiguration = {
+        showInComment: false,
+        showInWebview: true,
+    };
+    switch (setting) {
+        case DescriptionConfiguration.Both:
+            config.showInComment = true;
+            config.showInWebview = true;
+            break;
+        case DescriptionConfiguration.None:
+            config.showInComment = false;
+            config.showInWebview = false;
+            break;
+        case DescriptionConfiguration.InFileComment:
+            config.showInComment = true;
+            config.showInWebview = false;
+            break;
+        case DescriptionConfiguration.InWebView:
+            config.showInComment = false;
+            config.showInWebview = true;
+            break;
+    }
+
+    // To be compatible with the deprecated setting:
+    if (getWorkspaceConfiguration().get<boolean>("showCommentDescription")) {
+        config.showInComment = true;
+    }
+
+    return config;
+}
+
+export interface IDescriptionConfiguration {
+    showInComment: boolean;
+    showInWebview: boolean;
+}

From 15c4216badd3080c0845d51ed71e786b6003895e Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Sun, 23 Feb 2020 13:33:45 +0800
Subject: [PATCH 10/47] Remove the deprecated setting: leetcode.enableShortcuts
 (#520)

---
 README.md                          |  1 -
 docs/README_zh-CN.md               |  1 -
 package.json                       |  6 ------
 src/codelens/CodeLensController.ts | 22 +++-------------------
 4 files changed, 3 insertions(+), 27 deletions(-)

diff --git a/README.md b/README.md
index 454a2d46..b5067515 100644
--- a/README.md
+++ b/README.md
@@ -129,7 +129,6 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 | `leetcode.filePath`                                                                     | Specify the relative path under the workspace and the file name to save the problem files. More details can be found [here](https://github.com/jdneo/vscode-leetcode/wiki/Customize-the-Relative-Folder-and-the-File-Name-of-the-Problem-File).                                                                                                                                                                                   |                    |
 | **[Deprecated] Use `leetcode.filePath` instead** ~~`leetcode.outputFolder`~~            | ~~Specify the relative path to save the problem files. Besides using customized path, there are also several reserved words which can be used here: <ul><li>`${tag}`: Categorize the problem according to their tags.<li>`${language}`: Categorize the problem according to their language.</li><li>`${difficulty}`: Categorize the problem according to their difficulty.</li></ul>For example: `problem-${tag}-${difficulty}`~~ | ~~N/A~~            |
 | `leetcode.enableStatusBar`                                                              | Specify whether the LeetCode status bar will be shown or not.                                                                                                                                                                                                                                                                                                                                                                     | `true`             |
-| **[Deprecated] Use `leetcode.editor.shortcuts` instead** ~~`leetcode.enableShortcuts`~~ | ~~Specify whether the submit and test shortcuts in editor or not.~~                                                                                                                                                                                                                                                                                                                                                               | ~~`true`~~         |
 | `leetcode.editor.shortcuts`                                                             | Specify the customized shorcuts in editors. Supported values are: `submit`, `test`, `solution` and `description`.                                                                                                                                                                                                                                                                                                                 | `["submit, test"]` |
 | `leetcode.enableSideMode`                                                               | Specify whether `preview`, `solution` and `submission` tab should be grouped into the second editor column when solving a problem.                                                                                                                                                                                                                                                                                                | `true`             |
 | `leetcode.nodePath`                                                                     | Specify the `Node.js` executable path. for example, C:\Program Files\nodejs\node.exe                                                                                                                                                                                                                                                                                                                                              | `node`             |
diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md
index d6b3b8f4..d69c62a7 100644
--- a/docs/README_zh-CN.md
+++ b/docs/README_zh-CN.md
@@ -130,7 +130,6 @@
 | `leetcode.filePath`                                                                | 指定生成题目文件的相对文件夹路径名和文件名。点击查看[更多详细用法](https://github.com/jdneo/vscode-leetcode/wiki/%E8%87%AA%E5%AE%9A%E4%B9%89%E9%A2%98%E7%9B%AE%E6%96%87%E4%BB%B6%E7%9A%84%E7%9B%B8%E5%AF%B9%E6%96%87%E4%BB%B6%E5%A4%B9%E8%B7%AF%E5%BE%84%E5%92%8C%E6%96%87%E4%BB%B6%E5%90%8D)。 |                    |
 | **[Deprecated] 请使用 `leetcode.filePath`** ~~`leetcode.outputFolder`~~            | ~~指定保存文件时所用的相对文件夹路径。除了用户自定义路径外,也可以使用保留项,包括:<ul><li>`${tag}`: 根据题目的类别进行分类。<li>`${language}`: 根据题目的语言进行分类。</li><li>`${difficulty}`: 根据题目的难度进行分类。</li></ul>例如:`problem-${tag}-${difficulty}`~~                     | ~~N/A~~            |
 | `leetcode.enableStatusBar`                                                         | 指定是否在 VS Code 下方显示插件状态栏。                                                                                                                                                                                                                                                         | `true`             |
-| **[Deprecated] 请使用 `leetcode.editor.shortcuts`** ~~`leetcode.enableShortcuts`~~ | ~~指定是否在 VS Code 编辑文件下方显示提交和测试的快捷按钮。~~                                                                                                                                                                                                                                   | ~~`true`~~         |
 | `leetcode.editor.shortcuts`                                                        | 指定在编辑器内所自定义的快捷方式。可用的快捷方式有: `submit`, `test`, `solution`, `description`。                                                                                                                                                                                               | `["submit, test"]` |
 | `leetcode.enableSideMode`                                                          | 指定在解决一道题时,是否将`问题预览`、`高票答案`与`提交结果`窗口集中在编辑器的第二栏。                                                                                                                                                                                                          | `true`             |
 | `leetcode.nodePath`                                                                | 指定 `Node.js` 可执行文件的路径。如:C:\Program Files\nodejs\node.exe                                                                                                                                                                                                                           | `node`             |
diff --git a/package.json b/package.json
index 6397ef3a..cc7b9eb1 100644
--- a/package.json
+++ b/package.json
@@ -621,12 +621,6 @@
                         "scope": "application",
                         "description": "Show the LeetCode status bar or not."
                     },
-                    "leetcode.enableShortcuts": {
-                        "type": "boolean",
-                        "default": true,
-                        "scope": "application",
-                        "description": "[Deprecated] Show the submit and test shortcuts in editor or not."
-                    },
                     "leetcode.editor.shortcuts": {
                         "type": "array",
                         "default": [
diff --git a/src/codelens/CodeLensController.ts b/src/codelens/CodeLensController.ts
index 9373df27..8e2fa3c9 100644
--- a/src/codelens/CodeLensController.ts
+++ b/src/codelens/CodeLensController.ts
@@ -1,7 +1,7 @@
 // Copyright (c) jdneo. All rights reserved.
 // Licensed under the MIT license.
 
-import { ConfigurationChangeEvent, Disposable, languages, workspace, WorkspaceConfiguration } from "vscode";
+import { ConfigurationChangeEvent, Disposable, languages, workspace } from "vscode";
 import { CustomCodeLensProvider } from "./CustomCodeLensProvider";
 
 class CodeLensController implements Disposable {
@@ -13,14 +13,12 @@ class CodeLensController implements Disposable {
         this.internalProvider = new CustomCodeLensProvider();
 
         this.configurationChangeListener = workspace.onDidChangeConfiguration((event: ConfigurationChangeEvent) => {
-            if (event.affectsConfiguration("leetcode.enableShortcuts")) {
-                this.setCodeLensVisibility();
-            } else if (event.affectsConfiguration("leetcode.editor.shortcuts")) {
+            if (event.affectsConfiguration("leetcode.editor.shortcuts")) {
                 this.internalProvider.refresh();
             }
         }, this);
 
-        this.setCodeLensVisibility();
+        this.registeredProvider = languages.registerCodeLensProvider({ scheme: "file" }, this.internalProvider);
     }
 
     public dispose(): void {
@@ -29,20 +27,6 @@ class CodeLensController implements Disposable {
         }
         this.configurationChangeListener.dispose();
     }
-
-    private setCodeLensVisibility(): void {
-        if (this.isShortcutsEnabled() && !this.registeredProvider) {
-            this.registeredProvider = languages.registerCodeLensProvider({ scheme: "file" }, this.internalProvider);
-        } else if (!this.isShortcutsEnabled() && this.registeredProvider) {
-            this.registeredProvider.dispose();
-            this.registeredProvider = undefined;
-        }
-    }
-
-    private isShortcutsEnabled(): boolean {
-        const configuration: WorkspaceConfiguration = workspace.getConfiguration();
-        return configuration.get<boolean>("leetcode.enableShortcuts", true);
-    }
 }
 
 export const codeLensController: CodeLensController = new CodeLensController();

From bedd69307944795846db5995167cdb709398758d Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Sun, 23 Feb 2020 14:02:08 +0800
Subject: [PATCH 11/47] Remove the deprecated setting: leetcode.outputFolder
 (#521)

---
 README.md            | 1 -
 docs/README_zh-CN.md | 1 -
 package.json         | 5 -----
 src/commands/show.ts | 4 +---
 4 files changed, 1 insertion(+), 10 deletions(-)

diff --git a/README.md b/README.md
index b5067515..fecddd1b 100644
--- a/README.md
+++ b/README.md
@@ -127,7 +127,6 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 | `leetcode.endpoint`                                                                     | Specify the active endpoint. Supported endpoints are: `leetcode`, `leetcode-cn`                                                                                                                                                                                                                                                                                                                                                   | `leetcode`         |
 | `leetcode.workspaceFolder`                                                              | Specify the path of the workspace folder to store the problem files.                                                                                                                                                                                                                                                                                                                                                              | `""`               |
 | `leetcode.filePath`                                                                     | Specify the relative path under the workspace and the file name to save the problem files. More details can be found [here](https://github.com/jdneo/vscode-leetcode/wiki/Customize-the-Relative-Folder-and-the-File-Name-of-the-Problem-File).                                                                                                                                                                                   |                    |
-| **[Deprecated] Use `leetcode.filePath` instead** ~~`leetcode.outputFolder`~~            | ~~Specify the relative path to save the problem files. Besides using customized path, there are also several reserved words which can be used here: <ul><li>`${tag}`: Categorize the problem according to their tags.<li>`${language}`: Categorize the problem according to their language.</li><li>`${difficulty}`: Categorize the problem according to their difficulty.</li></ul>For example: `problem-${tag}-${difficulty}`~~ | ~~N/A~~            |
 | `leetcode.enableStatusBar`                                                              | Specify whether the LeetCode status bar will be shown or not.                                                                                                                                                                                                                                                                                                                                                                     | `true`             |
 | `leetcode.editor.shortcuts`                                                             | Specify the customized shorcuts in editors. Supported values are: `submit`, `test`, `solution` and `description`.                                                                                                                                                                                                                                                                                                                 | `["submit, test"]` |
 | `leetcode.enableSideMode`                                                               | Specify whether `preview`, `solution` and `submission` tab should be grouped into the second editor column when solving a problem.                                                                                                                                                                                                                                                                                                | `true`             |
diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md
index d69c62a7..8aced3a8 100644
--- a/docs/README_zh-CN.md
+++ b/docs/README_zh-CN.md
@@ -128,7 +128,6 @@
 | `leetcode.endpoint`                                                                | 指定使用的终端,可用终端有:`leetcode`, `leetcode-cn`                                                                                                                                                                                                                                           | `leetcode`         |
 | `leetcode.workspaceFolder`                                                         | 指定保存文件的工作区目录                                                                                                                                                                                                                                                                        | `""`               |
 | `leetcode.filePath`                                                                | 指定生成题目文件的相对文件夹路径名和文件名。点击查看[更多详细用法](https://github.com/jdneo/vscode-leetcode/wiki/%E8%87%AA%E5%AE%9A%E4%B9%89%E9%A2%98%E7%9B%AE%E6%96%87%E4%BB%B6%E7%9A%84%E7%9B%B8%E5%AF%B9%E6%96%87%E4%BB%B6%E5%A4%B9%E8%B7%AF%E5%BE%84%E5%92%8C%E6%96%87%E4%BB%B6%E5%90%8D)。 |                    |
-| **[Deprecated] 请使用 `leetcode.filePath`** ~~`leetcode.outputFolder`~~            | ~~指定保存文件时所用的相对文件夹路径。除了用户自定义路径外,也可以使用保留项,包括:<ul><li>`${tag}`: 根据题目的类别进行分类。<li>`${language}`: 根据题目的语言进行分类。</li><li>`${difficulty}`: 根据题目的难度进行分类。</li></ul>例如:`problem-${tag}-${difficulty}`~~                     | ~~N/A~~            |
 | `leetcode.enableStatusBar`                                                         | 指定是否在 VS Code 下方显示插件状态栏。                                                                                                                                                                                                                                                         | `true`             |
 | `leetcode.editor.shortcuts`                                                        | 指定在编辑器内所自定义的快捷方式。可用的快捷方式有: `submit`, `test`, `solution`, `description`。                                                                                                                                                                                               | `["submit, test"]` |
 | `leetcode.enableSideMode`                                                          | 指定在解决一道题时,是否将`问题预览`、`高票答案`与`提交结果`窗口集中在编辑器的第二栏。                                                                                                                                                                                                          | `true`             |
diff --git a/package.json b/package.json
index cc7b9eb1..ddc54134 100644
--- a/package.json
+++ b/package.json
@@ -369,11 +369,6 @@
                         "description": "The path of the workspace folder to store the problem files.",
                         "default": ""
                     },
-                    "leetcode.outputFolder": {
-                        "type": "string",
-                        "scope": "application",
-                        "description": "[Deprecated] The output folder to save the problem files."
-                    },
                     "leetcode.filePath": {
                         "type": "object",
                         "scope": "application",
diff --git a/src/commands/show.ts b/src/commands/show.ts
index 1265e6f7..70474426 100644
--- a/src/commands/show.ts
+++ b/src/commands/show.ts
@@ -144,10 +144,8 @@ async function showProblemInternal(node: IProblem): Promise<void> {
             return;
         }
 
-        const outputFolder: string = leetCodeConfig.get<string>("outputFolder", "").trim();
-
         const fileFolder: string = leetCodeConfig
-            .get<string>(`filePath.${language}.folder`, leetCodeConfig.get<string>(`filePath.default.folder`, outputFolder))
+            .get<string>(`filePath.${language}.folder`, leetCodeConfig.get<string>(`filePath.default.folder`, ""))
             .trim();
         const fileName: string = leetCodeConfig
             .get<string>(

From 1835d07495513e6603b721033b28a24ceb75e651 Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Sat, 18 Apr 2020 18:20:31 +0800
Subject: [PATCH 12/47] Prepare for 0.16.2 (#541)

---
 CHANGELOG.md      |   9 ++++
 package-lock.json | 123 ++++++++++++++++++++++++++--------------------
 package.json      |   4 +-
 3 files changed, 81 insertions(+), 55 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index bb9c73be..93ccefa0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,15 @@ All notable changes to the "leetcode" extension will be documented in this file.
 
 Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
 
+## [0.16.2]
+### Added
+- New Category: `Concurrency` [CLI#42](https://github.com/leetcode-tools/leetcode-cli/pull/42)
+- New configuration to better configure how to show the description [#310](https://github.com/jdneo/vscode-leetcode/issues/310)
+
+### Removed
+- Removed the deprecated setting `leetcode.enableShortcuts` [PR#520](https://github.com/jdneo/vscode-leetcode/pull/520)
+- Removed the deprecated setting `leetcode.outputFolder` [PR#521](https://github.com/jdneo/vscode-leetcode/pull/521)
+
 ## [0.16.1]
 ### Added
 - Can show the problem in current workspace even if it's not a LeetCode workspace [#373](https://github.com/jdneo/vscode-leetcode/issues/373)
diff --git a/package-lock.json b/package-lock.json
index 0a555853..0283fca9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
 {
     "name": "vscode-leetcode",
-    "version": "0.16.1",
+    "version": "0.16.2",
     "lockfileVersion": 1,
     "requires": true,
     "dependencies": {
@@ -86,11 +86,11 @@
             }
         },
         "ajv": {
-            "version": "6.9.1",
-            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz",
-            "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==",
+            "version": "6.12.0",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
+            "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
             "requires": {
-                "fast-deep-equal": "^2.0.1",
+                "fast-deep-equal": "^3.1.1",
                 "fast-json-stable-stringify": "^2.0.0",
                 "json-schema-traverse": "^0.4.1",
                 "uri-js": "^4.2.2"
@@ -146,9 +146,9 @@
             "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
         },
         "aws4": {
-            "version": "1.8.0",
-            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
-            "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
+            "version": "1.9.1",
+            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
+            "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="
         },
         "babel-code-frame": {
             "version": "6.26.0",
@@ -306,9 +306,9 @@
             "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="
         },
         "combined-stream": {
-            "version": "1.0.7",
-            "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
-            "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
+            "version": "1.0.8",
+            "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+            "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
             "requires": {
                 "delayed-stream": "~1.0.0"
             }
@@ -479,12 +479,12 @@
             "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
         },
         "escodegen": {
-            "version": "1.12.1",
-            "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.1.tgz",
-            "integrity": "sha512-Q8t2YZ+0e0pc7NRVj3B4tSQ9rim1oi4Fh46k2xhJ2qOiEwhQfdjyEQddWdj7ZFaKmU+5104vn1qrcjEPWq+bgQ==",
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz",
+            "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==",
             "optional": true,
             "requires": {
-                "esprima": "^3.1.3",
+                "esprima": "^4.0.1",
                 "estraverse": "^4.2.0",
                 "esutils": "^2.0.2",
                 "optionator": "^0.8.1",
@@ -492,9 +492,9 @@
             }
         },
         "esprima": {
-            "version": "3.1.3",
-            "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
-            "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+            "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
             "optional": true
         },
         "estraverse": {
@@ -538,14 +538,14 @@
             "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A="
         },
         "fast-deep-equal": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-            "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
+            "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA=="
         },
         "fast-json-stable-stringify": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-            "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+            "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
         },
         "fast-levenshtein": {
             "version": "2.0.6",
@@ -936,16 +936,16 @@
             }
         },
         "mime-db": {
-            "version": "1.38.0",
-            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz",
-            "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg=="
+            "version": "1.43.0",
+            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
+            "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ=="
         },
         "mime-types": {
-            "version": "2.1.22",
-            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz",
-            "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==",
+            "version": "2.1.26",
+            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
+            "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
             "requires": {
-                "mime-db": "~1.38.0"
+                "mime-db": "1.43.0"
             }
         },
         "mimic-fn": {
@@ -967,11 +967,18 @@
             "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
         },
         "mkdirp": {
-            "version": "0.5.1",
-            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-            "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+            "version": "0.5.5",
+            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+            "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
             "requires": {
-                "minimist": "0.0.8"
+                "minimist": "^1.2.5"
+            },
+            "dependencies": {
+                "minimist": {
+                    "version": "1.2.5",
+                    "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+                    "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+                }
             }
         },
         "moment": {
@@ -1135,9 +1142,9 @@
             "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg=="
         },
         "p-limit": {
-            "version": "2.2.2",
-            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
-            "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+            "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
             "requires": {
                 "p-try": "^2.0.0"
             }
@@ -1212,9 +1219,9 @@
             }
         },
         "psl": {
-            "version": "1.1.31",
-            "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
-            "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw=="
+            "version": "1.8.0",
+            "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+            "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
         },
         "pump": {
             "version": "3.0.0",
@@ -1344,9 +1351,9 @@
             }
         },
         "safe-buffer": {
-            "version": "5.1.2",
-            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-            "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
+            "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
         },
         "safer-buffer": {
             "version": "2.1.2",
@@ -1388,9 +1395,9 @@
             "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
         },
         "signal-exit": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
-            "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+            "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
         },
         "source-map": {
             "version": "0.6.1",
@@ -1602,9 +1609,9 @@
             }
         },
         "uuid": {
-            "version": "3.3.2",
-            "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
-            "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
+            "version": "3.4.0",
+            "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+            "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
         },
         "verror": {
             "version": "1.10.0",
@@ -1617,9 +1624,9 @@
             }
         },
         "vsc-leetcode-cli": {
-            "version": "2.6.22",
-            "resolved": "https://registry.npmjs.org/vsc-leetcode-cli/-/vsc-leetcode-cli-2.6.22.tgz",
-            "integrity": "sha512-/mKAQtwabtzZfbQlJO9k9qotx7qgtDFZnZ6TkO3NrfUyne2jTXLzDBN+/66fcXUyX5fpxKYBx81icChGRnT7CQ==",
+            "version": "2.6.23",
+            "resolved": "https://registry.npmjs.org/vsc-leetcode-cli/-/vsc-leetcode-cli-2.6.23.tgz",
+            "integrity": "sha512-icSErC6SFhtR9wNs00yv4UO7MktGgRFKwvNwl5L3Fprchr/iK6C09iUdn60ZsKcKsfTm0eBoLmvSTHZCHM2wXQ==",
             "requires": {
                 "ansi-styles": "3.2.1",
                 "cheerio": "0.20.0",
@@ -1634,6 +1641,16 @@
                 "underscore": "1.9.1",
                 "wordwrap": "1.0.0",
                 "yargs": "12.0.4"
+            },
+            "dependencies": {
+                "mkdirp": {
+                    "version": "0.5.1",
+                    "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+                    "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+                    "requires": {
+                        "minimist": "0.0.8"
+                    }
+                }
             }
         },
         "wcwidth": {
diff --git a/package.json b/package.json
index ddc54134..933ce6b6 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
     "name": "vscode-leetcode",
     "displayName": "LeetCode",
     "description": "Solve LeetCode problems in VS Code",
-    "version": "0.16.1",
+    "version": "0.16.2",
     "author": "Sheng Chen",
     "publisher": "shengchen",
     "license": "MIT",
@@ -675,6 +675,6 @@
         "markdown-it": "^8.4.2",
         "require-from-string": "^2.0.2",
         "unescape-js": "^1.1.1",
-        "vsc-leetcode-cli": "2.6.22"
+        "vsc-leetcode-cli": "2.6.23"
     }
 }

From 082876628ceb7b07806c07b6b457014397a98b65 Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Wed, 20 May 2020 19:41:37 +0800
Subject: [PATCH 13/47] Update third party notice

---
 thirdpartynotice.txt | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/thirdpartynotice.txt b/thirdpartynotice.txt
index 1f33cded..93c1b0f0 100644
--- a/thirdpartynotice.txt
+++ b/thirdpartynotice.txt
@@ -11,6 +11,7 @@ are grateful to these developers for their contribution to open source.
 4. lodash (https://github.com/lodash/lodash)
 5. markdown-it (https://github.com/markdown-it/markdown-it)
 6. leetcode-cli (https://github.com/skygragon/leetcode-cli)
+7. unescape-js (https://github.com/iamakulov/unescape-js)
 
 fs-extra NOTICES BEGIN HERE
 =============================
@@ -205,3 +206,31 @@ SOFTWARE.
 
 END OF leetcode-cli NOTICES AND INFORMATION
 ==================================
+
+unescape-js NOTICES BEGIN HERE
+=============================
+
+The MIT License (MIT)
+
+Copyright (c) Ivan Akulov <mail@iamakulov.com> (http://iamakulov.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+END OF unescape-js NOTICES AND INFORMATION
+==================================

From 9bf587782fc086ce75fa677ff199f764d939244b Mon Sep 17 00:00:00 2001
From: Jerry Zou <jerry.zry@outlook.com>
Date: Thu, 28 May 2020 14:22:57 +0800
Subject: [PATCH 14/47] chore: replace resources (#561)

---
 resources/LeetCode.png      | Bin 15437 -> 7031 bytes
 resources/LeetCode.svg      |  12 +++++-------
 resources/check.png         | Bin 3057 -> 235 bytes
 resources/dark/dislike.png  | Bin 700 -> 364 bytes
 resources/dark/like.png     | Bin 472 -> 498 bytes
 resources/light/dislike.png | Bin 599 -> 368 bytes
 resources/light/like.png    | Bin 418 -> 521 bytes
 resources/lock.png          | Bin 3160 -> 387 bytes
 resources/x.png             | Bin 3109 -> 225 bytes
 9 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/resources/LeetCode.png b/resources/LeetCode.png
index d068e69789afa0277908230fc9f89c106f5c5487..35461b5fe8c8e60fdd6c1d043047bbaff46b8f54 100644
GIT binary patch
literal 7031
zcmV--8;InIP)<h;3K|Lk000e1NJLTq005f+005{61^@s6_m7;900001b5ch_0Itp)
z=>Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@
z1ONa40RR91o1g;#1ONa40RR91r~m)}02}1()c^n*;Ymb6RCodHT?tqe$F{DT8D;|&
z(I_Y`+~9IiuTjys8zU|VxI;7wnoSd<QKLqqxw(EO*F=pkxk+9U_b6_0!3Ed2<HCy~
zSB*RF8;Dz6fMJ-KdZ)mN7^jEnnXaChp04jJx~J>ZsdN7Rsp{&k1tB>IiGUuIB|=;a
z@d88x#Cs4=K>QwJJBV_S5pWrS*FnQ|h@_0T7t-rOl!J@_Zv+&O;~R)&k*sw3Ly(W-
zU6P!^rxC#5{d|a}iR9=xZDQN_G<vf0ybzcL(vFhLmfTIqAHb_bS=c8L_!PXhMIgS{
zrurm$veOPDFhU@rQDWYJNSk9h$Ot@#0DZM#fylQ8vnSu;xl-f{K94{TK%fYsJ>oc%
zMhPtWK)da7a14Q0LF^ZZD#yfmNmb<~?WMvp*&MrZ%|UD(M6F}uyrmxT&LL-zBmxoO
z)m@0rG>?wv=_*O&WT$u`5C+n;x9BKooRKqvet%w8$-<IDAQ(J4578L{@yWAHa>&UJ
z@j@U7q>n@7LmFpfY0tI+FUw?MNg+U+v~-BhkcV%ck0gbh><ljiG$6eLB45%tBTt)8
z`O5*X+an!eCAg9T(HY|K&9fQG@skd8vL}2Hpf$`wh<r)ojC>lDqvK<oEGsPpz6N)k
zAr9X>nNUszX+bA@!v}#WAk3FE&d8sEa$ewLm@F$T1U>+FoFNY1JXfHc8q$JJ_J$7v
zNgyorP$63+yanaR6I}S*8HvgE0)I>pZIMIBYkxo)FG&nL*&QATbOKpA*+fWE+0vB<
zWwhmCmn<qV1n7uZI-JKAIfT4MKdyI^7<RHdJP>FIvaE*+QNo%bCh)LJ7L^zRe*=H$
zv^gPbFD_m0NDMpK9UcgTfb0c`T;ve)`gk68$)XZNfDRR+i@FF&C@x)}OAI^N9UchK
zndZMi<RXWV*MHz)m(Pkyb;1iBDzqLV?R_#0uhjRuRJ7oQn`B9q-eg%7pO_`(ETB>x
zPerHNt%lgsSx_9!7t>gc){UxwRLW8?VssXUsqKZh165RP!f`kA9n~jwxl$-e!d2?e
z&k*USD5jx(JwLQ{Tp-e^?Ldfe9yH<`kOHkhe-GV)BahHw;65AdAmx>qd<#~OWNmq~
z+A6ebVjwE7<Mk8*v$PcdK|1{$oN)00Ya2aLzm&)}6#)JxYmn=QDAB&j6;b7KyogrX
ztVdAO{e%Ma({S(0^xLV=1g8=6FoZ^fJ<N$#tC9k3|0vKEqEXn&!B~^==utryNv<-C
zkSS8R2W3)13N_mh@Nxk}roL1ykBe)xI>7=j^?}hbgjH|i#G7;!ucU*w|5x>ayE6|W
zQ=$dxG1@jh5D88+N-csKBVtY`i>iD`2x006EzX_6o1KeNV6??Tn5-)F=RMJ@QE}7R
zx(=MM4j65P|C_-$=~gc5qTHe1D{Hn!HC0g>6?>woVRGNv4=Ny0h(_-|fniAmWsu}*
zP2E8T)@6Df*}61RwZEKe-co2{TcgqUv`gPDkGeFXA0xyJqy{vr`^n;}bYBHY1+OC8
zkT$xOnU~Bv9~p?iPwCI!)7fv7L;YH?T8{1c@}9Xuhz=356nd*O$jW#+d0G;|Yo6IA
z_R=?7ve%G){l10yO!BY#2cWUhbY~!s2)`ngwm%+t^}a_~<AM=hQL|0#p$T7|UU)zZ
zqW!an-jj$%Z*3Q3HXI_$g1vsVBabKBq(1tP)FY;&=Wm&rKRmtPNr$HPr6ZF(ED#iq
ziY)2StoHIS%XpdN(PWztk1A}<G@d+p!_0hT#(}Lg=(|J@B-+#4Sq^%tDL}Y?dF%T)
zk9}qv8I3fV7gU!IoHNlCAen}^m((Z)UU57#RETMbE-J@(9jXwRgnOR#s)e6DwPwSo
zuBuOqK{Ocrh*rMuMMR@KC8QVn;}2+7L&II9t*F^Ol58+2@z~Cj#xT}MM8Z&^4Wla{
zt-Ud6tc`G5KWTtS(IK*=S{J8Ph@8>mn$f<In*D1s3Yl+>7*S1$(qO1irGQfZZy4W)
z=b}u6aTX$$tm2~r-9{Fr3Mt{0i^ZaXudo3yGqfQbVOa$Xk%U1W_u+`a8lw0Z56+n>
zGIw|v=RS~ZnEHAv&4y*^g>g2L1ie(dvI6Y~qE!!q_oW!a!Y_C&!j=>i8nGL9+(Xv@
zaX65rH7mlaiPu2Ko6x+`%{kl?FkXhVesAN1>jmyHpzKmThHOLHX&3&y&oHEHlU<Vt
zu0V+vh+Yi#JB=`zga!@YfbkT%nvu%^J~1_fn(kdtGz@Ax=3hCUGZ;gyj8wgG(#@;S
zrFp;wk09I7S9M>_+g<P>jNo8uPem9iv~yy`+$LdulaZ$VLY%OQE|nm7Ad9LsLD)18
z2q*prb&PWnR`kP(+4}@{%teJvZ>}S@z2C|I<2ifs{#|5dOEiBNA@s}p752n5(Z<3M
z9=gI1(@^|PvvA)SWFenHZ723e)*_@(jKYaIKQeWar*gNF?Sn4*p>y}-|5RXPOEfxE
z=-b4AUxqDwGyr2vCnt**$l{PlSZii2)N-Ms6>2RA<GDy%c?3>4Nmo^JdvF`sKI|3{
zKW}f|iiZWHRCiE#JYaw&8Piq&<E*Xu?+dTpF^$EOmrXF2mAGNOHjEA;t-dc#xSZpd
zwd|zaLbh=+{!u@t<!`<7h(MjgG>|tsXy-57YjFF@LL{S^A3AmYd+4zaW$LkQ<u{O0
z(HjrSIcz&woU5Xf?V}$0$ff%X={N4fJ1fQkzIU!&nqElfDR@kvGpb;A)puYJ^Py7D
zI*koTfrr6!+~Q}ii}y=ZvVGiLQ}>sQqT?5HEzC!7^lPr!v-)shNAaL^yd<)?8Z3Wm
zUIVpU6~}W4B#9NXP-6CYv7cS3^`en&a;&cU+DzlwQ#aX<;D~)meQe`VBfQ=B+(4F8
z4@G9vI_Rl36W>Za8ztquCpO`jKAc-YoYD&gZvMUKgcwANYM{OVL~CL#+f$Et(2eV;
zrVeU2yhMB($uP7eMDz|5^O}tg70Sp`T}eN0V!oVI+q$ak5I<AxRVR^0boCu25m{Vi
zEXYoW-YV-3(^He^qBmN<dhmG*)*ullFs<3*<B{^jW%U^`h!z>9y4SkCsh+nHjoxOQ
zlsgL^Xrkflo;bH1N+HA_8H(N$tvo1*DcSPRsgLbGZLH1Op@!9!k73GP#EcEa%g(bd
zj){Jpn7bWm)Gc6O09}?<oIub(aSAFag&EoUM5+&LI%aIZ+L`dGN<(Z*zsA!x<iY3-
z?+&>CwF~gZzZKMSDdKoSYLk`0FNjkXqnd3%E6v7~3}b87PSgxi6!mScZTaOI!$sC*
ziKQPtEj>nwxB3C${soc!r!@nvC6;f3*KC8^Y8Nd}FN|UBK$Y^?{8}4z=jj{sj<GIF
zZ2k0=1U$!0g(kHZl+Adafkm`ViJ)YAr=#wF79TJqvc5U6s*okIjjrF!RKs4@Ww}#7
zPQ0}NVdcwULl!eT{FFDD>Hdpi!N@i|N<VpFTES?-cubnV29cz8nzv_d$%hxB(hoQ(
z`!p)AhmHeX;Yi?s@m)ON<~4z}a;g)AY$Lnq-&>fL|Cx#Lm^8Htk-=?s<G<ZzSjg#-
z1QUvvLrokW1B9C)tb2Hsu=?z4bNQw2nC<}y^LN2eAp_fm?C4OTcV5wcIeWKZl6{w?
zoeD$G`-6uI;60hnB~R%@83k^F2i^MJB|SVcyHvA{kJENYPRm=)nrPq;fjJ6ueVu6Z
zzQQQu6^JO?K<D8qkNa#xRPl|NM56{cO}5EBbv06cE82GFG26k9)W|`tH7N_y48!QT
z9Ds0xZ~hl)aU>AVxegM>dr%GSCt_pi6xoJ0Lw?&&6lGq>Wxv=<d<)I4B?k-pi4BaW
zmxmK_ZlfB1j{@rbhu8Z!j5mXCvAE-9gV;Vg^~~0@sXAkQrjhy3n7AhD%+&v~FGp<9
zg)WaQ4(<Sxs=oofFLCNFX?CYVGd!PDhH(OKvW@7h8}<G6g0I0Y-g)`>(z&5JYx@af
zJ;=lUEjk~=JXn@24Q_!<mabspKj7|^gIh#Lznp~QKBR58jn&jeCXh_(;a@ehqJla=
z3BWA2tE;|2n`$Ob$V$Bff$ojfw42O~WK?(aFx8!pdeHw$IruCB<GSi&;9VD8rhpmQ
z8igt!ejJTN8-?JrH`CJ{ZwpNuOQO{cRu)X`rLFDhILP)fMqpHw_8lmKS&ar8kQpcR
z^l!x24OzW6Ai%O#t6E-R8Xu!==M6Z>HZn$lPAX>gtX9z<o5w}#nXkvj7$RA{PzdyG
zuA!eq1aCqEG}tn#t2Rj}J7qoIj{t_n^GrgMO{GMZ5nXg+ydNIf1Hlj&9qmtN-w0l-
z4Q#1dFPM?CB55E%KY|NQHad}58tBMg@I}DxsE?D^O)dB;v?mWuvbk-9s+Bz%IZe6<
za4uU#-{gO})hy`Nbe$snHhj6xaM{z~+_r67nAvO&vsf%uV5=U{W*d1L4)*L(C=?dJ
z<~GDDadB}@O~BzKo58H_O-R0ABReX<jHp^Ks9?H(p*^2OOUuZ}&}V07kAeaR8;!-I
zOGGQ%8w-Me#6QhWO-;Q7KbC5>+OIly?)>1-gfdPzo6);@mQH2l<(1qiLVeIvX031B
zxUpkSPR@C7U>Za^j7bjs5C{YDPYedbh0U8c)48n<1x~WvdT0^!^HJ@p%9##X#8?Q3
zHVBIN6`F$(#zpyp`btpar2wWQ9dVYknQRrVx&^Bb39>RGZ9*U97jLyqU!%A!z<*&I
zcs8RwY*?sX4gw-zfm!@LVq;@B+0)5cvjI5-+k6xDiMj(uxRq$TckfmK(ddw9nP~PH
z;anQ!(Omi*Y%e<}+3r3j8haV}q=g14#ajl7!?67Pe7Y=z{CviNkE@sIV+nM)M%dHC
zNw$Xu3ul@=g|^Z(Ds<o0buq627z4yC&qvFm6R0@@C!shW<~UVxCn%NJtvkihCKRlD
zh1)_oMIZ#4?AWoR5|=JcvT<c_=DHH2d}s0rmFMx}$5o+blPAy!1*jc8g@uJRxRN=^
zh6SwJV7EQNp8vQUv3DJMO6BdP%W1+P0RPnGxU_MSt(;cz^p!DJZU?Xbk!Oi;P?U+7
zN~QApB~Y0F!$2wgV{>B7Nw!J>u>Fic0bUT-6iAg*YPxmnMpxnH1i>k#awb~{<m>hN
ztF{v8HBPbx`r}7jnfPA6anBOOHxC2(R0cX_m8B4XT5WsBjvYBGDNeGL*D3Cn(&N(U
z)q57z*f_eIiTeVKT9^%Bxb?-d`@9#eWV@T`a+2+Za*E>unuxFET0Rv}A8%DLF)<nN
z@VcCLMmd9{2>c44tG3w_<|JFi0JPIyM!snomx|i+%_FqDQmLeygPj&yudEMU)9G|c
zW#Pa{HoeZUjxH@)mI6o9>9&ufyJ?3wD$hc$d-v`S{rvp80^uaLoIMM?9MK6_W<hVi
zb5vARnH?~@Z`0rddLHbgXZPc(BL-Pzn$}j`&%A7MduIVg=K2>E6@3oP>Ts}4{xEO7
zLHv$pAld@RG69-ThdxKzB^%5cO<QxgupK`e>`M=QRX1zSu7Yv)rNl|yzI}U57y#HG
zK#PVF!+?BrNR>P++y?xBQSq>FI9`S1ZGhDZXNQN|P>&FcH9o3WR1{5!M-^-qC|{H`
z0-Vom)a#oS4GV(&u|-G(=-%*0&#2Rd)G6zd2m-JL_EB(!b`%7SueZ|3FIgqR5y9LT
z+fCO;XrfVl@S)!_tdo{bIFW;lz*7Y1ijeS2(3*|v)2WeVWEb5BPfL=|d>(<fI_Q3&
z<X{nt3D;RS*5^T%0VqL$uG}3~SwUwPGa;PT4_Sss`A?MbmJujM;O+Lh?^%(J>V+Nm
zEbn#Fek#K)BY@)Lk&^Dm&XRC`ux{JCuWCP+;g%6VPZscF(v(_BOcx3q_Nwkn8EzQ?
z1l#<avl4^VQK>+dp|AzG47ZOXFtLXw9EOaWSrN^umo6Ip<T=sD5%+QT-|eKG3J}oG
zSWKH#`r`M^_S)G#4!7)n?@0AQ)?}mlDdFB|r=>$#<X{H@vc6t9va*3->$BJ?%IPG#
zLyYWcrSIM{?y7FV__T`l<OE71gWGABE!t<G%U#I<5Fn}5^yt3j4LIuwKU>3|@%~SM
zc?8=((u!ams-gec9h=xbvE#Xe(`2KXK8{n@Uy*J)cIl2qi~)!wv5j_h@&QA_b6)t^
z1(IBK0FY}IJj8_9bseMY2rEb9#OyV8<wQ!fJH)6g8@@<2o{4X+>F{K)gtEk4O~*jA
z_<^l7DXuE=*8DJF5tHO9GmwQWE0bu{NrFO=#k`s%2h(S4w+EMMHmmhxqxI1X(+W1;
z%Oft4*Q&3q<A7G0P0P~@W6P40QaU9XN)G-BYP6wF`GxT)*s}Xur}7GvNf5G8TgG$`
zNceeg-tzk*5$?5@HNXDyTVYp$aPVj~E)$J<hmi@XP&52`?s0cHD_BkR_2$Pb-)yIi
zhj(y-j_l<E28h-rp=47KE)hvwe?qj`PS<Ew6bMkwg#T^*>5ijdHJjCVy35|8{RL}p
zKN4p@fj*I%{V5s3PRg<R;_hQ9qS5_cT@Q3>Ce~HQiC3~+SH@q1U^Sby=&!cqrw(bS
zkA;0i=~o8k0f^SNcQfhDX(%Sz;@~+@qX|PadMAKt$YP)~$=nhICmZ!*=H|SuiEZ><
zMCzrYwMUFCdp1>PxCKE5h5ku2MBZkgzAgiu4yj~9Hd^vmTORL9Y_E=jse2}eEOAk2
zeWtP5lgT+QYI1LO#zdpeRdSby%*aL^nwe_YJE*m$LyaIskr)ncJZfwl-B?XmCKvo!
zR1Et?AR4$q{t&|#TV*gM8!d49rh<b5T5H<Ys-!U5GC=5STaFnUbZw+QHDwC-+H*pe
zDTKaaq9q5<1v0Q`I-i=TP+WZaL)<gwWTWoP*jR9AKpSmKn8zRr;kNy5tbcH|`Yat?
zEH0eRmG&pm2zkpn4Louwh}~tacxd7+Dr$2xp{IYN)#--A7jn%S-j+I%p;H6(r5Clv
zdUK8-QJQflOoYy6@t1*laPp=z`FZ9!fCuNgZBa&1YBnn%)7R(yp3qF$v`%pGTn6i9
zX2+c;jbT~&>hmL`-Md;jmxCe`4I!0s5|=GvTo;vW)S)l77*F+Us%l&>L@CNf9J@~&
zYaY9(IzJ{J>BIok(K19Q8oVID1GCc{wU33I=wzc#e6hLkT<_L?4PpH^Q8wd9J8KF(
zd`xv=To+^=^Th&7hjkJ%MS&Iv&ljob1iSEBlr(&T!v-=E6!n?yuRctO*VWu~(0KC1
z4YMdCOzF0k?IKKdW^6!@{%VU@ze|Yr<2>kfz9CAP7_UPSp$Rzhh})lA-AXnJ_T*Sy
z_0;1<r;lGXaqbKv<V|_`Mb({Gnwr9=uR;!QH!W28zDzWVq1(wujhNI&AF}y~@$}Iv
zCQ%j%Y!RlqH>#U|_`n|@IJ7(`wb9i8^8?hV;Ld!g(Zm_r?m;!06+5>)vsnwb9;c<`
zXGcTxM%Uc6USoMYbjcL7?ug+cSyrt+%W|x`$;#Tn$Z&hNFB6So;Spq`hJ3LF-R|1N
zRHr%AI`lW|u<B4@;EMfunPhPYU4M>Q0R553kbf9PT(o9Z$TNzeGvFc5XwR4hKRlut
zEo~HCZ+B0o>ilmPOqEMtXK@~0MTyQ#4?;?%VlMJieuf9!ye3pRP-|93Cd)+VagKl*
zO_Z0|#l6l3p|5#DXTTPY9!EB6<VQVFxqYWpS?T9ZRc#q9<h8vY2cq`%VR9J8@F|VV
zM+(1bc+idO&Xz&vZ=#3yKZGgVbj>+YIz7d<Vw8d+YV`M1qEQ<?l5Es4`cCZsE~~Qk
zpEKE?u11Aj2oq!U=!=9>Z(b<r2-ykb+lq*4D;|8~Tv_T#axJjY5CctREX2-0TEX^?
zD68z^bT1$pwbNtCMvbFy{f``1oue;h>2DSRrXr%1BkXj7F}?!jW<ksaBHaeWZo{!0
z!lW9^*RKXgYFk~n<{m65(P~7zhCA*tvA{=2ohl)f39akvRj6QOv?*MvP@kiporKm;
z_1()WV}1@HwLpx<l0a8Cp`rK)f2_Ytu8RBDi-<;n@tEEy*IoK<3o5LmH-^&@99%N4
zTo3a1cnEB}htV2usnM(scm>jQh)__3u}<d(>ho5^g*w7&nnI}(PfrQa`g=puSsE0t
zAR9G!)hcA(e$rSMM&X_*?SQN2pwCqm;^y~KqEV2%hHOvnD1lM95z+rppA_N_*9%sn
zwsrl4P$ia*)zEZ$U5#c1$J@w8?Iv4}8ymt*Dwp>R{j9G)Qo<6KUJ_QLnh^uMt?4X{
ztv8ab*nXHv^%Be#JyO~kKId<>*P{3qT0U9aDeLt_qu_Zh*{Ja_S2VK!%i4W>>!!Yu
z8uY(O;=SCbwmKaYXpy(qXjb3(-Y085k2+3@)6ZUzW_Ty(fyJ&rdgu#Gj`N2_4E6AV
zz^<rg_=nL9lz3|**y_%=d4gf#1&BN5>$Pu!`mQ=;T)OT^q2^##5qtwL$wwV*P+f_7
zHPfKsopdN9&?{bbSm3{5EUc&Yjbq+>hm>T<M&TyO)tVxUX@$v5>fC;0K}Pt16B4LE
zYL!>HnS+#g5FT`Er*}}uaVx#*E;!;ASzOg0J|RJkz<6f4BgXKR!3ZW0<0Poja`|TU
z26@Sm%?diKJ=+UN_X9+xqeiUdxpu_&kOF^#24(*wmFF{CczAVh)RsfmYdA4?9n=za
z;MwPMh@#9<wU*7}NT1E-!0h3=I5Fo(DHDxiBH5a)^bIG=tJOe7rm5iW>o8W$6TVMT
zlC42X)igZt#?jKYO8ML;$Y#BP#e*Czh7s^DHVjB7{yJqPHEc4%elv06b-@P}SpD?W
zqfe2|dJ{@^M=|$+PDDJ^cF{mQc1ts01k1hRT`<scDGIERf_t8I+XQK=|L!{aB-u)X
zUA*6u;chg-mRF!N(FS58NO$#FHVc}`J)noi9a8OGf^WQn&y(%1XcbRbdGMeq)Oz7S
zyuU$u7&N;fa1NgxU~w7(^9$&n0ti2ZG?-OS9w4l^0>`sZd!2>jX_;JqMYZJj{{z~E
V*?5*yDenLP002ovPDHLkV1ldwNeBP{

literal 15437
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%0Ao`s
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
D)Sv-e

diff --git a/resources/LeetCode.svg b/resources/LeetCode.svg
index a3bac1f0..3a80c1b4 100644
--- a/resources/LeetCode.svg
+++ b/resources/LeetCode.svg
@@ -1,11 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<svg width="15px" height="16px" viewBox="0 0 15 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <!-- Generator: Sketch 57 (83077) - https://sketch.com -->
-    <title>Combined Shape</title>
-    <desc>Created with Sketch.</desc>
-    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="Artboard" transform="translate(-439.000000, -612.000000)" fill="#303133" fill-rule="nonzero">
-            <path d="M448.617144,612.16769 C448.808341,612.363282 448.826418,612.663731 448.673533,612.879152 L448.608191,612.955578 L446.15,615.357 L449.894886,619.007259 C450.093972,619.194817 450.124399,619.494266 449.98051,619.715797 L449.918369,619.794848 C449.707367,620.01882 449.354751,620.029333 449.13078,619.818331 L449.13078,619.818331 L445.354,616.136 L440.170212,621.203943 C440.111737,621.261104 440.099007,621.347469 440.132652,621.417331 L440.166592,621.46592 L445.358074,626.829135 C445.415144,626.888093 445.501806,626.90111 445.571922,626.867432 L445.620685,626.833408 L445.623532,626.830592 L449.13805,623.278672 C449.354479,623.05994 449.707246,623.058073 449.925978,623.274502 C450.120407,623.466883 450.143485,623.766988 449.994209,623.984926 L449.930149,624.06243 L446.415631,627.61435 L446.395701,627.634062 C445.914207,628.100138 445.16516,628.119545 444.661422,627.700626 L444.55742,627.604151 L439.365938,622.240936 C438.901478,621.761111 438.880378,621.015175 439.29562,620.511206 L439.391276,620.407102 L447.829256,612.158737 C448.049297,611.94364 448.402047,611.947648 448.617144,612.16769 Z M446.514534,621 L453.485466,621 C453.769635,621 454,621.223858 454,621.5 C454,621.74546 453.817984,621.949608 453.577954,621.991944 L453.485466,622 L446.514534,622 C446.230365,622 446,621.776142 446,621.5 C446,621.25454 446.182016,621.050392 446.422046,621.008056 L446.514534,621 L453.485466,621 Z" id="Combined-Shape"></path>
+<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>LeetCode</title>
+    <g id="LeetCode" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="lc(1)-copy" transform="translate(1.000000, 0.000000)" fill="#303133" fill-rule="nonzero">
+            <path d="M6.88695652,15.9652174 C5.94782609,15.9652174 5.04347826,15.6173913 4.3826087,14.9565217 L1.39130435,12 C1.28695652,11.8956522 1.1826087,11.7913043 1.11304348,11.6869565 C0.417391304,10.8173913 0.139130435,9.70434783 0.382608696,8.66086957 C0.452173913,8.4173913 0.52173913,8.20869565 0.626086957,8 L0.660869565,7.89565217 L0.695652174,7.82608696 L0.730434783,7.75652174 C0.8,7.65217391 0.869565217,7.51304348 0.973913043,7.40869565 C1.04347826,7.33913043 1.11304348,7.23478261 1.1826087,7.16521739 L7.6173913,0.243478261 C7.72173913,0.139130435 7.86086957,0.0695652174 8.03478261,0.0695652174 C8.17391304,0.0695652174 8.31304348,0.139130435 8.4173913,0.208695652 C8.66086957,0.417391304 8.66086957,0.8 8.45217391,1.00869565 L6.53913043,3.06086957 L7.26956522,3.16521739 C7.93043478,3.26956522 8.52173913,3.51304348 9.00869565,3.93043478 L11.4434783,5.91304348 C11.6869565,6.12173913 11.7217391,6.46956522 11.5130435,6.71304348 C11.4086957,6.85217391 11.2347826,6.92173913 11.0608696,6.92173913 C10.9217391,6.92173913 10.8173913,6.88695652 10.7130435,6.7826087 L8.27826087,4.8 C7.82608696,4.45217391 7.23478261,4.24347826 6.60869565,4.24347826 C5.84347826,4.24347826 5.11304348,4.52173913 4.66086957,5.00869565 L1.9826087,7.86086957 C1.42608696,8.48695652 1.25217391,9.35652174 1.56521739,10.1913043 L1.6,10.2956522 C1.73913043,10.6086957 1.94782609,10.9217391 2.19130435,11.1652174 C2.19130435,11.1652174 5.14782609,14.0521739 5.1826087,14.0869565 C5.63478261,14.5391304 6.26086957,14.7826087 6.92173913,14.7826087 C7.5826087,14.7826087 8.20869565,14.5391304 8.66086957,14.0521739 L10.3304348,12.3826087 C10.4347826,12.2782609 10.573913,12.2086957 10.7478261,12.2086957 C10.8869565,12.2086957 11.026087,12.2782609 11.1652174,12.3826087 C11.373913,12.5913043 11.373913,12.973913 11.1652174,13.1826087 L9.49565217,14.8521739 C8.76521739,15.5826087 7.86086957,15.9652174 6.88695652,15.9652174 Z M5.9826087,10.0869565 C5.66956522,10.0869565 5.42608696,9.84347826 5.42608696,9.53043478 C5.42608696,9.2173913 5.66956522,8.97391304 5.9826087,8.97391304 L13.0434783,8.97391304 C13.3565217,8.97391304 13.6,9.2173913 13.6,9.53043478 C13.6,9.84347826 13.3913043,10.0869565 13.0782609,10.0869565 L5.9826087,10.0869565 Z" id="Shape"></path>
         </g>
     </g>
 </svg>
\ No newline at end of file
diff --git a/resources/check.png b/resources/check.png
index ad7077dffcfe6bd7ae200c13b983e982e1b6160d..84d2d1007e2fec3b72d5157ea6b530444dc24518 100644
GIT binary patch
delta 219
zcmew;{+e-uL_G^L0|P^2NcwRg#ggvm>&U>cv7h@-A}f&3SRCZ;#IWw1%u66gF~BFp
z)hDwsa=S*<4)vIwT9Mn;BX_6+$>`l6GHX9b<hOiSC{Qt1NswPKLrS;f*Z4=8-+3zb
z8|(p!26?(ThG?8mPLOD6Fy-`h$dc3wnO}G{$b@w@%LNe~l`zKT7PFX^sj{t5+pw<4
z&DfE91<O$`wFN>U+FPbcEZWtW87e+YddmgblP${{8V}YiSj@!mT3F0^OSh*d(0B$<
LS3j3^P6<r_wu?&B

literal 3057
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

diff --git a/resources/dark/dislike.png b/resources/dark/dislike.png
index 4a4fe0202483583ef0d5278b9be337aca5ce2a96..47f17c57de149b767426486c1c7891ebb80bc36e 100644
GIT binary patch
delta 348
zcmdnP`i5zOWIZzj1B1(wu46!oCEd~2k%3`jKlh(RRv@3TILO_JVcj{Imq3ndfKQ04
zPiEnP0|yQsJP0I#VE_L8$BrEXGR~Yi0~GxK|36R!$b~3?un!+T3}gVop+kotjMhD_
zj6eg$N`m}?8S1+t-rsvGw3gMD@t}|P?(%%el%M7`2Xof#11eeU>EaktaqH|vPrkzn
zJPc>|v2ObOf4Ny`Z&Qcv*BO?Pvo=~X<R4<I{Bi#UzvP<*&a1@TZmbr0X1)Bv@106+
zUYDQ!{1&ZxbJq4Qz9~l&R`PJOwQ_T@&Ehs;>*Bt$UtCCBg~u;c&%*FT%ml{5E#((Z
zSU>%Kr(WzJkNHJGewP;?QokHsoYgA*&6daIVzuDIlPR;zgeR=wJHP&b;mat~b(en#
c*zD=!7ZFj7&)WKz7wBFFPgg&ebxsLQ0BrT76aWAK

delta 687
zcmV;g0#N<z0=xx~8Gi%-007x@vVQ;o00Lr5M??VshmXv^0007YNkl<ZNXPAz%S+Tz
z6vyxQm?U~pSfZKI-w+igG}WRog4*<0R!~;kC_-CCMGz(tEkhDg49i6k76YPlKj-I<
z9^g<|q%JbcMK%sOqI6o!Z~V>6$3V;OZ}q$Pp3gbwd(J(^{C{8na%qvAly1hDlOOgK
zr^02alW-ZQdCdfKjPcAK*P=Y;wiXx7_{QakF~-PI#xqZ>(_fQoK8`ZXS*JQ0w6$Ec
zqbO>xa|1;g;exG=2AyhYU<Bn`211K)QC{|~_V>bNwuxC3W!5(O=@`QrdQc=S5l)~C
zr<*62?Bf@c?0?PPch}lc)E@IMcB67GpRhJ$LwWblqdfH^7(<=vLMql@gYwk}%%JYd
zLIBTKppx(b!)Rnzfj#qxFFv3drL(ZM>nOH|{fsseL*>k32AMU=shBjNOh*nbWG<H(
z>Z_cOcoQFNQ+8qQER2xLD9T5t!izVGqP8*n+D(+1w13P}{;r`Y6DaRxLvJ~Q-k;hl
z%RqSMmz-+(jN<YRWvH)`t9cL_pg9u}E|C`~({{Hp9zv69MD{R)ayz@e0q$lZqCvV)
z;x^<Vh9XtQP{$N1E%{m`2jP~|i4sdj;dzgvJkUV?F3UlLOQano#!h35p^i9eALgA)
zDTK77BY%3!lhQ@1j4_7Id_v_-Wc^~j9^f9z_wXuXoC*eg>C)sJc)M;<guP{V7~@nB
zO?jt|sWds4iXxdkQIy~AmU-zsIR~~%0;OlkS0{%gfl9lxpEydZZ9|FK5KmBk%C==Z
zT<Rr(@(1N{M{!57ZS($?XKsu!a)4=+F1Iu}2`FeqnT%{NV0=(dXEf*!6S<%A{uffP
V3>enx1@-^{002ovPDHLkV1l;*McDuV

diff --git a/resources/dark/like.png b/resources/dark/like.png
index 613fccd4a02d9c514bfab713760aaf1c768432e3..d77896123ed59a02c35564e57d46c80e2878b7c4 100644
GIT binary patch
literal 498
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^)
z4C~IxyaaM`0(?STeKHI8@85s)=usef;J|@{2M+?tQ>RV=NeBRnL!{s&oN?&TA)p!{
z_v+QFKn6rFkc22WdGaKX0pUVOtNbrvKzo%-g8YIRo(k-V)cV7A|AX(hO{?pZPnYK(
zl<9iQJl)*ZOr%fvqFtxkj~fB)K;>UOT^vIyZk?TQb6T^40BfLNLGSNrwqO7Mw@`0O
z^hvoF?C<)W)o=R`wL`Aw9(x~;)O+au`x+C^_ilmdbqpE#x9iqc7<yPngl;X6Y1lI{
z_<)zeNi}x9Lq%QzpEP%cEb#hUveLuP?81SYuP)A5eAU<_Oqt`ZK|R~V&}PBtvZpO4
z#5+7<wtQmM`tIbt?0fCpi&46YciDq9)*cJ^S*P&t>z&-Uxx05-ACa8tUF~hka(CN(
z)_{C&))^JW_Z<xPofUEXBrwgLY2v>byBMnWzLM1_n=M)Wz>3>2zA>)CgFRuE2+zt7
tmqgb*nfs&vO2fwMe_y0teDwMU<2GHfpSosUPk{lz;OXk;vd$@?2>=Tb^e_Mb

delta 457
zcmV;)0XF{f1K0zQ8Gi%-007x@vVQ;o00Lr5M??VshmXv^0004zNkl<ZNQv!`u}&0G
z6o!W_$VP*9bQ|_LtiZx-Ln4hzi6#P)_yW=rtPmv-^%*RHj;Ptj-SeHzHWt(ih08`8
zuo(y>zs0N$12Z_Y8Y}->-E+_P-E(gc{LkNvN<Qt|bUE{{_J4tydim!`z05;C@{KdP
zY}tL4QgEx%Mv2w)yFm~HK1DBiVy(v5WxR*z@VHgk9kwb9wvUi4v5XLVJhAHTaI4~T
z>>&;k3YBOhc0P^7wR+hWIYo$5dlo+@2)My}gr9o|4-lR6coe_Q5r<4%thaC4KC*jp
z<2Lfyw2!rM8-Gu&&m%VD3A(6NNo&kXV+`>n7M!5=wIYJg*O4E`f(~llDk5M4(TTUK
zh<AkqJIL04Z5yL}NB$@;?z4z6@oPSZ2%EJ$c(dlm$evy(+e$t~vqp$`kv7<K#EDH_
zg>xqp&!gz$s~XB^&=4=P6@C15CVsUd7oM%?<8OY8M?wmJl~feMFDv@^+uV3kF%TXp
zSVx3}i1osFq_8zK(Cx9pH+*AYJW~7-{!j7)D@0%2sNNKS00000NkvXXu0mjfTy@rt

diff --git a/resources/light/dislike.png b/resources/light/dislike.png
index b514f0f3223cdc878233d86e4427ac161b65ee05..4ced195dcf60ed39d75d30df3d82b5b843cb6c03 100644
GIT binary patch
literal 368
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^)
z4C~IxyaaMQ0(?STeKHHx)z$6o?SZ74nwplD7LWu2O-)S*1Hv{pHwP*J0-!jMgiFEM
zr+f?^0L>IH3GxeO@L?&xC)D-McEiEl+H8{1=J~5qeumaW-(~#=RI=F9#WAGf*4c@k
ze1{cy80K!6u_49($AACXtK3wtOshIGN9U{rr{uhr!sB=9kJZ`D$=ve!C)3)UUfu6+
z?!L9!=YdJ$%&XV)XQpc3Q;=V<FySN<H>)ET6KfQg39AO{kN4bhTsExBMdpaOXm&X8
z?2%s}P=4<HMmw?QrmnBo*9S~?dhOg)z0vG9XH?ExU4xPcld=Owd|&<xs#wk4ysUKI
elbELCADKQ%sQvU*-`)gtE`z75pUXO@geCx}d3?42

delta 585
zcmV-P0=E6|0@nnP8Gi%-007x@vVQ;o00Lr5M??VshmXv^0006INkl<ZNXPBe-)qfr
z9LMp;b~u&{5tbRt-yp=w!3B}x#*a&spSL27OChCMl1nX$ny?#b`~g^^wrFHrnBfAm
zY-{p%alSj}?Cdz(%B9cu>h=D7UeC|_{rc3G|LdQwN_({F^?%D}5A9Wz+o`h8BVYW|
z>z-XIOWEsnh%sNE?O=z#qMav}jkos+Jr1aoR`00yLOA2B5Z*bWURs?)-U%PaA}VzV
z4^$V_s+=++gb|Ge<1kyh@VIc0-9pb8dv<N`-8bvU)#rFG?93P1go7o6&B&Cj9~SQB
zWv@^-r59T!e1FKxVPWQ!05gQ4yzCLyObJlwy0>}RB(zQmK+3kfSg2pvU)E4vM&Xb!
zX!Bp~$8}qrQ;WQGs`$voGKk|sc%>%kw@V0(#mCMG!-bP2>$DKQ2rtaHKxd-DiOC?c
z_G9Y25js2<x-E9H6rw^?5n`JA!l1Pzh)B{{XIQvU+<!xbOGSvZJHmiWg6LL@20w)6
zQh|*}OxG&(CtYN39}uppDE(yP5!2if`mF{H283&+|4XBY<}ru`Np!VfiPyq2^C*Y7
zEPOHxH98BT%g6cD-13O?R-r~$?)C;h3gVowi|q7W!cR+c(T&Er+>p>d5rD0Rgj+Tm
z5L(<2`a)&g7QR|BF@P<Ggx|tVDJeG+HAy>cGAP_J9i+4f->jUhJ=;aAbWWvQ8NK}v
Xli1|nJR2A100000NkvXXu0mjf^gbip

diff --git a/resources/light/like.png b/resources/light/like.png
index 0f7081d2a74f7186174e7495b02d9eb2456ab686..92b845de5dfcb57cf04356fe45ceb742c1f6ed1e 100644
GIT binary patch
literal 521
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^)
z4C~IxyaaMe1AIbUeKHF*H8s`L)a>l+3=Iu|41IllAPE8L>grlrT0k~X4Ui3F07(b~
zt^mkbvt|v1i!2CNrlFyM%m%8_i*5G+IzX)?$S;_|`~U~*6M=hw-g{|v*;cHL5>EcQ
zTPBF{&Gd#XeP{DeUes9`Ti_sksNE3gd<IV!$B>F!XD3GT9Wvl?xooEB`O?c<{G0Fl
zf9@_*1e9(u8^oWVwNdr<qxoA-?e^Fg=oY*0*T&Bh2`91?U*#}#e7>O1lYev7CO+Sf
zU(FBvE0h<Ve5IoPP2<_)>vfk^Ic_peC_CA$-MlvT0SkNk#A_1|GtZIPw&Bz18qTP8
zDOIs07y5KQ1}Pl-#d&<`0l~M6eT}|PKE{8~(VV{|z#`^wrJTj#Ux$A`$U0c+9Umht
zHNPxa`iyCX*oxd2`Jy6@cker_Z?5CrZue$_?u{?OOU0soZZ73aDdI|Zu-xr4pK-cJ
z#|x&Ey)(3B8wyPfmLvt<p5(bSKEuwXvFz>XNtJp>@4w`Xo+z>9;nc8Qz|dpxboFyt
I=akR{0K<H|bpQYW

delta 403
zcmV;E0c`$>1fm0w8Gi%-007x@vVQ;o00Lr5M??VshmXv^00047Nkl<ZNXPAwJx&5q
z7)1{hglN>xj=(ysz{1d&XyZ?*CW4x{0d0*|iV}#r1`DMl>H;+EVW1F+Hfl2vNUp_8
z90nMiL1X1N)xF=GGkI^|e|~kstWu&*hZpWxBl@+8vd%rPbbqLG!!qGPc!COYJq;EB
zSftUjc_iMCHxL$^#E6h!hZ;g0aEK69wn-2nMwTk#*{ujuL6n*3>Z0t^Mu;|hUB`h*
zZV?aN2U$T_F5Jv4@4S)f>!+w8mYkx5$PB#LB*}sO7UJ58bwn)CAB!WNoY+E)1rm%S
znohJ3Gl2vtgn#A49O5dFpp3{nahearhHpHBu-&(oMcAZ$;c1$P-QN1xry`AwI2p7$
zLbRA4iqCoDeiR1J5%PK=#OV-)!Oy+%;R;{4x5D5T-{VGc)}si7_bUv3=^uA1M#7Dv
xfUvO<h2XeR<k4tfcN9g6qvJ;LBm6Js6PRC@{a13X<O~1+002ovPDHLkV1kB1yCMJp

diff --git a/resources/lock.png b/resources/lock.png
index 8c6fa7fdd7ed8ddc9a2a74ce1828c13817c0102d..c9ce37743fdaad8553a9f718caa761235b8d94aa 100644
GIT binary patch
literal 387
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^)
z4C~IxyaaMQ0(?STeKHIGFP8kjQ0)KJ(EqFD|1S~)u@{NM7?LmsOnjjPSOJhL0a6B1
z43fI{TKqK7O!1N+zhDNNOU#^yo`kIa;#SqWs3;-+?`9Llojcw;iEafd+2-lu7*cWT
z?4;X#hZF=@xmme%_l7_J|34&iszB`Q89yG_OxSEWS>RCE|F)MU9J`F?{|eo_IDF@Q
zCYJ2WJ3E_N@7;O-@}O5O_jTpi1)?n+uRORGDSS!jOIaY!!hfFQU-rVzdyVxB=Z-I1
z@tU=9={cu%kLj$v9p?`9oS4IEbgtU{S?q?F`foZ7mSx%qe%o%YerUq7hb{%H)=izv
zGE;}e#c5-X(zY9Bokj1LDa06rvbve-YXtx8kiKK3)WUUseJ#)j44$rjF6*2UngHQL
Bs0jc7

literal 3160
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

diff --git a/resources/x.png b/resources/x.png
index 57709cdb580bc338e2177c7c7785c4a6997df556..64a5fc7e256d3d3b99fbe980942af7da049bffc1 100644
GIT binary patch
delta 209
zcmZ1~@sM$XL_G^L0|P^2NcwRg#ggvm>&U>cv7h@-A}f&3SRCZ;#IWw1%u66gD8MJg
z)hDy?y}Qc?cbAVIuAh9|-n%=$$uG$S%CeRO`2{ni%=Ojy+;-&)P$0(B#W6(Vd~(79
z@dBfU3um+f7_T~T=t{AO8t{rT1okXE7{GWeV1t)XV28yVPEj`v#~_Ah3fc_Xj)4q8
zO^X<ou!J%$W7s9e<9u=L(E^EGmkn*&AJ+CT9O7`g#mq3XMkIKSNy=NGMGT&<elF{r
G5}E*S6-5dF

literal 3109
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


From 672de39302def1c85e10a6293a394853ca355c74 Mon Sep 17 00:00:00 2001
From: yihong <zouzou0208@gmail.com>
Date: Tue, 2 Jun 2020 22:00:33 +0800
Subject: [PATCH 15/47] Update README_zh-CN.md (#566)

* Update README_zh-CN.md

* Update README_zh-CN.md
---
 docs/README_zh-CN.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md
index 8aced3a8..59b62e3f 100644
--- a/docs/README_zh-CN.md
+++ b/docs/README_zh-CN.md
@@ -34,7 +34,7 @@
 
 ## 运行条件
 - [VS Code 1.23.0+](https://code.visualstudio.com/)
-- [Node.js 8+](https://nodejs.org)
+- [Node.js 10+](https://nodejs.org)
     > 注意:请确保`Node`在`PATH`环境变量中。您也可以通过设定 `leetcode.nodePath` 选项来指定 `Node.js` 可执行文件的路径。
 
 ## 快速开始

From a11fb1d857f3f019ba6060b85eb85716f1b4ece4 Mon Sep 17 00:00:00 2001
From: yihong <zouzou0208@gmail.com>
Date: Tue, 2 Jun 2020 22:00:49 +0800
Subject: [PATCH 16/47] Update README.md (#565)

* Update README.md

* Update README.md
---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index fecddd1b..7bc7decb 100644
--- a/README.md
+++ b/README.md
@@ -33,7 +33,7 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 
 ## Requirements
 - [VS Code 1.30.1+](https://code.visualstudio.com/)
-- [Node.js 8+](https://nodejs.org)
+- [Node.js 10+](https://nodejs.org)
     > NOTE: Please make sure that `Node` is in your `PATH` environment variable. You can also use the setting `leetcode.nodePath` to specify the location of your `Node.js` executable.
 
 ## Quick Start

From d1307f1d27e0bd48e61397d2e4a85b5bc708299d Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Thu, 4 Jun 2020 16:33:34 +0800
Subject: [PATCH 17/47] chore: Update badge urls (#569)

---
 README.md            | 12 ++++++------
 docs/README_zh-CN.md | 12 ++++++------
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/README.md b/README.md
index 7bc7decb..164da0bf 100644
--- a/README.md
+++ b/README.md
@@ -3,20 +3,20 @@
 > Solve LeetCode problems in VS Code
 
 <p align="center">
-  <img src="https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/resources/LeetCode.png" alt="">
+  <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/resources/LeetCode.png" alt="">
 </p>
 <p align="center">
-  <a href="https://travis-ci.org/jdneo/vscode-leetcode">
-    <img src="https://img.shields.io/travis/jdneo/vscode-leetcode.svg?style=flat-square" alt="">
+  <a href="https://travis-ci.org/LeetCode-OpenSource/vscode-leetcode">
+    <img src="https://img.shields.io/travis/LeetCode-OpenSource/vscode-leetcode.svg?style=flat-square" alt="">
   </a>
   <a href="https://gitter.im/vscode-leetcode/Lobby">
-    <img src="https://img.shields.io/gitter/room/jdneo/vscode-leetcode.svg?style=flat-square" alt="">
+    <img src="https://img.shields.io/gitter/room/LeetCode-OpenSource/vscode-leetcode.svg?style=flat-square" alt="">
   </a>
   <a href="https://marketplace.visualstudio.com/items?itemName=shengchen.vscode-leetcode">
     <img src="https://img.shields.io/visual-studio-marketplace/d/shengchen.vscode-leetcode.svg?style=flat-square" alt="">
   </a>
-  <a href="https://github.com/jdneo/vscode-leetcode/blob/master/LICENSE">
-    <img src="https://img.shields.io/github/license/jdneo/vscode-leetcode.svg?style=flat-square" alt="">
+  <a href="https://github.com/LeetCode-OpenSource/vscode-leetcode/blob/master/LICENSE">
+    <img src="https://img.shields.io/github/license/LeetCode-OpenSource/vscode-leetcode.svg?style=flat-square" alt="">
   </a>
 </p>
 
diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md
index 59b62e3f..8a2a191f 100644
--- a/docs/README_zh-CN.md
+++ b/docs/README_zh-CN.md
@@ -3,20 +3,20 @@
 > 在 VS Code 中练习 LeetCode
 
 <p align="center">
-  <img src="https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/resources/LeetCode.png" alt="">
+  <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/resources/LeetCode.png" alt="">
 </p>
 <p align="center">
-  <a href="https://travis-ci.org/jdneo/vscode-leetcode">
-    <img src="https://img.shields.io/travis/jdneo/vscode-leetcode.svg?style=flat-square" alt="">
+  <a href="https://travis-ci.org/LeetCode-OpenSource/vscode-leetcode">
+    <img src="https://img.shields.io/travis/LeetCode-OpenSource/vscode-leetcode.svg?style=flat-square" alt="">
   </a>
   <a href="https://gitter.im/vscode-leetcode/Lobby">
-    <img src="https://img.shields.io/gitter/room/jdneo/vscode-leetcode.svg?style=flat-square" alt="">
+    <img src="https://img.shields.io/gitter/room/LeetCode-OpenSource/vscode-leetcode.svg?style=flat-square" alt="">
   </a>
   <a href="https://marketplace.visualstudio.com/items?itemName=shengchen.vscode-leetcode">
     <img src="https://img.shields.io/visual-studio-marketplace/d/shengchen.vscode-leetcode.svg?style=flat-square" alt="">
   </a>
-  <a href="https://github.com/jdneo/vscode-leetcode/blob/master/LICENSE">
-    <img src="https://img.shields.io/github/license/jdneo/vscode-leetcode.svg?style=flat-square" alt="">
+  <a href="https://github.com/LeetCode-OpenSource/vscode-leetcode/blob/master/LICENSE">
+    <img src="https://img.shields.io/github/license/LeetCode-OpenSource/vscode-leetcode.svg?style=flat-square" alt="">
   </a>
 </p>
 

From 7705ce717207bf2203dca2eacebc8b9c2013f26f Mon Sep 17 00:00:00 2001
From: Nathan Esau <nathanesau1@gmail.com>
Date: Sat, 27 Jun 2020 04:03:17 -0400
Subject: [PATCH 18/47] Add ts support (#573)

---
 README.md            |   2 +-
 docs/README_zh-CN.md |   2 +-
 package-lock.json    | 422 +++++++++++++++----------------------------
 package.json         |   5 +-
 src/shared.ts        |   2 +
 5 files changed, 152 insertions(+), 281 deletions(-)

diff --git a/README.md b/README.md
index 164da0bf..07b9b68b 100644
--- a/README.md
+++ b/README.md
@@ -122,7 +122,7 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
 | `leetcode.hideSolved`                                                                   | Specify to hide the solved problems or not                                                                                                                                                                                                                                                                                                                                                                                        | `false`            |
 | `leetcode.showLocked`                                                                   | Specify to show the locked problems or not. Only Premium users could open the locked problems                                                                                                                                                                                                                                                                                                                                     | `false`            |
-| `leetcode.defaultLanguage`                                                              | Specify the default language used to solve the problem. Supported languages are: `bash`, `c`, `cpp`, `csharp`, `golang`, `java`, `javascript`, `kotlin`, `mysql`, `php`, `python`,`python3`,`ruby`,`rust`, `scala`,`swift`                                                                                                                                                                                                        | `N/A`              |
+| `leetcode.defaultLanguage`                                                              | Specify the default language used to solve the problem. Supported languages are: `bash`, `c`, `cpp`, `csharp`, `golang`, `java`, `javascript`, `kotlin`, `mysql`, `php`, `python`,`python3`,`ruby`,`rust`, `scala`, `swift`, `typescript`                                                                                                                                                                                                        | `N/A`              |
 | `leetcode.useWsl`                                                                       | Specify whether to use WSL or not                                                                                                                                                                                                                                                                                                                                                                                                 | `false`            |
 | `leetcode.endpoint`                                                                     | Specify the active endpoint. Supported endpoints are: `leetcode`, `leetcode-cn`                                                                                                                                                                                                                                                                                                                                                   | `leetcode`         |
 | `leetcode.workspaceFolder`                                                              | Specify the path of the workspace folder to store the problem files.                                                                                                                                                                                                                                                                                                                                                              | `""`               |
diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md
index 8a2a191f..194c43d7 100644
--- a/docs/README_zh-CN.md
+++ b/docs/README_zh-CN.md
@@ -123,7 +123,7 @@
 | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
 | `leetcode.hideSolved`                                                              | 指定是否要隐藏已解决的问题                                                                                                                                                                                                                                                                      | `false`            |
 | `leetcode.showLocked`                                                              | 指定是否显示付费题目,只有付费账户才可以打开付费题目                                                                                                                                                                                                                                            | `false`            |
-| `leetcode.defaultLanguage`                                                         | 指定答题时使用的默认语言,可选语言有:`bash`, `c`, `cpp`, `csharp`, `golang`, `java`, `javascript`, `kotlin`, `mysql`, `php`, `python`,`python3`,`ruby`, `rust`, `scala`,`swift`                                                                                                                | `N/A`              |
+| `leetcode.defaultLanguage`                                                         | 指定答题时使用的默认语言,可选语言有:`bash`, `c`, `cpp`, `csharp`, `golang`, `java`, `javascript`, `kotlin`, `mysql`, `php`, `python`,`python3`,`ruby`, `rust`, `scala`, `swift`, `typescript`                                                                                                                | `N/A`              |
 | `leetcode.useWsl`                                                                  | 指定是否启用 WSL                                                                                                                                                                                                                                                                                | `false`            |
 | `leetcode.endpoint`                                                                | 指定使用的终端,可用终端有:`leetcode`, `leetcode-cn`                                                                                                                                                                                                                                           | `leetcode`         |
 | `leetcode.workspaceFolder`                                                         | 指定保存文件的工作区目录                                                                                                                                                                                                                                                                        | `""`               |
diff --git a/package-lock.json b/package-lock.json
index 0283fca9..1144cdac 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4,6 +4,11 @@
     "lockfileVersion": 1,
     "requires": true,
     "dependencies": {
+        "@types/color-name": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+            "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
+        },
         "@types/fs-extra": {
             "version": "5.0.0",
             "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
@@ -86,9 +91,9 @@
             }
         },
         "ajv": {
-            "version": "6.12.0",
-            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
-            "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
+            "version": "6.12.2",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
+            "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==",
             "requires": {
                 "fast-deep-equal": "^3.1.1",
                 "fast-json-stable-stringify": "^2.0.0",
@@ -146,9 +151,9 @@
             "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
         },
         "aws4": {
-            "version": "1.9.1",
-            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
-            "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="
+            "version": "1.10.0",
+            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
+            "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA=="
         },
         "babel-code-frame": {
             "version": "6.26.0",
@@ -329,18 +334,6 @@
             "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
             "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
         },
-        "cross-spawn": {
-            "version": "6.0.5",
-            "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-            "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-            "requires": {
-                "nice-try": "^1.0.4",
-                "path-key": "^2.0.1",
-                "semver": "^5.5.0",
-                "shebang-command": "^1.2.0",
-                "which": "^1.2.9"
-            }
-        },
         "css-select": {
             "version": "1.2.0",
             "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
@@ -460,13 +453,10 @@
                 "safer-buffer": "^2.1.0"
             }
         },
-        "end-of-stream": {
-            "version": "1.4.4",
-            "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
-            "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-            "requires": {
-                "once": "^1.4.0"
-            }
+        "emoji-regex": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
         },
         "entities": {
             "version": "1.1.2",
@@ -479,9 +469,9 @@
             "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
         },
         "escodegen": {
-            "version": "1.14.1",
-            "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz",
-            "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==",
+            "version": "1.14.3",
+            "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+            "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
             "optional": true,
             "requires": {
                 "esprima": "^4.0.1",
@@ -508,20 +498,6 @@
             "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
             "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
         },
-        "execa": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
-            "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
-            "requires": {
-                "cross-spawn": "^6.0.0",
-                "get-stream": "^4.0.0",
-                "is-stream": "^1.1.0",
-                "npm-run-path": "^2.0.0",
-                "p-finally": "^1.0.0",
-                "signal-exit": "^3.0.0",
-                "strip-eof": "^1.0.0"
-            }
-        },
         "extend": {
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -538,9 +514,9 @@
             "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A="
         },
         "fast-deep-equal": {
-            "version": "3.1.1",
-            "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
-            "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA=="
+            "version": "3.1.3",
+            "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+            "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
         },
         "fast-json-stable-stringify": {
             "version": "2.1.0",
@@ -554,11 +530,12 @@
             "optional": true
         },
         "find-up": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-            "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+            "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
             "requires": {
-                "locate-path": "^3.0.0"
+                "locate-path": "^5.0.0",
+                "path-exists": "^4.0.0"
             }
         },
         "forever-agent": {
@@ -592,17 +569,9 @@
             "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
         },
         "get-caller-file": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
-            "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="
-        },
-        "get-stream": {
-            "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-            "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-            "requires": {
-                "pump": "^3.0.0"
-            }
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+            "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
         },
         "getpass": {
             "version": "0.1.7",
@@ -734,11 +703,6 @@
                 "number-is-nan": "^1.0.0"
             }
         },
-        "is-stream": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
-            "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
-        },
         "is-typedarray": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
@@ -749,11 +713,6 @@
             "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
             "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
         },
-        "isexe": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-            "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
-        },
         "isstream": {
             "version": "0.1.2",
             "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@@ -872,12 +831,11 @@
             }
         },
         "locate-path": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-            "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+            "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
             "requires": {
-                "p-locate": "^3.0.0",
-                "path-exists": "^3.0.0"
+                "p-locate": "^4.1.0"
             }
         },
         "lodash": {
@@ -893,14 +851,6 @@
                 "chalk": "^2.0.1"
             }
         },
-        "map-age-cleaner": {
-            "version": "0.1.3",
-            "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
-            "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
-            "requires": {
-                "p-defer": "^1.0.0"
-            }
-        },
         "markdown-it": {
             "version": "8.4.2",
             "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
@@ -918,34 +868,17 @@
             "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
             "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
         },
-        "mem": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
-            "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
-            "requires": {
-                "map-age-cleaner": "^0.1.1",
-                "mimic-fn": "^2.0.0",
-                "p-is-promise": "^2.0.0"
-            },
-            "dependencies": {
-                "mimic-fn": {
-                    "version": "2.1.0",
-                    "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-                    "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
-                }
-            }
-        },
         "mime-db": {
-            "version": "1.43.0",
-            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
-            "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ=="
+            "version": "1.44.0",
+            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+            "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
         },
         "mime-types": {
-            "version": "2.1.26",
-            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
-            "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
+            "version": "2.1.27",
+            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+            "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
             "requires": {
-                "mime-db": "1.43.0"
+                "mime-db": "1.44.0"
             }
         },
         "mimic-fn": {
@@ -962,29 +895,19 @@
             }
         },
         "minimist": {
-            "version": "0.0.8",
-            "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-            "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+            "version": "1.2.5",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+            "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
         },
         "mkdirp": {
-            "version": "0.5.5",
-            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
-            "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
-            "requires": {
-                "minimist": "^1.2.5"
-            },
-            "dependencies": {
-                "minimist": {
-                    "version": "1.2.5",
-                    "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-                    "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
-                }
-            }
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+            "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
         },
         "moment": {
-            "version": "2.24.0",
-            "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
-            "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
+            "version": "2.27.0",
+            "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz",
+            "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ=="
         },
         "mute-stream": {
             "version": "0.0.8",
@@ -1023,19 +946,6 @@
             "resolved": "https://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz",
             "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY="
         },
-        "nice-try": {
-            "version": "1.0.5",
-            "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
-            "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
-        },
-        "npm-run-path": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
-            "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
-            "requires": {
-                "path-key": "^2.0.0"
-            }
-        },
         "nth-check": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
@@ -1126,21 +1036,6 @@
                 "lcid": "^1.0.0"
             }
         },
-        "p-defer": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
-            "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww="
-        },
-        "p-finally": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
-            "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
-        },
-        "p-is-promise": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
-            "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg=="
-        },
         "p-limit": {
             "version": "2.3.0",
             "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
@@ -1150,11 +1045,11 @@
             }
         },
         "p-locate": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-            "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+            "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
             "requires": {
-                "p-limit": "^2.0.0"
+                "p-limit": "^2.2.0"
             }
         },
         "p-try": {
@@ -1169,20 +1064,15 @@
             "optional": true
         },
         "path-exists": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-            "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+            "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
         },
         "path-is-absolute": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
             "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
         },
-        "path-key": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-            "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
-        },
         "path-parse": {
             "version": "1.0.6",
             "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
@@ -1223,15 +1113,6 @@
             "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
             "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
         },
-        "pump": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-            "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-            "requires": {
-                "end-of-stream": "^1.1.0",
-                "once": "^1.3.1"
-            }
-        },
         "punycode": {
             "version": "2.1.1",
             "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
@@ -1315,9 +1196,9 @@
             "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
         },
         "require-main-filename": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
-            "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+            "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
         },
         "resolve": {
             "version": "1.10.0",
@@ -1351,9 +1232,9 @@
             }
         },
         "safe-buffer": {
-            "version": "5.2.0",
-            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
-            "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
+            "version": "5.2.1",
+            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
         },
         "safer-buffer": {
             "version": "2.1.2",
@@ -1374,26 +1255,14 @@
         "semver": {
             "version": "5.6.0",
             "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
-            "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg=="
+            "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+            "dev": true
         },
         "set-blocking": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
             "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
         },
-        "shebang-command": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-            "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
-            "requires": {
-                "shebang-regex": "^1.0.0"
-            }
-        },
-        "shebang-regex": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-            "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
-        },
         "signal-exit": {
             "version": "3.0.3",
             "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
@@ -1459,11 +1328,6 @@
                 "ansi-regex": "^2.0.0"
             }
         },
-        "strip-eof": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
-            "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
-        },
         "supports-color": {
             "version": "5.5.0",
             "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -1605,6 +1469,14 @@
                     "version": "0.9.2",
                     "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
                     "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0="
+                },
+                "mkdirp": {
+                    "version": "0.5.5",
+                    "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+                    "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+                    "requires": {
+                        "minimist": "^1.2.5"
+                    }
                 }
             }
         },
@@ -1624,14 +1496,14 @@
             }
         },
         "vsc-leetcode-cli": {
-            "version": "2.6.23",
-            "resolved": "https://registry.npmjs.org/vsc-leetcode-cli/-/vsc-leetcode-cli-2.6.23.tgz",
-            "integrity": "sha512-icSErC6SFhtR9wNs00yv4UO7MktGgRFKwvNwl5L3Fprchr/iK6C09iUdn60ZsKcKsfTm0eBoLmvSTHZCHM2wXQ==",
+            "version": "2.7.0",
+            "resolved": "https://registry.npmjs.org/vsc-leetcode-cli/-/vsc-leetcode-cli-2.7.0.tgz",
+            "integrity": "sha512-y0VEcdv1j61hblxBMQWGqdKC4TgGm9tu+9lvoMXz4RaDzwkmzfFpNMo32tMrJGiP23kk+IiXz6r41M1vcL2OlQ==",
             "requires": {
                 "ansi-styles": "3.2.1",
                 "cheerio": "0.20.0",
                 "he": "1.2.0",
-                "mkdirp": "0.5.1",
+                "mkdirp": "^1.0.4",
                 "moment": "^2.20.1",
                 "nconf": "0.10.0",
                 "ora": "3.0.0",
@@ -1640,17 +1512,7 @@
                 "supports-color": "5.5.0",
                 "underscore": "1.9.1",
                 "wordwrap": "1.0.0",
-                "yargs": "12.0.4"
-            },
-            "dependencies": {
-                "mkdirp": {
-                    "version": "0.5.1",
-                    "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-                    "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
-                    "requires": {
-                        "minimist": "0.0.8"
-                    }
-                }
+                "yargs": "^15.3.1"
             }
         },
         "wcwidth": {
@@ -1676,14 +1538,6 @@
                 "tr46": "~0.0.1"
             }
         },
-        "which": {
-            "version": "1.3.1",
-            "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-            "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-            "requires": {
-                "isexe": "^2.0.0"
-            }
-        },
         "which-module": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
@@ -1762,90 +1616,104 @@
             "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
         },
         "yargs": {
-            "version": "12.0.4",
-            "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.4.tgz",
-            "integrity": "sha512-f5esswlPO351AnejaO2A1ZZr0zesz19RehQKwiRDqWtrraWrJy16tsUIKgDXFMVytvNOHPVmTiaTh3wO67I0fQ==",
+            "version": "15.3.1",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
+            "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
             "requires": {
-                "cliui": "^4.0.0",
+                "cliui": "^6.0.0",
                 "decamelize": "^1.2.0",
-                "find-up": "^3.0.0",
-                "get-caller-file": "^1.0.1",
-                "os-locale": "^3.0.0",
+                "find-up": "^4.1.0",
+                "get-caller-file": "^2.0.1",
                 "require-directory": "^2.1.1",
-                "require-main-filename": "^1.0.1",
+                "require-main-filename": "^2.0.0",
                 "set-blocking": "^2.0.0",
-                "string-width": "^2.0.0",
+                "string-width": "^4.2.0",
                 "which-module": "^2.0.0",
-                "y18n": "^3.2.1 || ^4.0.0",
-                "yargs-parser": "^11.1.0"
+                "y18n": "^4.0.0",
+                "yargs-parser": "^18.1.1"
             },
             "dependencies": {
                 "ansi-regex": {
-                    "version": "3.0.0",
-                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-                    "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+                    "version": "5.0.0",
+                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+                    "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+                },
+                "ansi-styles": {
+                    "version": "4.2.1",
+                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+                    "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+                    "requires": {
+                        "@types/color-name": "^1.1.1",
+                        "color-convert": "^2.0.1"
+                    }
                 },
                 "cliui": {
-                    "version": "4.1.0",
-                    "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
-                    "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+                    "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
                     "requires": {
-                        "string-width": "^2.1.1",
-                        "strip-ansi": "^4.0.0",
-                        "wrap-ansi": "^2.0.0"
+                        "string-width": "^4.2.0",
+                        "strip-ansi": "^6.0.0",
+                        "wrap-ansi": "^6.2.0"
                     }
                 },
-                "invert-kv": {
-                    "version": "2.0.0",
-                    "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
-                    "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA=="
+                "color-convert": {
+                    "version": "2.0.1",
+                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+                    "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+                    "requires": {
+                        "color-name": "~1.1.4"
+                    }
+                },
+                "color-name": {
+                    "version": "1.1.4",
+                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
                 },
                 "is-fullwidth-code-point": {
-                    "version": "2.0.0",
-                    "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-                    "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+                    "version": "3.0.0",
+                    "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+                    "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
                 },
-                "lcid": {
-                    "version": "2.0.0",
-                    "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
-                    "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
+                "string-width": {
+                    "version": "4.2.0",
+                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+                    "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
                     "requires": {
-                        "invert-kv": "^2.0.0"
+                        "emoji-regex": "^8.0.0",
+                        "is-fullwidth-code-point": "^3.0.0",
+                        "strip-ansi": "^6.0.0"
                     }
                 },
-                "os-locale": {
-                    "version": "3.1.0",
-                    "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
-                    "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
+                "strip-ansi": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+                    "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
                     "requires": {
-                        "execa": "^1.0.0",
-                        "lcid": "^2.0.0",
-                        "mem": "^4.0.0"
+                        "ansi-regex": "^5.0.0"
                     }
                 },
-                "string-width": {
-                    "version": "2.1.1",
-                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-                    "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+                "wrap-ansi": {
+                    "version": "6.2.0",
+                    "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+                    "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
                     "requires": {
-                        "is-fullwidth-code-point": "^2.0.0",
-                        "strip-ansi": "^4.0.0"
+                        "ansi-styles": "^4.0.0",
+                        "string-width": "^4.1.0",
+                        "strip-ansi": "^6.0.0"
                     }
                 },
-                "strip-ansi": {
+                "y18n": {
                     "version": "4.0.0",
-                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-                    "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-                    "requires": {
-                        "ansi-regex": "^3.0.0"
-                    }
+                    "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+                    "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
                 }
             }
         },
         "yargs-parser": {
-            "version": "11.1.1",
-            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
-            "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
+            "version": "18.1.3",
+            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+            "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
             "requires": {
                 "camelcase": "^5.0.0",
                 "decamelize": "^1.2.0"
diff --git a/package.json b/package.json
index 933ce6b6..1a7c206c 100644
--- a/package.json
+++ b/package.json
@@ -295,7 +295,8 @@
                             "ruby",
                             "rust",
                             "scala",
-                            "swift"
+                            "swift",
+                            "typescript"
                         ],
                         "scope": "application",
                         "description": "Default language for solving the problems."
@@ -675,6 +676,6 @@
         "markdown-it": "^8.4.2",
         "require-from-string": "^2.0.2",
         "unescape-js": "^1.1.1",
-        "vsc-leetcode-cli": "2.6.23"
+        "vsc-leetcode-cli": "2.7.0"
     }
 }
diff --git a/src/shared.ts b/src/shared.ts
index d9d156d8..9b6a749a 100644
--- a/src/shared.ts
+++ b/src/shared.ts
@@ -36,6 +36,7 @@ export const languages: string[] = [
     "rust",
     "scala",
     "swift",
+    "typescript",
 ];
 
 export const langExt: Map<string, string> = new Map([
@@ -55,6 +56,7 @@ export const langExt: Map<string, string> = new Map([
     ["rust", "rs"],
     ["scala", "scala"],
     ["swift", "swift"],
+    ["typescript", "ts"],
 ]);
 
 export enum ProblemState {

From 75051806161e02c5071d29f99e3fe6f062d45f60 Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Sat, 27 Jun 2020 16:26:30 +0800
Subject: [PATCH 19/47] Prepare for 0.17.0 (#586)

* Prepare for 0.17.0

* Update marketplace URL
---
 CHANGELOG.md         | 7 +++++++
 README.md            | 4 ++--
 docs/README_zh-CN.md | 4 ++--
 package-lock.json    | 2 +-
 package.json         | 4 ++--
 5 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 93ccefa0..ffa84ef5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,13 @@ All notable changes to the "leetcode" extension will be documented in this file.
 
 Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
 
+## [0.17.0]
+### Added
+- Add TypeScript support [#560](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/560)
+
+### Changed
+- Update the UI resources [PR#561](https://github.com/LeetCode-OpenSource/vscode-leetcode/pull/561)
+
 ## [0.16.2]
 ### Added
 - New Category: `Concurrency` [CLI#42](https://github.com/leetcode-tools/leetcode-cli/pull/42)
diff --git a/README.md b/README.md
index 07b9b68b..4cbf9b6f 100644
--- a/README.md
+++ b/README.md
@@ -12,8 +12,8 @@
   <a href="https://gitter.im/vscode-leetcode/Lobby">
     <img src="https://img.shields.io/gitter/room/LeetCode-OpenSource/vscode-leetcode.svg?style=flat-square" alt="">
   </a>
-  <a href="https://marketplace.visualstudio.com/items?itemName=shengchen.vscode-leetcode">
-    <img src="https://img.shields.io/visual-studio-marketplace/d/shengchen.vscode-leetcode.svg?style=flat-square" alt="">
+  <a href="https://marketplace.visualstudio.com/items?itemName=LeetCode.vscode-leetcode">
+    <img src="https://img.shields.io/visual-studio-marketplace/d/LeetCode.vscode-leetcode.svg?style=flat-square" alt="">
   </a>
   <a href="https://github.com/LeetCode-OpenSource/vscode-leetcode/blob/master/LICENSE">
     <img src="https://img.shields.io/github/license/LeetCode-OpenSource/vscode-leetcode.svg?style=flat-square" alt="">
diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md
index 194c43d7..89d7d10f 100644
--- a/docs/README_zh-CN.md
+++ b/docs/README_zh-CN.md
@@ -12,8 +12,8 @@
   <a href="https://gitter.im/vscode-leetcode/Lobby">
     <img src="https://img.shields.io/gitter/room/LeetCode-OpenSource/vscode-leetcode.svg?style=flat-square" alt="">
   </a>
-  <a href="https://marketplace.visualstudio.com/items?itemName=shengchen.vscode-leetcode">
-    <img src="https://img.shields.io/visual-studio-marketplace/d/shengchen.vscode-leetcode.svg?style=flat-square" alt="">
+  <a href="https://marketplace.visualstudio.com/items?itemName=LeetCode.vscode-leetcode">
+    <img src="https://img.shields.io/visual-studio-marketplace/d/LeetCode.vscode-leetcode.svg?style=flat-square" alt="">
   </a>
   <a href="https://github.com/LeetCode-OpenSource/vscode-leetcode/blob/master/LICENSE">
     <img src="https://img.shields.io/github/license/LeetCode-OpenSource/vscode-leetcode.svg?style=flat-square" alt="">
diff --git a/package-lock.json b/package-lock.json
index 1144cdac..2332f2e1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
 {
     "name": "vscode-leetcode",
-    "version": "0.16.2",
+    "version": "0.17.0",
     "lockfileVersion": 1,
     "requires": true,
     "dependencies": {
diff --git a/package.json b/package.json
index 1a7c206c..90d6f0e1 100644
--- a/package.json
+++ b/package.json
@@ -2,9 +2,9 @@
     "name": "vscode-leetcode",
     "displayName": "LeetCode",
     "description": "Solve LeetCode problems in VS Code",
-    "version": "0.16.2",
+    "version": "0.17.0",
     "author": "Sheng Chen",
-    "publisher": "shengchen",
+    "publisher": "LeetCode",
     "license": "MIT",
     "icon": "resources/LeetCode.png",
     "engines": {

From 7aeb97eecbf3362c0331faf8c3840a56d66f00d9 Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Mon, 29 Jun 2020 10:52:04 +0800
Subject: [PATCH 20/47] Update the URLs (#587)

---
 .github/ISSUE_TEMPLATE/question.md |   6 +-
 ACKNOWLEDGEMENTS.md                |  38 +++----
 CHANGELOG.md                       | 160 ++++++++++++++---------------
 README.md                          |  34 +++---
 docs/README_zh-CN.md               |  34 +++---
 package.json                       |   4 +-
 6 files changed, 138 insertions(+), 138 deletions(-)

diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md
index 6253f0a4..c697e09a 100644
--- a/.github/ISSUE_TEMPLATE/question.md
+++ b/.github/ISSUE_TEMPLATE/question.md
@@ -3,11 +3,11 @@ name: 💬 Questions / Help
 about: If you have questions, please check our documents first
 ---
 
-Before you submit an question we recommend you to check out the [DOCUMENT](https://github.com/jdneo/vscode-leetcode/blob/master/README.md) first.
+Before you submit an question we recommend you to check out the [DOCUMENT](https://github.com/LeetCode-OpenSource/vscode-leetcode/blob/master/README.md) first.
 
 You can also find more information in:
-- [TROUBLESHOOTING](https://github.com/jdneo/vscode-leetcode/wiki/Troubleshooting)
-- [FAQ](https://github.com/jdneo/vscode-leetcode/wiki/FAQ)
+- [TROUBLESHOOTING](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/Troubleshooting)
+- [FAQ](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/FAQ)
 
 ## 💬 Questions and Help
 
diff --git a/ACKNOWLEDGEMENTS.md b/ACKNOWLEDGEMENTS.md
index 8f9ea9ce..6c7758be 100644
--- a/ACKNOWLEDGEMENTS.md
+++ b/ACKNOWLEDGEMENTS.md
@@ -3,22 +3,22 @@
 A big thanks to the following individuals for contributing:
 
 - [@JIEJIAN21](https://github.com/JIEJIAN21) - thanks for logo and icon design
-- [@TsFreddie](https://github.com/TsFreddie) — [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=TsFreddie)
-- [@ntt2k](https://github.com/ntt2k) — [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=ntt2k)
-- [@purocean](https://github.com/purocean) — [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=purocean)
-- [@Xeonacid](https://github.com/Xeonacid) — [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=Xeonacid)
-- [@Himself65](https://github.com/Himself65) — [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=Himself65)
-- [@Vigilans](https://github.com/Vigilans) — [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=Vigilans)
-- [@ringcrl](https://github.com/ringcrl) — [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=ringcrl)
-- [@pujiaxun](https://github.com/pujiaxun) — [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=pujiaxun)
-- [@edvardchen](https://github.com/edvardchen) — [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=edvardchen)
-- [@poppinlp](https://github.com/poppinlp) — [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=poppinlp)
-- [@xuzaixian](https://github.com/xuzaixian) — [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=xuzaixian)
-- [@ZainChen](https://github.com/ZainChen) — [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=ZainChen)
-- [@houtianze](https://github.com/houtianze) — [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=houtianze)
-- [@magic-akari](https://github.com/magic-akari) - [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=magic-akari)
-- [@SF-Zhou](https://github.com/SF-Zhou) - [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=SF-Zhou)
-- [@fuafa](https://github.com/fuafa) - [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=fuafa)
-- [@iFun](https://github.com/iFun) - [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=iFun)
-- [@hologerry](https://github.com/hologerry) - [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=hologerry)
-- [@yihong0618](https://github.com/yihong0618) - [contributions](https://github.com/jdneo/vscode-leetcode/commits?author=yihong0618)
+- [@TsFreddie](https://github.com/TsFreddie) — [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=TsFreddie)
+- [@ntt2k](https://github.com/ntt2k) — [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=ntt2k)
+- [@purocean](https://github.com/purocean) — [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=purocean)
+- [@Xeonacid](https://github.com/Xeonacid) — [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=Xeonacid)
+- [@Himself65](https://github.com/Himself65) — [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=Himself65)
+- [@Vigilans](https://github.com/Vigilans) — [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=Vigilans)
+- [@ringcrl](https://github.com/ringcrl) — [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=ringcrl)
+- [@pujiaxun](https://github.com/pujiaxun) — [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=pujiaxun)
+- [@edvardchen](https://github.com/edvardchen) — [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=edvardchen)
+- [@poppinlp](https://github.com/poppinlp) — [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=poppinlp)
+- [@xuzaixian](https://github.com/xuzaixian) — [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=xuzaixian)
+- [@ZainChen](https://github.com/ZainChen) — [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=ZainChen)
+- [@houtianze](https://github.com/houtianze) — [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=houtianze)
+- [@magic-akari](https://github.com/magic-akari) - [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=magic-akari)
+- [@SF-Zhou](https://github.com/SF-Zhou) - [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=SF-Zhou)
+- [@fuafa](https://github.com/fuafa) - [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=fuafa)
+- [@iFun](https://github.com/iFun) - [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=iFun)
+- [@hologerry](https://github.com/hologerry) - [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=hologerry)
+- [@yihong0618](https://github.com/yihong0618) - [contributions](https://github.com/LeetCode-OpenSource/vscode-leetcode/commits?author=yihong0618)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ffa84ef5..22a3fc38 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,117 +13,117 @@ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how
 ## [0.16.2]
 ### Added
 - New Category: `Concurrency` [CLI#42](https://github.com/leetcode-tools/leetcode-cli/pull/42)
-- New configuration to better configure how to show the description [#310](https://github.com/jdneo/vscode-leetcode/issues/310)
+- New configuration to better configure how to show the description [#310](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/310)
 
 ### Removed
-- Removed the deprecated setting `leetcode.enableShortcuts` [PR#520](https://github.com/jdneo/vscode-leetcode/pull/520)
-- Removed the deprecated setting `leetcode.outputFolder` [PR#521](https://github.com/jdneo/vscode-leetcode/pull/521)
+- Removed the deprecated setting `leetcode.enableShortcuts` [PR#520](https://github.com/LeetCode-OpenSource/vscode-leetcode/pull/520)
+- Removed the deprecated setting `leetcode.outputFolder` [PR#521](https://github.com/LeetCode-OpenSource/vscode-leetcode/pull/521)
 
 ## [0.16.1]
 ### Added
-- Can show the problem in current workspace even if it's not a LeetCode workspace [#373](https://github.com/jdneo/vscode-leetcode/issues/373)
+- Can show the problem in current workspace even if it's not a LeetCode workspace [#373](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/373)
 
 ### Fixed
-[Bugs fixed](https://github.com/jdneo/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.16.1+is%3Aclosed+label%3Abug)
+[Bugs fixed](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.16.1+is%3Aclosed+label%3Abug)
 
 ## [0.16.0]
 ### Added
-- Support GitHub login and LinkedIn login [PR#496](https://github.com/jdneo/vscode-leetcode/pull/496)
+- Support GitHub login and LinkedIn login [PR#496](https://github.com/LeetCode-OpenSource/vscode-leetcode/pull/496)
 
 ## [0.15.8]
 ### Added
-- Add a new command `Sign In by Cookie` to workaround the issue that [users cannot login to LeetCode](https://github.com/jdneo/vscode-leetcode/issues/478). Please check the [workaround steps](https://github.com/jdneo/vscode-leetcode/tree/master#%EF%B8%8F-attention-%EF%B8%8F--workaround-to-login-to-leetcode-endpoint) for more details!
+- Add a new command `Sign In by Cookie` to workaround the issue that [users cannot login to LeetCode](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/478). Please check the [workaround steps](https://github.com/LeetCode-OpenSource/vscode-leetcode/tree/master#%EF%B8%8F-attention-%EF%B8%8F--workaround-to-login-to-leetcode-endpoint) for more details!
 
 ### Changed
-- Update the explorer icons to be align with the VS Code design [#460](https://github.com/jdneo/vscode-leetcode/issues/460)
+- Update the explorer icons to be align with the VS Code design [#460](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/460)
 
 ## [0.15.7]
 ### Fixed
-[Bugs fixed](https://github.com/jdneo/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.15.7+is%3Aclosed+label%3Abug)
+[Bugs fixed](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.15.7+is%3Aclosed+label%3Abug)
 
 ## [0.15.6]
 ### Added
-- Add a link to the solution page [#424](https://github.com/jdneo/vscode-leetcode/issues/424)
+- Add a link to the solution page [#424](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/424)
 
 ### Fixed
-[Bugs fixed](https://github.com/jdneo/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.15.6+is%3Aclosed+label%3Abug)
+[Bugs fixed](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.15.6+is%3Aclosed+label%3Abug)
 
 ## [0.15.5]
 ### Added
-- Add a link to the discussion page [#420](https://github.com/jdneo/vscode-leetcode/issues/420)
+- Add a link to the discussion page [#420](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/420)
 
 ### Fixed
-[Bugs fixed](https://github.com/jdneo/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.15.5+is%3Aclosed+label%3Abug)
+[Bugs fixed](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.15.5+is%3Aclosed+label%3Abug)
 
 ## [0.15.4]
 ### Added
-- Add a new setting `leetcode.filePath`. Now users can use this setting to dynamicly specify the relative folder name and file name. [#PR380](https://github.com/jdneo/vscode-leetcode/pull/380)
+- Add a new setting `leetcode.filePath`. Now users can use this setting to dynamicly specify the relative folder name and file name. [#PR380](https://github.com/LeetCode-OpenSource/vscode-leetcode/pull/380)
 
 ### Fixed
-- Missing language `Rust` in the supported language list. [#PR412](https://github.com/jdneo/vscode-leetcode/pull/412)
-- Cannot show output when the answer is wrong. [#414](https://github.com/jdneo/vscode-leetcode/issues/414)
+- Missing language `Rust` in the supported language list. [#PR412](https://github.com/LeetCode-OpenSource/vscode-leetcode/pull/412)
+- Cannot show output when the answer is wrong. [#414](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/414)
 
 ## [0.15.3]
 ### Added
-- Support `Pick One` [#263](https://github.com/jdneo/vscode-leetcode/issues/263)
-- Support toggling the favorite problems [#378](https://github.com/jdneo/vscode-leetcode/issues/378)
+- Support `Pick One` [#263](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/263)
+- Support toggling the favorite problems [#378](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/378)
 
 ### Changed
-- Update the activity bar icon [#395](https://github.com/jdneo/vscode-leetcode/issues/263)
+- Update the activity bar icon [#395](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/263)
 
 ### Fixed
-[Bugs fixed](https://github.com/jdneo/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.15.3+is%3Aclosed+label%3Abug)
+[Bugs fixed](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.15.3+is%3Aclosed+label%3Abug)
 
 ## [0.15.2]
 ### Added
-- Prompt to open the workspace for LeetCode [#130](https://github.com/jdneo/vscode-leetcode/issues/130)
-- Support deleting sessions [#198](https://github.com/jdneo/vscode-leetcode/issues/130)
+- Prompt to open the workspace for LeetCode [#130](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/130)
+- Support deleting sessions [#198](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/130)
 
 ### Fixed
-[Bugs fixed](https://github.com/jdneo/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.15.2+is%3Aclosed+label%3Abug)
+[Bugs fixed](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.15.2+is%3Aclosed+label%3Abug)
 
 ## [0.15.1]
 ### Fixed
-[Bugs fixed](https://github.com/jdneo/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.15.1+is%3Aclosed+label%3Abug)
+[Bugs fixed](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.15.1+is%3Aclosed+label%3Abug)
 
 ## [0.15.0]
 ### Added
-- Auto refresh the explorer after submitting [#91](https://github.com/jdneo/vscode-leetcode/issues/91)
-- Add a editor shortcut `Description` to show the problem description [#286](https://github.com/jdneo/vscode-leetcode/issues/286)
-- Support customizing the shortcuts in editor [#335](https://github.com/jdneo/vscode-leetcode/issues/335)
+- Auto refresh the explorer after submitting [#91](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/91)
+- Add a editor shortcut `Description` to show the problem description [#286](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/286)
+- Support customizing the shortcuts in editor [#335](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/335)
 
 ### Fixed
-[Bugs fixed](https://github.com/jdneo/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.15.0+is%3Aclosed+label%3Abug)
+[Bugs fixed](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.15.0+is%3Aclosed+label%3Abug)
 
 ## [0.14.3]
 ### Added
-- Support interpolation for `leetcode.outputFolder` settings [#151](https://github.com/jdneo/vscode-leetcode/issues/151)
+- Support interpolation for `leetcode.outputFolder` settings [#151](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/151)
 
 ### Fixed
-[Bugs fixed](https://github.com/jdneo/vscode-leetcode/issues?q=is%3Aissue+is%3Aclosed+milestone%3A0.14.3+label%3Abug)
+[Bugs fixed](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues?q=is%3Aissue+is%3Aclosed+milestone%3A0.14.3+label%3Abug)
 
 ## [0.14.2]
 ### Added
-- Add the `All` category in the LeetCode Explorer [#184](https://github.com/jdneo/vscode-leetcode/issues/184)
-- Add shortcuts for `Show top voted solution` [#269](https://github.com/jdneo/vscode-leetcode/issues/269)
+- Add the `All` category in the LeetCode Explorer [#184](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/184)
+- Add shortcuts for `Show top voted solution` [#269](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/269)
 
 ### Fixed
-[Bugs fixed](https://github.com/jdneo/vscode-leetcode/issues?q=is%3Aissue+is%3Aclosed+label%3Abug+milestone%3A0.14.2)
+[Bugs fixed](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues?q=is%3Aissue+is%3Aclosed+label%3Abug+milestone%3A0.14.2)
 
 ## [0.14.1]
 ### Added
-- Add setting `leetcode.showCommentDescription` to specify whether including the problem description in comments or not [#287](https://github.com/jdneo/vscode-leetcode/issues/287)
+- Add setting `leetcode.showCommentDescription` to specify whether including the problem description in comments or not [#287](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/287)
 
 ## [0.14.0]
 ### Added
-- Add setting `leetcode.enableShortcuts` to specify whether to show the submit/test shortcuts in editor [#146](https://github.com/jdneo/vscode-leetcode/issues/146)
-- Add `Like` and `Dislike` counts in the problem description [#267](https://github.com/jdneo/vscode-leetcode/issues/267)
+- Add setting `leetcode.enableShortcuts` to specify whether to show the submit/test shortcuts in editor [#146](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/146)
+- Add `Like` and `Dislike` counts in the problem description [#267](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/267)
 
 ### Changed
 - Improve the `Preview`, `Result` and `Solution` views
 
 ### Fixed
-[Bugs fixed](https://github.com/jdneo/vscode-leetcode/issues?q=is%3Aissue+label%3Abug+is%3Aclosed+milestone%3A0.14.0)
+[Bugs fixed](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues?q=is%3Aissue+label%3Abug+is%3Aclosed+milestone%3A0.14.0)
 
 ## [0.13.3]
 ### Fixed
@@ -131,51 +131,51 @@ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how
 
 ## [0.13.2]
 ### Added
-- Add a setting `leetcode.enableStatusBar` to specify whether the LeetCode status bar will be shown or not [#156](https://github.com/jdneo/vscode-leetcode/issues/156)
-- Add a setting `leetcode.nodePath` to specify the `Node.js` executable path [#227](https://github.com/jdneo/vscode-leetcode/issues/227)
+- Add a setting `leetcode.enableStatusBar` to specify whether the LeetCode status bar will be shown or not [#156](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/156)
+- Add a setting `leetcode.nodePath` to specify the `Node.js` executable path [#227](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/227)
 
 ### Changed
-- Update the activity bar icon, See: [#225](https://github.com/jdneo/vscode-leetcode/pull/225)
+- Update the activity bar icon, See: [#225](https://github.com/LeetCode-OpenSource/vscode-leetcode/pull/225)
 
 ### Fixed
-[Bugs fixed](https://github.com/jdneo/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.13.2+is%3Aclosed+label%3Abug)
+[Bugs fixed](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.13.2+is%3Aclosed+label%3Abug)
 
 ## [0.13.1]
 ### Fixed
-[Bugs fixed](https://github.com/jdneo/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.13.1+is%3Aclosed+label%3Abug)
+[Bugs fixed](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.13.1+is%3Aclosed+label%3Abug)
 
 ## [0.13.0]
 ### Added
-- Preview the problem description [#131](https://github.com/jdneo/vscode-leetcode/issues/131)
-- Show top voted solution [#193](https://github.com/jdneo/vscode-leetcode/pull/193)
-- Add `collapse all` for the explorer [#197](https://github.com/jdneo/vscode-leetcode/pull/197)
+- Preview the problem description [#131](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/131)
+- Show top voted solution [#193](https://github.com/LeetCode-OpenSource/vscode-leetcode/pull/193)
+- Add `collapse all` for the explorer [#197](https://github.com/LeetCode-OpenSource/vscode-leetcode/pull/197)
 
 ### Fixed
-[Bugs fixed](https://github.com/jdneo/vscode-leetcode/issues?q=is%3Aissue+is%3Aclosed+milestone%3A0.13.0+label%3Abug)
+[Bugs fixed](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues?q=is%3Aissue+is%3Aclosed+milestone%3A0.13.0+label%3Abug)
 
 ## [0.12.0]
 ### Added
-- Add new command `LeetCode: Switch Default Language` to support switching the default language [#115](https://github.com/jdneo/vscode-leetcode/issues/115)
-- Support `PHP` and `Rust` ([#83](https://github.com/jdneo/vscode-leetcode/issues/83), [#103](https://github.com/jdneo/vscode-leetcode/issues/103))
+- Add new command `LeetCode: Switch Default Language` to support switching the default language [#115](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/115)
+- Support `PHP` and `Rust` ([#83](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/83), [#103](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/103))
 
 ### Fixed
-- Cannot retrieve time and memory result [#105](https://github.com/jdneo/vscode-leetcode/issues/105)
-- Power operator displays in a wrong way [#74](https://github.com/jdneo/vscode-leetcode/issues/74)
+- Cannot retrieve time and memory result [#105](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/105)
+- Power operator displays in a wrong way [#74](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/74)
 
 ## [0.11.0]
 ### Added
-- Add new setting: `leetcode.outputFolder` to customize the sub-directory to save the files generated by 'Show Problem' [#119](https://github.com/jdneo/vscode-leetcode/issues/119)
-- Add tooltips for sub-category nodes in LeetCode Explorer [#143](https://github.com/jdneo/vscode-leetcode/pull/143)
+- Add new setting: `leetcode.outputFolder` to customize the sub-directory to save the files generated by 'Show Problem' [#119](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/119)
+- Add tooltips for sub-category nodes in LeetCode Explorer [#143](https://github.com/LeetCode-OpenSource/vscode-leetcode/pull/143)
 
 ### Changed
-- Now when triggering 'Show Problem', the extension will not generate a new file if it already exists [#59](https://github.com/jdneo/vscode-leetcode/issues/59)
+- Now when triggering 'Show Problem', the extension will not generate a new file if it already exists [#59](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/59)
 
 ### Fixed
-- Log in timeout when proxy is enabled [#117](https://github.com/jdneo/vscode-leetcode/issues/117)
+- Log in timeout when proxy is enabled [#117](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/117)
 
 ## [0.10.2]
 ### Fixed
-- Test cases cannot have double quotes [#60](https://github.com/jdneo/vscode-leetcode/issues/60)
+- Test cases cannot have double quotes [#60](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/60)
 
 ## [0.10.1]
 ### Changed
@@ -183,13 +183,13 @@ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how
 
 ## [0.10.0]
 ### Added
-- Add an extension setting to hide solved problems [#95](https://github.com/jdneo/vscode-leetcode/issues/95)
-- Support categorize problems by company, tag, difficulty and favorite [#67](https://github.com/jdneo/vscode-leetcode/issues/67)
+- Add an extension setting to hide solved problems [#95](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/95)
+- Support categorize problems by company, tag, difficulty and favorite [#67](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/67)
 
 ## [0.9.0]
 ### Changed
-- Improve the experience of switching endpoint [#85](https://github.com/jdneo/vscode-leetcode/issues/85)
-- Use web view to show the result page [#76](https://github.com/jdneo/vscode-leetcode/issues/76)
+- Improve the experience of switching endpoint [#85](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/85)
+- Use web view to show the result page [#76](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/76)
 
 
 ## [0.8.2]
@@ -197,7 +197,7 @@ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how
 - Add Code Lens for submitting the answer to LeetCode
 
 ### Fixed
-- Fix the bug that the extension could not automatically sign in [#72](https://github.com/jdneo/vscode-leetcode/issues/72)
+- Fix the bug that the extension could not automatically sign in [#72](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/72)
 
 ## [0.8.1]
 ### Changed
@@ -205,67 +205,67 @@ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how
 
 ## [0.8.0]
 ### Added
-- Support LeetCode CN [#50](https://github.com/jdneo/vscode-leetcode/issues/50)
-- Support Windows Subsystem for Linux [#47](https://github.com/jdneo/vscode-leetcode/issues/47)
+- Support LeetCode CN [#50](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/50)
+- Support Windows Subsystem for Linux [#47](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/47)
 
 ## [0.7.0]
 ### Added
-- Add spinner when submitting code [#43](https://github.com/jdneo/vscode-leetcode/issues/43)
+- Add spinner when submitting code [#43](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/43)
 
 ## [0.6.1]
 ### Added
-- Add Sign in action into LeetCode Explorer title area [#25](https://github.com/jdneo/vscode-leetcode/issues/25)
+- Add Sign in action into LeetCode Explorer title area [#25](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/25)
 
 ## [0.6.0]
 ### Changed
-- Move LeetCode explorer into activity bar [#39](https://github.com/jdneo/vscode-leetcode/issues/39)
+- Move LeetCode explorer into activity bar [#39](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/39)
 
 ### Added
-- Support trigger test & submit in the editor [#37](https://github.com/jdneo/vscode-leetcode/issues/37)
+- Support trigger test & submit in the editor [#37](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/37)
 
 ### Fixed
-- Fix the bug that cannot show problem [#41](https://github.com/jdneo/vscode-leetcode/issues/41)
+- Fix the bug that cannot show problem [#41](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/41)
 
 ## [0.5.1]
 ### Fixed
-- Fix the bug when user's path contains white spaces [#34](https://github.com/jdneo/vscode-leetcode/issues/34)
+- Fix the bug when user's path contains white spaces [#34](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/34)
 
 ## [0.5.0]
 ### Added
-- Support submit and test solution files from the file explorer in VS Code ([#24](https://github.com/jdneo/vscode-leetcode/issues/24), [#26](https://github.com/jdneo/vscode-leetcode/issues/26))
+- Support submit and test solution files from the file explorer in VS Code ([#24](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/24), [#26](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/26))
 
 ## [0.4.0]
 ### Added
-- Support locked problem [#20](https://github.com/jdneo/vscode-leetcode/issues/20)
+- Support locked problem [#20](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/20)
 
 ### Changed
-- Simplify the command 'LeetCode: Test Current File' to 'LeetCode: Test' [#18](https://github.com/jdneo/vscode-leetcode/issues/18)
-- Will automatically save current file when 'LeetCode: Test' command is triggered [#17](https://github.com/jdneo/vscode-leetcode/issues/17)
+- Simplify the command 'LeetCode: Test Current File' to 'LeetCode: Test' [#18](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/18)
+- Will automatically save current file when 'LeetCode: Test' command is triggered [#17](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/17)
 
 ## [0.3.0]
 ### Added
-- Test current solution file [#15](https://github.com/jdneo/vscode-leetcode/issues/15)
+- Test current solution file [#15](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/15)
 
 ## [0.2.1]
 ### Fixed
-- Fix the wrong icon bug in LeetCode Explorer [#9](https://github.com/jdneo/vscode-leetcode/issues/9)
-- Fix the switch session bug when login session is expired [#12](https://github.com/jdneo/vscode-leetcode/issues/12)
+- Fix the wrong icon bug in LeetCode Explorer [#9](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/9)
+- Fix the switch session bug when login session is expired [#12](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/12)
 
 ## [0.2.0]
 ### Added
-- Support setting the default language to solve problems [#5](https://github.com/jdneo/vscode-leetcode/issues/5)
+- Support setting the default language to solve problems [#5](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/5)
 
 ### Fixed
-- When user cancels login, no further actions will happen [#10](https://github.com/jdneo/vscode-leetcode/issues/10)
+- When user cancels login, no further actions will happen [#10](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/10)
 
 ## [0.1.2]
 ### Fixed
-- Fix the duplicated nodes in LeetCode Explorer bug [#6](https://github.com/jdneo/vscode-leetcode/issues/6)
+- Fix the duplicated nodes in LeetCode Explorer bug [#6](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/6)
 
 ## [0.1.1]
 ### Fixed
-- Fix a bug in LeetCode Explorer [#3](https://github.com/jdneo/vscode-leetcode/issues/3)
-- Remove the show problem command from command palette [#4](https://github.com/jdneo/vscode-leetcode/issues/4)
+- Fix a bug in LeetCode Explorer [#3](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/3)
+- Remove the show problem command from command palette [#4](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/4)
 
 ## [0.1.0]
 ### Added
diff --git a/README.md b/README.md
index 4cbf9b6f..490db51e 100644
--- a/README.md
+++ b/README.md
@@ -20,16 +20,16 @@
   </a>
 </p>
 
-- English Document | [中文文档](https://github.com/jdneo/vscode-leetcode/blob/master/docs/README_zh-CN.md)
+- English Document | [中文文档](https://github.com/LeetCode-OpenSource/vscode-leetcode/blob/master/docs/README_zh-CN.md)
 
 ## ❗️ Attention ❗️- Workaround to login to LeetCode endpoint
 > Note: If you are using `leetcode-cn.com`, you can just ignore this section.
 
-Recently we observed that [the extension cannot login to leetcode.com endpoint anymore](https://github.com/jdneo/vscode-leetcode/issues/478). The root cause of this issue is that leetcode.com changed its login mechanism and so far there is no ideal way to fix that issue.
+Recently we observed that [the extension cannot login to leetcode.com endpoint anymore](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/478). The root cause of this issue is that leetcode.com changed its login mechanism and so far there is no ideal way to fix that issue.
 
 Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround which can somehow mitigate this. Now you can simply click the `Sign In` button and then select `Third Party` login or `Cookie` login.
 
-> Note: If you want to use third-party login(**Recommended**), please make sure your account has been connected to the thrid-party. If you want to use `Cookie` login, click [here](https://github.com/jdneo/vscode-leetcode/issues/478#issuecomment-564757098) to see the steps.
+> Note: If you want to use third-party login(**Recommended**), please make sure your account has been connected to the thrid-party. If you want to use `Cookie` login, click [here](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/478#issuecomment-564757098) to see the steps.
 
 ## Requirements
 - [VS Code 1.30.1+](https://code.visualstudio.com/)
@@ -38,13 +38,13 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 
 ## Quick Start
 
-![demo](https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/gifs/demo.gif)
+![demo](https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/gifs/demo.gif)
 
 ## Features
 
 ### Sign In/Out
 <p align="center">
-  <img src="https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/imgs/sign_in.png" alt="Sign in" />
+  <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/sign_in.png" alt="Sign in" />
 </p>
 
 - Simply click `Sign in to LeetCode` in the `LeetCode Explorer` will let you **sign in** with your LeetCode account.
@@ -56,10 +56,10 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 
 ### Switch Endpoint
 <p align="center">
-  <img src="https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/imgs/endpoint.png" alt="Switch Endpoint" />
+  <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/endpoint.png" alt="Switch Endpoint" />
 </p>
 
-- By clicking the button ![btn_endpoint](https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/imgs/btn_endpoint.png) at the **explorer's navigation bar**, you can switch between different endpoints.
+- By clicking the button ![btn_endpoint](https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/btn_endpoint.png) at the **explorer's navigation bar**, you can switch between different endpoints.
 
 - The supported endpoints are:
   - **leetcode.com**
@@ -71,7 +71,7 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 
 ### Pick a Problem
 <p align="center">
-  <img src="https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/imgs/pick_problem.png" alt="Pick a Problem" />
+  <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/pick_problem.png" alt="Pick a Problem" />
 </p>
 
 - Directly click on the problem or right click the problem in the `LeetCode Explorer` and select `Preview Problem` to see the problem description.
@@ -87,7 +87,7 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 
 ### Editor Shortcuts
 <p align="center">
-  <img src="https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/imgs/shortcuts.png" alt="Editor Shortcuts" />
+  <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/shortcuts.png" alt="Editor Shortcuts" />
 </p>
 
 - The extension supports 4 editor shortcuts (aka Code Lens):
@@ -102,16 +102,16 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 
 ### Search problems by Keywords
 <p align="center">
-  <img src="https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/imgs/search.png" alt="Search problems by Keywords" />
+  <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/search.png" alt="Search problems by Keywords" />
 </p>
 
-- By clicking the button ![btn_search](https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/imgs/btn_search.png) at the **explorer's navigation bar**, you can search the problems by keywords.
+- By clicking the button ![btn_search](https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/btn_search.png) at the **explorer's navigation bar**, you can search the problems by keywords.
 
 ---
 
 ### Manage Session
 <p align="center">
-  <img src="https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/imgs/session.png" alt="Manage Session" />
+  <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/session.png" alt="Manage Session" />
 </p>
 
 - To manage your LeetCode sessions, just clicking the `LeetCode: ***` at the bottom of the status bar. You can **switch** between sessions or **create**, **delete** a session.
@@ -126,7 +126,7 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 | `leetcode.useWsl`                                                                       | Specify whether to use WSL or not                                                                                                                                                                                                                                                                                                                                                                                                 | `false`            |
 | `leetcode.endpoint`                                                                     | Specify the active endpoint. Supported endpoints are: `leetcode`, `leetcode-cn`                                                                                                                                                                                                                                                                                                                                                   | `leetcode`         |
 | `leetcode.workspaceFolder`                                                              | Specify the path of the workspace folder to store the problem files.                                                                                                                                                                                                                                                                                                                                                              | `""`               |
-| `leetcode.filePath`                                                                     | Specify the relative path under the workspace and the file name to save the problem files. More details can be found [here](https://github.com/jdneo/vscode-leetcode/wiki/Customize-the-Relative-Folder-and-the-File-Name-of-the-Problem-File).                                                                                                                                                                                   |                    |
+| `leetcode.filePath`                                                                     | Specify the relative path under the workspace and the file name to save the problem files. More details can be found [here](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/Customize-the-Relative-Folder-and-the-File-Name-of-the-Problem-File).                                                                                                                                                                                   |                    |
 | `leetcode.enableStatusBar`                                                              | Specify whether the LeetCode status bar will be shown or not.                                                                                                                                                                                                                                                                                                                                                                     | `true`             |
 | `leetcode.editor.shortcuts`                                                             | Specify the customized shorcuts in editors. Supported values are: `submit`, `test`, `solution` and `description`.                                                                                                                                                                                                                                                                                                                 | `["submit, test"]` |
 | `leetcode.enableSideMode`                                                               | Specify whether `preview`, `solution` and `submission` tab should be grouped into the second editor column when solving a problem.                                                                                                                                                                                                                                                                                                | `true`             |
@@ -135,15 +135,15 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 
 ## Want Help?
 
-When you meet any problem, you can check out the [Troubleshooting](https://github.com/jdneo/vscode-leetcode/wiki/Troubleshooting) and [FAQ](https://github.com/jdneo/vscode-leetcode/wiki/FAQ) first.
+When you meet any problem, you can check out the [Troubleshooting](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/Troubleshooting) and [FAQ](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/FAQ) first.
 
-If your problem still cannot be addressed, feel free to reach us in the [Gitter Channel](https://gitter.im/vscode-leetcode/Lobby) or [file an issue](https://github.com/jdneo/vscode-leetcode/issues/new/choose).
+If your problem still cannot be addressed, feel free to reach us in the [Gitter Channel](https://gitter.im/vscode-leetcode/Lobby) or [file an issue](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/new/choose).
 
 ## Release Notes
 
-Refer to [CHANGELOG](https://github.com/jdneo/vscode-leetcode/blob/master/CHANGELOG.md)
+Refer to [CHANGELOG](https://github.com/LeetCode-OpenSource/vscode-leetcode/blob/master/CHANGELOG.md)
 
 ## Acknowledgement
 
 - This extension is based on [@skygragon](https://github.com/skygragon)'s [leetcode-cli](https://github.com/skygragon/leetcode-cli) open source project.
-- Special thanks to our [contributors](https://github.com/jdneo/vscode-leetcode/blob/master/ACKNOWLEDGEMENTS.md).
+- Special thanks to our [contributors](https://github.com/LeetCode-OpenSource/vscode-leetcode/blob/master/ACKNOWLEDGEMENTS.md).
diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md
index 89d7d10f..6972902d 100644
--- a/docs/README_zh-CN.md
+++ b/docs/README_zh-CN.md
@@ -20,17 +20,17 @@
   </a>
 </p>
 
-- [English Document](https://github.com/jdneo/vscode-leetcode#requirements) | 中文文档
+- [English Document](https://github.com/LeetCode-OpenSource/vscode-leetcode#requirements) | 中文文档
 
 ## ❗️ 注意 ❗️- 无法登录 LeetCode 节点的临时解决办法
 > 注意:如果使用的是 `leetcode-cn.com` 账户,可以跳过此段落。
 
-近期我们发现插件出现了[无法登录 leetcode.com 节点的问题](https://github.com/jdneo/vscode-leetcode/issues/478)。原因是因为近期 leetcode.com 改变了登录机制,目前我们暂时没有找到解决该问题的完美解决方案。
+近期我们发现插件出现了[无法登录 leetcode.com 节点的问题](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/478)。原因是因为近期 leetcode.com 改变了登录机制,目前我们暂时没有找到解决该问题的完美解决方案。
 
 感谢 [@yihong0618](https://github.com/yihong0618) 提供了一个临时解决办法。现在你可以直接点击登录按钮并选择第三方登录或者 `Cookie` 登录。
 
 
-> 注意:如果你希望使用第三方登录(**推荐**),请确保你的账户已经与第三方账户连接。如果你希望通过 `Cookie` 登录,请点击[该连接](https://github.com/jdneo/vscode-leetcode/issues/478#issuecomment-564757098)查看登录步骤。
+> 注意:如果你希望使用第三方登录(**推荐**),请确保你的账户已经与第三方账户连接。如果你希望通过 `Cookie` 登录,请点击[该连接](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/478#issuecomment-564757098)查看登录步骤。
 
 ## 运行条件
 - [VS Code 1.23.0+](https://code.visualstudio.com/)
@@ -39,13 +39,13 @@
 
 ## 快速开始
 
-![demo](https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/gifs/demo.gif)
+![demo](https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/gifs/demo.gif)
 
 ## 功能
 
 ### 登入登出
 <p align="center">
-  <img src="https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/imgs/sign_in.png" alt="登入登出" />
+  <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/sign_in.png" alt="登入登出" />
 </p>
 
 - 点击 `LeetCode Explorer` 中的 `Sign in to LeetCode` 即可登入。
@@ -57,10 +57,10 @@
 
 ### 切换 LeetCode 版本
 <p align="center">
-  <img src="https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/imgs/endpoint.png" alt="切换 LeetCode 版本" />
+  <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/endpoint.png" alt="切换 LeetCode 版本" />
 </p>
 
-- LeetCode 目前有**英文版**和**中文版**两种版本。点击 `LeetCode Explorer` 导航栏中的 ![btn_endpoint](https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/imgs/btn_endpoint.png) 按钮可切换版本。
+- LeetCode 目前有**英文版**和**中文版**两种版本。点击 `LeetCode Explorer` 导航栏中的 ![btn_endpoint](https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/btn_endpoint.png) 按钮可切换版本。
 
 - 目前可切换的版本有:
   - **leetcode.com**
@@ -72,7 +72,7 @@
 
 ### 选择题目
 <p align="center">
-  <img src="https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/imgs/pick_problem.png" alt="选择题目" />
+  <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/pick_problem.png" alt="选择题目" />
 </p>
 
 - 直接点击题目或者在 `LeetCode Explorer` 中**右键**题目并选择 `Preview Problem` 可查看题目描述
@@ -88,7 +88,7 @@
 
 ### 编辑器快捷方式
 <p align="center">
-  <img src="https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/imgs/shortcuts.png" alt="Editor Shortcuts" />
+  <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/shortcuts.png" alt="Editor Shortcuts" />
 </p>
 
 - 插件会在编辑区域内支持四种不同的快捷方式(Code Lens):
@@ -103,16 +103,16 @@
 
 ### 通过关键字搜索题目
 <p align="center">
-  <img src="https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/imgs/search.png" alt="通过关键字搜索题目" />
+  <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/search.png" alt="通过关键字搜索题目" />
 </p>
 
-- 点击 `LeetCode Explorer` 导航栏中的 ![btn_search](https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/imgs/btn_search.png) 按钮可按照关键字搜索题目。
+- 点击 `LeetCode Explorer` 导航栏中的 ![btn_search](https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/btn_search.png) 按钮可按照关键字搜索题目。
 
 ---
 
 ### 管理存档
 <p align="center">
-  <img src="https://raw.githubusercontent.com/jdneo/vscode-leetcode/master/docs/imgs/session.png" alt="管理存档" />
+  <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/session.png" alt="管理存档" />
 </p>
 
 - 点击位于 VS Code 底部状态栏的 `LeetCode: ***` 管理 `LeetCode 存档`。你可以**切换**存档或者**创建**,**删除**存档。
@@ -127,7 +127,7 @@
 | `leetcode.useWsl`                                                                  | 指定是否启用 WSL                                                                                                                                                                                                                                                                                | `false`            |
 | `leetcode.endpoint`                                                                | 指定使用的终端,可用终端有:`leetcode`, `leetcode-cn`                                                                                                                                                                                                                                           | `leetcode`         |
 | `leetcode.workspaceFolder`                                                         | 指定保存文件的工作区目录                                                                                                                                                                                                                                                                        | `""`               |
-| `leetcode.filePath`                                                                | 指定生成题目文件的相对文件夹路径名和文件名。点击查看[更多详细用法](https://github.com/jdneo/vscode-leetcode/wiki/%E8%87%AA%E5%AE%9A%E4%B9%89%E9%A2%98%E7%9B%AE%E6%96%87%E4%BB%B6%E7%9A%84%E7%9B%B8%E5%AF%B9%E6%96%87%E4%BB%B6%E5%A4%B9%E8%B7%AF%E5%BE%84%E5%92%8C%E6%96%87%E4%BB%B6%E5%90%8D)。 |                    |
+| `leetcode.filePath`                                                                | 指定生成题目文件的相对文件夹路径名和文件名。点击查看[更多详细用法](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/%E8%87%AA%E5%AE%9A%E4%B9%89%E9%A2%98%E7%9B%AE%E6%96%87%E4%BB%B6%E7%9A%84%E7%9B%B8%E5%AF%B9%E6%96%87%E4%BB%B6%E5%A4%B9%E8%B7%AF%E5%BE%84%E5%92%8C%E6%96%87%E4%BB%B6%E5%90%8D)。 |                    |
 | `leetcode.enableStatusBar`                                                         | 指定是否在 VS Code 下方显示插件状态栏。                                                                                                                                                                                                                                                         | `true`             |
 | `leetcode.editor.shortcuts`                                                        | 指定在编辑器内所自定义的快捷方式。可用的快捷方式有: `submit`, `test`, `solution`, `description`。                                                                                                                                                                                               | `["submit, test"]` |
 | `leetcode.enableSideMode`                                                          | 指定在解决一道题时,是否将`问题预览`、`高票答案`与`提交结果`窗口集中在编辑器的第二栏。                                                                                                                                                                                                          | `true`             |
@@ -135,15 +135,15 @@
 | `leetcode.showCommentDescription`                                                  | 指定是否要在注释中显示题干。                                                                                                                                                                                                                                                                    | `false`            |
 
 ## 需要帮助?
-在遇到任何问题时,可以先查看一下[疑难解答](https://github.com/jdneo/vscode-leetcode/wiki/%E7%96%91%E9%9A%BE%E8%A7%A3%E7%AD%94)以及[常见问题](https://github.com/jdneo/vscode-leetcode/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98)寻求帮助。
+在遇到任何问题时,可以先查看一下[疑难解答](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/%E7%96%91%E9%9A%BE%E8%A7%A3%E7%AD%94)以及[常见问题](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98)寻求帮助。
 
-如果您的问题依然没有解决,可以在 [Gitter Channel](https://gitter.im/vscode-leetcode/Lobby) 联系我们,或者您也可以[记录一个新的 issue](https://github.com/jdneo/vscode-leetcode/issues/new/choose)。
+如果您的问题依然没有解决,可以在 [Gitter Channel](https://gitter.im/vscode-leetcode/Lobby) 联系我们,或者您也可以[记录一个新的 issue](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/new/choose)。
 
 ## 更新日志
 
-请参考[更新日志](https://github.com/jdneo/vscode-leetcode/blob/master/CHANGELOG.md)
+请参考[更新日志](https://github.com/LeetCode-OpenSource/vscode-leetcode/blob/master/CHANGELOG.md)
 
 ## 鸣谢
 
 - 本插件基于[@skygragon](https://github.com/skygragon)的[leetcode-cli](https://github.com/skygragon/leetcode-cli)开源项目制作。
-- 特别鸣谢这些[贡献者们](https://github.com/jdneo/vscode-leetcode/blob/master/ACKNOWLEDGEMENTS.md)。
+- 特别鸣谢这些[贡献者们](https://github.com/LeetCode-OpenSource/vscode-leetcode/blob/master/ACKNOWLEDGEMENTS.md)。
diff --git a/package.json b/package.json
index 90d6f0e1..b6164f17 100644
--- a/package.json
+++ b/package.json
@@ -12,9 +12,9 @@
     },
     "repository": {
         "type": "git",
-        "url": "https://github.com/jdneo/vscode-leetcode"
+        "url": "https://github.com/LeetCode-OpenSource/vscode-leetcode"
     },
-    "homepage": "https://github.com/jdneo/vscode-leetcode/blob/master/README.md",
+    "homepage": "https://github.com/LeetCode-OpenSource/vscode-leetcode/blob/master/README.md",
     "categories": [
         "Other",
         "Snippets"

From 7bc6d6ca55954b3d53cfc1481ea4fdc1303d21b1 Mon Sep 17 00:00:00 2001
From: Jerry Zou <jerry.zry@outlook.com>
Date: Thu, 2 Jul 2020 12:16:37 +0800
Subject: [PATCH 21/47] chore: update copyright parts of license (#592)

---
 LICENSE | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/LICENSE b/LICENSE
index 4401d6f6..fffb65eb 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,7 @@
 MIT License
 
-Copyright (c) 2018 jdneo
+Copyright (c) 2020-present 力扣
+Copyright (c) 2018-2019 jdneo
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal

From ade48fbbea9fd55bff628fe95e948c4d694871e1 Mon Sep 17 00:00:00 2001
From: yihong <zouzou0208@gmail.com>
Date: Tue, 21 Jul 2020 11:29:12 +0800
Subject: [PATCH 22/47] add: star command in shortcuts (#601)

---
 README.md                              |  5 +++--
 docs/README_zh-CN.md                   |  5 +++--
 package.json                           |  8 ++++++++
 src/codelens/CodeLensController.ts     |  4 ++--
 src/codelens/CustomCodeLensProvider.ts | 19 ++++++++++++++++++-
 src/commands/star.ts                   | 12 ++++++++++--
 src/utils/settingUtils.ts              |  5 +++++
 7 files changed, 49 insertions(+), 9 deletions(-)

diff --git a/README.md b/README.md
index 490db51e..3396d0c7 100644
--- a/README.md
+++ b/README.md
@@ -90,9 +90,10 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
   <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/shortcuts.png" alt="Editor Shortcuts" />
 </p>
 
-- The extension supports 4 editor shortcuts (aka Code Lens):
+- The extension supports 5 editor shortcuts (aka Code Lens):
   - `Submit`: Submit your answer to LeetCode.
   - `Test`: Test your answer with customized test cases.
+  - `Star/Unstar`: Star or unstar the current problem.
   - `Solution`: Show the top voted solution for the current problem.
   - `Description`: Show the problem description page.
 
@@ -128,7 +129,7 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 | `leetcode.workspaceFolder`                                                              | Specify the path of the workspace folder to store the problem files.                                                                                                                                                                                                                                                                                                                                                              | `""`               |
 | `leetcode.filePath`                                                                     | Specify the relative path under the workspace and the file name to save the problem files. More details can be found [here](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/Customize-the-Relative-Folder-and-the-File-Name-of-the-Problem-File).                                                                                                                                                                                   |                    |
 | `leetcode.enableStatusBar`                                                              | Specify whether the LeetCode status bar will be shown or not.                                                                                                                                                                                                                                                                                                                                                                     | `true`             |
-| `leetcode.editor.shortcuts`                                                             | Specify the customized shorcuts in editors. Supported values are: `submit`, `test`, `solution` and `description`.                                                                                                                                                                                                                                                                                                                 | `["submit, test"]` |
+| `leetcode.editor.shortcuts`                                                             | Specify the customized shorcuts in editors. Supported values are: `submit`, `test`, `star`, `solution` and `description`.                                                                                                                                                                                                                                                                                                                 | `["submit, test"]` |
 | `leetcode.enableSideMode`                                                               | Specify whether `preview`, `solution` and `submission` tab should be grouped into the second editor column when solving a problem.                                                                                                                                                                                                                                                                                                | `true`             |
 | `leetcode.nodePath`                                                                     | Specify the `Node.js` executable path. for example, C:\Program Files\nodejs\node.exe                                                                                                                                                                                                                                                                                                                                              | `node`             |
 | `leetcode.showCommentDescription`                                                       | Specify whether to include the problem description in the comments                                                                                                                                                                                                                                                                                                                                                                | `false`            |
diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md
index 6972902d..608c6226 100644
--- a/docs/README_zh-CN.md
+++ b/docs/README_zh-CN.md
@@ -91,9 +91,10 @@
   <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/shortcuts.png" alt="Editor Shortcuts" />
 </p>
 
-- 插件会在编辑区域内支持四种不同的快捷方式(Code Lens):
+- 插件会在编辑区域内支持五种不同的快捷方式(Code Lens):
   - `Submit`: 提交你的答案至 LeetCode;
   - `Test`: 用给定的测试用例测试你的答案;
+  - `Star`: 收藏或取消收藏该问题;
   - `Solution`: 显示该问题的高票解答;
   - `Description`: 显示该问题的题目描述。
 
@@ -129,7 +130,7 @@
 | `leetcode.workspaceFolder`                                                         | 指定保存文件的工作区目录                                                                                                                                                                                                                                                                        | `""`               |
 | `leetcode.filePath`                                                                | 指定生成题目文件的相对文件夹路径名和文件名。点击查看[更多详细用法](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/%E8%87%AA%E5%AE%9A%E4%B9%89%E9%A2%98%E7%9B%AE%E6%96%87%E4%BB%B6%E7%9A%84%E7%9B%B8%E5%AF%B9%E6%96%87%E4%BB%B6%E5%A4%B9%E8%B7%AF%E5%BE%84%E5%92%8C%E6%96%87%E4%BB%B6%E5%90%8D)。 |                    |
 | `leetcode.enableStatusBar`                                                         | 指定是否在 VS Code 下方显示插件状态栏。                                                                                                                                                                                                                                                         | `true`             |
-| `leetcode.editor.shortcuts`                                                        | 指定在编辑器内所自定义的快捷方式。可用的快捷方式有: `submit`, `test`, `solution`, `description`。                                                                                                                                                                                               | `["submit, test"]` |
+| `leetcode.editor.shortcuts`                                                        | 指定在编辑器内所自定义的快捷方式。可用的快捷方式有: `submit`, `test`, `star`, `solution`, `description`。                                                                                                                                                                                               | `["submit, test"]` |
 | `leetcode.enableSideMode`                                                          | 指定在解决一道题时,是否将`问题预览`、`高票答案`与`提交结果`窗口集中在编辑器的第二栏。                                                                                                                                                                                                          | `true`             |
 | `leetcode.nodePath`                                                                | 指定 `Node.js` 可执行文件的路径。如:C:\Program Files\nodejs\node.exe                                                                                                                                                                                                                           | `node`             |
 | `leetcode.showCommentDescription`                                                  | 指定是否要在注释中显示题干。                                                                                                                                                                                                                                                                    | `false`            |
diff --git a/package.json b/package.json
index b6164f17..81a8536b 100644
--- a/package.json
+++ b/package.json
@@ -629,8 +629,16 @@
                             "enum": [
                                 "submit",
                                 "test",
+                                "star",
                                 "solution",
                                 "description"
+                            ],
+                            "enumDescriptions": [
+                                "Submit your answer to LeetCode.",
+                                "Test your answer with customized test cases.",
+                                "Star or unstar the current problem.",
+                                "Show the top voted solution for the current problem.",
+                                "Show the problem description page."
                             ]
                         },
                         "description": "Customize the shorcuts in editors."
diff --git a/src/codelens/CodeLensController.ts b/src/codelens/CodeLensController.ts
index 8e2fa3c9..b41f28f0 100644
--- a/src/codelens/CodeLensController.ts
+++ b/src/codelens/CodeLensController.ts
@@ -2,7 +2,7 @@
 // Licensed under the MIT license.
 
 import { ConfigurationChangeEvent, Disposable, languages, workspace } from "vscode";
-import { CustomCodeLensProvider } from "./CustomCodeLensProvider";
+import { customCodeLensProvider, CustomCodeLensProvider } from "./CustomCodeLensProvider";
 
 class CodeLensController implements Disposable {
     private internalProvider: CustomCodeLensProvider;
@@ -10,7 +10,7 @@ class CodeLensController implements Disposable {
     private configurationChangeListener: Disposable;
 
     constructor() {
-        this.internalProvider = new CustomCodeLensProvider();
+        this.internalProvider = customCodeLensProvider;
 
         this.configurationChangeListener = workspace.onDidChangeConfiguration((event: ConfigurationChangeEvent) => {
             if (event.affectsConfiguration("leetcode.editor.shortcuts")) {
diff --git a/src/codelens/CustomCodeLensProvider.ts b/src/codelens/CustomCodeLensProvider.ts
index 4764e999..4b9b6491 100644
--- a/src/codelens/CustomCodeLensProvider.ts
+++ b/src/codelens/CustomCodeLensProvider.ts
@@ -2,6 +2,8 @@
 // Licensed under the MIT license.
 
 import * as vscode from "vscode";
+import { explorerNodeManager } from "../explorer/explorerNodeManager";
+import { LeetCodeNode } from "../explorer/LeetCodeNode";
 import { getEditorShortcuts } from "../utils/settingUtils";
 
 export class CustomCodeLensProvider implements vscode.CodeLensProvider {
@@ -23,10 +25,15 @@ export class CustomCodeLensProvider implements vscode.CodeLensProvider {
         }
 
         const content: string = document.getText();
-        const matchResult: RegExpMatchArray | null = content.match(/@lc app=.* id=.* lang=.*/);
+        const matchResult: RegExpMatchArray | null = content.match(/@lc app=.* id=(.*) lang=.*/);
         if (!matchResult) {
             return undefined;
         }
+        const nodeId: string | undefined = matchResult[1];
+        let node: LeetCodeNode | undefined;
+        if (nodeId) {
+            node = explorerNodeManager.getNodeById(nodeId);
+        }
 
         let codeLensLine: number = document.lineCount - 1;
         for (let i: number = document.lineCount - 1; i >= 0; i--) {
@@ -56,6 +63,14 @@ export class CustomCodeLensProvider implements vscode.CodeLensProvider {
             }));
         }
 
+        if (shortcuts.indexOf("star") >= 0 && node) {
+            codeLens.push(new vscode.CodeLens(range, {
+                title: node.isFavorite ? "Unstar" : "Star",
+                command: node.isFavorite ? "leetcode.removeFavorite" : "leetcode.addFavorite",
+                arguments: [node],
+            }));
+        }
+
         if (shortcuts.indexOf("solution") >= 0) {
             codeLens.push(new vscode.CodeLens(range, {
                 title: "Solution",
@@ -75,3 +90,5 @@ export class CustomCodeLensProvider implements vscode.CodeLensProvider {
         return codeLens;
     }
 }
+
+export const customCodeLensProvider: CustomCodeLensProvider = new CustomCodeLensProvider();
diff --git a/src/commands/star.ts b/src/commands/star.ts
index baae0b07..36611499 100644
--- a/src/commands/star.ts
+++ b/src/commands/star.ts
@@ -2,15 +2,20 @@
 // Copyright (c) jdneo. All rights reserved.
 // Licensed under the MIT license.
 
+import { customCodeLensProvider } from "../codelens/CustomCodeLensProvider";
 import { LeetCodeNode } from "../explorer/LeetCodeNode";
 import { leetCodeTreeDataProvider } from "../explorer/LeetCodeTreeDataProvider";
 import { leetCodeExecutor } from "../leetCodeExecutor";
+import { hasStarShortcut } from "../utils/settingUtils";
 import { DialogType, promptForOpenOutputChannel } from "../utils/uiUtils";
 
 export async function addFavorite(node: LeetCodeNode): Promise<void> {
     try {
         await leetCodeExecutor.toggleFavorite(node, true);
-        leetCodeTreeDataProvider.refresh();
+        await leetCodeTreeDataProvider.refresh();
+        if (hasStarShortcut()) {
+            customCodeLensProvider.refresh();
+        }
     } catch (error) {
         await promptForOpenOutputChannel("Failed to add the problem to favorite. Please open the output channel for details.", DialogType.error);
     }
@@ -19,7 +24,10 @@ export async function addFavorite(node: LeetCodeNode): Promise<void> {
 export async function removeFavorite(node: LeetCodeNode): Promise<void> {
     try {
         await leetCodeExecutor.toggleFavorite(node, false);
-        leetCodeTreeDataProvider.refresh();
+        await leetCodeTreeDataProvider.refresh();
+        if (hasStarShortcut()) {
+            customCodeLensProvider.refresh();
+        }
     } catch (error) {
         await promptForOpenOutputChannel("Failed to remove the problem from favorite. Please open the output channel for details.", DialogType.error);
     }
diff --git a/src/utils/settingUtils.ts b/src/utils/settingUtils.ts
index 8c94a95f..207604fa 100644
--- a/src/utils/settingUtils.ts
+++ b/src/utils/settingUtils.ts
@@ -20,6 +20,11 @@ export function getEditorShortcuts(): string[] {
     return getWorkspaceConfiguration().get<string[]>("editor.shortcuts", ["submit", "test"]);
 }
 
+export function hasStarShortcut(): boolean {
+    const shortcuts: string[] = getWorkspaceConfiguration().get<string[]>("editor.shortcuts", ["submit", "test"]);
+    return shortcuts.indexOf("star") >= 0;
+}
+
 export function getDescriptionConfiguration(): IDescriptionConfiguration {
     const setting: string = getWorkspaceConfiguration().get<string>("showDescription", DescriptionConfiguration.InWebView);
     const config: IDescriptionConfiguration = {

From 5fa449e58f6e198ddb4fd481490c1ddc050dacb4 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 21 Jul 2020 12:35:27 +0800
Subject: [PATCH 23/47] chore(deps): bump lodash from 4.17.13 to 4.17.19 (#597)

Bumps [lodash](https://github.com/lodash/lodash) from 4.17.13 to 4.17.19.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.13...4.17.19)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 package-lock.json | 6 +++---
 package.json      | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 2332f2e1..f378577b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -839,9 +839,9 @@
             }
         },
         "lodash": {
-            "version": "4.17.13",
-            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.13.tgz",
-            "integrity": "sha512-vm3/XWXfWtRua0FkUyEHBZy8kCPjErNBT9fJx8Zvs+U6zjqPbTUOpkaoum3O5uiA8sm+yNMHXfYkTUHFoMxFNA=="
+            "version": "4.17.19",
+            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
+            "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
         },
         "log-symbols": {
             "version": "2.2.0",
diff --git a/package.json b/package.json
index 81a8536b..b1759a52 100644
--- a/package.json
+++ b/package.json
@@ -680,7 +680,7 @@
     "dependencies": {
         "fs-extra": "^6.0.1",
         "highlight.js": "^9.15.6",
-        "lodash": "^4.17.13",
+        "lodash": "^4.17.19",
         "markdown-it": "^8.4.2",
         "require-from-string": "^2.0.2",
         "unescape-js": "^1.1.1",

From 1893d34a64c567cbfb7a2872b59e0f88e8910347 Mon Sep 17 00:00:00 2001
From: yihong <zouzou0208@gmail.com>
Date: Thu, 23 Jul 2020 16:20:01 +0800
Subject: [PATCH 24/47] fix: #593 by adding global flag to remove cache (#602)

---
 src/extension.ts        |  2 +-
 src/leetCodeExecutor.ts | 25 +++++++++++++++++++++----
 src/shared.ts           |  2 ++
 3 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/src/extension.ts b/src/extension.ts
index 9bb3ad41..5bd026f1 100644
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -26,7 +26,7 @@ import { markdownEngine } from "./webview/markdownEngine";
 
 export async function activate(context: vscode.ExtensionContext): Promise<void> {
     try {
-        if (!await leetCodeExecutor.meetRequirements()) {
+        if (!await leetCodeExecutor.meetRequirements(context)) {
             throw new Error("The environment doesn't meet requirements.");
         }
 
diff --git a/src/leetCodeExecutor.ts b/src/leetCodeExecutor.ts
index 4c0aa312..5157b6c1 100644
--- a/src/leetCodeExecutor.ts
+++ b/src/leetCodeExecutor.ts
@@ -3,10 +3,12 @@
 
 import * as cp from "child_process";
 import * as fse from "fs-extra";
+import * as os from "os";
 import * as path from "path";
 import * as requireFromString from "require-from-string";
+import { ExtensionContext } from "vscode";
 import { ConfigurationChangeEvent, Disposable, MessageItem, window, workspace, WorkspaceConfiguration } from "vscode";
-import { Endpoint, IProblem, supportedPlugins } from "./shared";
+import { Endpoint, IProblem, leetcodeHasInited, supportedPlugins } from "./shared";
 import { executeCommand, executeCommandWithProgress } from "./utils/cpUtils";
 import { DialogOptions, openUrl } from "./utils/uiUtils";
 import * as wsl from "./utils/wslUtils";
@@ -34,7 +36,11 @@ class LeetCodeExecutor implements Disposable {
         return `"${path.join(this.leetCodeRootPath, "bin", "leetcode")}"`;
     }
 
-    public async meetRequirements(): Promise<boolean> {
+    public async meetRequirements(context: ExtensionContext): Promise<boolean> {
+        const hasInited: boolean | undefined = context.globalState.get(leetcodeHasInited);
+        if (!hasInited) {
+            await this.removeOldCache();
+        }
         if (this.nodeExecutable !== "node") {
             if (!await fse.pathExists(this.nodeExecutable)) {
                 throw new Error(`The Node.js executable does not exist on path ${this.nodeExecutable}`);
@@ -60,10 +66,13 @@ class LeetCodeExecutor implements Disposable {
         for (const plugin of supportedPlugins) {
             try { // Check plugin
                 await this.executeCommandEx(this.nodeExecutable, [await this.getLeetCodeBinaryPath(), "plugin", "-e", plugin]);
-            } catch (error) { // Download plugin and activate
+            } catch (error) { // Remove old cache that may cause the error download plugin and activate
+                await this.removeOldCache();
                 await this.executeCommandEx(this.nodeExecutable, [await this.getLeetCodeBinaryPath(), "plugin", "-i", plugin]);
             }
         }
+        // Set the global state HasInited true to skip delete old cache after init
+        context.globalState.update(leetcodeHasInited, true);
         return true;
     }
 
@@ -76,7 +85,7 @@ class LeetCodeExecutor implements Disposable {
     }
 
     public async signOut(): Promise<string> {
-        return await await this.executeCommandEx(this.nodeExecutable, [await this.getLeetCodeBinaryPath(), "user", "-L"]);
+        return await this.executeCommandEx(this.nodeExecutable, [await this.getLeetCodeBinaryPath(), "user", "-L"]);
     }
 
     public async listProblems(showLocked: boolean): Promise<string> {
@@ -194,6 +203,14 @@ class LeetCodeExecutor implements Disposable {
         }
         return await executeCommandWithProgress(message, command, args, options);
     }
+
+    private async removeOldCache(): Promise<void> {
+        const oldPath: string = path.join(os.homedir(), ".lc");
+        if (await fse.pathExists(oldPath)) {
+            await fse.remove(oldPath);
+        }
+    }
+
 }
 
 export const leetCodeExecutor: LeetCodeExecutor = new LeetCodeExecutor();
diff --git a/src/shared.ts b/src/shared.ts
index 9b6a749a..e09943f8 100644
--- a/src/shared.ts
+++ b/src/shared.ts
@@ -114,3 +114,5 @@ export enum DescriptionConfiguration {
     Both = "Both",
     None = "None",
 }
+
+export const leetcodeHasInited: string = "leetcode.hasInited";

From 4c0d59a4a5400cb490ff575931b94b620815f694 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 11 Dec 2020 11:05:35 +0800
Subject: [PATCH 25/47] chore(deps): bump ini from 1.3.5 to 1.3.7 (#656)

Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.7.
- [Release notes](https://github.com/isaacs/ini/releases)
- [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.7)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 package-lock.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index f378577b..50c5fbc2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -686,9 +686,9 @@
             "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
         },
         "ini": {
-            "version": "1.3.5",
-            "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
-            "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+            "version": "1.3.7",
+            "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz",
+            "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ=="
         },
         "invert-kv": {
             "version": "1.0.0",

From 172c87817e834e6250229cd130037d791a83dd53 Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Mon, 31 May 2021 11:26:49 +0800
Subject: [PATCH 26/47] chore: Use GitHub Actions for CI (#709)

---
 .github/workflows/build.yml | 71 +++++++++++++++++++++++++++++++++++++
 .travis.yml                 | 19 ----------
 .vscodeignore               |  1 -
 README.md                   |  4 +--
 docs/README_zh-CN.md        |  4 +--
 5 files changed, 75 insertions(+), 24 deletions(-)
 create mode 100644 .github/workflows/build.yml
 delete mode 100644 .travis.yml

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 00000000..1df11a00
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,71 @@
+name: CI
+
+on:
+  push:
+    branches: [ master ]
+  pull_request:
+    branches: [ master ]
+
+jobs:
+  linux:
+    name: Linux
+    runs-on: ubuntu-latest
+    timeout-minutes: 30
+    steps:
+    - uses: actions/checkout@v2
+
+    - name: Setup Node.js environment
+      uses: actions/setup-node@v2
+      with:
+        node-version: 12
+
+    - name: Install Node.js modules
+      run: npm install
+
+    - name: Lint
+      run: npm run lint
+
+    - name: VSCE Packge
+      run: npx vsce package
+
+  windows:
+    name: Windows
+    runs-on: windows-latest
+    timeout-minutes: 30
+    steps:
+    - uses: actions/checkout@v2
+
+    - name: Setup Node.js environment
+      uses: actions/setup-node@v2
+      with:
+        node-version: 12
+
+    - name: Install Node.js modules
+      run: npm install
+
+    - name: Lint
+      run: npm run lint
+
+    - name: VSCE Packge
+      run: npx vsce package
+
+  darwin:
+    name: macOS
+    runs-on: macos-latest
+    timeout-minutes: 30
+    steps:
+    - uses: actions/checkout@v2
+
+    - name: Setup Node.js environment
+      uses: actions/setup-node@v2
+      with:
+        node-version: 12
+
+    - name: Install Node.js modules
+      run: npm install
+
+    - name: Lint
+      run: npm run lint
+
+    - name: VSCE Packge
+      run: npx vsce package
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 6bbae841..00000000
--- a/.travis.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-language: node_js
-
-node_js:
-  - 'lts/*'
-
-before_install:
-  - if [ $TRAVIS_OS_NAME == "linux" ]; then
-      export CXX="g++-4.9" CC="gcc-4.9" DISPLAY=:99.0;
-      sh -e /etc/init.d/xvfb start;
-      sleep 3;
-    fi
-
-install:
-  - npm install -g vsce
-  - npm install
-
-script:
-  - npm run lint
-  - vsce package
diff --git a/.vscodeignore b/.vscodeignore
index 8cdceec0..7a04907d 100644
--- a/.vscodeignore
+++ b/.vscodeignore
@@ -5,7 +5,6 @@ test/**
 src/**
 **/*.map
 .gitignore
-.travis.yml
 package-lock.json
 tsconfig.json
 tslint.json
diff --git a/README.md b/README.md
index 3396d0c7..b432be98 100644
--- a/README.md
+++ b/README.md
@@ -6,8 +6,8 @@
   <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/resources/LeetCode.png" alt="">
 </p>
 <p align="center">
-  <a href="https://travis-ci.org/LeetCode-OpenSource/vscode-leetcode">
-    <img src="https://img.shields.io/travis/LeetCode-OpenSource/vscode-leetcode.svg?style=flat-square" alt="">
+  <a href="https://github.com/LeetCode-OpenSource/vscode-leetcode/actions?query=workflow%3ACI+branch%3Amaster">
+    <img src="https://img.shields.io/github/workflow/status/LeetCode-OpenSource/vscode-leetcode/CI/master?style=flat-square" alt="">
   </a>
   <a href="https://gitter.im/vscode-leetcode/Lobby">
     <img src="https://img.shields.io/gitter/room/LeetCode-OpenSource/vscode-leetcode.svg?style=flat-square" alt="">
diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md
index 608c6226..e4760015 100644
--- a/docs/README_zh-CN.md
+++ b/docs/README_zh-CN.md
@@ -6,8 +6,8 @@
   <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/resources/LeetCode.png" alt="">
 </p>
 <p align="center">
-  <a href="https://travis-ci.org/LeetCode-OpenSource/vscode-leetcode">
-    <img src="https://img.shields.io/travis/LeetCode-OpenSource/vscode-leetcode.svg?style=flat-square" alt="">
+  <a href="https://github.com/LeetCode-OpenSource/vscode-leetcode/actions?query=workflow%3ACI+branch%3Amaster">
+    <img src="https://img.shields.io/github/workflow/status/LeetCode-OpenSource/vscode-leetcode/CI/master?style=flat-square" alt="">
   </a>
   <a href="https://gitter.im/vscode-leetcode/Lobby">
     <img src="https://img.shields.io/gitter/room/LeetCode-OpenSource/vscode-leetcode.svg?style=flat-square" alt="">

From 6b95d5c015d90008f9d99001ac0655ef82e4d30f Mon Sep 17 00:00:00 2001
From: Tejasvi S Tomar <45873379+tejasvi@users.noreply.github.com>
Date: Mon, 31 May 2021 09:01:16 +0530
Subject: [PATCH 27/47] chore: Fix typo (#694)

Co-authored-by: Sheng Chen <sheche@microsoft.com>
---
 README.md    | 2 +-
 package.json | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index b432be98..35fd0cad 100644
--- a/README.md
+++ b/README.md
@@ -129,7 +129,7 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 | `leetcode.workspaceFolder`                                                              | Specify the path of the workspace folder to store the problem files.                                                                                                                                                                                                                                                                                                                                                              | `""`               |
 | `leetcode.filePath`                                                                     | Specify the relative path under the workspace and the file name to save the problem files. More details can be found [here](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/Customize-the-Relative-Folder-and-the-File-Name-of-the-Problem-File).                                                                                                                                                                                   |                    |
 | `leetcode.enableStatusBar`                                                              | Specify whether the LeetCode status bar will be shown or not.                                                                                                                                                                                                                                                                                                                                                                     | `true`             |
-| `leetcode.editor.shortcuts`                                                             | Specify the customized shorcuts in editors. Supported values are: `submit`, `test`, `star`, `solution` and `description`.                                                                                                                                                                                                                                                                                                                 | `["submit, test"]` |
+| `leetcode.editor.shortcuts`                                                             | Specify the customized shortcuts in editors. Supported values are: `submit`, `test`, `star`, `solution` and `description`.                                                                                                                                                                                                                                                                                                                 | `["submit, test"]` |
 | `leetcode.enableSideMode`                                                               | Specify whether `preview`, `solution` and `submission` tab should be grouped into the second editor column when solving a problem.                                                                                                                                                                                                                                                                                                | `true`             |
 | `leetcode.nodePath`                                                                     | Specify the `Node.js` executable path. for example, C:\Program Files\nodejs\node.exe                                                                                                                                                                                                                                                                                                                                              | `node`             |
 | `leetcode.showCommentDescription`                                                       | Specify whether to include the problem description in the comments                                                                                                                                                                                                                                                                                                                                                                | `false`            |
diff --git a/package.json b/package.json
index b1759a52..4a2ef54a 100644
--- a/package.json
+++ b/package.json
@@ -641,7 +641,7 @@
                                 "Show the problem description page."
                             ]
                         },
-                        "description": "Customize the shorcuts in editors."
+                        "description": "Customize the shortcuts in editors."
                     },
                     "leetcode.enableSideMode": {
                         "type": "boolean",

From 0fcf9f1f404f2af10c0917db46c399af5049c3ee Mon Sep 17 00:00:00 2001
From: Zhizhang Deng <reg@2011ysyb.com>
Date: Mon, 31 May 2021 01:40:04 -0400
Subject: [PATCH 28/47] feat: Added an option to disable endpoint translation
 (#690)

Co-authored-by: Sheng Chen <sheche@microsoft.com>
---
 package-lock.json         | 2154 ++++++++++++++++++++++++++++++++++++-
 package.json              |   10 +-
 src/commands/list.ts      |    4 +-
 src/commands/show.ts      |   11 +-
 src/leetCodeExecutor.ts   |   54 +-
 src/utils/settingUtils.ts |    4 +
 6 files changed, 2209 insertions(+), 28 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 50c5fbc2..4afd04fd 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,8 +1,2141 @@
 {
     "name": "vscode-leetcode",
     "version": "0.17.0",
-    "lockfileVersion": 1,
+    "lockfileVersion": 2,
     "requires": true,
+    "packages": {
+        "": {
+            "version": "0.17.0",
+            "license": "MIT",
+            "dependencies": {
+                "fs-extra": "^6.0.1",
+                "highlight.js": "^9.15.6",
+                "lodash": "^4.17.19",
+                "markdown-it": "^8.4.2",
+                "require-from-string": "^2.0.2",
+                "unescape-js": "^1.1.1",
+                "vsc-leetcode-cli": "^2.8.0"
+            },
+            "devDependencies": {
+                "@types/fs-extra": "5.0.0",
+                "@types/highlight.js": "^9.12.3",
+                "@types/lodash": "^4.14.123",
+                "@types/markdown-it": "0.0.7",
+                "@types/mocha": "^2.2.42",
+                "@types/node": "^7.0.43",
+                "@types/require-from-string": "^1.2.0",
+                "@types/vscode": "1.42.0",
+                "tslint": "^5.9.1",
+                "typescript": "^2.6.1"
+            },
+            "engines": {
+                "vscode": "^1.42.0"
+            }
+        },
+        "node_modules/@types/color-name": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+            "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
+        },
+        "node_modules/@types/fs-extra": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
+            "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
+            "dev": true,
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@types/highlight.js": {
+            "version": "9.12.3",
+            "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.3.tgz",
+            "integrity": "sha512-pGF/zvYOACZ/gLGWdQH8zSwteQS1epp68yRcVLJMgUck/MjEn/FBYmPub9pXT8C1e4a8YZfHo1CKyV8q1vKUnQ==",
+            "dev": true
+        },
+        "node_modules/@types/linkify-it": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-2.0.4.tgz",
+            "integrity": "sha512-9o5piu3tP6DwqT+Cyf7S3BitsTc6Cl0pCPKUhIE5hzQbtueiBXdtBipTLLvaGfT11/8XHRmsagu4YfBesTaiCA==",
+            "dev": true
+        },
+        "node_modules/@types/lodash": {
+            "version": "4.14.123",
+            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.123.tgz",
+            "integrity": "sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q==",
+            "dev": true
+        },
+        "node_modules/@types/markdown-it": {
+            "version": "0.0.7",
+            "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-0.0.7.tgz",
+            "integrity": "sha512-WyL6pa76ollQFQNEaLVa41ZUUvDvPY+qAUmlsphnrpL6I9p1m868b26FyeoOmo7X3/Ta/S9WKXcEYXUSHnxoVQ==",
+            "dev": true,
+            "dependencies": {
+                "@types/linkify-it": "*"
+            }
+        },
+        "node_modules/@types/mocha": {
+            "version": "2.2.48",
+            "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz",
+            "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==",
+            "dev": true
+        },
+        "node_modules/@types/node": {
+            "version": "7.10.3",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.3.tgz",
+            "integrity": "sha512-HeyK+csRk7Khhg9krpMGJeT9pLzjsmiJFHYRzYpPv/dQ5tPclQsbvceiX/HKynRt/9lMLorWUYTbBHC3hRI4sg==",
+            "dev": true
+        },
+        "node_modules/@types/require-from-string": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/@types/require-from-string/-/require-from-string-1.2.0.tgz",
+            "integrity": "sha512-5vE9WoOOC9/DoD3Zj53UISpM+5tSvh8k0mL4fe2zFI6vO715/W4IQ3EdVUrWVMrFi1/NZhyMvm2iKsDFkEGddQ==",
+            "dev": true
+        },
+        "node_modules/@types/vscode": {
+            "version": "1.42.0",
+            "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.42.0.tgz",
+            "integrity": "sha512-ds6TceMsh77Fs0Mq0Vap6Y72JbGWB8Bay4DrnJlf5d9ui2RSe1wis13oQm+XhguOeH1HUfLGzaDAoupTUtgabw==",
+            "dev": true
+        },
+        "node_modules/abab": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
+            "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=",
+            "optional": true
+        },
+        "node_modules/acorn": {
+            "version": "2.7.0",
+            "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz",
+            "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=",
+            "optional": true,
+            "bin": {
+                "acorn": "bin/acorn"
+            },
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/acorn-globals": {
+            "version": "1.0.9",
+            "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz",
+            "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=",
+            "optional": true,
+            "dependencies": {
+                "acorn": "^2.1.0"
+            }
+        },
+        "node_modules/ajv": {
+            "version": "6.12.2",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
+            "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==",
+            "dependencies": {
+                "fast-deep-equal": "^3.1.1",
+                "fast-json-stable-stringify": "^2.0.0",
+                "json-schema-traverse": "^0.4.1",
+                "uri-js": "^4.2.2"
+            }
+        },
+        "node_modules/ansi-regex": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+            "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/ansi-styles": {
+            "version": "3.2.1",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+            "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+            "dependencies": {
+                "color-convert": "^1.9.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/argparse": {
+            "version": "1.0.10",
+            "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+            "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+            "dependencies": {
+                "sprintf-js": "~1.0.2"
+            }
+        },
+        "node_modules/asn1": {
+            "version": "0.2.4",
+            "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+            "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+            "dependencies": {
+                "safer-buffer": "~2.1.0"
+            }
+        },
+        "node_modules/assert-plus": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+            "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/async": {
+            "version": "1.5.2",
+            "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+            "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
+        },
+        "node_modules/asynckit": {
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+            "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+        },
+        "node_modules/aws-sign2": {
+            "version": "0.7.0",
+            "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+            "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/aws4": {
+            "version": "1.10.0",
+            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
+            "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA=="
+        },
+        "node_modules/babel-code-frame": {
+            "version": "6.26.0",
+            "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+            "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+            "dev": true,
+            "dependencies": {
+                "chalk": "^1.1.3",
+                "esutils": "^2.0.2",
+                "js-tokens": "^3.0.2"
+            }
+        },
+        "node_modules/babel-code-frame/node_modules/ansi-styles": {
+            "version": "2.2.1",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+            "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/babel-code-frame/node_modules/chalk": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+            "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^2.2.1",
+                "escape-string-regexp": "^1.0.2",
+                "has-ansi": "^2.0.0",
+                "strip-ansi": "^3.0.0",
+                "supports-color": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/babel-code-frame/node_modules/supports-color": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+            "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+            "dev": true,
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
+        "node_modules/balanced-match": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+            "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+        },
+        "node_modules/bcrypt-pbkdf": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+            "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+            "dependencies": {
+                "tweetnacl": "^0.14.3"
+            }
+        },
+        "node_modules/boolbase": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+            "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
+        },
+        "node_modules/brace-expansion": {
+            "version": "1.1.11",
+            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+            "dependencies": {
+                "balanced-match": "^1.0.0",
+                "concat-map": "0.0.1"
+            }
+        },
+        "node_modules/builtin-modules": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+            "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/camelcase": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+            "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/caseless": {
+            "version": "0.12.0",
+            "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+            "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+        },
+        "node_modules/chalk": {
+            "version": "2.4.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+            "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+            "dependencies": {
+                "ansi-styles": "^3.2.1",
+                "escape-string-regexp": "^1.0.5",
+                "supports-color": "^5.3.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/cheerio": {
+            "version": "0.20.0",
+            "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.20.0.tgz",
+            "integrity": "sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU=",
+            "dependencies": {
+                "css-select": "~1.2.0",
+                "dom-serializer": "~0.1.0",
+                "entities": "~1.1.1",
+                "htmlparser2": "~3.8.1",
+                "lodash": "^4.1.0"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            },
+            "optionalDependencies": {
+                "jsdom": "^7.0.2"
+            }
+        },
+        "node_modules/cli-cursor": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+            "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+            "dependencies": {
+                "restore-cursor": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/cli-spinners": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz",
+            "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/cliui": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+            "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+            "dependencies": {
+                "string-width": "^1.0.1",
+                "strip-ansi": "^3.0.1",
+                "wrap-ansi": "^2.0.0"
+            }
+        },
+        "node_modules/clone": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+            "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/code-point-at": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+            "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/color-convert": {
+            "version": "1.9.3",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+            "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+            "dependencies": {
+                "color-name": "1.1.3"
+            }
+        },
+        "node_modules/color-name": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+            "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+        },
+        "node_modules/colors": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+            "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+            "engines": {
+                "node": ">=0.1.90"
+            }
+        },
+        "node_modules/combined-stream": {
+            "version": "1.0.8",
+            "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+            "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+            "dependencies": {
+                "delayed-stream": "~1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/commander": {
+            "version": "2.19.0",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
+            "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
+            "dev": true
+        },
+        "node_modules/concat-map": {
+            "version": "0.0.1",
+            "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+            "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+        },
+        "node_modules/core-util-is": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+            "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+        },
+        "node_modules/css-select": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
+            "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+            "dependencies": {
+                "boolbase": "~1.0.0",
+                "css-what": "2.1",
+                "domutils": "1.5.1",
+                "nth-check": "~1.0.1"
+            }
+        },
+        "node_modules/css-what": {
+            "version": "2.1.3",
+            "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
+            "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/cssom": {
+            "version": "0.3.8",
+            "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+            "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+            "optional": true
+        },
+        "node_modules/cssstyle": {
+            "version": "0.2.37",
+            "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
+            "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=",
+            "optional": true,
+            "dependencies": {
+                "cssom": "0.3.x"
+            }
+        },
+        "node_modules/cycle": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+            "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/dashdash": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+            "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+            "dependencies": {
+                "assert-plus": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10"
+            }
+        },
+        "node_modules/decamelize": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+            "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/deep-equal": {
+            "version": "0.2.2",
+            "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz",
+            "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0="
+        },
+        "node_modules/deep-is": {
+            "version": "0.1.3",
+            "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+            "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+            "optional": true
+        },
+        "node_modules/defaults": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+            "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+            "dependencies": {
+                "clone": "^1.0.2"
+            }
+        },
+        "node_modules/delayed-stream": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+            "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/diff": {
+            "version": "3.5.0",
+            "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+            "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.3.1"
+            }
+        },
+        "node_modules/dom-serializer": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
+            "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
+            "dependencies": {
+                "domelementtype": "^1.3.0",
+                "entities": "^1.1.1"
+            }
+        },
+        "node_modules/domelementtype": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+            "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+        },
+        "node_modules/domhandler": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
+            "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
+            "dependencies": {
+                "domelementtype": "1"
+            }
+        },
+        "node_modules/domutils": {
+            "version": "1.5.1",
+            "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+            "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+            "dependencies": {
+                "dom-serializer": "0",
+                "domelementtype": "1"
+            }
+        },
+        "node_modules/ecc-jsbn": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+            "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+            "dependencies": {
+                "jsbn": "~0.1.0",
+                "safer-buffer": "^2.1.0"
+            }
+        },
+        "node_modules/emoji-regex": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "node_modules/entities": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+            "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
+        },
+        "node_modules/escape-string-regexp": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+            "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
+        "node_modules/escodegen": {
+            "version": "1.14.3",
+            "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+            "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+            "optional": true,
+            "dependencies": {
+                "esprima": "^4.0.1",
+                "estraverse": "^4.2.0",
+                "esutils": "^2.0.2",
+                "optionator": "^0.8.1",
+                "source-map": "~0.6.1"
+            },
+            "bin": {
+                "escodegen": "bin/escodegen.js",
+                "esgenerate": "bin/esgenerate.js"
+            },
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/esprima": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+            "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+            "optional": true,
+            "bin": {
+                "esparse": "bin/esparse.js",
+                "esvalidate": "bin/esvalidate.js"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/estraverse": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+            "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+            "optional": true,
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/esutils": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+            "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+            "devOptional": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/extend": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+            "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+        },
+        "node_modules/extsprintf": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+            "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+            "engines": [
+                "node >=0.6.0"
+            ]
+        },
+        "node_modules/eyes": {
+            "version": "0.1.8",
+            "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+            "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+            "engines": {
+                "node": "> 0.1.90"
+            }
+        },
+        "node_modules/fast-deep-equal": {
+            "version": "3.1.3",
+            "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+            "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+        },
+        "node_modules/fast-json-stable-stringify": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+            "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+        },
+        "node_modules/fast-levenshtein": {
+            "version": "2.0.6",
+            "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+            "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+            "optional": true
+        },
+        "node_modules/find-up": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+            "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+            "dependencies": {
+                "locate-path": "^5.0.0",
+                "path-exists": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/forever-agent": {
+            "version": "0.6.1",
+            "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+            "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/form-data": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+            "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+            "dependencies": {
+                "asynckit": "^0.4.0",
+                "combined-stream": "^1.0.6",
+                "mime-types": "^2.1.12"
+            },
+            "engines": {
+                "node": ">= 0.12"
+            }
+        },
+        "node_modules/fs-extra": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
+            "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==",
+            "dependencies": {
+                "graceful-fs": "^4.1.2",
+                "jsonfile": "^4.0.0",
+                "universalify": "^0.1.0"
+            }
+        },
+        "node_modules/fs.realpath": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+            "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+        },
+        "node_modules/get-caller-file": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+            "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+            "engines": {
+                "node": "6.* || 8.* || >= 10.*"
+            }
+        },
+        "node_modules/getpass": {
+            "version": "0.1.7",
+            "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+            "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+            "dependencies": {
+                "assert-plus": "^1.0.0"
+            }
+        },
+        "node_modules/glob": {
+            "version": "7.1.3",
+            "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+            "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+            "dependencies": {
+                "fs.realpath": "^1.0.0",
+                "inflight": "^1.0.4",
+                "inherits": "2",
+                "minimatch": "^3.0.4",
+                "once": "^1.3.0",
+                "path-is-absolute": "^1.0.0"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/graceful-fs": {
+            "version": "4.1.15",
+            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
+            "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
+        },
+        "node_modules/har-schema": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+            "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/har-validator": {
+            "version": "5.1.3",
+            "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+            "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+            "dependencies": {
+                "ajv": "^6.5.5",
+                "har-schema": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/has-ansi": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+            "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+            "dev": true,
+            "dependencies": {
+                "ansi-regex": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/has-flag": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+            "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/he": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+            "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+            "bin": {
+                "he": "bin/he"
+            }
+        },
+        "node_modules/highlight.js": {
+            "version": "9.15.6",
+            "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.6.tgz",
+            "integrity": "sha512-zozTAWM1D6sozHo8kqhfYgsac+B+q0PmsjXeyDrYIHHcBN0zTVT66+s2GW1GZv7DbyaROdLXKdabwS/WqPyIdQ==",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/htmlparser2": {
+            "version": "3.8.3",
+            "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
+            "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
+            "dependencies": {
+                "domelementtype": "1",
+                "domhandler": "2.3",
+                "domutils": "1.5",
+                "entities": "1.0",
+                "readable-stream": "1.1"
+            }
+        },
+        "node_modules/htmlparser2/node_modules/entities": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
+            "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY="
+        },
+        "node_modules/http-signature": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+            "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+            "dependencies": {
+                "assert-plus": "^1.0.0",
+                "jsprim": "^1.2.2",
+                "sshpk": "^1.7.0"
+            },
+            "engines": {
+                "node": ">=0.8",
+                "npm": ">=1.3.7"
+            }
+        },
+        "node_modules/i": {
+            "version": "0.3.6",
+            "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz",
+            "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=",
+            "engines": {
+                "node": ">=0.4"
+            }
+        },
+        "node_modules/inflight": {
+            "version": "1.0.6",
+            "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+            "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+            "dependencies": {
+                "once": "^1.3.0",
+                "wrappy": "1"
+            }
+        },
+        "node_modules/inherits": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+            "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+        },
+        "node_modules/ini": {
+            "version": "1.3.7",
+            "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz",
+            "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ=="
+        },
+        "node_modules/invert-kv": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+            "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-fullwidth-code-point": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+            "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+            "dependencies": {
+                "number-is-nan": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-typedarray": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+            "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+        },
+        "node_modules/isarray": {
+            "version": "0.0.1",
+            "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+            "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+        },
+        "node_modules/isstream": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+            "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+        },
+        "node_modules/js-tokens": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+            "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+            "dev": true
+        },
+        "node_modules/js-yaml": {
+            "version": "3.13.1",
+            "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+            "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+            "dev": true,
+            "dependencies": {
+                "argparse": "^1.0.7",
+                "esprima": "^4.0.0"
+            },
+            "bin": {
+                "js-yaml": "bin/js-yaml.js"
+            }
+        },
+        "node_modules/js-yaml/node_modules/esprima": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+            "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+            "dev": true,
+            "bin": {
+                "esparse": "bin/esparse.js",
+                "esvalidate": "bin/esvalidate.js"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/jsbn": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+            "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+        },
+        "node_modules/jsdom": {
+            "version": "7.2.2",
+            "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz",
+            "integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=",
+            "optional": true,
+            "dependencies": {
+                "abab": "^1.0.0",
+                "acorn": "^2.4.0",
+                "acorn-globals": "^1.0.4",
+                "cssom": ">= 0.3.0 < 0.4.0",
+                "cssstyle": ">= 0.2.29 < 0.3.0",
+                "escodegen": "^1.6.1",
+                "nwmatcher": ">= 1.3.7 < 2.0.0",
+                "parse5": "^1.5.1",
+                "request": "^2.55.0",
+                "sax": "^1.1.4",
+                "symbol-tree": ">= 3.1.0 < 4.0.0",
+                "tough-cookie": "^2.2.0",
+                "webidl-conversions": "^2.0.0",
+                "whatwg-url-compat": "~0.6.5",
+                "xml-name-validator": ">= 2.0.1 < 3.0.0"
+            }
+        },
+        "node_modules/json-schema": {
+            "version": "0.2.3",
+            "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+            "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+        },
+        "node_modules/json-schema-traverse": {
+            "version": "0.4.1",
+            "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+            "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+        },
+        "node_modules/json-stringify-safe": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+            "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+        },
+        "node_modules/jsonfile": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+            "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+            "dependencies": {
+                "graceful-fs": "^4.1.6"
+            }
+        },
+        "node_modules/jsprim": {
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+            "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+            "engines": [
+                "node >=0.6.0"
+            ],
+            "dependencies": {
+                "assert-plus": "1.0.0",
+                "extsprintf": "1.3.0",
+                "json-schema": "0.2.3",
+                "verror": "1.10.0"
+            }
+        },
+        "node_modules/lcid": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+            "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+            "dependencies": {
+                "invert-kv": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/levn": {
+            "version": "0.3.0",
+            "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+            "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+            "optional": true,
+            "dependencies": {
+                "prelude-ls": "~1.1.2",
+                "type-check": "~0.3.2"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/linkify-it": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz",
+            "integrity": "sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==",
+            "dependencies": {
+                "uc.micro": "^1.0.1"
+            }
+        },
+        "node_modules/locate-path": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+            "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+            "dependencies": {
+                "p-locate": "^4.1.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/lodash": {
+            "version": "4.17.19",
+            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
+            "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
+        },
+        "node_modules/log-symbols": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+            "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+            "dependencies": {
+                "chalk": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/markdown-it": {
+            "version": "8.4.2",
+            "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
+            "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==",
+            "dependencies": {
+                "argparse": "^1.0.7",
+                "entities": "~1.1.1",
+                "linkify-it": "^2.0.0",
+                "mdurl": "^1.0.1",
+                "uc.micro": "^1.0.5"
+            },
+            "bin": {
+                "markdown-it": "bin/markdown-it.js"
+            }
+        },
+        "node_modules/mdurl": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+            "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
+        },
+        "node_modules/mime-db": {
+            "version": "1.44.0",
+            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+            "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/mime-types": {
+            "version": "2.1.27",
+            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+            "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+            "dependencies": {
+                "mime-db": "1.44.0"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/mimic-fn": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+            "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/minimatch": {
+            "version": "3.0.4",
+            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+            "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+            "dependencies": {
+                "brace-expansion": "^1.1.7"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/minimist": {
+            "version": "1.2.5",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+            "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+        },
+        "node_modules/mkdirp": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+            "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+            "bin": {
+                "mkdirp": "bin/cmd.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/moment": {
+            "version": "2.27.0",
+            "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz",
+            "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/mute-stream": {
+            "version": "0.0.8",
+            "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+            "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
+        },
+        "node_modules/nconf": {
+            "version": "0.10.0",
+            "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.10.0.tgz",
+            "integrity": "sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q==",
+            "dependencies": {
+                "async": "^1.4.0",
+                "ini": "^1.3.0",
+                "secure-keys": "^1.0.0",
+                "yargs": "^3.19.0"
+            },
+            "engines": {
+                "node": ">= 0.4.0"
+            }
+        },
+        "node_modules/nconf/node_modules/yargs": {
+            "version": "3.32.0",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz",
+            "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=",
+            "dependencies": {
+                "camelcase": "^2.0.1",
+                "cliui": "^3.0.3",
+                "decamelize": "^1.1.1",
+                "os-locale": "^1.4.0",
+                "string-width": "^1.0.1",
+                "window-size": "^0.1.4",
+                "y18n": "^3.2.0"
+            }
+        },
+        "node_modules/ncp": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz",
+            "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=",
+            "bin": {
+                "ncp": "bin/ncp"
+            }
+        },
+        "node_modules/nth-check": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+            "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+            "dependencies": {
+                "boolbase": "~1.0.0"
+            }
+        },
+        "node_modules/number-is-nan": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+            "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/nwmatcher": {
+            "version": "1.4.4",
+            "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz",
+            "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==",
+            "optional": true
+        },
+        "node_modules/oauth-sign": {
+            "version": "0.9.0",
+            "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+            "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/once": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+            "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+            "dependencies": {
+                "wrappy": "1"
+            }
+        },
+        "node_modules/onetime": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+            "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+            "dependencies": {
+                "mimic-fn": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/optionator": {
+            "version": "0.8.3",
+            "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+            "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+            "optional": true,
+            "dependencies": {
+                "deep-is": "~0.1.3",
+                "fast-levenshtein": "~2.0.6",
+                "levn": "~0.3.0",
+                "prelude-ls": "~1.1.2",
+                "type-check": "~0.3.2",
+                "word-wrap": "~1.2.3"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/ora": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/ora/-/ora-3.0.0.tgz",
+            "integrity": "sha512-LBS97LFe2RV6GJmXBi6OKcETKyklHNMV0xw7BtsVn2MlsgsydyZetSCbCANr+PFLmDyv4KV88nn0eCKza665Mg==",
+            "dependencies": {
+                "chalk": "^2.3.1",
+                "cli-cursor": "^2.1.0",
+                "cli-spinners": "^1.1.0",
+                "log-symbols": "^2.2.0",
+                "strip-ansi": "^4.0.0",
+                "wcwidth": "^1.0.1"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/ora/node_modules/ansi-regex": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+            "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/ora/node_modules/strip-ansi": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+            "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+            "dependencies": {
+                "ansi-regex": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/os-locale": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+            "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+            "dependencies": {
+                "lcid": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/p-limit": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+            "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+            "dependencies": {
+                "p-try": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/p-locate": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+            "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+            "dependencies": {
+                "p-limit": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/p-try": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+            "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/parse5": {
+            "version": "1.5.1",
+            "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
+            "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=",
+            "optional": true
+        },
+        "node_modules/path-exists": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+            "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/path-is-absolute": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+            "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/path-parse": {
+            "version": "1.0.6",
+            "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+            "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+            "dev": true
+        },
+        "node_modules/performance-now": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+            "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+        },
+        "node_modules/pkginfo": {
+            "version": "0.4.1",
+            "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz",
+            "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=",
+            "engines": {
+                "node": ">= 0.4.0"
+            }
+        },
+        "node_modules/prelude-ls": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+            "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+            "optional": true,
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/prompt": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.0.0.tgz",
+            "integrity": "sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4=",
+            "dependencies": {
+                "colors": "^1.1.2",
+                "pkginfo": "0.x.x",
+                "read": "1.0.x",
+                "revalidator": "0.1.x",
+                "utile": "0.3.x",
+                "winston": "2.1.x"
+            },
+            "engines": {
+                "node": ">= 0.6.6"
+            }
+        },
+        "node_modules/psl": {
+            "version": "1.8.0",
+            "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+            "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+        },
+        "node_modules/punycode": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+            "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/qs": {
+            "version": "6.5.2",
+            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+            "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+            "engines": {
+                "node": ">=0.6"
+            }
+        },
+        "node_modules/read": {
+            "version": "1.0.7",
+            "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
+            "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=",
+            "dependencies": {
+                "mute-stream": "~0.0.4"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/readable-stream": {
+            "version": "1.1.14",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+            "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+            "dependencies": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.1",
+                "isarray": "0.0.1",
+                "string_decoder": "~0.10.x"
+            }
+        },
+        "node_modules/request": {
+            "version": "2.88.0",
+            "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+            "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+            "dependencies": {
+                "aws-sign2": "~0.7.0",
+                "aws4": "^1.8.0",
+                "caseless": "~0.12.0",
+                "combined-stream": "~1.0.6",
+                "extend": "~3.0.2",
+                "forever-agent": "~0.6.1",
+                "form-data": "~2.3.2",
+                "har-validator": "~5.1.0",
+                "http-signature": "~1.2.0",
+                "is-typedarray": "~1.0.0",
+                "isstream": "~0.1.2",
+                "json-stringify-safe": "~5.0.1",
+                "mime-types": "~2.1.19",
+                "oauth-sign": "~0.9.0",
+                "performance-now": "^2.1.0",
+                "qs": "~6.5.2",
+                "safe-buffer": "^5.1.2",
+                "tough-cookie": "~2.4.3",
+                "tunnel-agent": "^0.6.0",
+                "uuid": "^3.3.2"
+            },
+            "engines": {
+                "node": ">= 4"
+            }
+        },
+        "node_modules/request/node_modules/punycode": {
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+            "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+        },
+        "node_modules/request/node_modules/tough-cookie": {
+            "version": "2.4.3",
+            "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+            "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+            "dependencies": {
+                "psl": "^1.1.24",
+                "punycode": "^1.4.1"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/require-directory": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+            "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/require-from-string": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+            "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/require-main-filename": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+            "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+        },
+        "node_modules/resolve": {
+            "version": "1.10.0",
+            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz",
+            "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==",
+            "dev": true,
+            "dependencies": {
+                "path-parse": "^1.0.6"
+            }
+        },
+        "node_modules/restore-cursor": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+            "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+            "dependencies": {
+                "onetime": "^2.0.0",
+                "signal-exit": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/revalidator": {
+            "version": "0.1.8",
+            "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz",
+            "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=",
+            "engines": {
+                "node": ">= 0.4.0"
+            }
+        },
+        "node_modules/rimraf": {
+            "version": "2.7.1",
+            "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+            "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+            "dependencies": {
+                "glob": "^7.1.3"
+            },
+            "bin": {
+                "rimraf": "bin.js"
+            }
+        },
+        "node_modules/safe-buffer": {
+            "version": "5.2.1",
+            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+        },
+        "node_modules/safer-buffer": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+            "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+        },
+        "node_modules/sax": {
+            "version": "1.2.4",
+            "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+            "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+            "optional": true
+        },
+        "node_modules/secure-keys": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz",
+            "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o="
+        },
+        "node_modules/semver": {
+            "version": "5.6.0",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+            "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+            "dev": true,
+            "bin": {
+                "semver": "bin/semver"
+            }
+        },
+        "node_modules/set-blocking": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+            "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+        },
+        "node_modules/signal-exit": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+            "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+        },
+        "node_modules/source-map": {
+            "version": "0.6.1",
+            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+            "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+            "optional": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/sprintf-js": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+            "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+        },
+        "node_modules/sshpk": {
+            "version": "1.16.1",
+            "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+            "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+            "dependencies": {
+                "asn1": "~0.2.3",
+                "assert-plus": "^1.0.0",
+                "bcrypt-pbkdf": "^1.0.0",
+                "dashdash": "^1.12.0",
+                "ecc-jsbn": "~0.1.1",
+                "getpass": "^0.1.1",
+                "jsbn": "~0.1.0",
+                "safer-buffer": "^2.0.2",
+                "tweetnacl": "~0.14.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/stack-trace": {
+            "version": "0.0.10",
+            "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+            "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/string_decoder": {
+            "version": "0.10.31",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+            "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+        },
+        "node_modules/string-width": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+            "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+            "dependencies": {
+                "code-point-at": "^1.0.0",
+                "is-fullwidth-code-point": "^1.0.0",
+                "strip-ansi": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/string.fromcodepoint": {
+            "version": "0.2.1",
+            "resolved": "https://registry.npmjs.org/string.fromcodepoint/-/string.fromcodepoint-0.2.1.tgz",
+            "integrity": "sha1-jZeDM8C8klOPUPOD5IiPPlYZ1lM="
+        },
+        "node_modules/strip-ansi": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+            "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+            "dependencies": {
+                "ansi-regex": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/supports-color": {
+            "version": "5.5.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+            "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+            "dependencies": {
+                "has-flag": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/symbol-tree": {
+            "version": "3.2.4",
+            "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+            "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+            "optional": true
+        },
+        "node_modules/tough-cookie": {
+            "version": "2.5.0",
+            "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+            "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+            "optional": true,
+            "dependencies": {
+                "psl": "^1.1.28",
+                "punycode": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/tr46": {
+            "version": "0.0.3",
+            "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+            "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
+            "optional": true
+        },
+        "node_modules/tslib": {
+            "version": "1.9.3",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+            "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+            "dev": true
+        },
+        "node_modules/tslint": {
+            "version": "5.12.1",
+            "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.1.tgz",
+            "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==",
+            "dev": true,
+            "dependencies": {
+                "babel-code-frame": "^6.22.0",
+                "builtin-modules": "^1.1.1",
+                "chalk": "^2.3.0",
+                "commander": "^2.12.1",
+                "diff": "^3.2.0",
+                "glob": "^7.1.1",
+                "js-yaml": "^3.7.0",
+                "minimatch": "^3.0.4",
+                "resolve": "^1.3.2",
+                "semver": "^5.3.0",
+                "tslib": "^1.8.0",
+                "tsutils": "^2.27.2"
+            },
+            "bin": {
+                "tslint": "bin/tslint"
+            },
+            "engines": {
+                "node": ">=4.8.0"
+            }
+        },
+        "node_modules/tsutils": {
+            "version": "2.29.0",
+            "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+            "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+            "dev": true,
+            "dependencies": {
+                "tslib": "^1.8.1"
+            }
+        },
+        "node_modules/tunnel-agent": {
+            "version": "0.6.0",
+            "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+            "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+            "dependencies": {
+                "safe-buffer": "^5.0.1"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/tweetnacl": {
+            "version": "0.14.5",
+            "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+            "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+        },
+        "node_modules/type-check": {
+            "version": "0.3.2",
+            "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+            "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+            "optional": true,
+            "dependencies": {
+                "prelude-ls": "~1.1.2"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/typescript": {
+            "version": "2.9.2",
+            "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz",
+            "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==",
+            "dev": true,
+            "bin": {
+                "tsc": "bin/tsc",
+                "tsserver": "bin/tsserver"
+            },
+            "engines": {
+                "node": ">=4.2.0"
+            }
+        },
+        "node_modules/uc.micro": {
+            "version": "1.0.6",
+            "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
+            "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
+        },
+        "node_modules/underscore": {
+            "version": "1.9.1",
+            "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz",
+            "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg=="
+        },
+        "node_modules/unescape-js": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/unescape-js/-/unescape-js-1.1.1.tgz",
+            "integrity": "sha512-2/6CdybfFt9fzYJhCD6SHfBnqCGNfjhMwPK9Pf+sJRloa/WmyAmxdBVOslOIYkvSIRKX+9xGePF5t1tugtZ63g==",
+            "dependencies": {
+                "string.fromcodepoint": "^0.2.1"
+            }
+        },
+        "node_modules/universalify": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+            "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+            "engines": {
+                "node": ">= 4.0.0"
+            }
+        },
+        "node_modules/uri-js": {
+            "version": "4.2.2",
+            "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+            "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+            "dependencies": {
+                "punycode": "^2.1.0"
+            }
+        },
+        "node_modules/utile": {
+            "version": "0.3.0",
+            "resolved": "https://registry.npmjs.org/utile/-/utile-0.3.0.tgz",
+            "integrity": "sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo=",
+            "dependencies": {
+                "async": "~0.9.0",
+                "deep-equal": "~0.2.1",
+                "i": "0.3.x",
+                "mkdirp": "0.x.x",
+                "ncp": "1.0.x",
+                "rimraf": "2.x.x"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/utile/node_modules/async": {
+            "version": "0.9.2",
+            "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
+            "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0="
+        },
+        "node_modules/utile/node_modules/mkdirp": {
+            "version": "0.5.5",
+            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+            "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+            "dependencies": {
+                "minimist": "^1.2.5"
+            },
+            "bin": {
+                "mkdirp": "bin/cmd.js"
+            }
+        },
+        "node_modules/uuid": {
+            "version": "3.4.0",
+            "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+            "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+            "bin": {
+                "uuid": "bin/uuid"
+            }
+        },
+        "node_modules/verror": {
+            "version": "1.10.0",
+            "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+            "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+            "engines": [
+                "node >=0.6.0"
+            ],
+            "dependencies": {
+                "assert-plus": "^1.0.0",
+                "core-util-is": "1.0.2",
+                "extsprintf": "^1.2.0"
+            }
+        },
+        "node_modules/vsc-leetcode-cli": {
+            "version": "2.8.0",
+            "resolved": "https://registry.npmjs.org/vsc-leetcode-cli/-/vsc-leetcode-cli-2.8.0.tgz",
+            "integrity": "sha512-KcFzpk3OZ+wUCoeK1yjBK0hYpJItYd8WFC7pQfE1zxJGjQs4tUvadLI5imKfRjw5NicjNRFnVpVv6N7ig7ik4A==",
+            "dependencies": {
+                "ansi-styles": "3.2.1",
+                "cheerio": "0.20.0",
+                "he": "1.2.0",
+                "mkdirp": "^1.0.4",
+                "moment": "^2.20.1",
+                "nconf": "0.10.0",
+                "ora": "3.0.0",
+                "prompt": "1.0.0",
+                "request": "2.88.0",
+                "supports-color": "5.5.0",
+                "underscore": "1.9.1",
+                "wordwrap": "1.0.0",
+                "yargs": "^15.3.1"
+            },
+            "bin": {
+                "leetcode": "bin/leetcode"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/wcwidth": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+            "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+            "dependencies": {
+                "defaults": "^1.0.3"
+            }
+        },
+        "node_modules/webidl-conversions": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-2.0.1.tgz",
+            "integrity": "sha1-O/glj30xjHRDw28uFpQCoaZwNQY=",
+            "optional": true
+        },
+        "node_modules/whatwg-url-compat": {
+            "version": "0.6.5",
+            "resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz",
+            "integrity": "sha1-AImBEa9om7CXVBzVpFymyHmERb8=",
+            "optional": true,
+            "dependencies": {
+                "tr46": "~0.0.1"
+            }
+        },
+        "node_modules/which-module": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+            "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+        },
+        "node_modules/window-size": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
+            "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=",
+            "bin": {
+                "window-size": "cli.js"
+            },
+            "engines": {
+                "node": ">= 0.10.0"
+            }
+        },
+        "node_modules/winston": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/winston/-/winston-2.1.1.tgz",
+            "integrity": "sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4=",
+            "dependencies": {
+                "async": "~1.0.0",
+                "colors": "1.0.x",
+                "cycle": "1.0.x",
+                "eyes": "0.1.x",
+                "isstream": "0.1.x",
+                "pkginfo": "0.3.x",
+                "stack-trace": "0.0.x"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/winston/node_modules/async": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+            "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
+        },
+        "node_modules/winston/node_modules/colors": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+            "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+            "engines": {
+                "node": ">=0.1.90"
+            }
+        },
+        "node_modules/winston/node_modules/pkginfo": {
+            "version": "0.3.1",
+            "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz",
+            "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=",
+            "engines": {
+                "node": ">= 0.4.0"
+            }
+        },
+        "node_modules/word-wrap": {
+            "version": "1.2.3",
+            "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+            "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+            "optional": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/wordwrap": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+            "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
+        },
+        "node_modules/wrap-ansi": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+            "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+            "dependencies": {
+                "string-width": "^1.0.1",
+                "strip-ansi": "^3.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/wrappy": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+            "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+        },
+        "node_modules/xml-name-validator": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
+            "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=",
+            "optional": true
+        },
+        "node_modules/y18n": {
+            "version": "3.2.1",
+            "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+            "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
+        },
+        "node_modules/yargs": {
+            "version": "15.3.1",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
+            "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
+            "dependencies": {
+                "cliui": "^6.0.0",
+                "decamelize": "^1.2.0",
+                "find-up": "^4.1.0",
+                "get-caller-file": "^2.0.1",
+                "require-directory": "^2.1.1",
+                "require-main-filename": "^2.0.0",
+                "set-blocking": "^2.0.0",
+                "string-width": "^4.2.0",
+                "which-module": "^2.0.0",
+                "y18n": "^4.0.0",
+                "yargs-parser": "^18.1.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/yargs-parser": {
+            "version": "18.1.3",
+            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+            "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+            "dependencies": {
+                "camelcase": "^5.0.0",
+                "decamelize": "^1.2.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/yargs-parser/node_modules/camelcase": {
+            "version": "5.3.1",
+            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+            "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/yargs/node_modules/ansi-regex": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+            "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/yargs/node_modules/ansi-styles": {
+            "version": "4.2.1",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+            "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+            "dependencies": {
+                "@types/color-name": "^1.1.1",
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/yargs/node_modules/cliui": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+            "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+            "dependencies": {
+                "string-width": "^4.2.0",
+                "strip-ansi": "^6.0.0",
+                "wrap-ansi": "^6.2.0"
+            }
+        },
+        "node_modules/yargs/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/yargs/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        },
+        "node_modules/yargs/node_modules/is-fullwidth-code-point": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+            "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/yargs/node_modules/string-width": {
+            "version": "4.2.0",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+            "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+            "dependencies": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/yargs/node_modules/strip-ansi": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+            "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+            "dependencies": {
+                "ansi-regex": "^5.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/yargs/node_modules/wrap-ansi": {
+            "version": "6.2.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+            "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/yargs/node_modules/y18n": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+            "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
+        }
+    },
     "dependencies": {
         "@types/color-name": {
             "version": "1.1.1",
@@ -496,7 +2629,8 @@
         "esutils": {
             "version": "2.0.2",
             "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-            "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+            "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+            "devOptional": true
         },
         "extend": {
             "version": "3.0.2",
@@ -1300,6 +3434,11 @@
             "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
             "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
         },
+        "string_decoder": {
+            "version": "0.10.31",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+            "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+        },
         "string-width": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
@@ -1315,11 +3454,6 @@
             "resolved": "https://registry.npmjs.org/string.fromcodepoint/-/string.fromcodepoint-0.2.1.tgz",
             "integrity": "sha1-jZeDM8C8klOPUPOD5IiPPlYZ1lM="
         },
-        "string_decoder": {
-            "version": "0.10.31",
-            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-            "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
-        },
         "strip-ansi": {
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
@@ -1496,9 +3630,9 @@
             }
         },
         "vsc-leetcode-cli": {
-            "version": "2.7.0",
-            "resolved": "https://registry.npmjs.org/vsc-leetcode-cli/-/vsc-leetcode-cli-2.7.0.tgz",
-            "integrity": "sha512-y0VEcdv1j61hblxBMQWGqdKC4TgGm9tu+9lvoMXz4RaDzwkmzfFpNMo32tMrJGiP23kk+IiXz6r41M1vcL2OlQ==",
+            "version": "2.8.0",
+            "resolved": "https://registry.npmjs.org/vsc-leetcode-cli/-/vsc-leetcode-cli-2.8.0.tgz",
+            "integrity": "sha512-KcFzpk3OZ+wUCoeK1yjBK0hYpJItYd8WFC7pQfE1zxJGjQs4tUvadLI5imKfRjw5NicjNRFnVpVv6N7ig7ik4A==",
             "requires": {
                 "ansi-styles": "3.2.1",
                 "cheerio": "0.20.0",
diff --git a/package.json b/package.json
index 4a2ef54a..58e99198 100644
--- a/package.json
+++ b/package.json
@@ -364,6 +364,12 @@
                         ],
                         "description": "Endpoint of the user account."
                     },
+                    "leetcode.useEndpointTranslation": {
+                        "type": "boolean",
+                        "default": true,
+                        "scope": "application",
+                        "description": "Use endpoint's translation (if available)"
+                    },
                     "leetcode.workspaceFolder": {
                         "type": "string",
                         "scope": "application",
@@ -672,8 +678,8 @@
         "@types/markdown-it": "0.0.7",
         "@types/mocha": "^2.2.42",
         "@types/node": "^7.0.43",
-        "@types/vscode": "1.42.0",
         "@types/require-from-string": "^1.2.0",
+        "@types/vscode": "1.42.0",
         "tslint": "^5.9.1",
         "typescript": "^2.6.1"
     },
@@ -684,6 +690,6 @@
         "markdown-it": "^8.4.2",
         "require-from-string": "^2.0.2",
         "unescape-js": "^1.1.1",
-        "vsc-leetcode-cli": "2.7.0"
+        "vsc-leetcode-cli": "2.8.0"
     }
 }
diff --git a/src/commands/list.ts b/src/commands/list.ts
index 5cb44137..7e7b36a7 100644
--- a/src/commands/list.ts
+++ b/src/commands/list.ts
@@ -5,6 +5,7 @@ import * as vscode from "vscode";
 import { leetCodeExecutor } from "../leetCodeExecutor";
 import { leetCodeManager } from "../leetCodeManager";
 import { IProblem, ProblemState, UserStatus } from "../shared";
+import * as settingUtils from "../utils/settingUtils";
 import { DialogType, promptForOpenOutputChannel } from "../utils/uiUtils";
 
 export async function listProblems(): Promise<IProblem[]> {
@@ -14,7 +15,8 @@ export async function listProblems(): Promise<IProblem[]> {
         }
         const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode");
         const showLocked: boolean = !!leetCodeConfig.get<boolean>("showLocked");
-        const result: string = await leetCodeExecutor.listProblems(showLocked);
+        const useEndpointTranslation: boolean = settingUtils.shouldUseEndpointTranslation();
+        const result: string = await leetCodeExecutor.listProblems(showLocked, useEndpointTranslation);
         const problems: IProblem[] = [];
         const lines: string[] = result.split("\n");
         const reg: RegExp = /^(.)\s(.{1,2})\s(.)\s\[\s*(\d*)\s*\]\s*(.*)\s*(Easy|Medium|Hard)\s*\((\s*\d+\.\d+ %)\)/;
diff --git a/src/commands/show.ts b/src/commands/show.ts
index 70474426..3aebce8f 100644
--- a/src/commands/show.ts
+++ b/src/commands/show.ts
@@ -41,8 +41,8 @@ export async function previewProblem(input: IProblem | vscode.Uri, isSideMode: b
     } else {
         node = input;
     }
-
-    const descString: string = await leetCodeExecutor.getDescription(node.id);
+    const needTranslation: boolean = settingUtils.shouldUseEndpointTranslation();
+    const descString: string = await leetCodeExecutor.getDescription(node.id, needTranslation);
     leetCodePreviewProvider.show(descString, node, isSideMode);
 }
 
@@ -97,7 +97,8 @@ export async function showSolution(input: LeetCodeNode | vscode.Uri): Promise<vo
         return;
     }
     try {
-        const solution: string = await leetCodeExecutor.showSolution(problemInput, language);
+        const needTranslation: boolean = settingUtils.shouldUseEndpointTranslation();
+        const solution: string = await leetCodeExecutor.showSolution(problemInput, language, needTranslation);
         leetCodeSolutionProvider.show(unescapeJS(solution));
     } catch (error) {
         leetCodeChannel.appendLine(error.toString());
@@ -167,7 +168,9 @@ async function showProblemInternal(node: IProblem): Promise<void> {
         finalPath = wsl.useWsl() ? await wsl.toWinPath(finalPath) : finalPath;
 
         const descriptionConfig: IDescriptionConfiguration = settingUtils.getDescriptionConfiguration();
-        await leetCodeExecutor.showProblem(node, language, finalPath, descriptionConfig.showInComment);
+        const needTranslation: boolean = settingUtils.shouldUseEndpointTranslation();
+
+        await leetCodeExecutor.showProblem(node, language, finalPath, descriptionConfig.showInComment, needTranslation);
         const promises: any[] = [
             vscode.window.showTextDocument(vscode.Uri.file(finalPath), { preview: false, viewColumn: vscode.ViewColumn.One }),
             promptHintMessage(
diff --git a/src/leetCodeExecutor.ts b/src/leetCodeExecutor.ts
index 5157b6c1..d2332c7a 100644
--- a/src/leetCodeExecutor.ts
+++ b/src/leetCodeExecutor.ts
@@ -88,30 +88,62 @@ class LeetCodeExecutor implements Disposable {
         return await this.executeCommandEx(this.nodeExecutable, [await this.getLeetCodeBinaryPath(), "user", "-L"]);
     }
 
-    public async listProblems(showLocked: boolean): Promise<string> {
-        return await this.executeCommandEx(this.nodeExecutable, showLocked ?
-            [await this.getLeetCodeBinaryPath(), "list"] :
-            [await this.getLeetCodeBinaryPath(), "list", "-q", "L"],
-        );
+    public async listProblems(showLocked: boolean, needTranslation: boolean): Promise<string> {
+        const cmd: string[] = [await this.getLeetCodeBinaryPath(), "list"];
+        if (!needTranslation) {
+            cmd.push("-T"); // use -T to prevent translation
+        }
+        if (!showLocked) {
+            cmd.push("-q");
+            cmd.push("L");
+        }
+        return await this.executeCommandEx(this.nodeExecutable, cmd);
     }
 
-    public async showProblem(problemNode: IProblem, language: string, filePath: string, showDescriptionInComment: boolean = false): Promise<void> {
+    public async showProblem(problemNode: IProblem, language: string, filePath: string, showDescriptionInComment: boolean = false, needTranslation: boolean): Promise<void> {
         const templateType: string = showDescriptionInComment ? "-cx" : "-c";
+        const cmd: string[] = [await this.getLeetCodeBinaryPath(), "show", problemNode.id, templateType, "-l", language];
+
+        if (!needTranslation) {
+            cmd.push("-T"); // use -T to force English version
+        }
 
         if (!await fse.pathExists(filePath)) {
             await fse.createFile(filePath);
-            const codeTemplate: string = await this.executeCommandWithProgressEx("Fetching problem data...", this.nodeExecutable, [await this.getLeetCodeBinaryPath(), "show", problemNode.id, templateType, "-l", language]);
+            const codeTemplate: string = await this.executeCommandWithProgressEx("Fetching problem data...", this.nodeExecutable, cmd);
             await fse.writeFile(filePath, codeTemplate);
         }
     }
 
-    public async showSolution(input: string, language: string): Promise<string> {
-        const solution: string = await this.executeCommandWithProgressEx("Fetching top voted solution from discussions...", this.nodeExecutable, [await this.getLeetCodeBinaryPath(), "show", input, "--solution", "-l", language]);
+    /**
+     * This function returns solution of a problem identified by input
+     *
+     * @remarks
+     * Even though this function takes the needTranslation flag, it is important to note
+     * that as of vsc-leetcode-cli 2.8.0, leetcode-cli doesn't support querying solution
+     * on CN endpoint yet. So this flag doesn't have any effect right now.
+     *
+     * @param input - parameter to pass to cli that can identify a problem
+     * @param language - the source code language of the solution desired
+     * @param needTranslation - whether or not to use endPoint translation on solution query
+     * @returns promise of the solution string
+     */
+    public async showSolution(input: string, language: string, needTranslation: boolean): Promise<string> {
+        // solution don't support translation
+        const cmd: string[] = [await this.getLeetCodeBinaryPath(), "show", input, "--solution", "-l", language];
+        if (!needTranslation) {
+            cmd.push("-T");
+        }
+        const solution: string = await this.executeCommandWithProgressEx("Fetching top voted solution from discussions...", this.nodeExecutable, cmd);
         return solution;
     }
 
-    public async getDescription(problemNodeId: string): Promise<string> {
-        return await this.executeCommandWithProgressEx("Fetching problem description...", this.nodeExecutable, [await this.getLeetCodeBinaryPath(), "show", problemNodeId, "-x"]);
+    public async getDescription(problemNodeId: string, needTranslation: boolean): Promise<string> {
+        const cmd: string[] = [await this.getLeetCodeBinaryPath(), "show", problemNodeId, "-x"];
+        if (!needTranslation) {
+            cmd.push("-T");
+        }
+        return await this.executeCommandWithProgressEx("Fetching problem description...", this.nodeExecutable, cmd);
     }
 
     public async listSessions(): Promise<string> {
diff --git a/src/utils/settingUtils.ts b/src/utils/settingUtils.ts
index 207604fa..7b6eb6c2 100644
--- a/src/utils/settingUtils.ts
+++ b/src/utils/settingUtils.ts
@@ -25,6 +25,10 @@ export function hasStarShortcut(): boolean {
     return shortcuts.indexOf("star") >= 0;
 }
 
+export function shouldUseEndpointTranslation(): boolean {
+    return getWorkspaceConfiguration().get<boolean>("useEndpointTranslation", true);
+}
+
 export function getDescriptionConfiguration(): IDescriptionConfiguration {
     const setting: string = getWorkspaceConfiguration().get<string>("showDescription", DescriptionConfiguration.InWebView);
     const config: IDescriptionConfiguration = {

From ff46c33772441a076ae0008c83b9531f58a57e98 Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Thu, 3 Jun 2021 10:30:26 +0800
Subject: [PATCH 29/47] chore: Update npm modules (#710)

---
 package-lock.json                         | 2521 ++-------------------
 package.json                              |   19 +-
 src/leetCodeManager.ts                    |   14 +-
 src/utils/cpUtils.ts                      |    6 +-
 src/webview/leetCodePreviewProvider.ts    |    2 -
 src/webview/leetCodeSolutionProvider.ts   |    1 -
 src/webview/leetCodeSubmissionProvider.ts |    1 -
 7 files changed, 211 insertions(+), 2353 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 4afd04fd..e4980605 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,2172 +1,54 @@
 {
     "name": "vscode-leetcode",
     "version": "0.17.0",
-    "lockfileVersion": 2,
+    "lockfileVersion": 1,
     "requires": true,
-    "packages": {
-        "": {
-            "version": "0.17.0",
-            "license": "MIT",
-            "dependencies": {
-                "fs-extra": "^6.0.1",
-                "highlight.js": "^9.15.6",
-                "lodash": "^4.17.19",
-                "markdown-it": "^8.4.2",
-                "require-from-string": "^2.0.2",
-                "unescape-js": "^1.1.1",
-                "vsc-leetcode-cli": "^2.8.0"
-            },
-            "devDependencies": {
-                "@types/fs-extra": "5.0.0",
-                "@types/highlight.js": "^9.12.3",
-                "@types/lodash": "^4.14.123",
-                "@types/markdown-it": "0.0.7",
-                "@types/mocha": "^2.2.42",
-                "@types/node": "^7.0.43",
-                "@types/require-from-string": "^1.2.0",
-                "@types/vscode": "1.42.0",
-                "tslint": "^5.9.1",
-                "typescript": "^2.6.1"
-            },
-            "engines": {
-                "vscode": "^1.42.0"
-            }
-        },
-        "node_modules/@types/color-name": {
-            "version": "1.1.1",
-            "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
-            "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
-        },
-        "node_modules/@types/fs-extra": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
-            "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
-            "dev": true,
-            "dependencies": {
-                "@types/node": "*"
-            }
-        },
-        "node_modules/@types/highlight.js": {
-            "version": "9.12.3",
-            "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.3.tgz",
-            "integrity": "sha512-pGF/zvYOACZ/gLGWdQH8zSwteQS1epp68yRcVLJMgUck/MjEn/FBYmPub9pXT8C1e4a8YZfHo1CKyV8q1vKUnQ==",
-            "dev": true
-        },
-        "node_modules/@types/linkify-it": {
-            "version": "2.0.4",
-            "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-2.0.4.tgz",
-            "integrity": "sha512-9o5piu3tP6DwqT+Cyf7S3BitsTc6Cl0pCPKUhIE5hzQbtueiBXdtBipTLLvaGfT11/8XHRmsagu4YfBesTaiCA==",
-            "dev": true
-        },
-        "node_modules/@types/lodash": {
-            "version": "4.14.123",
-            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.123.tgz",
-            "integrity": "sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q==",
-            "dev": true
-        },
-        "node_modules/@types/markdown-it": {
-            "version": "0.0.7",
-            "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-0.0.7.tgz",
-            "integrity": "sha512-WyL6pa76ollQFQNEaLVa41ZUUvDvPY+qAUmlsphnrpL6I9p1m868b26FyeoOmo7X3/Ta/S9WKXcEYXUSHnxoVQ==",
-            "dev": true,
-            "dependencies": {
-                "@types/linkify-it": "*"
-            }
-        },
-        "node_modules/@types/mocha": {
-            "version": "2.2.48",
-            "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz",
-            "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==",
-            "dev": true
-        },
-        "node_modules/@types/node": {
-            "version": "7.10.3",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.3.tgz",
-            "integrity": "sha512-HeyK+csRk7Khhg9krpMGJeT9pLzjsmiJFHYRzYpPv/dQ5tPclQsbvceiX/HKynRt/9lMLorWUYTbBHC3hRI4sg==",
-            "dev": true
-        },
-        "node_modules/@types/require-from-string": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/@types/require-from-string/-/require-from-string-1.2.0.tgz",
-            "integrity": "sha512-5vE9WoOOC9/DoD3Zj53UISpM+5tSvh8k0mL4fe2zFI6vO715/W4IQ3EdVUrWVMrFi1/NZhyMvm2iKsDFkEGddQ==",
-            "dev": true
-        },
-        "node_modules/@types/vscode": {
-            "version": "1.42.0",
-            "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.42.0.tgz",
-            "integrity": "sha512-ds6TceMsh77Fs0Mq0Vap6Y72JbGWB8Bay4DrnJlf5d9ui2RSe1wis13oQm+XhguOeH1HUfLGzaDAoupTUtgabw==",
-            "dev": true
-        },
-        "node_modules/abab": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
-            "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=",
-            "optional": true
-        },
-        "node_modules/acorn": {
-            "version": "2.7.0",
-            "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz",
-            "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=",
-            "optional": true,
-            "bin": {
-                "acorn": "bin/acorn"
-            },
-            "engines": {
-                "node": ">=0.4.0"
-            }
-        },
-        "node_modules/acorn-globals": {
-            "version": "1.0.9",
-            "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz",
-            "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=",
-            "optional": true,
-            "dependencies": {
-                "acorn": "^2.1.0"
-            }
-        },
-        "node_modules/ajv": {
-            "version": "6.12.2",
-            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
-            "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==",
-            "dependencies": {
-                "fast-deep-equal": "^3.1.1",
-                "fast-json-stable-stringify": "^2.0.0",
-                "json-schema-traverse": "^0.4.1",
-                "uri-js": "^4.2.2"
-            }
-        },
-        "node_modules/ansi-regex": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-            "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/ansi-styles": {
-            "version": "3.2.1",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-            "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-            "dependencies": {
-                "color-convert": "^1.9.0"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/argparse": {
-            "version": "1.0.10",
-            "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-            "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-            "dependencies": {
-                "sprintf-js": "~1.0.2"
-            }
-        },
-        "node_modules/asn1": {
-            "version": "0.2.4",
-            "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
-            "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
-            "dependencies": {
-                "safer-buffer": "~2.1.0"
-            }
-        },
-        "node_modules/assert-plus": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-            "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
-            "engines": {
-                "node": ">=0.8"
-            }
-        },
-        "node_modules/async": {
-            "version": "1.5.2",
-            "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
-            "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
-        },
-        "node_modules/asynckit": {
-            "version": "0.4.0",
-            "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-            "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
-        },
-        "node_modules/aws-sign2": {
-            "version": "0.7.0",
-            "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-            "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
-            "engines": {
-                "node": "*"
-            }
-        },
-        "node_modules/aws4": {
-            "version": "1.10.0",
-            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
-            "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA=="
-        },
-        "node_modules/babel-code-frame": {
-            "version": "6.26.0",
-            "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
-            "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
-            "dev": true,
-            "dependencies": {
-                "chalk": "^1.1.3",
-                "esutils": "^2.0.2",
-                "js-tokens": "^3.0.2"
-            }
-        },
-        "node_modules/babel-code-frame/node_modules/ansi-styles": {
-            "version": "2.2.1",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-            "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/babel-code-frame/node_modules/chalk": {
-            "version": "1.1.3",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-            "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^2.2.1",
-                "escape-string-regexp": "^1.0.2",
-                "has-ansi": "^2.0.0",
-                "strip-ansi": "^3.0.0",
-                "supports-color": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/babel-code-frame/node_modules/supports-color": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-            "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-            "dev": true,
-            "engines": {
-                "node": ">=0.8.0"
-            }
-        },
-        "node_modules/balanced-match": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-            "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
-        },
-        "node_modules/bcrypt-pbkdf": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
-            "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
-            "dependencies": {
-                "tweetnacl": "^0.14.3"
-            }
-        },
-        "node_modules/boolbase": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
-            "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
-        },
-        "node_modules/brace-expansion": {
-            "version": "1.1.11",
-            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-            "dependencies": {
-                "balanced-match": "^1.0.0",
-                "concat-map": "0.0.1"
-            }
-        },
-        "node_modules/builtin-modules": {
-            "version": "1.1.1",
-            "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
-            "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/camelcase": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-            "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/caseless": {
-            "version": "0.12.0",
-            "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-            "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
-        },
-        "node_modules/chalk": {
-            "version": "2.4.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-            "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-            "dependencies": {
-                "ansi-styles": "^3.2.1",
-                "escape-string-regexp": "^1.0.5",
-                "supports-color": "^5.3.0"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/cheerio": {
-            "version": "0.20.0",
-            "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.20.0.tgz",
-            "integrity": "sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU=",
-            "dependencies": {
-                "css-select": "~1.2.0",
-                "dom-serializer": "~0.1.0",
-                "entities": "~1.1.1",
-                "htmlparser2": "~3.8.1",
-                "lodash": "^4.1.0"
-            },
-            "engines": {
-                "node": ">= 0.6"
-            },
-            "optionalDependencies": {
-                "jsdom": "^7.0.2"
-            }
-        },
-        "node_modules/cli-cursor": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
-            "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
-            "dependencies": {
-                "restore-cursor": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/cli-spinners": {
-            "version": "1.3.1",
-            "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz",
-            "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==",
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/cliui": {
-            "version": "3.2.0",
-            "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
-            "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
-            "dependencies": {
-                "string-width": "^1.0.1",
-                "strip-ansi": "^3.0.1",
-                "wrap-ansi": "^2.0.0"
-            }
-        },
-        "node_modules/clone": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
-            "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
-            "engines": {
-                "node": ">=0.8"
-            }
-        },
-        "node_modules/code-point-at": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
-            "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/color-convert": {
-            "version": "1.9.3",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-            "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-            "dependencies": {
-                "color-name": "1.1.3"
-            }
-        },
-        "node_modules/color-name": {
-            "version": "1.1.3",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-            "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
-        },
-        "node_modules/colors": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
-            "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
-            "engines": {
-                "node": ">=0.1.90"
-            }
-        },
-        "node_modules/combined-stream": {
-            "version": "1.0.8",
-            "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-            "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-            "dependencies": {
-                "delayed-stream": "~1.0.0"
-            },
-            "engines": {
-                "node": ">= 0.8"
-            }
-        },
-        "node_modules/commander": {
-            "version": "2.19.0",
-            "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
-            "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
-            "dev": true
-        },
-        "node_modules/concat-map": {
-            "version": "0.0.1",
-            "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-            "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
-        },
-        "node_modules/core-util-is": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-            "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
-        },
-        "node_modules/css-select": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
-            "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
-            "dependencies": {
-                "boolbase": "~1.0.0",
-                "css-what": "2.1",
-                "domutils": "1.5.1",
-                "nth-check": "~1.0.1"
-            }
-        },
-        "node_modules/css-what": {
-            "version": "2.1.3",
-            "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
-            "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
-            "engines": {
-                "node": "*"
-            }
-        },
-        "node_modules/cssom": {
-            "version": "0.3.8",
-            "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
-            "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
-            "optional": true
-        },
-        "node_modules/cssstyle": {
-            "version": "0.2.37",
-            "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
-            "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=",
-            "optional": true,
-            "dependencies": {
-                "cssom": "0.3.x"
-            }
-        },
-        "node_modules/cycle": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
-            "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
-            "engines": {
-                "node": ">=0.4.0"
-            }
-        },
-        "node_modules/dashdash": {
-            "version": "1.14.1",
-            "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-            "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
-            "dependencies": {
-                "assert-plus": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=0.10"
-            }
-        },
-        "node_modules/decamelize": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-            "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/deep-equal": {
-            "version": "0.2.2",
-            "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz",
-            "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0="
-        },
-        "node_modules/deep-is": {
-            "version": "0.1.3",
-            "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-            "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
-            "optional": true
-        },
-        "node_modules/defaults": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
-            "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
-            "dependencies": {
-                "clone": "^1.0.2"
-            }
-        },
-        "node_modules/delayed-stream": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-            "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-            "engines": {
-                "node": ">=0.4.0"
-            }
-        },
-        "node_modules/diff": {
-            "version": "3.5.0",
-            "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
-            "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.3.1"
-            }
-        },
-        "node_modules/dom-serializer": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
-            "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
-            "dependencies": {
-                "domelementtype": "^1.3.0",
-                "entities": "^1.1.1"
-            }
-        },
-        "node_modules/domelementtype": {
-            "version": "1.3.1",
-            "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
-            "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
-        },
-        "node_modules/domhandler": {
-            "version": "2.3.0",
-            "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
-            "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
-            "dependencies": {
-                "domelementtype": "1"
-            }
-        },
-        "node_modules/domutils": {
-            "version": "1.5.1",
-            "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
-            "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
-            "dependencies": {
-                "dom-serializer": "0",
-                "domelementtype": "1"
-            }
-        },
-        "node_modules/ecc-jsbn": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
-            "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
-            "dependencies": {
-                "jsbn": "~0.1.0",
-                "safer-buffer": "^2.1.0"
-            }
-        },
-        "node_modules/emoji-regex": {
-            "version": "8.0.0",
-            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
-        },
-        "node_modules/entities": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
-            "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
-        },
-        "node_modules/escape-string-regexp": {
-            "version": "1.0.5",
-            "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-            "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-            "engines": {
-                "node": ">=0.8.0"
-            }
-        },
-        "node_modules/escodegen": {
-            "version": "1.14.3",
-            "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
-            "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
-            "optional": true,
-            "dependencies": {
-                "esprima": "^4.0.1",
-                "estraverse": "^4.2.0",
-                "esutils": "^2.0.2",
-                "optionator": "^0.8.1",
-                "source-map": "~0.6.1"
-            },
-            "bin": {
-                "escodegen": "bin/escodegen.js",
-                "esgenerate": "bin/esgenerate.js"
-            },
-            "engines": {
-                "node": ">=4.0"
-            }
-        },
-        "node_modules/esprima": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-            "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-            "optional": true,
-            "bin": {
-                "esparse": "bin/esparse.js",
-                "esvalidate": "bin/esvalidate.js"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/estraverse": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-            "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-            "optional": true,
-            "engines": {
-                "node": ">=4.0"
-            }
-        },
-        "node_modules/esutils": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-            "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
-            "devOptional": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/extend": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-            "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
-        },
-        "node_modules/extsprintf": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-            "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
-            "engines": [
-                "node >=0.6.0"
-            ]
-        },
-        "node_modules/eyes": {
-            "version": "0.1.8",
-            "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
-            "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
-            "engines": {
-                "node": "> 0.1.90"
-            }
-        },
-        "node_modules/fast-deep-equal": {
-            "version": "3.1.3",
-            "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-            "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
-        },
-        "node_modules/fast-json-stable-stringify": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-            "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
-        },
-        "node_modules/fast-levenshtein": {
-            "version": "2.0.6",
-            "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-            "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
-            "optional": true
-        },
-        "node_modules/find-up": {
-            "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-            "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-            "dependencies": {
-                "locate-path": "^5.0.0",
-                "path-exists": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/forever-agent": {
-            "version": "0.6.1",
-            "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-            "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
-            "engines": {
-                "node": "*"
-            }
-        },
-        "node_modules/form-data": {
-            "version": "2.3.3",
-            "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
-            "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
-            "dependencies": {
-                "asynckit": "^0.4.0",
-                "combined-stream": "^1.0.6",
-                "mime-types": "^2.1.12"
-            },
-            "engines": {
-                "node": ">= 0.12"
-            }
-        },
-        "node_modules/fs-extra": {
-            "version": "6.0.1",
-            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
-            "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==",
-            "dependencies": {
-                "graceful-fs": "^4.1.2",
-                "jsonfile": "^4.0.0",
-                "universalify": "^0.1.0"
-            }
-        },
-        "node_modules/fs.realpath": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-            "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
-        },
-        "node_modules/get-caller-file": {
-            "version": "2.0.5",
-            "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-            "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-            "engines": {
-                "node": "6.* || 8.* || >= 10.*"
-            }
-        },
-        "node_modules/getpass": {
-            "version": "0.1.7",
-            "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-            "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
-            "dependencies": {
-                "assert-plus": "^1.0.0"
-            }
-        },
-        "node_modules/glob": {
-            "version": "7.1.3",
-            "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
-            "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
-            "dependencies": {
-                "fs.realpath": "^1.0.0",
-                "inflight": "^1.0.4",
-                "inherits": "2",
-                "minimatch": "^3.0.4",
-                "once": "^1.3.0",
-                "path-is-absolute": "^1.0.0"
-            },
-            "engines": {
-                "node": "*"
-            }
-        },
-        "node_modules/graceful-fs": {
-            "version": "4.1.15",
-            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
-            "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
-        },
-        "node_modules/har-schema": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-            "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/har-validator": {
-            "version": "5.1.3",
-            "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
-            "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
-            "dependencies": {
-                "ajv": "^6.5.5",
-                "har-schema": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/has-ansi": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-            "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
-            "dev": true,
-            "dependencies": {
-                "ansi-regex": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/has-flag": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-            "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/he": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
-            "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
-            "bin": {
-                "he": "bin/he"
-            }
-        },
-        "node_modules/highlight.js": {
-            "version": "9.15.6",
-            "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.6.tgz",
-            "integrity": "sha512-zozTAWM1D6sozHo8kqhfYgsac+B+q0PmsjXeyDrYIHHcBN0zTVT66+s2GW1GZv7DbyaROdLXKdabwS/WqPyIdQ==",
-            "engines": {
-                "node": "*"
-            }
-        },
-        "node_modules/htmlparser2": {
-            "version": "3.8.3",
-            "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
-            "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
-            "dependencies": {
-                "domelementtype": "1",
-                "domhandler": "2.3",
-                "domutils": "1.5",
-                "entities": "1.0",
-                "readable-stream": "1.1"
-            }
-        },
-        "node_modules/htmlparser2/node_modules/entities": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
-            "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY="
-        },
-        "node_modules/http-signature": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
-            "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
-            "dependencies": {
-                "assert-plus": "^1.0.0",
-                "jsprim": "^1.2.2",
-                "sshpk": "^1.7.0"
-            },
-            "engines": {
-                "node": ">=0.8",
-                "npm": ">=1.3.7"
-            }
-        },
-        "node_modules/i": {
-            "version": "0.3.6",
-            "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz",
-            "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=",
-            "engines": {
-                "node": ">=0.4"
-            }
-        },
-        "node_modules/inflight": {
-            "version": "1.0.6",
-            "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-            "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-            "dependencies": {
-                "once": "^1.3.0",
-                "wrappy": "1"
-            }
-        },
-        "node_modules/inherits": {
-            "version": "2.0.3",
-            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-            "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
-        },
-        "node_modules/ini": {
-            "version": "1.3.7",
-            "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz",
-            "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ=="
-        },
-        "node_modules/invert-kv": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
-            "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/is-fullwidth-code-point": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-            "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-            "dependencies": {
-                "number-is-nan": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/is-typedarray": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-            "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
-        },
-        "node_modules/isarray": {
-            "version": "0.0.1",
-            "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-            "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
-        },
-        "node_modules/isstream": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-            "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
-        },
-        "node_modules/js-tokens": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
-            "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
-            "dev": true
-        },
-        "node_modules/js-yaml": {
-            "version": "3.13.1",
-            "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
-            "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
-            "dev": true,
-            "dependencies": {
-                "argparse": "^1.0.7",
-                "esprima": "^4.0.0"
-            },
-            "bin": {
-                "js-yaml": "bin/js-yaml.js"
-            }
-        },
-        "node_modules/js-yaml/node_modules/esprima": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-            "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-            "dev": true,
-            "bin": {
-                "esparse": "bin/esparse.js",
-                "esvalidate": "bin/esvalidate.js"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/jsbn": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-            "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
-        },
-        "node_modules/jsdom": {
-            "version": "7.2.2",
-            "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz",
-            "integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=",
-            "optional": true,
-            "dependencies": {
-                "abab": "^1.0.0",
-                "acorn": "^2.4.0",
-                "acorn-globals": "^1.0.4",
-                "cssom": ">= 0.3.0 < 0.4.0",
-                "cssstyle": ">= 0.2.29 < 0.3.0",
-                "escodegen": "^1.6.1",
-                "nwmatcher": ">= 1.3.7 < 2.0.0",
-                "parse5": "^1.5.1",
-                "request": "^2.55.0",
-                "sax": "^1.1.4",
-                "symbol-tree": ">= 3.1.0 < 4.0.0",
-                "tough-cookie": "^2.2.0",
-                "webidl-conversions": "^2.0.0",
-                "whatwg-url-compat": "~0.6.5",
-                "xml-name-validator": ">= 2.0.1 < 3.0.0"
-            }
-        },
-        "node_modules/json-schema": {
-            "version": "0.2.3",
-            "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-            "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
-        },
-        "node_modules/json-schema-traverse": {
-            "version": "0.4.1",
-            "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-            "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
-        },
-        "node_modules/json-stringify-safe": {
-            "version": "5.0.1",
-            "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-            "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
-        },
-        "node_modules/jsonfile": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-            "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
-            "dependencies": {
-                "graceful-fs": "^4.1.6"
-            }
-        },
-        "node_modules/jsprim": {
-            "version": "1.4.1",
-            "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
-            "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
-            "engines": [
-                "node >=0.6.0"
-            ],
-            "dependencies": {
-                "assert-plus": "1.0.0",
-                "extsprintf": "1.3.0",
-                "json-schema": "0.2.3",
-                "verror": "1.10.0"
-            }
-        },
-        "node_modules/lcid": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
-            "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
-            "dependencies": {
-                "invert-kv": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/levn": {
-            "version": "0.3.0",
-            "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-            "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
-            "optional": true,
-            "dependencies": {
-                "prelude-ls": "~1.1.2",
-                "type-check": "~0.3.2"
-            },
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/linkify-it": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz",
-            "integrity": "sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==",
-            "dependencies": {
-                "uc.micro": "^1.0.1"
-            }
-        },
-        "node_modules/locate-path": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-            "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-            "dependencies": {
-                "p-locate": "^4.1.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/lodash": {
-            "version": "4.17.19",
-            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
-            "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
-        },
-        "node_modules/log-symbols": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
-            "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
-            "dependencies": {
-                "chalk": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/markdown-it": {
-            "version": "8.4.2",
-            "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
-            "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==",
-            "dependencies": {
-                "argparse": "^1.0.7",
-                "entities": "~1.1.1",
-                "linkify-it": "^2.0.0",
-                "mdurl": "^1.0.1",
-                "uc.micro": "^1.0.5"
-            },
-            "bin": {
-                "markdown-it": "bin/markdown-it.js"
-            }
-        },
-        "node_modules/mdurl": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
-            "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
-        },
-        "node_modules/mime-db": {
-            "version": "1.44.0",
-            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
-            "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/mime-types": {
-            "version": "2.1.27",
-            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
-            "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
-            "dependencies": {
-                "mime-db": "1.44.0"
-            },
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/mimic-fn": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
-            "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/minimatch": {
-            "version": "3.0.4",
-            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-            "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-            "dependencies": {
-                "brace-expansion": "^1.1.7"
-            },
-            "engines": {
-                "node": "*"
-            }
-        },
-        "node_modules/minimist": {
-            "version": "1.2.5",
-            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-            "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
-        },
-        "node_modules/mkdirp": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-            "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-            "bin": {
-                "mkdirp": "bin/cmd.js"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/moment": {
-            "version": "2.27.0",
-            "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz",
-            "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==",
-            "engines": {
-                "node": "*"
-            }
-        },
-        "node_modules/mute-stream": {
-            "version": "0.0.8",
-            "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
-            "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
-        },
-        "node_modules/nconf": {
-            "version": "0.10.0",
-            "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.10.0.tgz",
-            "integrity": "sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q==",
-            "dependencies": {
-                "async": "^1.4.0",
-                "ini": "^1.3.0",
-                "secure-keys": "^1.0.0",
-                "yargs": "^3.19.0"
-            },
-            "engines": {
-                "node": ">= 0.4.0"
-            }
-        },
-        "node_modules/nconf/node_modules/yargs": {
-            "version": "3.32.0",
-            "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz",
-            "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=",
-            "dependencies": {
-                "camelcase": "^2.0.1",
-                "cliui": "^3.0.3",
-                "decamelize": "^1.1.1",
-                "os-locale": "^1.4.0",
-                "string-width": "^1.0.1",
-                "window-size": "^0.1.4",
-                "y18n": "^3.2.0"
-            }
-        },
-        "node_modules/ncp": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz",
-            "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=",
-            "bin": {
-                "ncp": "bin/ncp"
-            }
-        },
-        "node_modules/nth-check": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
-            "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
-            "dependencies": {
-                "boolbase": "~1.0.0"
-            }
-        },
-        "node_modules/number-is-nan": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-            "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/nwmatcher": {
-            "version": "1.4.4",
-            "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz",
-            "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==",
-            "optional": true
-        },
-        "node_modules/oauth-sign": {
-            "version": "0.9.0",
-            "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
-            "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
-            "engines": {
-                "node": "*"
-            }
-        },
-        "node_modules/once": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-            "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-            "dependencies": {
-                "wrappy": "1"
-            }
-        },
-        "node_modules/onetime": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
-            "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
-            "dependencies": {
-                "mimic-fn": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/optionator": {
-            "version": "0.8.3",
-            "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-            "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-            "optional": true,
-            "dependencies": {
-                "deep-is": "~0.1.3",
-                "fast-levenshtein": "~2.0.6",
-                "levn": "~0.3.0",
-                "prelude-ls": "~1.1.2",
-                "type-check": "~0.3.2",
-                "word-wrap": "~1.2.3"
-            },
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/ora": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/ora/-/ora-3.0.0.tgz",
-            "integrity": "sha512-LBS97LFe2RV6GJmXBi6OKcETKyklHNMV0xw7BtsVn2MlsgsydyZetSCbCANr+PFLmDyv4KV88nn0eCKza665Mg==",
-            "dependencies": {
-                "chalk": "^2.3.1",
-                "cli-cursor": "^2.1.0",
-                "cli-spinners": "^1.1.0",
-                "log-symbols": "^2.2.0",
-                "strip-ansi": "^4.0.0",
-                "wcwidth": "^1.0.1"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/ora/node_modules/ansi-regex": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-            "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/ora/node_modules/strip-ansi": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-            "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-            "dependencies": {
-                "ansi-regex": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/os-locale": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
-            "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
-            "dependencies": {
-                "lcid": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/p-limit": {
-            "version": "2.3.0",
-            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-            "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-            "dependencies": {
-                "p-try": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/p-locate": {
-            "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-            "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-            "dependencies": {
-                "p-limit": "^2.2.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/p-try": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-            "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/parse5": {
-            "version": "1.5.1",
-            "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
-            "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=",
-            "optional": true
-        },
-        "node_modules/path-exists": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-            "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/path-is-absolute": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-            "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/path-parse": {
-            "version": "1.0.6",
-            "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-            "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
-            "dev": true
-        },
-        "node_modules/performance-now": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-            "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
-        },
-        "node_modules/pkginfo": {
-            "version": "0.4.1",
-            "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz",
-            "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=",
-            "engines": {
-                "node": ">= 0.4.0"
-            }
-        },
-        "node_modules/prelude-ls": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-            "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
-            "optional": true,
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/prompt": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.0.0.tgz",
-            "integrity": "sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4=",
-            "dependencies": {
-                "colors": "^1.1.2",
-                "pkginfo": "0.x.x",
-                "read": "1.0.x",
-                "revalidator": "0.1.x",
-                "utile": "0.3.x",
-                "winston": "2.1.x"
-            },
-            "engines": {
-                "node": ">= 0.6.6"
-            }
-        },
-        "node_modules/psl": {
-            "version": "1.8.0",
-            "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
-            "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
-        },
-        "node_modules/punycode": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-            "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/qs": {
-            "version": "6.5.2",
-            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
-            "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
-            "engines": {
-                "node": ">=0.6"
-            }
-        },
-        "node_modules/read": {
-            "version": "1.0.7",
-            "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
-            "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=",
-            "dependencies": {
-                "mute-stream": "~0.0.4"
-            },
-            "engines": {
-                "node": ">=0.8"
-            }
-        },
-        "node_modules/readable-stream": {
-            "version": "1.1.14",
-            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
-            "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
-            "dependencies": {
-                "core-util-is": "~1.0.0",
-                "inherits": "~2.0.1",
-                "isarray": "0.0.1",
-                "string_decoder": "~0.10.x"
-            }
-        },
-        "node_modules/request": {
-            "version": "2.88.0",
-            "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
-            "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
-            "dependencies": {
-                "aws-sign2": "~0.7.0",
-                "aws4": "^1.8.0",
-                "caseless": "~0.12.0",
-                "combined-stream": "~1.0.6",
-                "extend": "~3.0.2",
-                "forever-agent": "~0.6.1",
-                "form-data": "~2.3.2",
-                "har-validator": "~5.1.0",
-                "http-signature": "~1.2.0",
-                "is-typedarray": "~1.0.0",
-                "isstream": "~0.1.2",
-                "json-stringify-safe": "~5.0.1",
-                "mime-types": "~2.1.19",
-                "oauth-sign": "~0.9.0",
-                "performance-now": "^2.1.0",
-                "qs": "~6.5.2",
-                "safe-buffer": "^5.1.2",
-                "tough-cookie": "~2.4.3",
-                "tunnel-agent": "^0.6.0",
-                "uuid": "^3.3.2"
-            },
-            "engines": {
-                "node": ">= 4"
-            }
-        },
-        "node_modules/request/node_modules/punycode": {
-            "version": "1.4.1",
-            "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-            "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
-        },
-        "node_modules/request/node_modules/tough-cookie": {
-            "version": "2.4.3",
-            "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
-            "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
-            "dependencies": {
-                "psl": "^1.1.24",
-                "punycode": "^1.4.1"
-            },
-            "engines": {
-                "node": ">=0.8"
-            }
-        },
-        "node_modules/require-directory": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-            "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/require-from-string": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
-            "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/require-main-filename": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-            "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
-        },
-        "node_modules/resolve": {
-            "version": "1.10.0",
-            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz",
-            "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==",
-            "dev": true,
-            "dependencies": {
-                "path-parse": "^1.0.6"
-            }
-        },
-        "node_modules/restore-cursor": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
-            "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
-            "dependencies": {
-                "onetime": "^2.0.0",
-                "signal-exit": "^3.0.2"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/revalidator": {
-            "version": "0.1.8",
-            "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz",
-            "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=",
-            "engines": {
-                "node": ">= 0.4.0"
-            }
-        },
-        "node_modules/rimraf": {
-            "version": "2.7.1",
-            "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-            "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-            "dependencies": {
-                "glob": "^7.1.3"
-            },
-            "bin": {
-                "rimraf": "bin.js"
-            }
-        },
-        "node_modules/safe-buffer": {
-            "version": "5.2.1",
-            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-        },
-        "node_modules/safer-buffer": {
-            "version": "2.1.2",
-            "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-            "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
-        },
-        "node_modules/sax": {
-            "version": "1.2.4",
-            "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-            "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
-            "optional": true
-        },
-        "node_modules/secure-keys": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz",
-            "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o="
-        },
-        "node_modules/semver": {
-            "version": "5.6.0",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
-            "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
-            "dev": true,
-            "bin": {
-                "semver": "bin/semver"
-            }
-        },
-        "node_modules/set-blocking": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-            "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
-        },
-        "node_modules/signal-exit": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
-            "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
-        },
-        "node_modules/source-map": {
-            "version": "0.6.1",
-            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-            "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-            "optional": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/sprintf-js": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-            "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
-        },
-        "node_modules/sshpk": {
-            "version": "1.16.1",
-            "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
-            "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
-            "dependencies": {
-                "asn1": "~0.2.3",
-                "assert-plus": "^1.0.0",
-                "bcrypt-pbkdf": "^1.0.0",
-                "dashdash": "^1.12.0",
-                "ecc-jsbn": "~0.1.1",
-                "getpass": "^0.1.1",
-                "jsbn": "~0.1.0",
-                "safer-buffer": "^2.0.2",
-                "tweetnacl": "~0.14.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/stack-trace": {
-            "version": "0.0.10",
-            "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
-            "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
-            "engines": {
-                "node": "*"
-            }
-        },
-        "node_modules/string_decoder": {
-            "version": "0.10.31",
-            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-            "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
-        },
-        "node_modules/string-width": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-            "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
-            "dependencies": {
-                "code-point-at": "^1.0.0",
-                "is-fullwidth-code-point": "^1.0.0",
-                "strip-ansi": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/string.fromcodepoint": {
-            "version": "0.2.1",
-            "resolved": "https://registry.npmjs.org/string.fromcodepoint/-/string.fromcodepoint-0.2.1.tgz",
-            "integrity": "sha1-jZeDM8C8klOPUPOD5IiPPlYZ1lM="
-        },
-        "node_modules/strip-ansi": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-            "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-            "dependencies": {
-                "ansi-regex": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/supports-color": {
-            "version": "5.5.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-            "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-            "dependencies": {
-                "has-flag": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/symbol-tree": {
-            "version": "3.2.4",
-            "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
-            "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
-            "optional": true
-        },
-        "node_modules/tough-cookie": {
-            "version": "2.5.0",
-            "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
-            "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
-            "optional": true,
-            "dependencies": {
-                "psl": "^1.1.28",
-                "punycode": "^2.1.1"
-            },
-            "engines": {
-                "node": ">=0.8"
-            }
-        },
-        "node_modules/tr46": {
-            "version": "0.0.3",
-            "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-            "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
-            "optional": true
-        },
-        "node_modules/tslib": {
-            "version": "1.9.3",
-            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
-            "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
-            "dev": true
-        },
-        "node_modules/tslint": {
-            "version": "5.12.1",
-            "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.1.tgz",
-            "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==",
-            "dev": true,
-            "dependencies": {
-                "babel-code-frame": "^6.22.0",
-                "builtin-modules": "^1.1.1",
-                "chalk": "^2.3.0",
-                "commander": "^2.12.1",
-                "diff": "^3.2.0",
-                "glob": "^7.1.1",
-                "js-yaml": "^3.7.0",
-                "minimatch": "^3.0.4",
-                "resolve": "^1.3.2",
-                "semver": "^5.3.0",
-                "tslib": "^1.8.0",
-                "tsutils": "^2.27.2"
-            },
-            "bin": {
-                "tslint": "bin/tslint"
-            },
-            "engines": {
-                "node": ">=4.8.0"
-            }
-        },
-        "node_modules/tsutils": {
-            "version": "2.29.0",
-            "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
-            "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
-            "dev": true,
-            "dependencies": {
-                "tslib": "^1.8.1"
-            }
-        },
-        "node_modules/tunnel-agent": {
-            "version": "0.6.0",
-            "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-            "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
-            "dependencies": {
-                "safe-buffer": "^5.0.1"
-            },
-            "engines": {
-                "node": "*"
-            }
-        },
-        "node_modules/tweetnacl": {
-            "version": "0.14.5",
-            "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-            "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
-        },
-        "node_modules/type-check": {
-            "version": "0.3.2",
-            "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-            "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
-            "optional": true,
-            "dependencies": {
-                "prelude-ls": "~1.1.2"
-            },
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/typescript": {
-            "version": "2.9.2",
-            "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz",
-            "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==",
-            "dev": true,
-            "bin": {
-                "tsc": "bin/tsc",
-                "tsserver": "bin/tsserver"
-            },
-            "engines": {
-                "node": ">=4.2.0"
-            }
-        },
-        "node_modules/uc.micro": {
-            "version": "1.0.6",
-            "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
-            "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
-        },
-        "node_modules/underscore": {
-            "version": "1.9.1",
-            "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz",
-            "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg=="
-        },
-        "node_modules/unescape-js": {
-            "version": "1.1.1",
-            "resolved": "https://registry.npmjs.org/unescape-js/-/unescape-js-1.1.1.tgz",
-            "integrity": "sha512-2/6CdybfFt9fzYJhCD6SHfBnqCGNfjhMwPK9Pf+sJRloa/WmyAmxdBVOslOIYkvSIRKX+9xGePF5t1tugtZ63g==",
-            "dependencies": {
-                "string.fromcodepoint": "^0.2.1"
-            }
-        },
-        "node_modules/universalify": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-            "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-            "engines": {
-                "node": ">= 4.0.0"
-            }
-        },
-        "node_modules/uri-js": {
-            "version": "4.2.2",
-            "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
-            "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
-            "dependencies": {
-                "punycode": "^2.1.0"
-            }
-        },
-        "node_modules/utile": {
-            "version": "0.3.0",
-            "resolved": "https://registry.npmjs.org/utile/-/utile-0.3.0.tgz",
-            "integrity": "sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo=",
-            "dependencies": {
-                "async": "~0.9.0",
-                "deep-equal": "~0.2.1",
-                "i": "0.3.x",
-                "mkdirp": "0.x.x",
-                "ncp": "1.0.x",
-                "rimraf": "2.x.x"
-            },
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/utile/node_modules/async": {
-            "version": "0.9.2",
-            "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
-            "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0="
-        },
-        "node_modules/utile/node_modules/mkdirp": {
-            "version": "0.5.5",
-            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
-            "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
-            "dependencies": {
-                "minimist": "^1.2.5"
-            },
-            "bin": {
-                "mkdirp": "bin/cmd.js"
-            }
-        },
-        "node_modules/uuid": {
-            "version": "3.4.0",
-            "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
-            "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
-            "bin": {
-                "uuid": "bin/uuid"
-            }
-        },
-        "node_modules/verror": {
-            "version": "1.10.0",
-            "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
-            "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
-            "engines": [
-                "node >=0.6.0"
-            ],
-            "dependencies": {
-                "assert-plus": "^1.0.0",
-                "core-util-is": "1.0.2",
-                "extsprintf": "^1.2.0"
-            }
-        },
-        "node_modules/vsc-leetcode-cli": {
-            "version": "2.8.0",
-            "resolved": "https://registry.npmjs.org/vsc-leetcode-cli/-/vsc-leetcode-cli-2.8.0.tgz",
-            "integrity": "sha512-KcFzpk3OZ+wUCoeK1yjBK0hYpJItYd8WFC7pQfE1zxJGjQs4tUvadLI5imKfRjw5NicjNRFnVpVv6N7ig7ik4A==",
-            "dependencies": {
-                "ansi-styles": "3.2.1",
-                "cheerio": "0.20.0",
-                "he": "1.2.0",
-                "mkdirp": "^1.0.4",
-                "moment": "^2.20.1",
-                "nconf": "0.10.0",
-                "ora": "3.0.0",
-                "prompt": "1.0.0",
-                "request": "2.88.0",
-                "supports-color": "5.5.0",
-                "underscore": "1.9.1",
-                "wordwrap": "1.0.0",
-                "yargs": "^15.3.1"
-            },
-            "bin": {
-                "leetcode": "bin/leetcode"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/wcwidth": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
-            "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
-            "dependencies": {
-                "defaults": "^1.0.3"
-            }
-        },
-        "node_modules/webidl-conversions": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-2.0.1.tgz",
-            "integrity": "sha1-O/glj30xjHRDw28uFpQCoaZwNQY=",
-            "optional": true
-        },
-        "node_modules/whatwg-url-compat": {
-            "version": "0.6.5",
-            "resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz",
-            "integrity": "sha1-AImBEa9om7CXVBzVpFymyHmERb8=",
-            "optional": true,
-            "dependencies": {
-                "tr46": "~0.0.1"
-            }
-        },
-        "node_modules/which-module": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-            "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
-        },
-        "node_modules/window-size": {
-            "version": "0.1.4",
-            "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
-            "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=",
-            "bin": {
-                "window-size": "cli.js"
-            },
-            "engines": {
-                "node": ">= 0.10.0"
-            }
-        },
-        "node_modules/winston": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/winston/-/winston-2.1.1.tgz",
-            "integrity": "sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4=",
-            "dependencies": {
-                "async": "~1.0.0",
-                "colors": "1.0.x",
-                "cycle": "1.0.x",
-                "eyes": "0.1.x",
-                "isstream": "0.1.x",
-                "pkginfo": "0.3.x",
-                "stack-trace": "0.0.x"
-            },
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/winston/node_modules/async": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
-            "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
-        },
-        "node_modules/winston/node_modules/colors": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
-            "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
-            "engines": {
-                "node": ">=0.1.90"
-            }
-        },
-        "node_modules/winston/node_modules/pkginfo": {
-            "version": "0.3.1",
-            "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz",
-            "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=",
-            "engines": {
-                "node": ">= 0.4.0"
-            }
-        },
-        "node_modules/word-wrap": {
-            "version": "1.2.3",
-            "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-            "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
-            "optional": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/wordwrap": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
-            "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
-        },
-        "node_modules/wrap-ansi": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
-            "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
-            "dependencies": {
-                "string-width": "^1.0.1",
-                "strip-ansi": "^3.0.1"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/wrappy": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-            "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
-        },
-        "node_modules/xml-name-validator": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
-            "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=",
-            "optional": true
-        },
-        "node_modules/y18n": {
-            "version": "3.2.1",
-            "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
-            "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
-        },
-        "node_modules/yargs": {
-            "version": "15.3.1",
-            "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
-            "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
-            "dependencies": {
-                "cliui": "^6.0.0",
-                "decamelize": "^1.2.0",
-                "find-up": "^4.1.0",
-                "get-caller-file": "^2.0.1",
-                "require-directory": "^2.1.1",
-                "require-main-filename": "^2.0.0",
-                "set-blocking": "^2.0.0",
-                "string-width": "^4.2.0",
-                "which-module": "^2.0.0",
-                "y18n": "^4.0.0",
-                "yargs-parser": "^18.1.1"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/yargs-parser": {
-            "version": "18.1.3",
-            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
-            "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
-            "dependencies": {
-                "camelcase": "^5.0.0",
-                "decamelize": "^1.2.0"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/yargs-parser/node_modules/camelcase": {
-            "version": "5.3.1",
-            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-            "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/yargs/node_modules/ansi-regex": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-            "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/yargs/node_modules/ansi-styles": {
-            "version": "4.2.1",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
-            "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
-            "dependencies": {
-                "@types/color-name": "^1.1.1",
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/yargs/node_modules/cliui": {
-            "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
-            "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
-            "dependencies": {
-                "string-width": "^4.2.0",
-                "strip-ansi": "^6.0.0",
-                "wrap-ansi": "^6.2.0"
-            }
-        },
-        "node_modules/yargs/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/yargs/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-        },
-        "node_modules/yargs/node_modules/is-fullwidth-code-point": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-            "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/yargs/node_modules/string-width": {
-            "version": "4.2.0",
-            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-            "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-            "dependencies": {
-                "emoji-regex": "^8.0.0",
-                "is-fullwidth-code-point": "^3.0.0",
-                "strip-ansi": "^6.0.0"
-            },
-            "engines": {
-                "node": ">=8"
+    "dependencies": {
+        "@babel/code-frame": {
+            "version": "7.12.13",
+            "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
+            "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
+            "dev": true,
+            "requires": {
+                "@babel/highlight": "^7.12.13"
             }
         },
-        "node_modules/yargs/node_modules/strip-ansi": {
-            "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-            "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
-            "dependencies": {
-                "ansi-regex": "^5.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
+        "@babel/helper-validator-identifier": {
+            "version": "7.14.0",
+            "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz",
+            "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==",
+            "dev": true
         },
-        "node_modules/yargs/node_modules/wrap-ansi": {
-            "version": "6.2.0",
-            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
-            "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
-            "dependencies": {
-                "ansi-styles": "^4.0.0",
-                "string-width": "^4.1.0",
-                "strip-ansi": "^6.0.0"
-            },
-            "engines": {
-                "node": ">=8"
+        "@babel/highlight": {
+            "version": "7.14.0",
+            "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz",
+            "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==",
+            "dev": true,
+            "requires": {
+                "@babel/helper-validator-identifier": "^7.14.0",
+                "chalk": "^2.0.0",
+                "js-tokens": "^4.0.0"
             }
         },
-        "node_modules/yargs/node_modules/y18n": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
-            "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
-        }
-    },
-    "dependencies": {
-        "@types/color-name": {
-            "version": "1.1.1",
-            "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
-            "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
-        },
         "@types/fs-extra": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
-            "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
+            "version": "9.0.11",
+            "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.11.tgz",
+            "integrity": "sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA==",
             "dev": true,
             "requires": {
                 "@types/node": "*"
             }
         },
-        "@types/highlight.js": {
-            "version": "9.12.3",
-            "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.3.tgz",
-            "integrity": "sha512-pGF/zvYOACZ/gLGWdQH8zSwteQS1epp68yRcVLJMgUck/MjEn/FBYmPub9pXT8C1e4a8YZfHo1CKyV8q1vKUnQ==",
-            "dev": true
-        },
         "@types/linkify-it": {
-            "version": "2.0.4",
-            "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-2.0.4.tgz",
-            "integrity": "sha512-9o5piu3tP6DwqT+Cyf7S3BitsTc6Cl0pCPKUhIE5hzQbtueiBXdtBipTLLvaGfT11/8XHRmsagu4YfBesTaiCA==",
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.1.tgz",
+            "integrity": "sha512-pQv3Sygwxxh6jYQzXaiyWDAHevJqWtqDUv6t11Sa9CPGiXny66II7Pl6PR8QO5OVysD6HYOkHMeBgIjLnk9SkQ==",
             "dev": true
         },
         "@types/lodash": {
-            "version": "4.14.123",
-            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.123.tgz",
-            "integrity": "sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q==",
+            "version": "4.14.170",
+            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz",
+            "integrity": "sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q==",
             "dev": true
         },
         "@types/markdown-it": {
@@ -2185,9 +67,9 @@
             "dev": true
         },
         "@types/node": {
-            "version": "7.10.3",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.3.tgz",
-            "integrity": "sha512-HeyK+csRk7Khhg9krpMGJeT9pLzjsmiJFHYRzYpPv/dQ5tPclQsbvceiX/HKynRt/9lMLorWUYTbBHC3hRI4sg==",
+            "version": "14.17.1",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.1.tgz",
+            "integrity": "sha512-/tpUyFD7meeooTRwl3sYlihx2BrJE7q9XF71EguPFIySj9B7qgnRtHsHTho+0AUm4m1SvWGm6uSncrR94q6Vtw==",
             "dev": true
         },
         "@types/require-from-string": {
@@ -2224,9 +106,9 @@
             }
         },
         "ajv": {
-            "version": "6.12.2",
-            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
-            "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==",
+            "version": "6.12.6",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+            "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
             "requires": {
                 "fast-deep-equal": "^3.1.1",
                 "fast-json-stable-stringify": "^2.0.0",
@@ -2284,52 +166,14 @@
             "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
         },
         "aws4": {
-            "version": "1.10.0",
-            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
-            "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA=="
-        },
-        "babel-code-frame": {
-            "version": "6.26.0",
-            "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
-            "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
-            "dev": true,
-            "requires": {
-                "chalk": "^1.1.3",
-                "esutils": "^2.0.2",
-                "js-tokens": "^3.0.2"
-            },
-            "dependencies": {
-                "ansi-styles": {
-                    "version": "2.2.1",
-                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-                    "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-                    "dev": true
-                },
-                "chalk": {
-                    "version": "1.1.3",
-                    "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-                    "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-                    "dev": true,
-                    "requires": {
-                        "ansi-styles": "^2.2.1",
-                        "escape-string-regexp": "^1.0.2",
-                        "has-ansi": "^2.0.0",
-                        "strip-ansi": "^3.0.0",
-                        "supports-color": "^2.0.0"
-                    }
-                },
-                "supports-color": {
-                    "version": "2.0.0",
-                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-                    "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-                    "dev": true
-                }
-            }
+            "version": "1.11.0",
+            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
+            "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
         },
         "balanced-match": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-            "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+            "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
         },
         "bcrypt-pbkdf": {
             "version": "1.0.2",
@@ -2452,9 +296,9 @@
             }
         },
         "commander": {
-            "version": "2.19.0",
-            "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
-            "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
+            "version": "2.20.3",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+            "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
             "dev": true
         },
         "concat-map": {
@@ -2541,9 +385,9 @@
             "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
         },
         "diff": {
-            "version": "3.5.0",
-            "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
-            "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+            "version": "4.0.2",
+            "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+            "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
             "dev": true
         },
         "dom-serializer": {
@@ -2617,8 +461,7 @@
         "esprima": {
             "version": "4.0.1",
             "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-            "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-            "optional": true
+            "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
         },
         "estraverse": {
             "version": "4.3.0",
@@ -2627,10 +470,10 @@
             "optional": true
         },
         "esutils": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-            "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
-            "devOptional": true
+            "version": "2.0.3",
+            "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+            "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+            "optional": true
         },
         "extend": {
             "version": "3.0.2",
@@ -2688,13 +531,13 @@
             }
         },
         "fs-extra": {
-            "version": "6.0.1",
-            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
-            "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==",
+            "version": "10.0.0",
+            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
+            "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
             "requires": {
-                "graceful-fs": "^4.1.2",
-                "jsonfile": "^4.0.0",
-                "universalify": "^0.1.0"
+                "graceful-fs": "^4.2.0",
+                "jsonfile": "^6.0.1",
+                "universalify": "^2.0.0"
             }
         },
         "fs.realpath": {
@@ -2702,6 +545,12 @@
             "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
             "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
         },
+        "function-bind": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+            "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+            "dev": true
+        },
         "get-caller-file": {
             "version": "2.0.5",
             "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
@@ -2716,9 +565,9 @@
             }
         },
         "glob": {
-            "version": "7.1.3",
-            "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
-            "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+            "version": "7.1.7",
+            "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+            "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
             "requires": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -2729,9 +578,9 @@
             }
         },
         "graceful-fs": {
-            "version": "4.1.15",
-            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
-            "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
+            "version": "4.2.6",
+            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
+            "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ=="
         },
         "har-schema": {
             "version": "2.0.0",
@@ -2739,21 +588,21 @@
             "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
         },
         "har-validator": {
-            "version": "5.1.3",
-            "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
-            "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+            "version": "5.1.5",
+            "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+            "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
             "requires": {
-                "ajv": "^6.5.5",
+                "ajv": "^6.12.3",
                 "har-schema": "^2.0.0"
             }
         },
-        "has-ansi": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-            "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+        "has": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+            "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
             "dev": true,
             "requires": {
-                "ansi-regex": "^2.0.0"
+                "function-bind": "^1.1.1"
             }
         },
         "has-flag": {
@@ -2767,9 +616,9 @@
             "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
         },
         "highlight.js": {
-            "version": "9.15.6",
-            "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.6.tgz",
-            "integrity": "sha512-zozTAWM1D6sozHo8kqhfYgsac+B+q0PmsjXeyDrYIHHcBN0zTVT66+s2GW1GZv7DbyaROdLXKdabwS/WqPyIdQ=="
+            "version": "10.7.2",
+            "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.2.tgz",
+            "integrity": "sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg=="
         },
         "htmlparser2": {
             "version": "3.8.3",
@@ -2815,20 +664,29 @@
             }
         },
         "inherits": {
-            "version": "2.0.3",
-            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-            "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+            "version": "2.0.4",
+            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+            "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
         },
         "ini": {
-            "version": "1.3.7",
-            "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz",
-            "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ=="
+            "version": "1.3.8",
+            "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+            "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
         },
         "invert-kv": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
             "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
         },
+        "is-core-module": {
+            "version": "2.4.0",
+            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
+            "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
+            "dev": true,
+            "requires": {
+                "has": "^1.0.3"
+            }
+        },
         "is-fullwidth-code-point": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
@@ -2853,27 +711,19 @@
             "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
         },
         "js-tokens": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
-            "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+            "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
             "dev": true
         },
         "js-yaml": {
-            "version": "3.13.1",
-            "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
-            "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+            "version": "3.14.1",
+            "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+            "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
             "dev": true,
             "requires": {
                 "argparse": "^1.0.7",
                 "esprima": "^4.0.0"
-            },
-            "dependencies": {
-                "esprima": {
-                    "version": "4.0.1",
-                    "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-                    "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-                    "dev": true
-                }
             }
         },
         "jsbn": {
@@ -2920,11 +770,12 @@
             "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
         },
         "jsonfile": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-            "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+            "version": "6.1.0",
+            "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+            "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
             "requires": {
-                "graceful-fs": "^4.1.6"
+                "graceful-fs": "^4.1.6",
+                "universalify": "^2.0.0"
             }
         },
         "jsprim": {
@@ -2957,9 +808,9 @@
             }
         },
         "linkify-it": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz",
-            "integrity": "sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==",
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz",
+            "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==",
             "requires": {
                 "uc.micro": "^1.0.1"
             }
@@ -2973,9 +824,9 @@
             }
         },
         "lodash": {
-            "version": "4.17.19",
-            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
-            "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
+            "version": "4.17.21",
+            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+            "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
         },
         "log-symbols": {
             "version": "2.2.0",
@@ -3003,16 +854,16 @@
             "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
         },
         "mime-db": {
-            "version": "1.44.0",
-            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
-            "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
+            "version": "1.47.0",
+            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz",
+            "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw=="
         },
         "mime-types": {
-            "version": "2.1.27",
-            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
-            "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+            "version": "2.1.30",
+            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz",
+            "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==",
             "requires": {
-                "mime-db": "1.44.0"
+                "mime-db": "1.47.0"
             }
         },
         "mimic-fn": {
@@ -3039,9 +890,9 @@
             "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
         },
         "moment": {
-            "version": "2.27.0",
-            "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz",
-            "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ=="
+            "version": "2.29.1",
+            "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
+            "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
         },
         "mute-stream": {
             "version": "0.0.8",
@@ -3208,9 +1059,9 @@
             "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
         },
         "path-parse": {
-            "version": "1.0.6",
-            "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-            "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+            "version": "1.0.7",
+            "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+            "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
             "dev": true
         },
         "performance-now": {
@@ -3335,11 +1186,12 @@
             "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
         },
         "resolve": {
-            "version": "1.10.0",
-            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz",
-            "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==",
+            "version": "1.20.0",
+            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+            "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
             "dev": true,
             "requires": {
+                "is-core-module": "^2.2.0",
                 "path-parse": "^1.0.6"
             }
         },
@@ -3387,9 +1239,9 @@
             "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o="
         },
         "semver": {
-            "version": "5.6.0",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
-            "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+            "version": "5.7.1",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
             "dev": true
         },
         "set-blocking": {
@@ -3434,11 +1286,6 @@
             "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
             "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
         },
-        "string_decoder": {
-            "version": "0.10.31",
-            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-            "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
-        },
         "string-width": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
@@ -3454,6 +1301,11 @@
             "resolved": "https://registry.npmjs.org/string.fromcodepoint/-/string.fromcodepoint-0.2.1.tgz",
             "integrity": "sha1-jZeDM8C8klOPUPOD5IiPPlYZ1lM="
         },
+        "string_decoder": {
+            "version": "0.10.31",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+            "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+        },
         "strip-ansi": {
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
@@ -3493,29 +1345,41 @@
             "optional": true
         },
         "tslib": {
-            "version": "1.9.3",
-            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
-            "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
             "dev": true
         },
         "tslint": {
-            "version": "5.12.1",
-            "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.1.tgz",
-            "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==",
+            "version": "5.20.1",
+            "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz",
+            "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==",
             "dev": true,
             "requires": {
-                "babel-code-frame": "^6.22.0",
+                "@babel/code-frame": "^7.0.0",
                 "builtin-modules": "^1.1.1",
                 "chalk": "^2.3.0",
                 "commander": "^2.12.1",
-                "diff": "^3.2.0",
+                "diff": "^4.0.1",
                 "glob": "^7.1.1",
-                "js-yaml": "^3.7.0",
+                "js-yaml": "^3.13.1",
                 "minimatch": "^3.0.4",
+                "mkdirp": "^0.5.1",
                 "resolve": "^1.3.2",
                 "semver": "^5.3.0",
                 "tslib": "^1.8.0",
-                "tsutils": "^2.27.2"
+                "tsutils": "^2.29.0"
+            },
+            "dependencies": {
+                "mkdirp": {
+                    "version": "0.5.5",
+                    "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+                    "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+                    "dev": true,
+                    "requires": {
+                        "minimist": "^1.2.5"
+                    }
+                }
             }
         },
         "tsutils": {
@@ -3550,9 +1414,9 @@
             }
         },
         "typescript": {
-            "version": "2.9.2",
-            "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz",
-            "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==",
+            "version": "4.3.2",
+            "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz",
+            "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==",
             "dev": true
         },
         "uc.micro": {
@@ -3566,22 +1430,22 @@
             "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg=="
         },
         "unescape-js": {
-            "version": "1.1.1",
-            "resolved": "https://registry.npmjs.org/unescape-js/-/unescape-js-1.1.1.tgz",
-            "integrity": "sha512-2/6CdybfFt9fzYJhCD6SHfBnqCGNfjhMwPK9Pf+sJRloa/WmyAmxdBVOslOIYkvSIRKX+9xGePF5t1tugtZ63g==",
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/unescape-js/-/unescape-js-1.1.4.tgz",
+            "integrity": "sha512-42SD8NOQEhdYntEiUQdYq/1V/YHwr1HLwlHuTJB5InVVdOSbgI6xu8jK5q65yIzuFCfczzyDF/7hbGzVbyCw0g==",
             "requires": {
                 "string.fromcodepoint": "^0.2.1"
             }
         },
         "universalify": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-            "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+            "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
         },
         "uri-js": {
-            "version": "4.2.2",
-            "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
-            "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+            "version": "4.4.1",
+            "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+            "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
             "requires": {
                 "punycode": "^2.1.0"
             }
@@ -3745,14 +1609,14 @@
             "optional": true
         },
         "y18n": {
-            "version": "3.2.1",
-            "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
-            "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
+            "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ=="
         },
         "yargs": {
-            "version": "15.3.1",
-            "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
-            "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
+            "version": "15.4.1",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+            "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
             "requires": {
                 "cliui": "^6.0.0",
                 "decamelize": "^1.2.0",
@@ -3764,7 +1628,7 @@
                 "string-width": "^4.2.0",
                 "which-module": "^2.0.0",
                 "y18n": "^4.0.0",
-                "yargs-parser": "^18.1.1"
+                "yargs-parser": "^18.1.2"
             },
             "dependencies": {
                 "ansi-regex": {
@@ -3773,11 +1637,10 @@
                     "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
                 },
                 "ansi-styles": {
-                    "version": "4.2.1",
-                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
-                    "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+                    "version": "4.3.0",
+                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+                    "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
                     "requires": {
-                        "@types/color-name": "^1.1.1",
                         "color-convert": "^2.0.1"
                     }
                 },
@@ -3810,9 +1673,9 @@
                     "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
                 },
                 "string-width": {
-                    "version": "4.2.0",
-                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-                    "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+                    "version": "4.2.2",
+                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+                    "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
                     "requires": {
                         "emoji-regex": "^8.0.0",
                         "is-fullwidth-code-point": "^3.0.0",
@@ -3838,9 +1701,9 @@
                     }
                 },
                 "y18n": {
-                    "version": "4.0.0",
-                    "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
-                    "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
+                    "version": "4.0.3",
+                    "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+                    "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
                 }
             }
         },
diff --git a/package.json b/package.json
index 58e99198..22e91b40 100644
--- a/package.json
+++ b/package.json
@@ -672,24 +672,23 @@
         "lint": "tslint --project tsconfig.json -e src/*.d.ts -t verbose"
     },
     "devDependencies": {
-        "@types/fs-extra": "5.0.0",
-        "@types/highlight.js": "^9.12.3",
-        "@types/lodash": "^4.14.123",
+        "@types/fs-extra": "^9.0.11",
+        "@types/lodash": "^4.14.170",
         "@types/markdown-it": "0.0.7",
         "@types/mocha": "^2.2.42",
-        "@types/node": "^7.0.43",
+        "@types/node": "^14.14.33",
         "@types/require-from-string": "^1.2.0",
         "@types/vscode": "1.42.0",
-        "tslint": "^5.9.1",
-        "typescript": "^2.6.1"
+        "tslint": "^5.20.1",
+        "typescript": "^4.3.2"
     },
     "dependencies": {
-        "fs-extra": "^6.0.1",
-        "highlight.js": "^9.15.6",
-        "lodash": "^4.17.19",
+        "fs-extra": "^10.0.0",
+        "highlight.js": "^10.7.2",
+        "lodash": "^4.17.21",
         "markdown-it": "^8.4.2",
         "require-from-string": "^2.0.2",
-        "unescape-js": "^1.1.1",
+        "unescape-js": "^1.1.4",
         "vsc-leetcode-cli": "2.8.0"
     }
 }
diff --git a/src/leetCodeManager.ts b/src/leetCodeManager.ts
index 44be87a9..089390d3 100644
--- a/src/leetCodeManager.ts
+++ b/src/leetCodeManager.ts
@@ -83,7 +83,7 @@ class LeetCodeManager extends EventEmitter {
                         env: createEnvOption(),
                     });
 
-                childProc.stdout.on("data", async (data: string | Buffer) => {
+                childProc.stdout?.on("data", async (data: string | Buffer) => {
                     data = data.toString();
                     leetCodeChannel.append(data);
                     if (data.includes("twoFactorCode")) {
@@ -96,19 +96,19 @@ class LeetCodeManager extends EventEmitter {
                             childProc.kill();
                             return resolve(undefined);
                         }
-                        childProc.stdin.write(`${twoFactor}\n`);
+                        childProc.stdin?.write(`${twoFactor}\n`);
                     }
                     const successMatch: RegExpMatchArray | null = data.match(this.successRegex);
                     if (successMatch && successMatch[1]) {
-                        childProc.stdin.end();
+                        childProc.stdin?.end();
                         return resolve(successMatch[1]);
                     } else if (data.match(this.failRegex)) {
-                        childProc.stdin.end();
+                        childProc.stdin?.end();
                         return reject(new Error("Faile to login"));
                     }
                 });
 
-                childProc.stderr.on("data", (data: string | Buffer) => leetCodeChannel.append(data.toString()));
+                childProc.stderr?.on("data", (data: string | Buffer) => leetCodeChannel.append(data.toString()));
 
                 childProc.on("error", reject);
                 const name: string | undefined = await vscode.window.showInputBox({
@@ -120,7 +120,7 @@ class LeetCodeManager extends EventEmitter {
                     childProc.kill();
                     return resolve(undefined);
                 }
-                childProc.stdin.write(`${name}\n`);
+                childProc.stdin?.write(`${name}\n`);
                 const pwd: string | undefined = await vscode.window.showInputBox({
                     prompt: isByCookie ? "Enter cookie" : "Enter password.",
                     password: true,
@@ -131,7 +131,7 @@ class LeetCodeManager extends EventEmitter {
                     childProc.kill();
                     return resolve(undefined);
                 }
-                childProc.stdin.write(`${pwd}\n`);
+                childProc.stdin?.write(`${pwd}\n`);
             });
             if (userName) {
                 vscode.window.showInformationMessage(`Successfully ${inMessage}.`);
diff --git a/src/utils/cpUtils.ts b/src/utils/cpUtils.ts
index 59e907b6..c71ae61c 100644
--- a/src/utils/cpUtils.ts
+++ b/src/utils/cpUtils.ts
@@ -15,13 +15,13 @@ export async function executeCommand(command: string, args: string[], options: c
 
         const childProc: cp.ChildProcess = cp.spawn(command, args, { ...options, env: createEnvOption() });
 
-        childProc.stdout.on("data", (data: string | Buffer) => {
+        childProc.stdout?.on("data", (data: string | Buffer) => {
             data = data.toString();
             result = result.concat(data);
             leetCodeChannel.append(data);
         });
 
-        childProc.stderr.on("data", (data: string | Buffer) => leetCodeChannel.append(data.toString()));
+        childProc.stderr?.on("data", (data: string | Buffer) => leetCodeChannel.append(data.toString()));
 
         childProc.on("error", reject);
 
@@ -42,7 +42,7 @@ export async function executeCommand(command: string, args: string[], options: c
 export async function executeCommandWithProgress(message: string, command: string, args: string[], options: cp.SpawnOptions = { shell: true }): Promise<string> {
     let result: string = "";
     await vscode.window.withProgress({ location: vscode.ProgressLocation.Notification }, async (p: vscode.Progress<{}>) => {
-        return new Promise(async (resolve: () => void, reject: (e: Error) => void): Promise<void> => {
+        return new Promise<void>(async (resolve: () => void, reject: (e: Error) => void): Promise<void> => {
             p.report({ message });
             try {
                 result = await executeCommand(command, args, options);
diff --git a/src/webview/leetCodePreviewProvider.ts b/src/webview/leetCodePreviewProvider.ts
index fba17728..78b40991 100644
--- a/src/webview/leetCodePreviewProvider.ts
+++ b/src/webview/leetCodePreviewProvider.ts
@@ -130,8 +130,6 @@ class LeetCodePreviewProvider extends LeetCodeWebview {
 
     protected onDidDisposeWebview(): void {
         super.onDidDisposeWebview();
-        delete this.node;
-        delete this.description;
         this.sideMode = false;
     }
 
diff --git a/src/webview/leetCodeSolutionProvider.ts b/src/webview/leetCodeSolutionProvider.ts
index d888b3bd..1fad6e22 100644
--- a/src/webview/leetCodeSolutionProvider.ts
+++ b/src/webview/leetCodeSolutionProvider.ts
@@ -64,7 +64,6 @@ class LeetCodeSolutionProvider extends LeetCodeWebview {
 
     protected onDidDisposeWebview(): void {
         super.onDidDisposeWebview();
-        delete this.solution;
     }
 
     private parseSolution(raw: string): Solution {
diff --git a/src/webview/leetCodeSubmissionProvider.ts b/src/webview/leetCodeSubmissionProvider.ts
index f4f18fd4..62d07291 100644
--- a/src/webview/leetCodeSubmissionProvider.ts
+++ b/src/webview/leetCodeSubmissionProvider.ts
@@ -59,7 +59,6 @@ class LeetCodeSubmissionProvider extends LeetCodeWebview {
 
     protected onDidDisposeWebview(): void {
         super.onDidDisposeWebview();
-        delete this.result;
     }
 
     private async showKeybindingsHint(): Promise<void> {

From ce928666ef555a95394b9bca661bfb47d74a06c0 Mon Sep 17 00:00:00 2001
From: Peng-Yu Chen <walkccray@gmail.com>
Date: Wed, 2 Jun 2021 22:34:21 -0400
Subject: [PATCH 30/47] docs: Update README.md (#637)

Co-authored-by: Sheng Chen <sheche@microsoft.com>
---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 35fd0cad..173371f6 100644
--- a/README.md
+++ b/README.md
@@ -29,7 +29,7 @@ Recently we observed that [the extension cannot login to leetcode.com endpoint a
 
 Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround which can somehow mitigate this. Now you can simply click the `Sign In` button and then select `Third Party` login or `Cookie` login.
 
-> Note: If you want to use third-party login(**Recommended**), please make sure your account has been connected to the thrid-party. If you want to use `Cookie` login, click [here](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/478#issuecomment-564757098) to see the steps.
+> Note: If you want to use third-party login(**Recommended**), please make sure your account has been connected to the third-party. If you want to use `Cookie` login, click [here](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/478#issuecomment-564757098) to see the steps.
 
 ## Requirements
 - [VS Code 1.30.1+](https://code.visualstudio.com/)

From 45ae2451a51f3f5475952200475fb8ff6655b9f2 Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Tue, 8 Jun 2021 13:50:58 +0800
Subject: [PATCH 31/47] feat: Move leetcode commands into submenu (#712)

---
 package-lock.json                        |  6 +++---
 package.json                             | 15 +++++++++++++--
 src/explorer/LeetCodeTreeDataProvider.ts |  2 +-
 src/utils/workspaceUtils.ts              |  5 ++---
 4 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index e4980605..f29605ac 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -79,9 +79,9 @@
             "dev": true
         },
         "@types/vscode": {
-            "version": "1.42.0",
-            "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.42.0.tgz",
-            "integrity": "sha512-ds6TceMsh77Fs0Mq0Vap6Y72JbGWB8Bay4DrnJlf5d9ui2RSe1wis13oQm+XhguOeH1HUfLGzaDAoupTUtgabw==",
+            "version": "1.50.0",
+            "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.50.0.tgz",
+            "integrity": "sha512-QnIeyi4L2DiD9M2bAQKRzT/EQvc80qP9UL6JD5TiLlNRL1khIDg4ej4mDSRbtFrDAsRntFI1RhMvdomUThMsqg==",
             "dev": true
         },
         "abab": {
diff --git a/package.json b/package.json
index 22e91b40..ea24e2dd 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
     "license": "MIT",
     "icon": "resources/LeetCode.png",
     "engines": {
-        "vscode": "^1.42.0"
+        "vscode": "^1.50.0"
     },
     "repository": {
         "type": "git",
@@ -243,6 +243,11 @@
                 }
             ],
             "editor/context": [
+                {
+                    "submenu": "leetcode.editorAction"
+                }
+            ],
+            "leetcode.editorAction": [
                 {
                     "command": "leetcode.testSolution",
                     "group": "leetcode@1"
@@ -261,6 +266,12 @@
                 }
             ]
         },
+        "submenus": [
+            {
+                "id": "leetcode.editorAction",
+                "label": "LeetCode"
+            }
+        ],
         "configuration": [
             {
                 "title": "LeetCode",
@@ -678,7 +689,7 @@
         "@types/mocha": "^2.2.42",
         "@types/node": "^14.14.33",
         "@types/require-from-string": "^1.2.0",
-        "@types/vscode": "1.42.0",
+        "@types/vscode": "1.50.0",
         "tslint": "^5.20.1",
         "typescript": "^4.3.2"
     },
diff --git a/src/explorer/LeetCodeTreeDataProvider.ts b/src/explorer/LeetCodeTreeDataProvider.ts
index 69445bbb..2bfbe497 100644
--- a/src/explorer/LeetCodeTreeDataProvider.ts
+++ b/src/explorer/LeetCodeTreeDataProvider.ts
@@ -23,7 +23,7 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider<LeetCod
 
     public async refresh(): Promise<void> {
         await explorerNodeManager.refreshCache();
-        this.onDidChangeTreeDataEvent.fire();
+        this.onDidChangeTreeDataEvent.fire(null);
     }
 
     public getTreeItem(element: LeetCodeNode): vscode.TreeItem | Thenable<vscode.TreeItem> {
diff --git a/src/utils/workspaceUtils.ts b/src/utils/workspaceUtils.ts
index c129f8db..81072be7 100644
--- a/src/utils/workspaceUtils.ts
+++ b/src/utils/workspaceUtils.ts
@@ -18,9 +18,8 @@ export async function selectWorkspaceFolder(): Promise<string> {
             return workspaceFolderSetting;
         }
     }
-    const workspaceFolders: vscode.WorkspaceFolder[] = vscode.workspace.workspaceFolders || [];
     let needAsk: boolean = true;
-    for (const folder of workspaceFolders) {
+    for (const folder of vscode.workspace.workspaceFolders || []) {
         if (isSubFolder(folder.uri.fsPath, workspaceFolderSetting)) {
             needAsk = false;
         }
@@ -47,7 +46,7 @@ export async function selectWorkspaceFolder(): Promise<string> {
                 await vscode.commands.executeCommand("vscode.openFolder", vscode.Uri.file(workspaceFolderSetting), true);
                 return "";
             case OpenOption.addToWorkspace:
-                vscode.workspace.updateWorkspaceFolders(workspaceFolders.length, 0, { uri: vscode.Uri.file(workspaceFolderSetting) });
+                vscode.workspace.updateWorkspaceFolders(vscode.workspace.workspaceFolders?.length ?? 0, 0, { uri: vscode.Uri.file(workspaceFolderSetting) });
                 break;
             default:
                 return "";

From 802dc405aa061d5dc286de86088bb2f7a332db3f Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Tue, 8 Jun 2021 14:18:56 +0800
Subject: [PATCH 32/47] fix: Folder not exist when select the workspace folder
 (#713)

---
 src/utils/workspaceUtils.ts | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/utils/workspaceUtils.ts b/src/utils/workspaceUtils.ts
index 81072be7..48105d5a 100644
--- a/src/utils/workspaceUtils.ts
+++ b/src/utils/workspaceUtils.ts
@@ -1,6 +1,7 @@
 // Copyright (c) jdneo. All rights reserved.
 // Licensed under the MIT license.
 
+import * as fse from "fs-extra";
 import * as os from "os";
 import * as path from "path";
 import * as vscode from "vscode";
@@ -19,6 +20,7 @@ export async function selectWorkspaceFolder(): Promise<string> {
         }
     }
     let needAsk: boolean = true;
+    await fse.ensureDir(workspaceFolderSetting);
     for (const folder of vscode.workspace.workspaceFolders || []) {
         if (isSubFolder(folder.uri.fsPath, workspaceFolderSetting)) {
             needAsk = false;
@@ -36,6 +38,7 @@ export async function selectWorkspaceFolder(): Promise<string> {
             { placeHolder: "The LeetCode workspace folder is not opened in VS Code, would you like to open it?" },
         );
 
+        // Todo: generate file first
         switch (choice) {
             case OpenOption.justOpenFile:
                 return workspaceFolderSetting;

From adf255c5dbb6e440536697ef3e436a6c484385fe Mon Sep 17 00:00:00 2001
From: Sheng Chen <sheche@microsoft.com>
Date: Tue, 8 Jun 2021 14:49:24 +0800
Subject: [PATCH 33/47] chore: Prepare for 0.18.0 (#714)

---
 CHANGELOG.md         | 11 +++++++++++
 README.md            |  1 +
 docs/README_zh-CN.md |  1 +
 package-lock.json    |  2 +-
 package.json         |  2 +-
 5 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 22a3fc38..0de174fc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,17 @@ All notable changes to the "leetcode" extension will be documented in this file.
 
 Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
 
+## [0.18.0]
+### Added
+- Add `star` command in shortcuts [PR#601](https://github.com/LeetCode-OpenSource/vscode-leetcode/pull/601)
+- Add an option to disable endpoint translation [#389](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/389)
+
+### Changed
+- LeetCode actions are moved into sub-menu: `LeetCode` in the editor context menu. [PR#712](https://github.com/LeetCode-OpenSource/vscode-leetcode/pull/712)
+
+### Fixed
+[Bugs fixed](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues?q=is%3Aissue+milestone%3A0.18.0+is%3Aclosed+label%3Abug)
+
 ## [0.17.0]
 ### Added
 - Add TypeScript support [#560](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/560)
diff --git a/README.md b/README.md
index 173371f6..249e20bd 100644
--- a/README.md
+++ b/README.md
@@ -133,6 +133,7 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 | `leetcode.enableSideMode`                                                               | Specify whether `preview`, `solution` and `submission` tab should be grouped into the second editor column when solving a problem.                                                                                                                                                                                                                                                                                                | `true`             |
 | `leetcode.nodePath`                                                                     | Specify the `Node.js` executable path. for example, C:\Program Files\nodejs\node.exe                                                                                                                                                                                                                                                                                                                                              | `node`             |
 | `leetcode.showCommentDescription`                                                       | Specify whether to include the problem description in the comments                                                                                                                                                                                                                                                                                                                                                                | `false`            |
+| `leetcode.useEndpointTranslation`                                                       | Use endpoint's translation (if available)                                                                                                                                                                                                                                                                                                                                                                | `true`            |
 
 ## Want Help?
 
diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md
index e4760015..71ed04b6 100644
--- a/docs/README_zh-CN.md
+++ b/docs/README_zh-CN.md
@@ -134,6 +134,7 @@
 | `leetcode.enableSideMode`                                                          | 指定在解决一道题时,是否将`问题预览`、`高票答案`与`提交结果`窗口集中在编辑器的第二栏。                                                                                                                                                                                                          | `true`             |
 | `leetcode.nodePath`                                                                | 指定 `Node.js` 可执行文件的路径。如:C:\Program Files\nodejs\node.exe                                                                                                                                                                                                                           | `node`             |
 | `leetcode.showCommentDescription`                                                  | 指定是否要在注释中显示题干。                                                                                                                                                                                                                                                                    | `false`            |
+| `leetcode.useEndpointTranslation`                                                       | 是否显示翻译版本内容。                                                                                                                                                                                                                                                                                                                                                                | `true`            |
 
 ## 需要帮助?
 在遇到任何问题时,可以先查看一下[疑难解答](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/%E7%96%91%E9%9A%BE%E8%A7%A3%E7%AD%94)以及[常见问题](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98)寻求帮助。
diff --git a/package-lock.json b/package-lock.json
index f29605ac..75694f3b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
 {
     "name": "vscode-leetcode",
-    "version": "0.17.0",
+    "version": "0.18.0",
     "lockfileVersion": 1,
     "requires": true,
     "dependencies": {
diff --git a/package.json b/package.json
index ea24e2dd..cad81253 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
     "name": "vscode-leetcode",
     "displayName": "LeetCode",
     "description": "Solve LeetCode problems in VS Code",
-    "version": "0.17.0",
+    "version": "0.18.0",
     "author": "Sheng Chen",
     "publisher": "LeetCode",
     "license": "MIT",

From e93bb6e4cb46b1019d1624c313d93cad2598b27d Mon Sep 17 00:00:00 2001
From: Abhishek Kathuria <anshkathuria@gmail.com>
Date: Thu, 19 Aug 2021 21:43:28 -0700
Subject: [PATCH 34/47] feat: Add difficulty badge to problems in explorer tree
 (#727)

---
 README.md                                     | 32 ++++++++-------
 package-lock.json                             |  6 +--
 package.json                                  | 10 ++++-
 src/explorer/LeetCodeNode.ts                  | 11 ++++-
 src/explorer/LeetCodeTreeDataProvider.ts      |  1 +
 .../LeetCodeTreeItemDecorationProvider.ts     | 40 +++++++++++++++++++
 src/extension.ts                              |  2 +
 7 files changed, 81 insertions(+), 21 deletions(-)
 create mode 100644 src/explorer/LeetCodeTreeItemDecorationProvider.ts

diff --git a/README.md b/README.md
index 249e20bd..8292a79f 100644
--- a/README.md
+++ b/README.md
@@ -119,21 +119,23 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 
 
 ## Settings
-| Setting Name                                                                            | Description                                                                                                                                                                                                                                                                                                                                                                                                                       | Default Value      |
-| --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
-| `leetcode.hideSolved`                                                                   | Specify to hide the solved problems or not                                                                                                                                                                                                                                                                                                                                                                                        | `false`            |
-| `leetcode.showLocked`                                                                   | Specify to show the locked problems or not. Only Premium users could open the locked problems                                                                                                                                                                                                                                                                                                                                     | `false`            |
-| `leetcode.defaultLanguage`                                                              | Specify the default language used to solve the problem. Supported languages are: `bash`, `c`, `cpp`, `csharp`, `golang`, `java`, `javascript`, `kotlin`, `mysql`, `php`, `python`,`python3`,`ruby`,`rust`, `scala`, `swift`, `typescript`                                                                                                                                                                                                        | `N/A`              |
-| `leetcode.useWsl`                                                                       | Specify whether to use WSL or not                                                                                                                                                                                                                                                                                                                                                                                                 | `false`            |
-| `leetcode.endpoint`                                                                     | Specify the active endpoint. Supported endpoints are: `leetcode`, `leetcode-cn`                                                                                                                                                                                                                                                                                                                                                   | `leetcode`         |
-| `leetcode.workspaceFolder`                                                              | Specify the path of the workspace folder to store the problem files.                                                                                                                                                                                                                                                                                                                                                              | `""`               |
-| `leetcode.filePath`                                                                     | Specify the relative path under the workspace and the file name to save the problem files. More details can be found [here](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/Customize-the-Relative-Folder-and-the-File-Name-of-the-Problem-File).                                                                                                                                                                                   |                    |
-| `leetcode.enableStatusBar`                                                              | Specify whether the LeetCode status bar will be shown or not.                                                                                                                                                                                                                                                                                                                                                                     | `true`             |
-| `leetcode.editor.shortcuts`                                                             | Specify the customized shortcuts in editors. Supported values are: `submit`, `test`, `star`, `solution` and `description`.                                                                                                                                                                                                                                                                                                                 | `["submit, test"]` |
-| `leetcode.enableSideMode`                                                               | Specify whether `preview`, `solution` and `submission` tab should be grouped into the second editor column when solving a problem.                                                                                                                                                                                                                                                                                                | `true`             |
-| `leetcode.nodePath`                                                                     | Specify the `Node.js` executable path. for example, C:\Program Files\nodejs\node.exe                                                                                                                                                                                                                                                                                                                                              | `node`             |
-| `leetcode.showCommentDescription`                                                       | Specify whether to include the problem description in the comments                                                                                                                                                                                                                                                                                                                                                                | `false`            |
-| `leetcode.useEndpointTranslation`                                                       | Use endpoint's translation (if available)                                                                                                                                                                                                                                                                                                                                                                | `true`            |
+
+| Setting Name                      | Description                                                                                                                                                                                                                                                   | Default Value      |
+| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
+| `leetcode.hideSolved`             | Specify to hide the solved problems or not                                                                                                                                                                                                                    | `false`            |
+| `leetcode.showLocked`             | Specify to show the locked problems or not. Only Premium users could open the locked problems                                                                                                                                                                 | `false`            |
+| `leetcode.defaultLanguage`        | Specify the default language used to solve the problem. Supported languages are: `bash`, `c`, `cpp`, `csharp`, `golang`, `java`, `javascript`, `kotlin`, `mysql`, `php`, `python`,`python3`,`ruby`,`rust`, `scala`, `swift`, `typescript`                     | `N/A`              |
+| `leetcode.useWsl`                 | Specify whether to use WSL or not                                                                                                                                                                                                                             | `false`            |
+| `leetcode.endpoint`               | Specify the active endpoint. Supported endpoints are: `leetcode`, `leetcode-cn`                                                                                                                                                                               | `leetcode`         |
+| `leetcode.workspaceFolder`        | Specify the path of the workspace folder to store the problem files.                                                                                                                                                                                          | `""`               |
+| `leetcode.filePath`               | Specify the relative path under the workspace and the file name to save the problem files. More details can be found [here](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/Customize-the-Relative-Folder-and-the-File-Name-of-the-Problem-File). |                    |
+| `leetcode.enableStatusBar`        | Specify whether the LeetCode status bar will be shown or not.                                                                                                                                                                                                 | `true`             |
+| `leetcode.editor.shortcuts`       | Specify the customized shortcuts in editors. Supported values are: `submit`, `test`, `star`, `solution` and `description`.                                                                                                                                    | `["submit, test"]` |
+| `leetcode.enableSideMode`         | Specify whether `preview`, `solution` and `submission` tab should be grouped into the second editor column when solving a problem.                                                                                                                            | `true`             |
+| `leetcode.nodePath`               | Specify the `Node.js` executable path. for example, C:\Program Files\nodejs\node.exe                                                                                                                                                                          | `node`             |
+| `leetcode.showCommentDescription` | Specify whether to include the problem description in the comments                                                                                                                                                                                            | `false`            |
+| `leetcode.useEndpointTranslation` | Use endpoint's translation (if available)                                                                                                                                                                                                                     | `true`             |
+| `leetcode.colorizeProblems`       | Add difficulty badge and colorize problems files in explorer tree                                                                                                                                                                                             | `true`             |
 
 ## Want Help?
 
diff --git a/package-lock.json b/package-lock.json
index 75694f3b..4ab065af 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -79,9 +79,9 @@
             "dev": true
         },
         "@types/vscode": {
-            "version": "1.50.0",
-            "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.50.0.tgz",
-            "integrity": "sha512-QnIeyi4L2DiD9M2bAQKRzT/EQvc80qP9UL6JD5TiLlNRL1khIDg4ej4mDSRbtFrDAsRntFI1RhMvdomUThMsqg==",
+            "version": "1.57.0",
+            "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.57.0.tgz",
+            "integrity": "sha512-FeznBFtIDCWRluojTsi9c3LLcCHOXP5etQfBK42+ixo1CoEAchkw39tuui9zomjZuKfUVL33KZUDIwHZ/xvOkQ==",
             "dev": true
         },
         "abab": {
diff --git a/package.json b/package.json
index cad81253..7ecd780a 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
     "license": "MIT",
     "icon": "resources/LeetCode.png",
     "engines": {
-        "vscode": "^1.50.0"
+        "vscode": "^1.57.0"
     },
     "repository": {
         "type": "git",
@@ -671,6 +671,12 @@
                         "default": "node",
                         "scope": "application",
                         "description": "The Node.js executable path. for example, C:\\Program Files\\nodejs\\node.exe"
+                    },
+                    "leetcode.colorizeProblems": {
+                        "type": "boolean",
+                        "default": true,
+                        "scope": "application",
+                        "description": "Add difficulty badge and colorize problems files in explorer tree."
                     }
                 }
             }
@@ -689,7 +695,7 @@
         "@types/mocha": "^2.2.42",
         "@types/node": "^14.14.33",
         "@types/require-from-string": "^1.2.0",
-        "@types/vscode": "1.50.0",
+        "@types/vscode": "1.57.0",
         "tslint": "^5.20.1",
         "typescript": "^4.3.2"
     },
diff --git a/src/explorer/LeetCodeNode.ts b/src/explorer/LeetCodeNode.ts
index 67aad324..c8540887 100644
--- a/src/explorer/LeetCodeNode.ts
+++ b/src/explorer/LeetCodeNode.ts
@@ -1,7 +1,7 @@
 // Copyright (c) jdneo. All rights reserved.
 // Licensed under the MIT license.
 
-import { Command } from "vscode";
+import { Command, Uri } from "vscode";
 import { IProblem, ProblemState } from "../shared";
 
 export class LeetCodeNode {
@@ -55,4 +55,13 @@ export class LeetCodeNode {
         };
     }
 
+    public get uri(): Uri {
+        return Uri.from({
+            scheme: "leetcode",
+            authority: this.isProblem ? "problems" : "tree-node",
+            path: `/${this.id}`, // path must begin with slash /
+            query: `difficulty=${this.difficulty}`,
+        });
+    }
+
 }
diff --git a/src/explorer/LeetCodeTreeDataProvider.ts b/src/explorer/LeetCodeTreeDataProvider.ts
index 2bfbe497..4764934a 100644
--- a/src/explorer/LeetCodeTreeDataProvider.ts
+++ b/src/explorer/LeetCodeTreeDataProvider.ts
@@ -51,6 +51,7 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider<LeetCod
             collapsibleState: element.isProblem ? vscode.TreeItemCollapsibleState.None : vscode.TreeItemCollapsibleState.Collapsed,
             iconPath: this.parseIconPathFromProblemState(element),
             command: element.isProblem ? element.previewCommand : undefined,
+            resourceUri: element.uri,
             contextValue,
         };
     }
diff --git a/src/explorer/LeetCodeTreeItemDecorationProvider.ts b/src/explorer/LeetCodeTreeItemDecorationProvider.ts
new file mode 100644
index 00000000..103ce2d9
--- /dev/null
+++ b/src/explorer/LeetCodeTreeItemDecorationProvider.ts
@@ -0,0 +1,40 @@
+import { URLSearchParams } from "url";
+import { FileDecoration, FileDecorationProvider, ProviderResult, ThemeColor, Uri, workspace, WorkspaceConfiguration } from "vscode";
+
+export class LeetCodeTreeItemDecorationProvider implements FileDecorationProvider {
+    private readonly DIFFICULTY_BADGE_LABEL: { [key: string]: string } = {
+        easy: "E",
+        medium: "M",
+        hard: "H",
+    };
+
+    private readonly ITEM_COLOR: { [key: string]: ThemeColor } = {
+        easy: new ThemeColor("charts.green"),
+        medium: new ThemeColor("charts.yellow"),
+        hard: new ThemeColor("charts.red"),
+    };
+
+    public provideFileDecoration(uri: Uri): ProviderResult<FileDecoration>  {
+        if (!this.isDifficultyBadgeEnabled()) {
+            return;
+        }
+
+        if (uri.scheme !== "leetcode" && uri.authority !== "problems") {
+            return;
+        }
+
+        const params: URLSearchParams = new URLSearchParams(uri.query);
+        const difficulty: string = params.get("difficulty")!.toLowerCase();
+        return {
+            badge: this.DIFFICULTY_BADGE_LABEL[difficulty],
+            color: this.ITEM_COLOR[difficulty],
+        };
+    }
+
+    private isDifficultyBadgeEnabled(): boolean {
+        const configuration: WorkspaceConfiguration = workspace.getConfiguration();
+        return configuration.get<boolean>("leetcode.colorizeProblems", false);
+    }
+}
+
+export const leetCodeTreeItemDecorationProvider: LeetCodeTreeItemDecorationProvider = new LeetCodeTreeItemDecorationProvider();
diff --git a/src/extension.ts b/src/extension.ts
index 5bd026f1..102c245f 100644
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -14,6 +14,7 @@ import * as test from "./commands/test";
 import { explorerNodeManager } from "./explorer/explorerNodeManager";
 import { LeetCodeNode } from "./explorer/LeetCodeNode";
 import { leetCodeTreeDataProvider } from "./explorer/LeetCodeTreeDataProvider";
+import { leetCodeTreeItemDecorationProvider } from "./explorer/LeetCodeTreeItemDecorationProvider";
 import { leetCodeChannel } from "./leetCodeChannel";
 import { leetCodeExecutor } from "./leetCodeExecutor";
 import { leetCodeManager } from "./leetCodeManager";
@@ -47,6 +48,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
             markdownEngine,
             codeLensController,
             explorerNodeManager,
+            vscode.window.registerFileDecorationProvider(leetCodeTreeItemDecorationProvider),
             vscode.window.createTreeView("leetCodeExplorer", { treeDataProvider: leetCodeTreeDataProvider, showCollapseAll: true }),
             vscode.commands.registerCommand("leetcode.deleteCache", () => cache.deleteCache()),
             vscode.commands.registerCommand("leetcode.toggleLeetCodeCn", () => plugin.switchEndpoint()),

From de1dc4161b497b4f76faad2363abab0104a75373 Mon Sep 17 00:00:00 2001
From: Abhishek Kathuria <anshkathuria@gmail.com>
Date: Fri, 20 Aug 2021 19:42:58 -0700
Subject: [PATCH 35/47] feat: Add support for sorting problems by acceptance
 rate (#728)

---
 README.md                           |  1 +
 package.json                        | 23 ++++++++++++++++++
 src/commands/plugin.ts              | 36 ++++++++++++++++++++++++++++-
 src/explorer/LeetCodeNode.ts        |  4 ++++
 src/explorer/explorerNodeManager.ts | 20 ++++++++++++----
 src/extension.ts                    |  1 +
 src/shared.ts                       |  8 +++++++
 7 files changed, 88 insertions(+), 5 deletions(-)

diff --git a/README.md b/README.md
index 8292a79f..ac752c73 100644
--- a/README.md
+++ b/README.md
@@ -136,6 +136,7 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 | `leetcode.showCommentDescription` | Specify whether to include the problem description in the comments                                                                                                                                                                                            | `false`            |
 | `leetcode.useEndpointTranslation` | Use endpoint's translation (if available)                                                                                                                                                                                                                     | `true`             |
 | `leetcode.colorizeProblems`       | Add difficulty badge and colorize problems files in explorer tree                                                                                                                                                                                             | `true`             |
+| `leetcode.problems.sortStrategy`  | Specify sorting strategy for problems list                                                                                                                                                                                                                    | `None`             |
 
 ## Want Help?
 
diff --git a/package.json b/package.json
index 7ecd780a..bcdb5c02 100644
--- a/package.json
+++ b/package.json
@@ -38,6 +38,7 @@
         "onCommand:leetcode.testSolution",
         "onCommand:leetcode.submitSolution",
         "onCommand:leetcode.switchDefaultLanguage",
+        "onCommand:leetcode.problems.sort",
         "onView:leetCodeExplorer"
     ],
     "main": "./out/src/extension",
@@ -134,6 +135,12 @@
                 "command": "leetcode.switchDefaultLanguage",
                 "title": "Switch Default Language",
                 "category": "LeetCode"
+            },
+            {
+                "command": "leetcode.problems.sort",
+                "title": "Sort Problems",
+                "category": "LeetCode",
+                "icon": "$(sort-precedence)"
             }
         ],
         "viewsContainers": {
@@ -179,6 +186,11 @@
                     "command": "leetcode.pickOne",
                     "when": "view == leetCodeExplorer",
                     "group": "overflow@0"
+                },
+                {
+                    "command": "leetcode.problems.sort",
+                    "when": "view == leetCodeExplorer",
+                    "group": "overflow@1"
                 }
             ],
             "view/item/context": [
@@ -677,6 +689,17 @@
                         "default": true,
                         "scope": "application",
                         "description": "Add difficulty badge and colorize problems files in explorer tree."
+                    },
+                    "leetcode.problems.sortStrategy": {
+                        "type": "string",
+                        "default": "None",
+                        "scope": "application",
+                        "enum": [
+                            "None",
+                            "Acceptance Rate (Ascending)",
+                            "Acceptance Rate (Descending)"
+                        ],
+                        "description": "Sorting strategy for problems list."
                     }
                 }
             }
diff --git a/src/commands/plugin.ts b/src/commands/plugin.ts
index 481bd6dd..040f8321 100644
--- a/src/commands/plugin.ts
+++ b/src/commands/plugin.ts
@@ -2,9 +2,10 @@
 // Licensed under the MIT license.
 
 import * as vscode from "vscode";
+import { leetCodeTreeDataProvider } from "../explorer/LeetCodeTreeDataProvider";
 import { leetCodeExecutor } from "../leetCodeExecutor";
 import { IQuickItemEx } from "../shared";
-import { Endpoint } from "../shared";
+import { Endpoint, SortingStrategy } from "../shared";
 import { DialogType, promptForOpenOutputChannel, promptForSignIn } from "../utils/uiUtils";
 import { deleteCache } from "./cache";
 
@@ -52,3 +53,36 @@ export function getLeetCodeEndpoint(): string {
     const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode");
     return leetCodeConfig.get<string>("endpoint", Endpoint.LeetCode);
 }
+
+const SORT_ORDER: SortingStrategy[] = [
+    SortingStrategy.None,
+    SortingStrategy.AcceptanceRateAsc,
+    SortingStrategy.AcceptanceRateDesc,
+];
+
+export async function switchSortingStrategy(): Promise<void> {
+    const currentStrategy: SortingStrategy = getSortingStrategy();
+    const picks: Array<IQuickItemEx<string>> = [];
+    picks.push(
+        ...SORT_ORDER.map((s: SortingStrategy) => {
+            return {
+                label: `${currentStrategy === s ? "$(check)" : "    "} ${s}`,
+                value: s,
+            };
+        }),
+    );
+
+    const choice: IQuickItemEx<string> | undefined = await vscode.window.showQuickPick(picks);
+    if (!choice || choice.value === currentStrategy) {
+        return;
+    }
+
+    const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode");
+    await leetCodeConfig.update("problems.sortStrategy", choice.value, true);
+    await leetCodeTreeDataProvider.refresh();
+}
+
+export function getSortingStrategy(): SortingStrategy {
+    const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode");
+    return leetCodeConfig.get<SortingStrategy>("problems.sortStrategy", SortingStrategy.None);
+}
diff --git a/src/explorer/LeetCodeNode.ts b/src/explorer/LeetCodeNode.ts
index c8540887..3d2cc74f 100644
--- a/src/explorer/LeetCodeNode.ts
+++ b/src/explorer/LeetCodeNode.ts
@@ -55,6 +55,10 @@ export class LeetCodeNode {
         };
     }
 
+    public get acceptanceRate(): number {
+        return Number(this.passRate.slice(0, -1).trim());
+    }
+
     public get uri(): Uri {
         return Uri.from({
             scheme: "leetcode",
diff --git a/src/explorer/explorerNodeManager.ts b/src/explorer/explorerNodeManager.ts
index 95053263..a04ad55c 100644
--- a/src/explorer/explorerNodeManager.ts
+++ b/src/explorer/explorerNodeManager.ts
@@ -4,7 +4,8 @@
 import * as _ from "lodash";
 import { Disposable } from "vscode";
 import * as list from "../commands/list";
-import { Category, defaultProblem, ProblemState } from "../shared";
+import { getSortingStrategy } from "../commands/plugin";
+import { Category, defaultProblem, ProblemState, SortingStrategy } from "../shared";
 import { shouldHideSolvedProblem } from "../utils/settingUtils";
 import { LeetCodeNode } from "./LeetCodeNode";
 
@@ -56,7 +57,9 @@ class ExplorerNodeManager implements Disposable {
     }
 
     public getAllNodes(): LeetCodeNode[] {
-        return Array.from(this.explorerNodeMap.values());
+        return this.applySortingStrategy(
+            Array.from(this.explorerNodeMap.values()),
+        );
     }
 
     public getAllDifficultyNodes(): LeetCodeNode[] {
@@ -114,7 +117,7 @@ class ExplorerNodeManager implements Disposable {
                 res.push(node);
             }
         }
-        return res;
+        return this.applySortingStrategy(res);
     }
 
     public getChildrenNodesById(id: string): LeetCodeNode[] {
@@ -142,7 +145,7 @@ class ExplorerNodeManager implements Disposable {
                     break;
             }
         }
-        return res;
+        return this.applySortingStrategy(res);
     }
 
     public dispose(): void {
@@ -186,6 +189,15 @@ class ExplorerNodeManager implements Disposable {
                 break;
         }
     }
+
+    private applySortingStrategy(nodes: LeetCodeNode[]): LeetCodeNode[] {
+        const strategy: SortingStrategy = getSortingStrategy();
+        switch (strategy) {
+            case SortingStrategy.AcceptanceRateAsc: return nodes.sort((x: LeetCodeNode, y: LeetCodeNode) => Number(x.acceptanceRate) - Number(y.acceptanceRate));
+            case SortingStrategy.AcceptanceRateDesc: return nodes.sort((x: LeetCodeNode, y: LeetCodeNode) => Number(y.acceptanceRate) - Number(x.acceptanceRate));
+            default: return nodes;
+        }
+    }
 }
 
 export const explorerNodeManager: ExplorerNodeManager = new ExplorerNodeManager();
diff --git a/src/extension.ts b/src/extension.ts
index 102c245f..dfd91683 100644
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -66,6 +66,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
             vscode.commands.registerCommand("leetcode.switchDefaultLanguage", () => switchDefaultLanguage()),
             vscode.commands.registerCommand("leetcode.addFavorite", (node: LeetCodeNode) => star.addFavorite(node)),
             vscode.commands.registerCommand("leetcode.removeFavorite", (node: LeetCodeNode) => star.removeFavorite(node)),
+            vscode.commands.registerCommand("leetcode.problems.sort", () => plugin.switchSortingStrategy()),
         );
 
         await leetCodeExecutor.switchEndpoint(plugin.getLeetCodeEndpoint());
diff --git a/src/shared.ts b/src/shared.ts
index e09943f8..84b529cc 100644
--- a/src/shared.ts
+++ b/src/shared.ts
@@ -116,3 +116,11 @@ export enum DescriptionConfiguration {
 }
 
 export const leetcodeHasInited: string = "leetcode.hasInited";
+
+export enum SortingStrategy {
+    None = "None",
+    AcceptanceRateAsc = "Acceptance Rate (Ascending)",
+    AcceptanceRateDesc = "Acceptance Rate (Descending)",
+    FrequencyAsc = "Frequency (Ascending)",
+    FrequencyDesc = "Frequency (Descending)",
+}

From b7638bb26308ebfc6c0ab9b655cbfe7ae9097f18 Mon Sep 17 00:00:00 2001
From: Miloas <0x9357@gmail.com>
Date: Mon, 9 May 2022 18:06:56 +0800
Subject: [PATCH 36/47] fix: update cn domain (#800)

* fix: update cn domain

* fix(ci): upgrade node to 14

* chore: bump cli
---
 .github/workflows/build.yml |   70 +-
 README.md                   |    4 +-
 docs/README_zh-CN.md        |    4 +-
 package-lock.json           | 2353 +++++++++++++++++++++++++++++++++--
 package.json                |    2 +-
 src/commands/plugin.ts      |    2 +-
 src/utils/uiUtils.ts        |    2 +-
 7 files changed, 2262 insertions(+), 175 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 1df11a00..2bdeaa49 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -2,9 +2,9 @@ name: CI
 
 on:
   push:
-    branches: [ master ]
+    branches: [master]
   pull_request:
-    branches: [ master ]
+    branches: [master]
 
 jobs:
   linux:
@@ -12,60 +12,60 @@ jobs:
     runs-on: ubuntu-latest
     timeout-minutes: 30
     steps:
-    - uses: actions/checkout@v2
+      - uses: actions/checkout@v2
 
-    - name: Setup Node.js environment
-      uses: actions/setup-node@v2
-      with:
-        node-version: 12
+      - name: Setup Node.js environment
+        uses: actions/setup-node@v2
+        with:
+          node-version: 14
 
-    - name: Install Node.js modules
-      run: npm install
+      - name: Install Node.js modules
+        run: npm install
 
-    - name: Lint
-      run: npm run lint
+      - name: Lint
+        run: npm run lint
 
-    - name: VSCE Packge
-      run: npx vsce package
+      - name: VSCE Packge
+        run: npx vsce package
 
   windows:
     name: Windows
     runs-on: windows-latest
     timeout-minutes: 30
     steps:
-    - uses: actions/checkout@v2
+      - uses: actions/checkout@v2
 
-    - name: Setup Node.js environment
-      uses: actions/setup-node@v2
-      with:
-        node-version: 12
+      - name: Setup Node.js environment
+        uses: actions/setup-node@v2
+        with:
+          node-version: 14
 
-    - name: Install Node.js modules
-      run: npm install
+      - name: Install Node.js modules
+        run: npm install
 
-    - name: Lint
-      run: npm run lint
+      - name: Lint
+        run: npm run lint
 
-    - name: VSCE Packge
-      run: npx vsce package
+      - name: VSCE Packge
+        run: npx vsce package
 
   darwin:
     name: macOS
     runs-on: macos-latest
     timeout-minutes: 30
     steps:
-    - uses: actions/checkout@v2
+      - uses: actions/checkout@v2
 
-    - name: Setup Node.js environment
-      uses: actions/setup-node@v2
-      with:
-        node-version: 12
+      - name: Setup Node.js environment
+        uses: actions/setup-node@v2
+        with:
+          node-version: 14
 
-    - name: Install Node.js modules
-      run: npm install
+      - name: Install Node.js modules
+        run: npm install
 
-    - name: Lint
-      run: npm run lint
+      - name: Lint
+        run: npm run lint
 
-    - name: VSCE Packge
-      run: npx vsce package
+      - name: VSCE Packge
+        run: npx vsce package
diff --git a/README.md b/README.md
index ac752c73..cfe37701 100644
--- a/README.md
+++ b/README.md
@@ -23,7 +23,7 @@
 - English Document | [中文文档](https://github.com/LeetCode-OpenSource/vscode-leetcode/blob/master/docs/README_zh-CN.md)
 
 ## ❗️ Attention ❗️- Workaround to login to LeetCode endpoint
-> Note: If you are using `leetcode-cn.com`, you can just ignore this section.
+> Note: If you are using `leetcode.cn`, you can just ignore this section.
 
 Recently we observed that [the extension cannot login to leetcode.com endpoint anymore](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/478). The root cause of this issue is that leetcode.com changed its login mechanism and so far there is no ideal way to fix that issue.
 
@@ -63,7 +63,7 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 
 - The supported endpoints are:
   - **leetcode.com**
-  - **leetcode-cn.com**
+  - **leetcode.cn**
 
   > Note: The accounts of different endpoints are **not** shared. Please make sure you are using the right endpoint. The extension will use `leetcode.com` by default.
 
diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md
index 71ed04b6..ad4c9a74 100644
--- a/docs/README_zh-CN.md
+++ b/docs/README_zh-CN.md
@@ -23,7 +23,7 @@
 - [English Document](https://github.com/LeetCode-OpenSource/vscode-leetcode#requirements) | 中文文档
 
 ## ❗️ 注意 ❗️- 无法登录 LeetCode 节点的临时解决办法
-> 注意:如果使用的是 `leetcode-cn.com` 账户,可以跳过此段落。
+> 注意:如果使用的是 `leetcode.cn` 账户,可以跳过此段落。
 
 近期我们发现插件出现了[无法登录 leetcode.com 节点的问题](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/478)。原因是因为近期 leetcode.com 改变了登录机制,目前我们暂时没有找到解决该问题的完美解决方案。
 
@@ -64,7 +64,7 @@
 
 - 目前可切换的版本有:
   - **leetcode.com**
-  - **leetcode-cn.com**
+  - **leetcode.cn**
 
   > 注意:两种版本的 LeetCode 账户并**不通用**,请确保当前激活的版本是正确的。插件默认激活的是**英文版**。
 
diff --git a/package-lock.json b/package-lock.json
index 4ab065af..fe9c5d7f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,8 +1,2132 @@
 {
     "name": "vscode-leetcode",
     "version": "0.18.0",
-    "lockfileVersion": 1,
+    "lockfileVersion": 2,
     "requires": true,
+    "packages": {
+        "": {
+            "name": "vscode-leetcode",
+            "version": "0.18.0",
+            "license": "MIT",
+            "dependencies": {
+                "fs-extra": "^10.0.0",
+                "highlight.js": "^10.7.2",
+                "lodash": "^4.17.21",
+                "markdown-it": "^8.4.2",
+                "require-from-string": "^2.0.2",
+                "unescape-js": "^1.1.4",
+                "vsc-leetcode-cli": "2.8.1"
+            },
+            "devDependencies": {
+                "@types/fs-extra": "^9.0.11",
+                "@types/lodash": "^4.14.170",
+                "@types/markdown-it": "0.0.7",
+                "@types/mocha": "^2.2.42",
+                "@types/node": "^14.14.33",
+                "@types/require-from-string": "^1.2.0",
+                "@types/vscode": "1.57.0",
+                "tslint": "^5.20.1",
+                "typescript": "^4.3.2"
+            },
+            "engines": {
+                "vscode": "^1.57.0"
+            }
+        },
+        "node_modules/@babel/code-frame": {
+            "version": "7.12.13",
+            "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
+            "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
+            "dev": true,
+            "dependencies": {
+                "@babel/highlight": "^7.12.13"
+            }
+        },
+        "node_modules/@babel/helper-validator-identifier": {
+            "version": "7.14.0",
+            "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz",
+            "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==",
+            "dev": true
+        },
+        "node_modules/@babel/highlight": {
+            "version": "7.14.0",
+            "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz",
+            "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-validator-identifier": "^7.14.0",
+                "chalk": "^2.0.0",
+                "js-tokens": "^4.0.0"
+            }
+        },
+        "node_modules/@types/fs-extra": {
+            "version": "9.0.11",
+            "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.11.tgz",
+            "integrity": "sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA==",
+            "dev": true,
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@types/linkify-it": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.1.tgz",
+            "integrity": "sha512-pQv3Sygwxxh6jYQzXaiyWDAHevJqWtqDUv6t11Sa9CPGiXny66II7Pl6PR8QO5OVysD6HYOkHMeBgIjLnk9SkQ==",
+            "dev": true
+        },
+        "node_modules/@types/lodash": {
+            "version": "4.14.170",
+            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz",
+            "integrity": "sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q==",
+            "dev": true
+        },
+        "node_modules/@types/markdown-it": {
+            "version": "0.0.7",
+            "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-0.0.7.tgz",
+            "integrity": "sha512-WyL6pa76ollQFQNEaLVa41ZUUvDvPY+qAUmlsphnrpL6I9p1m868b26FyeoOmo7X3/Ta/S9WKXcEYXUSHnxoVQ==",
+            "dev": true,
+            "dependencies": {
+                "@types/linkify-it": "*"
+            }
+        },
+        "node_modules/@types/mocha": {
+            "version": "2.2.48",
+            "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz",
+            "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==",
+            "dev": true
+        },
+        "node_modules/@types/node": {
+            "version": "14.17.1",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.1.tgz",
+            "integrity": "sha512-/tpUyFD7meeooTRwl3sYlihx2BrJE7q9XF71EguPFIySj9B7qgnRtHsHTho+0AUm4m1SvWGm6uSncrR94q6Vtw==",
+            "dev": true
+        },
+        "node_modules/@types/require-from-string": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/@types/require-from-string/-/require-from-string-1.2.0.tgz",
+            "integrity": "sha512-5vE9WoOOC9/DoD3Zj53UISpM+5tSvh8k0mL4fe2zFI6vO715/W4IQ3EdVUrWVMrFi1/NZhyMvm2iKsDFkEGddQ==",
+            "dev": true
+        },
+        "node_modules/@types/vscode": {
+            "version": "1.57.0",
+            "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.57.0.tgz",
+            "integrity": "sha512-FeznBFtIDCWRluojTsi9c3LLcCHOXP5etQfBK42+ixo1CoEAchkw39tuui9zomjZuKfUVL33KZUDIwHZ/xvOkQ==",
+            "dev": true
+        },
+        "node_modules/abab": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
+            "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=",
+            "optional": true
+        },
+        "node_modules/acorn": {
+            "version": "2.7.0",
+            "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz",
+            "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=",
+            "optional": true,
+            "bin": {
+                "acorn": "bin/acorn"
+            },
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/acorn-globals": {
+            "version": "1.0.9",
+            "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz",
+            "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=",
+            "optional": true,
+            "dependencies": {
+                "acorn": "^2.1.0"
+            }
+        },
+        "node_modules/ajv": {
+            "version": "6.12.6",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+            "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+            "dependencies": {
+                "fast-deep-equal": "^3.1.1",
+                "fast-json-stable-stringify": "^2.0.0",
+                "json-schema-traverse": "^0.4.1",
+                "uri-js": "^4.2.2"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/epoberezkin"
+            }
+        },
+        "node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/ansi-styles": {
+            "version": "3.2.1",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+            "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+            "dependencies": {
+                "color-convert": "^1.9.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/argparse": {
+            "version": "1.0.10",
+            "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+            "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+            "dependencies": {
+                "sprintf-js": "~1.0.2"
+            }
+        },
+        "node_modules/asn1": {
+            "version": "0.2.4",
+            "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+            "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+            "dependencies": {
+                "safer-buffer": "~2.1.0"
+            }
+        },
+        "node_modules/assert-plus": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+            "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/async": {
+            "version": "1.5.2",
+            "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+            "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
+        },
+        "node_modules/asynckit": {
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+            "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+        },
+        "node_modules/aws-sign2": {
+            "version": "0.7.0",
+            "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+            "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/aws4": {
+            "version": "1.11.0",
+            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
+            "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
+        },
+        "node_modules/balanced-match": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+            "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+        },
+        "node_modules/bcrypt-pbkdf": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+            "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+            "dependencies": {
+                "tweetnacl": "^0.14.3"
+            }
+        },
+        "node_modules/boolbase": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+            "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
+        },
+        "node_modules/brace-expansion": {
+            "version": "1.1.11",
+            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+            "dependencies": {
+                "balanced-match": "^1.0.0",
+                "concat-map": "0.0.1"
+            }
+        },
+        "node_modules/builtin-modules": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+            "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/caseless": {
+            "version": "0.12.0",
+            "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+            "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+        },
+        "node_modules/chalk": {
+            "version": "2.4.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+            "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+            "dependencies": {
+                "ansi-styles": "^3.2.1",
+                "escape-string-regexp": "^1.0.5",
+                "supports-color": "^5.3.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/cheerio": {
+            "version": "0.20.0",
+            "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.20.0.tgz",
+            "integrity": "sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU=",
+            "dependencies": {
+                "css-select": "~1.2.0",
+                "dom-serializer": "~0.1.0",
+                "entities": "~1.1.1",
+                "htmlparser2": "~3.8.1",
+                "lodash": "^4.1.0"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            },
+            "optionalDependencies": {
+                "jsdom": "^7.0.2"
+            }
+        },
+        "node_modules/cli-cursor": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+            "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+            "dependencies": {
+                "restore-cursor": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/cli-spinners": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz",
+            "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/cliui": {
+            "version": "7.0.4",
+            "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+            "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+            "dependencies": {
+                "string-width": "^4.2.0",
+                "strip-ansi": "^6.0.0",
+                "wrap-ansi": "^7.0.0"
+            }
+        },
+        "node_modules/clone": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+            "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/color-convert": {
+            "version": "1.9.3",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+            "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+            "dependencies": {
+                "color-name": "1.1.3"
+            }
+        },
+        "node_modules/color-name": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+            "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+        },
+        "node_modules/colors": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+            "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+            "engines": {
+                "node": ">=0.1.90"
+            }
+        },
+        "node_modules/combined-stream": {
+            "version": "1.0.8",
+            "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+            "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+            "dependencies": {
+                "delayed-stream": "~1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/commander": {
+            "version": "2.20.3",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+            "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+            "dev": true
+        },
+        "node_modules/concat-map": {
+            "version": "0.0.1",
+            "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+            "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+        },
+        "node_modules/core-util-is": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+            "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+        },
+        "node_modules/css-select": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
+            "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+            "dependencies": {
+                "boolbase": "~1.0.0",
+                "css-what": "2.1",
+                "domutils": "1.5.1",
+                "nth-check": "~1.0.1"
+            }
+        },
+        "node_modules/css-what": {
+            "version": "2.1.3",
+            "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
+            "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/cssom": {
+            "version": "0.3.8",
+            "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+            "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+            "optional": true
+        },
+        "node_modules/cssstyle": {
+            "version": "0.2.37",
+            "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
+            "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=",
+            "optional": true,
+            "dependencies": {
+                "cssom": "0.3.x"
+            }
+        },
+        "node_modules/cycle": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+            "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/dashdash": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+            "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+            "dependencies": {
+                "assert-plus": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10"
+            }
+        },
+        "node_modules/decamelize": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+            "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/deep-equal": {
+            "version": "0.2.2",
+            "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz",
+            "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0="
+        },
+        "node_modules/deep-is": {
+            "version": "0.1.3",
+            "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+            "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+            "optional": true
+        },
+        "node_modules/defaults": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+            "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+            "dependencies": {
+                "clone": "^1.0.2"
+            }
+        },
+        "node_modules/delayed-stream": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+            "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/diff": {
+            "version": "4.0.2",
+            "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+            "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.3.1"
+            }
+        },
+        "node_modules/dom-serializer": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
+            "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
+            "dependencies": {
+                "domelementtype": "^1.3.0",
+                "entities": "^1.1.1"
+            }
+        },
+        "node_modules/domelementtype": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+            "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+        },
+        "node_modules/domhandler": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
+            "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
+            "dependencies": {
+                "domelementtype": "1"
+            }
+        },
+        "node_modules/domutils": {
+            "version": "1.5.1",
+            "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+            "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+            "dependencies": {
+                "dom-serializer": "0",
+                "domelementtype": "1"
+            }
+        },
+        "node_modules/ecc-jsbn": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+            "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+            "dependencies": {
+                "jsbn": "~0.1.0",
+                "safer-buffer": "^2.1.0"
+            }
+        },
+        "node_modules/emoji-regex": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "node_modules/entities": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+            "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
+        },
+        "node_modules/escalade": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+            "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/escape-string-regexp": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+            "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
+        "node_modules/escodegen": {
+            "version": "1.14.3",
+            "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+            "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+            "optional": true,
+            "dependencies": {
+                "esprima": "^4.0.1",
+                "estraverse": "^4.2.0",
+                "esutils": "^2.0.2",
+                "optionator": "^0.8.1"
+            },
+            "bin": {
+                "escodegen": "bin/escodegen.js",
+                "esgenerate": "bin/esgenerate.js"
+            },
+            "engines": {
+                "node": ">=4.0"
+            },
+            "optionalDependencies": {
+                "source-map": "~0.6.1"
+            }
+        },
+        "node_modules/esprima": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+            "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+            "devOptional": true,
+            "bin": {
+                "esparse": "bin/esparse.js",
+                "esvalidate": "bin/esvalidate.js"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/estraverse": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+            "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+            "optional": true,
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/esutils": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+            "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+            "optional": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/extend": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+            "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+        },
+        "node_modules/extsprintf": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+            "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+            "engines": [
+                "node >=0.6.0"
+            ]
+        },
+        "node_modules/eyes": {
+            "version": "0.1.8",
+            "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+            "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+            "engines": {
+                "node": "> 0.1.90"
+            }
+        },
+        "node_modules/fast-deep-equal": {
+            "version": "3.1.3",
+            "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+            "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+        },
+        "node_modules/fast-json-stable-stringify": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+            "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+        },
+        "node_modules/fast-levenshtein": {
+            "version": "2.0.6",
+            "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+            "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+            "optional": true
+        },
+        "node_modules/find-up": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+            "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+            "dependencies": {
+                "locate-path": "^5.0.0",
+                "path-exists": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/forever-agent": {
+            "version": "0.6.1",
+            "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+            "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/form-data": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+            "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+            "dependencies": {
+                "asynckit": "^0.4.0",
+                "combined-stream": "^1.0.6",
+                "mime-types": "^2.1.12"
+            },
+            "engines": {
+                "node": ">= 0.12"
+            }
+        },
+        "node_modules/fs-extra": {
+            "version": "10.0.0",
+            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
+            "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
+            "dependencies": {
+                "graceful-fs": "^4.2.0",
+                "jsonfile": "^6.0.1",
+                "universalify": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/fs.realpath": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+            "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+        },
+        "node_modules/function-bind": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+            "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+            "dev": true
+        },
+        "node_modules/get-caller-file": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+            "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+            "engines": {
+                "node": "6.* || 8.* || >= 10.*"
+            }
+        },
+        "node_modules/getpass": {
+            "version": "0.1.7",
+            "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+            "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+            "dependencies": {
+                "assert-plus": "^1.0.0"
+            }
+        },
+        "node_modules/glob": {
+            "version": "7.1.7",
+            "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+            "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+            "dependencies": {
+                "fs.realpath": "^1.0.0",
+                "inflight": "^1.0.4",
+                "inherits": "2",
+                "minimatch": "^3.0.4",
+                "once": "^1.3.0",
+                "path-is-absolute": "^1.0.0"
+            },
+            "engines": {
+                "node": "*"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/graceful-fs": {
+            "version": "4.2.6",
+            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
+            "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ=="
+        },
+        "node_modules/har-schema": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+            "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/har-validator": {
+            "version": "5.1.5",
+            "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+            "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+            "deprecated": "this library is no longer supported",
+            "dependencies": {
+                "ajv": "^6.12.3",
+                "har-schema": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/has": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+            "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+            "dev": true,
+            "dependencies": {
+                "function-bind": "^1.1.1"
+            },
+            "engines": {
+                "node": ">= 0.4.0"
+            }
+        },
+        "node_modules/has-flag": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+            "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/he": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+            "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+            "bin": {
+                "he": "bin/he"
+            }
+        },
+        "node_modules/highlight.js": {
+            "version": "10.7.2",
+            "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.2.tgz",
+            "integrity": "sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg==",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/htmlparser2": {
+            "version": "3.8.3",
+            "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
+            "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
+            "dependencies": {
+                "domelementtype": "1",
+                "domhandler": "2.3",
+                "domutils": "1.5",
+                "entities": "1.0",
+                "readable-stream": "1.1"
+            }
+        },
+        "node_modules/htmlparser2/node_modules/entities": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
+            "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY="
+        },
+        "node_modules/http-signature": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+            "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+            "dependencies": {
+                "assert-plus": "^1.0.0",
+                "jsprim": "^1.2.2",
+                "sshpk": "^1.7.0"
+            },
+            "engines": {
+                "node": ">=0.8",
+                "npm": ">=1.3.7"
+            }
+        },
+        "node_modules/i": {
+            "version": "0.3.6",
+            "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz",
+            "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=",
+            "engines": {
+                "node": ">=0.4"
+            }
+        },
+        "node_modules/inflight": {
+            "version": "1.0.6",
+            "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+            "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+            "dependencies": {
+                "once": "^1.3.0",
+                "wrappy": "1"
+            }
+        },
+        "node_modules/inherits": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+            "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+        },
+        "node_modules/ini": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+            "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/is-core-module": {
+            "version": "2.4.0",
+            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
+            "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
+            "dev": true,
+            "dependencies": {
+                "has": "^1.0.3"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-fullwidth-code-point": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+            "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/is-typedarray": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+            "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+        },
+        "node_modules/isarray": {
+            "version": "0.0.1",
+            "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+            "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+        },
+        "node_modules/isstream": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+            "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+        },
+        "node_modules/js-tokens": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+            "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+            "dev": true
+        },
+        "node_modules/js-yaml": {
+            "version": "3.14.1",
+            "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+            "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+            "dev": true,
+            "dependencies": {
+                "argparse": "^1.0.7",
+                "esprima": "^4.0.0"
+            },
+            "bin": {
+                "js-yaml": "bin/js-yaml.js"
+            }
+        },
+        "node_modules/jsbn": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+            "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+        },
+        "node_modules/jsdom": {
+            "version": "7.2.2",
+            "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz",
+            "integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=",
+            "optional": true,
+            "dependencies": {
+                "abab": "^1.0.0",
+                "acorn": "^2.4.0",
+                "acorn-globals": "^1.0.4",
+                "cssom": ">= 0.3.0 < 0.4.0",
+                "cssstyle": ">= 0.2.29 < 0.3.0",
+                "escodegen": "^1.6.1",
+                "nwmatcher": ">= 1.3.7 < 2.0.0",
+                "parse5": "^1.5.1",
+                "request": "^2.55.0",
+                "sax": "^1.1.4",
+                "symbol-tree": ">= 3.1.0 < 4.0.0",
+                "tough-cookie": "^2.2.0",
+                "webidl-conversions": "^2.0.0",
+                "whatwg-url-compat": "~0.6.5",
+                "xml-name-validator": ">= 2.0.1 < 3.0.0"
+            }
+        },
+        "node_modules/json-schema": {
+            "version": "0.2.3",
+            "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+            "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+        },
+        "node_modules/json-schema-traverse": {
+            "version": "0.4.1",
+            "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+            "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+        },
+        "node_modules/json-stringify-safe": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+            "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+        },
+        "node_modules/jsonfile": {
+            "version": "6.1.0",
+            "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+            "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+            "dependencies": {
+                "universalify": "^2.0.0"
+            },
+            "optionalDependencies": {
+                "graceful-fs": "^4.1.6"
+            }
+        },
+        "node_modules/jsprim": {
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+            "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+            "engines": [
+                "node >=0.6.0"
+            ],
+            "dependencies": {
+                "assert-plus": "1.0.0",
+                "extsprintf": "1.3.0",
+                "json-schema": "0.2.3",
+                "verror": "1.10.0"
+            }
+        },
+        "node_modules/levn": {
+            "version": "0.3.0",
+            "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+            "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+            "optional": true,
+            "dependencies": {
+                "prelude-ls": "~1.1.2",
+                "type-check": "~0.3.2"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/linkify-it": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz",
+            "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==",
+            "dependencies": {
+                "uc.micro": "^1.0.1"
+            }
+        },
+        "node_modules/locate-path": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+            "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+            "dependencies": {
+                "p-locate": "^4.1.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/lodash": {
+            "version": "4.17.21",
+            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+            "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+        },
+        "node_modules/log-symbols": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+            "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+            "dependencies": {
+                "chalk": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/markdown-it": {
+            "version": "8.4.2",
+            "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
+            "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==",
+            "dependencies": {
+                "argparse": "^1.0.7",
+                "entities": "~1.1.1",
+                "linkify-it": "^2.0.0",
+                "mdurl": "^1.0.1",
+                "uc.micro": "^1.0.5"
+            },
+            "bin": {
+                "markdown-it": "bin/markdown-it.js"
+            }
+        },
+        "node_modules/mdurl": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+            "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
+        },
+        "node_modules/mime-db": {
+            "version": "1.47.0",
+            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz",
+            "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/mime-types": {
+            "version": "2.1.30",
+            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz",
+            "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==",
+            "dependencies": {
+                "mime-db": "1.47.0"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/mimic-fn": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+            "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/minimatch": {
+            "version": "3.0.4",
+            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+            "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+            "dependencies": {
+                "brace-expansion": "^1.1.7"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/minimist": {
+            "version": "1.2.5",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+            "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+        },
+        "node_modules/mkdirp": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+            "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+            "bin": {
+                "mkdirp": "bin/cmd.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/moment": {
+            "version": "2.29.1",
+            "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
+            "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/mute-stream": {
+            "version": "0.0.8",
+            "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+            "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
+        },
+        "node_modules/nconf": {
+            "version": "0.11.4",
+            "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.11.4.tgz",
+            "integrity": "sha512-YaDR846q11JnG1vTrhJ0QIlhiGY6+W1bgWtReG9SS3vkTl3AoNwFvUItdhG6/ZjGCfWpUVuRTNEBTDAQ3nWhGw==",
+            "dependencies": {
+                "async": "^1.4.0",
+                "ini": "^2.0.0",
+                "secure-keys": "^1.0.0",
+                "yargs": "^16.1.1"
+            },
+            "engines": {
+                "node": ">= 0.4.0"
+            }
+        },
+        "node_modules/nconf/node_modules/yargs": {
+            "version": "16.2.0",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+            "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+            "dependencies": {
+                "cliui": "^7.0.2",
+                "escalade": "^3.1.1",
+                "get-caller-file": "^2.0.5",
+                "require-directory": "^2.1.1",
+                "string-width": "^4.2.0",
+                "y18n": "^5.0.5",
+                "yargs-parser": "^20.2.2"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/nconf/node_modules/yargs-parser": {
+            "version": "20.2.9",
+            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+            "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/ncp": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz",
+            "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=",
+            "bin": {
+                "ncp": "bin/ncp"
+            }
+        },
+        "node_modules/nth-check": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+            "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+            "dependencies": {
+                "boolbase": "~1.0.0"
+            }
+        },
+        "node_modules/nwmatcher": {
+            "version": "1.4.4",
+            "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz",
+            "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==",
+            "optional": true
+        },
+        "node_modules/oauth-sign": {
+            "version": "0.9.0",
+            "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+            "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/once": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+            "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+            "dependencies": {
+                "wrappy": "1"
+            }
+        },
+        "node_modules/onetime": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+            "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+            "dependencies": {
+                "mimic-fn": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/optionator": {
+            "version": "0.8.3",
+            "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+            "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+            "optional": true,
+            "dependencies": {
+                "deep-is": "~0.1.3",
+                "fast-levenshtein": "~2.0.6",
+                "levn": "~0.3.0",
+                "prelude-ls": "~1.1.2",
+                "type-check": "~0.3.2",
+                "word-wrap": "~1.2.3"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/ora": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/ora/-/ora-3.0.0.tgz",
+            "integrity": "sha512-LBS97LFe2RV6GJmXBi6OKcETKyklHNMV0xw7BtsVn2MlsgsydyZetSCbCANr+PFLmDyv4KV88nn0eCKza665Mg==",
+            "dependencies": {
+                "chalk": "^2.3.1",
+                "cli-cursor": "^2.1.0",
+                "cli-spinners": "^1.1.0",
+                "log-symbols": "^2.2.0",
+                "strip-ansi": "^4.0.0",
+                "wcwidth": "^1.0.1"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/ora/node_modules/ansi-regex": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+            "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/ora/node_modules/strip-ansi": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+            "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+            "dependencies": {
+                "ansi-regex": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/p-limit": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+            "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+            "dependencies": {
+                "p-try": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/p-locate": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+            "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+            "dependencies": {
+                "p-limit": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/p-try": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+            "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/parse5": {
+            "version": "1.5.1",
+            "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
+            "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=",
+            "optional": true
+        },
+        "node_modules/path-exists": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+            "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/path-is-absolute": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+            "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/path-parse": {
+            "version": "1.0.7",
+            "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+            "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+            "dev": true
+        },
+        "node_modules/performance-now": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+            "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+        },
+        "node_modules/pkginfo": {
+            "version": "0.4.1",
+            "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz",
+            "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=",
+            "engines": {
+                "node": ">= 0.4.0"
+            }
+        },
+        "node_modules/prelude-ls": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+            "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+            "optional": true,
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/prompt": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.0.0.tgz",
+            "integrity": "sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4=",
+            "dependencies": {
+                "colors": "^1.1.2",
+                "pkginfo": "0.x.x",
+                "read": "1.0.x",
+                "revalidator": "0.1.x",
+                "utile": "0.3.x",
+                "winston": "2.1.x"
+            },
+            "engines": {
+                "node": ">= 0.6.6"
+            }
+        },
+        "node_modules/psl": {
+            "version": "1.8.0",
+            "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+            "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+        },
+        "node_modules/punycode": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+            "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/qs": {
+            "version": "6.5.2",
+            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+            "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+            "engines": {
+                "node": ">=0.6"
+            }
+        },
+        "node_modules/read": {
+            "version": "1.0.7",
+            "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
+            "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=",
+            "dependencies": {
+                "mute-stream": "~0.0.4"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/readable-stream": {
+            "version": "1.1.14",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+            "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+            "dependencies": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.1",
+                "isarray": "0.0.1",
+                "string_decoder": "~0.10.x"
+            }
+        },
+        "node_modules/request": {
+            "version": "2.88.0",
+            "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+            "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+            "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
+            "dependencies": {
+                "aws-sign2": "~0.7.0",
+                "aws4": "^1.8.0",
+                "caseless": "~0.12.0",
+                "combined-stream": "~1.0.6",
+                "extend": "~3.0.2",
+                "forever-agent": "~0.6.1",
+                "form-data": "~2.3.2",
+                "har-validator": "~5.1.0",
+                "http-signature": "~1.2.0",
+                "is-typedarray": "~1.0.0",
+                "isstream": "~0.1.2",
+                "json-stringify-safe": "~5.0.1",
+                "mime-types": "~2.1.19",
+                "oauth-sign": "~0.9.0",
+                "performance-now": "^2.1.0",
+                "qs": "~6.5.2",
+                "safe-buffer": "^5.1.2",
+                "tough-cookie": "~2.4.3",
+                "tunnel-agent": "^0.6.0",
+                "uuid": "^3.3.2"
+            },
+            "engines": {
+                "node": ">= 4"
+            }
+        },
+        "node_modules/request/node_modules/punycode": {
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+            "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+        },
+        "node_modules/request/node_modules/tough-cookie": {
+            "version": "2.4.3",
+            "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+            "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+            "dependencies": {
+                "psl": "^1.1.24",
+                "punycode": "^1.4.1"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/require-directory": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+            "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/require-from-string": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+            "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/require-main-filename": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+            "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+        },
+        "node_modules/resolve": {
+            "version": "1.20.0",
+            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+            "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+            "dev": true,
+            "dependencies": {
+                "is-core-module": "^2.2.0",
+                "path-parse": "^1.0.6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/restore-cursor": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+            "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+            "dependencies": {
+                "onetime": "^2.0.0",
+                "signal-exit": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/revalidator": {
+            "version": "0.1.8",
+            "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz",
+            "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=",
+            "engines": {
+                "node": ">= 0.4.0"
+            }
+        },
+        "node_modules/rimraf": {
+            "version": "2.7.1",
+            "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+            "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+            "dependencies": {
+                "glob": "^7.1.3"
+            },
+            "bin": {
+                "rimraf": "bin.js"
+            }
+        },
+        "node_modules/safe-buffer": {
+            "version": "5.2.1",
+            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
+        "node_modules/safer-buffer": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+            "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+        },
+        "node_modules/sax": {
+            "version": "1.2.4",
+            "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+            "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+            "optional": true
+        },
+        "node_modules/secure-keys": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz",
+            "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o="
+        },
+        "node_modules/semver": {
+            "version": "5.7.1",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+            "dev": true,
+            "bin": {
+                "semver": "bin/semver"
+            }
+        },
+        "node_modules/set-blocking": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+            "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+        },
+        "node_modules/signal-exit": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+            "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+        },
+        "node_modules/source-map": {
+            "version": "0.6.1",
+            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+            "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+            "optional": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/sprintf-js": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+            "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+        },
+        "node_modules/sshpk": {
+            "version": "1.16.1",
+            "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+            "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+            "dependencies": {
+                "asn1": "~0.2.3",
+                "assert-plus": "^1.0.0",
+                "bcrypt-pbkdf": "^1.0.0",
+                "dashdash": "^1.12.0",
+                "ecc-jsbn": "~0.1.1",
+                "getpass": "^0.1.1",
+                "jsbn": "~0.1.0",
+                "safer-buffer": "^2.0.2",
+                "tweetnacl": "~0.14.0"
+            },
+            "bin": {
+                "sshpk-conv": "bin/sshpk-conv",
+                "sshpk-sign": "bin/sshpk-sign",
+                "sshpk-verify": "bin/sshpk-verify"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/stack-trace": {
+            "version": "0.0.10",
+            "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+            "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/string_decoder": {
+            "version": "0.10.31",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+            "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+        },
+        "node_modules/string-width": {
+            "version": "4.2.3",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+            "dependencies": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/string.fromcodepoint": {
+            "version": "0.2.1",
+            "resolved": "https://registry.npmjs.org/string.fromcodepoint/-/string.fromcodepoint-0.2.1.tgz",
+            "integrity": "sha1-jZeDM8C8klOPUPOD5IiPPlYZ1lM="
+        },
+        "node_modules/strip-ansi": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/supports-color": {
+            "version": "5.5.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+            "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+            "dependencies": {
+                "has-flag": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/symbol-tree": {
+            "version": "3.2.4",
+            "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+            "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+            "optional": true
+        },
+        "node_modules/tough-cookie": {
+            "version": "2.5.0",
+            "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+            "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+            "optional": true,
+            "dependencies": {
+                "psl": "^1.1.28",
+                "punycode": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/tr46": {
+            "version": "0.0.3",
+            "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+            "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
+            "optional": true
+        },
+        "node_modules/tslib": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+            "dev": true
+        },
+        "node_modules/tslint": {
+            "version": "5.20.1",
+            "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz",
+            "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/code-frame": "^7.0.0",
+                "builtin-modules": "^1.1.1",
+                "chalk": "^2.3.0",
+                "commander": "^2.12.1",
+                "diff": "^4.0.1",
+                "glob": "^7.1.1",
+                "js-yaml": "^3.13.1",
+                "minimatch": "^3.0.4",
+                "mkdirp": "^0.5.1",
+                "resolve": "^1.3.2",
+                "semver": "^5.3.0",
+                "tslib": "^1.8.0",
+                "tsutils": "^2.29.0"
+            },
+            "bin": {
+                "tslint": "bin/tslint"
+            },
+            "engines": {
+                "node": ">=4.8.0"
+            },
+            "peerDependencies": {
+                "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev"
+            }
+        },
+        "node_modules/tslint/node_modules/mkdirp": {
+            "version": "0.5.5",
+            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+            "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+            "dev": true,
+            "dependencies": {
+                "minimist": "^1.2.5"
+            },
+            "bin": {
+                "mkdirp": "bin/cmd.js"
+            }
+        },
+        "node_modules/tsutils": {
+            "version": "2.29.0",
+            "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+            "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+            "dev": true,
+            "dependencies": {
+                "tslib": "^1.8.1"
+            },
+            "peerDependencies": {
+                "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev"
+            }
+        },
+        "node_modules/tunnel-agent": {
+            "version": "0.6.0",
+            "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+            "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+            "dependencies": {
+                "safe-buffer": "^5.0.1"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/tweetnacl": {
+            "version": "0.14.5",
+            "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+            "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+        },
+        "node_modules/type-check": {
+            "version": "0.3.2",
+            "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+            "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+            "optional": true,
+            "dependencies": {
+                "prelude-ls": "~1.1.2"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/typescript": {
+            "version": "4.3.2",
+            "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz",
+            "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==",
+            "dev": true,
+            "bin": {
+                "tsc": "bin/tsc",
+                "tsserver": "bin/tsserver"
+            },
+            "engines": {
+                "node": ">=4.2.0"
+            }
+        },
+        "node_modules/uc.micro": {
+            "version": "1.0.6",
+            "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
+            "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
+        },
+        "node_modules/underscore": {
+            "version": "1.9.1",
+            "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz",
+            "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg=="
+        },
+        "node_modules/unescape-js": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/unescape-js/-/unescape-js-1.1.4.tgz",
+            "integrity": "sha512-42SD8NOQEhdYntEiUQdYq/1V/YHwr1HLwlHuTJB5InVVdOSbgI6xu8jK5q65yIzuFCfczzyDF/7hbGzVbyCw0g==",
+            "dependencies": {
+                "string.fromcodepoint": "^0.2.1"
+            }
+        },
+        "node_modules/universalify": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+            "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
+        "node_modules/uri-js": {
+            "version": "4.4.1",
+            "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+            "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+            "dependencies": {
+                "punycode": "^2.1.0"
+            }
+        },
+        "node_modules/utile": {
+            "version": "0.3.0",
+            "resolved": "https://registry.npmjs.org/utile/-/utile-0.3.0.tgz",
+            "integrity": "sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo=",
+            "dependencies": {
+                "async": "~0.9.0",
+                "deep-equal": "~0.2.1",
+                "i": "0.3.x",
+                "mkdirp": "0.x.x",
+                "ncp": "1.0.x",
+                "rimraf": "2.x.x"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/utile/node_modules/async": {
+            "version": "0.9.2",
+            "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
+            "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0="
+        },
+        "node_modules/utile/node_modules/mkdirp": {
+            "version": "0.5.5",
+            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+            "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+            "dependencies": {
+                "minimist": "^1.2.5"
+            },
+            "bin": {
+                "mkdirp": "bin/cmd.js"
+            }
+        },
+        "node_modules/uuid": {
+            "version": "3.4.0",
+            "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+            "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+            "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
+            "bin": {
+                "uuid": "bin/uuid"
+            }
+        },
+        "node_modules/verror": {
+            "version": "1.10.0",
+            "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+            "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+            "engines": [
+                "node >=0.6.0"
+            ],
+            "dependencies": {
+                "assert-plus": "^1.0.0",
+                "core-util-is": "1.0.2",
+                "extsprintf": "^1.2.0"
+            }
+        },
+        "node_modules/vsc-leetcode-cli": {
+            "version": "2.8.1",
+            "resolved": "https://registry.npmjs.org/vsc-leetcode-cli/-/vsc-leetcode-cli-2.8.1.tgz",
+            "integrity": "sha512-C5q5wGeedHKJzs53/jrVWEeobRteB/libKrVHmLqE3zraKJBgteUN4LUNEYrAjU9O6yxgj/NPEWOLoEdRhwATw==",
+            "dependencies": {
+                "ansi-styles": "3.2.1",
+                "cheerio": "0.20.0",
+                "he": "1.2.0",
+                "mkdirp": "^1.0.4",
+                "moment": "^2.29.1",
+                "nconf": "^0.11.2",
+                "ora": "3.0.0",
+                "prompt": "1.0.0",
+                "request": "2.88.0",
+                "supports-color": "5.5.0",
+                "underscore": "1.9.1",
+                "wordwrap": "1.0.0",
+                "yargs": "^15.4.1"
+            },
+            "bin": {
+                "leetcode": "bin/leetcode"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/wcwidth": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+            "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+            "dependencies": {
+                "defaults": "^1.0.3"
+            }
+        },
+        "node_modules/webidl-conversions": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-2.0.1.tgz",
+            "integrity": "sha1-O/glj30xjHRDw28uFpQCoaZwNQY=",
+            "optional": true
+        },
+        "node_modules/whatwg-url-compat": {
+            "version": "0.6.5",
+            "resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz",
+            "integrity": "sha1-AImBEa9om7CXVBzVpFymyHmERb8=",
+            "optional": true,
+            "dependencies": {
+                "tr46": "~0.0.1"
+            }
+        },
+        "node_modules/which-module": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+            "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+        },
+        "node_modules/winston": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/winston/-/winston-2.1.1.tgz",
+            "integrity": "sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4=",
+            "dependencies": {
+                "async": "~1.0.0",
+                "colors": "1.0.x",
+                "cycle": "1.0.x",
+                "eyes": "0.1.x",
+                "isstream": "0.1.x",
+                "pkginfo": "0.3.x",
+                "stack-trace": "0.0.x"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/winston/node_modules/async": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+            "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
+        },
+        "node_modules/winston/node_modules/colors": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+            "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+            "engines": {
+                "node": ">=0.1.90"
+            }
+        },
+        "node_modules/winston/node_modules/pkginfo": {
+            "version": "0.3.1",
+            "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz",
+            "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=",
+            "engines": {
+                "node": ">= 0.4.0"
+            }
+        },
+        "node_modules/word-wrap": {
+            "version": "1.2.3",
+            "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+            "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+            "optional": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/wordwrap": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+            "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
+        },
+        "node_modules/wrap-ansi": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+            "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+            }
+        },
+        "node_modules/wrap-ansi/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/wrap-ansi/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/wrap-ansi/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        },
+        "node_modules/wrappy": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+            "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+        },
+        "node_modules/xml-name-validator": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
+            "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=",
+            "optional": true
+        },
+        "node_modules/y18n": {
+            "version": "5.0.8",
+            "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+            "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/yargs": {
+            "version": "15.4.1",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+            "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+            "dependencies": {
+                "cliui": "^6.0.0",
+                "decamelize": "^1.2.0",
+                "find-up": "^4.1.0",
+                "get-caller-file": "^2.0.1",
+                "require-directory": "^2.1.1",
+                "require-main-filename": "^2.0.0",
+                "set-blocking": "^2.0.0",
+                "string-width": "^4.2.0",
+                "which-module": "^2.0.0",
+                "y18n": "^4.0.0",
+                "yargs-parser": "^18.1.2"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/yargs-parser": {
+            "version": "18.1.3",
+            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+            "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+            "dependencies": {
+                "camelcase": "^5.0.0",
+                "decamelize": "^1.2.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/yargs-parser/node_modules/camelcase": {
+            "version": "5.3.1",
+            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+            "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/yargs/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/yargs/node_modules/cliui": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+            "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+            "dependencies": {
+                "string-width": "^4.2.0",
+                "strip-ansi": "^6.0.0",
+                "wrap-ansi": "^6.2.0"
+            }
+        },
+        "node_modules/yargs/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/yargs/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        },
+        "node_modules/yargs/node_modules/wrap-ansi": {
+            "version": "6.2.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+            "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/yargs/node_modules/y18n": {
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+            "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+        }
+    },
     "dependencies": {
         "@babel/code-frame": {
             "version": "7.12.13",
@@ -117,9 +2241,9 @@
             }
         },
         "ansi-regex": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-            "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
         },
         "ansi-styles": {
             "version": "3.2.1",
@@ -203,11 +2327,6 @@
             "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
             "dev": true
         },
-        "camelcase": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-            "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8="
-        },
         "caseless": {
             "version": "0.12.0",
             "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
@@ -250,13 +2369,13 @@
             "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg=="
         },
         "cliui": {
-            "version": "3.2.0",
-            "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
-            "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+            "version": "7.0.4",
+            "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+            "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
             "requires": {
-                "string-width": "^1.0.1",
-                "strip-ansi": "^3.0.1",
-                "wrap-ansi": "^2.0.0"
+                "string-width": "^4.2.0",
+                "strip-ansi": "^6.0.0",
+                "wrap-ansi": "^7.0.0"
             }
         },
         "clone": {
@@ -264,11 +2383,6 @@
             "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
             "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
         },
-        "code-point-at": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
-            "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
-        },
         "color-convert": {
             "version": "1.9.3",
             "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -440,6 +2554,11 @@
             "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
             "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
         },
+        "escalade": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+            "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+        },
         "escape-string-regexp": {
             "version": "1.0.5",
             "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -461,7 +2580,8 @@
         "esprima": {
             "version": "4.0.1",
             "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-            "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+            "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+            "devOptional": true
         },
         "estraverse": {
             "version": "4.3.0",
@@ -669,14 +2789,9 @@
             "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
         },
         "ini": {
-            "version": "1.3.8",
-            "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
-            "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
-        },
-        "invert-kv": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
-            "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+            "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="
         },
         "is-core-module": {
             "version": "2.4.0",
@@ -688,12 +2803,9 @@
             }
         },
         "is-fullwidth-code-point": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-            "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-            "requires": {
-                "number-is-nan": "^1.0.0"
-            }
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+            "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
         },
         "is-typedarray": {
             "version": "1.0.0",
@@ -789,14 +2901,6 @@
                 "verror": "1.10.0"
             }
         },
-        "lcid": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
-            "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
-            "requires": {
-                "invert-kv": "^1.0.0"
-            }
-        },
         "levn": {
             "version": "0.3.0",
             "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
@@ -900,29 +3004,34 @@
             "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
         },
         "nconf": {
-            "version": "0.10.0",
-            "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.10.0.tgz",
-            "integrity": "sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q==",
+            "version": "0.11.4",
+            "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.11.4.tgz",
+            "integrity": "sha512-YaDR846q11JnG1vTrhJ0QIlhiGY6+W1bgWtReG9SS3vkTl3AoNwFvUItdhG6/ZjGCfWpUVuRTNEBTDAQ3nWhGw==",
             "requires": {
                 "async": "^1.4.0",
-                "ini": "^1.3.0",
+                "ini": "^2.0.0",
                 "secure-keys": "^1.0.0",
-                "yargs": "^3.19.0"
+                "yargs": "^16.1.1"
             },
             "dependencies": {
                 "yargs": {
-                    "version": "3.32.0",
-                    "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz",
-                    "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=",
+                    "version": "16.2.0",
+                    "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+                    "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
                     "requires": {
-                        "camelcase": "^2.0.1",
-                        "cliui": "^3.0.3",
-                        "decamelize": "^1.1.1",
-                        "os-locale": "^1.4.0",
-                        "string-width": "^1.0.1",
-                        "window-size": "^0.1.4",
-                        "y18n": "^3.2.0"
+                        "cliui": "^7.0.2",
+                        "escalade": "^3.1.1",
+                        "get-caller-file": "^2.0.5",
+                        "require-directory": "^2.1.1",
+                        "string-width": "^4.2.0",
+                        "y18n": "^5.0.5",
+                        "yargs-parser": "^20.2.2"
                     }
+                },
+                "yargs-parser": {
+                    "version": "20.2.9",
+                    "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+                    "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="
                 }
             }
         },
@@ -939,11 +3048,6 @@
                 "boolbase": "~1.0.0"
             }
         },
-        "number-is-nan": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-            "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
-        },
         "nwmatcher": {
             "version": "1.4.4",
             "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz",
@@ -1013,14 +3117,6 @@
                 }
             }
         },
-        "os-locale": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
-            "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
-            "requires": {
-                "lcid": "^1.0.0"
-            }
-        },
         "p-limit": {
             "version": "2.3.0",
             "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
@@ -1286,14 +3382,19 @@
             "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
             "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
         },
+        "string_decoder": {
+            "version": "0.10.31",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+            "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+        },
         "string-width": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-            "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+            "version": "4.2.3",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
             "requires": {
-                "code-point-at": "^1.0.0",
-                "is-fullwidth-code-point": "^1.0.0",
-                "strip-ansi": "^3.0.0"
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
             }
         },
         "string.fromcodepoint": {
@@ -1301,17 +3402,12 @@
             "resolved": "https://registry.npmjs.org/string.fromcodepoint/-/string.fromcodepoint-0.2.1.tgz",
             "integrity": "sha1-jZeDM8C8klOPUPOD5IiPPlYZ1lM="
         },
-        "string_decoder": {
-            "version": "0.10.31",
-            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-            "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
-        },
         "strip-ansi": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-            "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
             "requires": {
-                "ansi-regex": "^2.0.0"
+                "ansi-regex": "^5.0.1"
             }
         },
         "supports-color": {
@@ -1494,23 +3590,23 @@
             }
         },
         "vsc-leetcode-cli": {
-            "version": "2.8.0",
-            "resolved": "https://registry.npmjs.org/vsc-leetcode-cli/-/vsc-leetcode-cli-2.8.0.tgz",
-            "integrity": "sha512-KcFzpk3OZ+wUCoeK1yjBK0hYpJItYd8WFC7pQfE1zxJGjQs4tUvadLI5imKfRjw5NicjNRFnVpVv6N7ig7ik4A==",
+            "version": "2.8.1",
+            "resolved": "https://registry.npmjs.org/vsc-leetcode-cli/-/vsc-leetcode-cli-2.8.1.tgz",
+            "integrity": "sha512-C5q5wGeedHKJzs53/jrVWEeobRteB/libKrVHmLqE3zraKJBgteUN4LUNEYrAjU9O6yxgj/NPEWOLoEdRhwATw==",
             "requires": {
                 "ansi-styles": "3.2.1",
                 "cheerio": "0.20.0",
                 "he": "1.2.0",
                 "mkdirp": "^1.0.4",
-                "moment": "^2.20.1",
-                "nconf": "0.10.0",
+                "moment": "^2.29.1",
+                "nconf": "^0.11.2",
                 "ora": "3.0.0",
                 "prompt": "1.0.0",
                 "request": "2.88.0",
                 "supports-color": "5.5.0",
                 "underscore": "1.9.1",
                 "wordwrap": "1.0.0",
-                "yargs": "^15.3.1"
+                "yargs": "^15.4.1"
             }
         },
         "wcwidth": {
@@ -1541,11 +3637,6 @@
             "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
             "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
         },
-        "window-size": {
-            "version": "0.1.4",
-            "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
-            "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY="
-        },
         "winston": {
             "version": "2.1.1",
             "resolved": "https://registry.npmjs.org/winston/-/winston-2.1.1.tgz",
@@ -1589,12 +3680,36 @@
             "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
         },
         "wrap-ansi": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
-            "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+            "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
             "requires": {
-                "string-width": "^1.0.1",
-                "strip-ansi": "^3.0.1"
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "dependencies": {
+                "ansi-styles": {
+                    "version": "4.3.0",
+                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+                    "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+                    "requires": {
+                        "color-convert": "^2.0.1"
+                    }
+                },
+                "color-convert": {
+                    "version": "2.0.1",
+                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+                    "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+                    "requires": {
+                        "color-name": "~1.1.4"
+                    }
+                },
+                "color-name": {
+                    "version": "1.1.4",
+                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+                }
             }
         },
         "wrappy": {
@@ -1609,9 +3724,9 @@
             "optional": true
         },
         "y18n": {
-            "version": "3.2.2",
-            "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
-            "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ=="
+            "version": "5.0.8",
+            "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+            "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
         },
         "yargs": {
             "version": "15.4.1",
@@ -1631,11 +3746,6 @@
                 "yargs-parser": "^18.1.2"
             },
             "dependencies": {
-                "ansi-regex": {
-                    "version": "5.0.0",
-                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-                    "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
-                },
                 "ansi-styles": {
                     "version": "4.3.0",
                     "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -1667,29 +3777,6 @@
                     "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
                     "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
                 },
-                "is-fullwidth-code-point": {
-                    "version": "3.0.0",
-                    "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-                    "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
-                },
-                "string-width": {
-                    "version": "4.2.2",
-                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
-                    "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
-                    "requires": {
-                        "emoji-regex": "^8.0.0",
-                        "is-fullwidth-code-point": "^3.0.0",
-                        "strip-ansi": "^6.0.0"
-                    }
-                },
-                "strip-ansi": {
-                    "version": "6.0.0",
-                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-                    "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
-                    "requires": {
-                        "ansi-regex": "^5.0.0"
-                    }
-                },
                 "wrap-ansi": {
                     "version": "6.2.0",
                     "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
diff --git a/package.json b/package.json
index bcdb5c02..1bb764f3 100644
--- a/package.json
+++ b/package.json
@@ -729,6 +729,6 @@
         "markdown-it": "^8.4.2",
         "require-from-string": "^2.0.2",
         "unescape-js": "^1.1.4",
-        "vsc-leetcode-cli": "2.8.0"
+        "vsc-leetcode-cli": "2.8.1"
     }
 }
diff --git a/src/commands/plugin.ts b/src/commands/plugin.ts
index 040f8321..d2ed4b6c 100644
--- a/src/commands/plugin.ts
+++ b/src/commands/plugin.ts
@@ -21,7 +21,7 @@ export async function switchEndpoint(): Promise<void> {
         },
         {
             label: `${isCnEnabled ? "$(check) " : ""}力扣`,
-            description: "leetcode-cn.com",
+            description: "leetcode.cn",
             detail: `启用中国版 LeetCode`,
             value: Endpoint.LeetCodeCN,
         },
diff --git a/src/utils/uiUtils.ts b/src/utils/uiUtils.ts
index 53275fa0..9e251a55 100644
--- a/src/utils/uiUtils.ts
+++ b/src/utils/uiUtils.ts
@@ -48,7 +48,7 @@ export async function promptForSignIn(): Promise<void> {
             break;
         case DialogOptions.singUp:
             if (getLeetCodeEndpoint()) {
-                openUrl("https://leetcode-cn.com");
+                openUrl("https://leetcode.cn");
             } else {
                 openUrl("https://leetcode.com");
             }

From 8d191f96f826aaad5865593552cecb87b816ef41 Mon Sep 17 00:00:00 2001
From: Miloas <qiyu.null@gmail.com>
Date: Mon, 9 May 2022 18:07:24 +0800
Subject: [PATCH 37/47] 0.18.1

---
 package-lock.json | 4 ++--
 package.json      | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index fe9c5d7f..51c317cb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "vscode-leetcode",
-    "version": "0.18.0",
+    "version": "0.18.1",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "vscode-leetcode",
-            "version": "0.18.0",
+            "version": "0.18.1",
             "license": "MIT",
             "dependencies": {
                 "fs-extra": "^10.0.0",
diff --git a/package.json b/package.json
index 1bb764f3..db0d475a 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
     "name": "vscode-leetcode",
     "displayName": "LeetCode",
     "description": "Solve LeetCode problems in VS Code",
-    "version": "0.18.0",
+    "version": "0.18.1",
     "author": "Sheng Chen",
     "publisher": "LeetCode",
     "license": "MIT",

From 4f8c777eab170636fa0869dc8c7f4af7a4be8d2d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 9 May 2022 18:18:42 +0800
Subject: [PATCH 38/47] chore(deps): bump ansi-regex from 3.0.0 to 3.0.1 (#805)

Bumps [ansi-regex](https://github.com/chalk/ansi-regex) from 3.0.0 to 3.0.1.
- [Release notes](https://github.com/chalk/ansi-regex/releases)
- [Commits](https://github.com/chalk/ansi-regex/compare/v3.0.0...v3.0.1)

---
updated-dependencies:
- dependency-name: ansi-regex
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 package-lock.json | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 51c317cb..27452c04 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1224,9 +1224,9 @@
             }
         },
         "node_modules/ora/node_modules/ansi-regex": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-            "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
+            "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
             "engines": {
                 "node": ">=4"
             }
@@ -3103,9 +3103,9 @@
             },
             "dependencies": {
                 "ansi-regex": {
-                    "version": "3.0.0",
-                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-                    "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+                    "version": "3.0.1",
+                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
+                    "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw=="
                 },
                 "strip-ansi": {
                     "version": "4.0.0",

From a68f93551231f30ff5153d8588fbbe2db53410c7 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 9 May 2022 18:18:58 +0800
Subject: [PATCH 39/47] chore(deps): bump minimist from 1.2.5 to 1.2.6 (#788)

Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6)

---
updated-dependencies:
- dependency-name: minimist
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 package-lock.json | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 27452c04..72b2ae44 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1074,9 +1074,9 @@
             }
         },
         "node_modules/minimist": {
-            "version": "1.2.5",
-            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-            "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+            "version": "1.2.6",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+            "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
         },
         "node_modules/mkdirp": {
             "version": "1.0.4",
@@ -2984,9 +2984,9 @@
             }
         },
         "minimist": {
-            "version": "1.2.5",
-            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-            "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+            "version": "1.2.6",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+            "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
         },
         "mkdirp": {
             "version": "1.0.4",

From 2afb9065f3de4a6bb94b3955c2c44fcb4a30bd32 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 9 May 2022 18:19:15 +0800
Subject: [PATCH 40/47] chore(deps): bump i from 0.3.6 to 0.3.7 (#743)

Bumps [i](https://github.com/pksunkara/inflect) from 0.3.6 to 0.3.7.
- [Release notes](https://github.com/pksunkara/inflect/releases)
- [Commits](https://github.com/pksunkara/inflect/compare/v0.3.6...v0.3.7)

---
updated-dependencies:
- dependency-name: i
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 package-lock.json | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 72b2ae44..667367a3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -816,9 +816,9 @@
             }
         },
         "node_modules/i": {
-            "version": "0.3.6",
-            "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz",
-            "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=",
+            "version": "0.3.7",
+            "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz",
+            "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==",
             "engines": {
                 "node": ">=0.4"
             }
@@ -2770,9 +2770,9 @@
             }
         },
         "i": {
-            "version": "0.3.6",
-            "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz",
-            "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0="
+            "version": "0.3.7",
+            "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz",
+            "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q=="
         },
         "inflight": {
             "version": "1.0.6",

From d713ad5ff5b12977a2cce485d7688f99966fb628 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 9 May 2022 18:22:22 +0800
Subject: [PATCH 41/47] chore(deps): bump moment from 2.29.1 to 2.29.3 (#806)

Bumps [moment](https://github.com/moment/moment) from 2.29.1 to 2.29.3.
- [Release notes](https://github.com/moment/moment/releases)
- [Changelog](https://github.com/moment/moment/blob/2.29.3/CHANGELOG.md)
- [Commits](https://github.com/moment/moment/compare/2.29.1...2.29.3)

---
updated-dependencies:
- dependency-name: moment
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 package-lock.json | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 667367a3..76397db2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1090,9 +1090,9 @@
             }
         },
         "node_modules/moment": {
-            "version": "2.29.1",
-            "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
-            "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
+            "version": "2.29.3",
+            "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz",
+            "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==",
             "engines": {
                 "node": "*"
             }
@@ -2994,9 +2994,9 @@
             "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
         },
         "moment": {
-            "version": "2.29.1",
-            "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
-            "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
+            "version": "2.29.3",
+            "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz",
+            "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw=="
         },
         "mute-stream": {
             "version": "0.0.8",

From 71264faf1ed6de25e60a39efbf73239fd3434353 Mon Sep 17 00:00:00 2001
From: leo <467512138@qq.com>
Date: Wed, 15 May 2024 16:36:57 +0800
Subject: [PATCH 42/47] feat: change login way and add tracking logic option
 (#944)

fix: resolve UAT issues

fix: update action

feat: add login progress

fix: change function name

Co-authored-by: leo.zhao<zale0201@gmail.com>
---
 .vscode/settings.json                    |   7 +-
 README.md                                |  16 +-
 docs/README_zh-CN.md                     |  49 ++++---
 package-lock.json                        |  74 ++++++++++
 package.json                             |  26 ++--
 src/commands/list.ts                     |   6 +-
 src/commands/show.ts                     |  93 +++++++-----
 src/explorer/LeetCodeTreeDataProvider.ts |  41 ++++--
 src/extension.ts                         |  42 +++++-
 src/globalState.ts                       |  55 +++++++
 src/leetCodeManager.ts                   | 177 ++++++++++-------------
 src/request/query-user-data.ts           |  25 ++++
 src/shared.ts                            |  40 ++++-
 src/utils/httpUtils.ts                   |  28 ++++
 src/utils/toolUtils.ts                   |  26 ++++
 src/utils/trackingUtils.ts               | 130 +++++++++++++++++
 src/webview/leetCodePreviewProvider.ts   |  72 +++++----
 17 files changed, 670 insertions(+), 237 deletions(-)
 create mode 100644 src/globalState.ts
 create mode 100644 src/request/query-user-data.ts
 create mode 100644 src/utils/httpUtils.ts
 create mode 100644 src/utils/toolUtils.ts
 create mode 100644 src/utils/trackingUtils.ts

diff --git a/.vscode/settings.json b/.vscode/settings.json
index a2d0a8b1..b5f72312 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -10,5 +10,8 @@
         ".vscode-test": true
     },
     "tslint.autoFixOnSave": true,
-    "tslint.ignoreDefinitionFiles": true
-}
\ No newline at end of file
+    "tslint.ignoreDefinitionFiles": true,
+    "prettier.tabWidth": 4,
+    "prettier.useTabs": false,
+    "prettier.printWidth": 150
+}
diff --git a/README.md b/README.md
index cfe37701..623e95f2 100644
--- a/README.md
+++ b/README.md
@@ -23,6 +23,7 @@
 - English Document | [中文文档](https://github.com/LeetCode-OpenSource/vscode-leetcode/blob/master/docs/README_zh-CN.md)
 
 ## ❗️ Attention ❗️- Workaround to login to LeetCode endpoint
+
 > Note: If you are using `leetcode.cn`, you can just ignore this section.
 
 Recently we observed that [the extension cannot login to leetcode.com endpoint anymore](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/478). The root cause of this issue is that leetcode.com changed its login mechanism and so far there is no ideal way to fix that issue.
@@ -32,9 +33,10 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 > Note: If you want to use third-party login(**Recommended**), please make sure your account has been connected to the third-party. If you want to use `Cookie` login, click [here](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/478#issuecomment-564757098) to see the steps.
 
 ## Requirements
+
 - [VS Code 1.30.1+](https://code.visualstudio.com/)
 - [Node.js 10+](https://nodejs.org)
-    > NOTE: Please make sure that `Node` is in your `PATH` environment variable. You can also use the setting `leetcode.nodePath` to specify the location of your `Node.js` executable.
+  > NOTE: Please make sure that `Node` is in your `PATH` environment variable. You can also use the setting `leetcode.nodePath` to specify the location of your `Node.js` executable.
 
 ## Quick Start
 
@@ -43,6 +45,7 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 ## Features
 
 ### Sign In/Out
+
 <p align="center">
   <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/sign_in.png" alt="Sign in" />
 </p>
@@ -52,9 +55,11 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 - You can also use the following command to sign in/out:
   - **LeetCode: Sign in**
   - **LeetCode: Sign out**
+
 ---
 
 ### Switch Endpoint
+
 <p align="center">
   <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/endpoint.png" alt="Switch Endpoint" />
 </p>
@@ -62,6 +67,7 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 - By clicking the button ![btn_endpoint](https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/btn_endpoint.png) at the **explorer's navigation bar**, you can switch between different endpoints.
 
 - The supported endpoints are:
+
   - **leetcode.com**
   - **leetcode.cn**
 
@@ -70,6 +76,7 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 ---
 
 ### Pick a Problem
+
 <p align="center">
   <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/pick_problem.png" alt="Pick a Problem" />
 </p>
@@ -86,11 +93,13 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 ---
 
 ### Editor Shortcuts
+
 <p align="center">
   <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/shortcuts.png" alt="Editor Shortcuts" />
 </p>
 
 - The extension supports 5 editor shortcuts (aka Code Lens):
+
   - `Submit`: Submit your answer to LeetCode.
   - `Test`: Test your answer with customized test cases.
   - `Star/Unstar`: Star or unstar the current problem.
@@ -102,6 +111,7 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 ---
 
 ### Search problems by Keywords
+
 <p align="center">
   <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/search.png" alt="Search problems by Keywords" />
 </p>
@@ -111,19 +121,18 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 ---
 
 ### Manage Session
+
 <p align="center">
   <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/session.png" alt="Manage Session" />
 </p>
 
 - To manage your LeetCode sessions, just clicking the `LeetCode: ***` at the bottom of the status bar. You can **switch** between sessions or **create**, **delete** a session.
 
-
 ## Settings
 
 | Setting Name                      | Description                                                                                                                                                                                                                                                   | Default Value      |
 | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
 | `leetcode.hideSolved`             | Specify to hide the solved problems or not                                                                                                                                                                                                                    | `false`            |
-| `leetcode.showLocked`             | Specify to show the locked problems or not. Only Premium users could open the locked problems                                                                                                                                                                 | `false`            |
 | `leetcode.defaultLanguage`        | Specify the default language used to solve the problem. Supported languages are: `bash`, `c`, `cpp`, `csharp`, `golang`, `java`, `javascript`, `kotlin`, `mysql`, `php`, `python`,`python3`,`ruby`,`rust`, `scala`, `swift`, `typescript`                     | `N/A`              |
 | `leetcode.useWsl`                 | Specify whether to use WSL or not                                                                                                                                                                                                                             | `false`            |
 | `leetcode.endpoint`               | Specify the active endpoint. Supported endpoints are: `leetcode`, `leetcode-cn`                                                                                                                                                                               | `leetcode`         |
@@ -137,6 +146,7 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh
 | `leetcode.useEndpointTranslation` | Use endpoint's translation (if available)                                                                                                                                                                                                                     | `true`             |
 | `leetcode.colorizeProblems`       | Add difficulty badge and colorize problems files in explorer tree                                                                                                                                                                                             | `true`             |
 | `leetcode.problems.sortStrategy`  | Specify sorting strategy for problems list                                                                                                                                                                                                                    | `None`             |
+| `leetcode.allowReportData`        | Allow LeetCode to report anonymous usage data to improve the product. list                                                                                                                                                                                    | `true`             |
 
 ## Want Help?
 
diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md
index ad4c9a74..caf110bf 100644
--- a/docs/README_zh-CN.md
+++ b/docs/README_zh-CN.md
@@ -23,19 +23,20 @@
 - [English Document](https://github.com/LeetCode-OpenSource/vscode-leetcode#requirements) | 中文文档
 
 ## ❗️ 注意 ❗️- 无法登录 LeetCode 节点的临时解决办法
+
 > 注意:如果使用的是 `leetcode.cn` 账户,可以跳过此段落。
 
 近期我们发现插件出现了[无法登录 leetcode.com 节点的问题](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/478)。原因是因为近期 leetcode.com 改变了登录机制,目前我们暂时没有找到解决该问题的完美解决方案。
 
 感谢 [@yihong0618](https://github.com/yihong0618) 提供了一个临时解决办法。现在你可以直接点击登录按钮并选择第三方登录或者 `Cookie` 登录。
 
-
 > 注意:如果你希望使用第三方登录(**推荐**),请确保你的账户已经与第三方账户连接。如果你希望通过 `Cookie` 登录,请点击[该连接](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/478#issuecomment-564757098)查看登录步骤。
 
 ## 运行条件
+
 - [VS Code 1.23.0+](https://code.visualstudio.com/)
 - [Node.js 10+](https://nodejs.org)
-    > 注意:请确保`Node`在`PATH`环境变量中。您也可以通过设定 `leetcode.nodePath` 选项来指定 `Node.js` 可执行文件的路径。
+  > 注意:请确保`Node`在`PATH`环境变量中。您也可以通过设定 `leetcode.nodePath` 选项来指定 `Node.js` 可执行文件的路径。
 
 ## 快速开始
 
@@ -44,18 +45,21 @@
 ## 功能
 
 ### 登入登出
+
 <p align="center">
   <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/sign_in.png" alt="登入登出" />
 </p>
 
 - 点击 `LeetCode Explorer` 中的 `Sign in to LeetCode` 即可登入。
 
-- 你也可以使用下来命令登入或利用cookie登入或登出:
+- 你也可以使用下来命令登入或利用 cookie 登入或登出:
   - **LeetCode: Sign in**
   - **LeetCode: Sign out**
+
 ---
 
 ### 切换 LeetCode 版本
+
 <p align="center">
   <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/endpoint.png" alt="切换 LeetCode 版本" />
 </p>
@@ -63,6 +67,7 @@
 - LeetCode 目前有**英文版**和**中文版**两种版本。点击 `LeetCode Explorer` 导航栏中的 ![btn_endpoint](https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/btn_endpoint.png) 按钮可切换版本。
 
 - 目前可切换的版本有:
+
   - **leetcode.com**
   - **leetcode.cn**
 
@@ -71,6 +76,7 @@
 ---
 
 ### 选择题目
+
 <p align="center">
   <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/pick_problem.png" alt="选择题目" />
 </p>
@@ -87,11 +93,13 @@
 ---
 
 ### 编辑器快捷方式
+
 <p align="center">
   <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/shortcuts.png" alt="Editor Shortcuts" />
 </p>
 
 - 插件会在编辑区域内支持五种不同的快捷方式(Code Lens):
+
   - `Submit`: 提交你的答案至 LeetCode;
   - `Test`: 用给定的测试用例测试你的答案;
   - `Star`: 收藏或取消收藏该问题;
@@ -103,6 +111,7 @@
 ---
 
 ### 通过关键字搜索题目
+
 <p align="center">
   <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/search.png" alt="通过关键字搜索题目" />
 </p>
@@ -112,31 +121,33 @@
 ---
 
 ### 管理存档
+
 <p align="center">
   <img src="https://raw.githubusercontent.com/LeetCode-OpenSource/vscode-leetcode/master/docs/imgs/session.png" alt="管理存档" />
 </p>
 
 - 点击位于 VS Code 底部状态栏的 `LeetCode: ***` 管理 `LeetCode 存档`。你可以**切换**存档或者**创建**,**删除**存档。
 
-
 ## 插件配置项
-| 配置项名称                                                                         | 描述                                                                                                                                                                                                                                                                                            | 默认值             |
-| ---------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
-| `leetcode.hideSolved`                                                              | 指定是否要隐藏已解决的问题                                                                                                                                                                                                                                                                      | `false`            |
-| `leetcode.showLocked`                                                              | 指定是否显示付费题目,只有付费账户才可以打开付费题目                                                                                                                                                                                                                                            | `false`            |
-| `leetcode.defaultLanguage`                                                         | 指定答题时使用的默认语言,可选语言有:`bash`, `c`, `cpp`, `csharp`, `golang`, `java`, `javascript`, `kotlin`, `mysql`, `php`, `python`,`python3`,`ruby`, `rust`, `scala`, `swift`, `typescript`                                                                                                                | `N/A`              |
-| `leetcode.useWsl`                                                                  | 指定是否启用 WSL                                                                                                                                                                                                                                                                                | `false`            |
-| `leetcode.endpoint`                                                                | 指定使用的终端,可用终端有:`leetcode`, `leetcode-cn`                                                                                                                                                                                                                                           | `leetcode`         |
-| `leetcode.workspaceFolder`                                                         | 指定保存文件的工作区目录                                                                                                                                                                                                                                                                        | `""`               |
-| `leetcode.filePath`                                                                | 指定生成题目文件的相对文件夹路径名和文件名。点击查看[更多详细用法](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/%E8%87%AA%E5%AE%9A%E4%B9%89%E9%A2%98%E7%9B%AE%E6%96%87%E4%BB%B6%E7%9A%84%E7%9B%B8%E5%AF%B9%E6%96%87%E4%BB%B6%E5%A4%B9%E8%B7%AF%E5%BE%84%E5%92%8C%E6%96%87%E4%BB%B6%E5%90%8D)。 |                    |
-| `leetcode.enableStatusBar`                                                         | 指定是否在 VS Code 下方显示插件状态栏。                                                                                                                                                                                                                                                         | `true`             |
-| `leetcode.editor.shortcuts`                                                        | 指定在编辑器内所自定义的快捷方式。可用的快捷方式有: `submit`, `test`, `star`, `solution`, `description`。                                                                                                                                                                                               | `["submit, test"]` |
-| `leetcode.enableSideMode`                                                          | 指定在解决一道题时,是否将`问题预览`、`高票答案`与`提交结果`窗口集中在编辑器的第二栏。                                                                                                                                                                                                          | `true`             |
-| `leetcode.nodePath`                                                                | 指定 `Node.js` 可执行文件的路径。如:C:\Program Files\nodejs\node.exe                                                                                                                                                                                                                           | `node`             |
-| `leetcode.showCommentDescription`                                                  | 指定是否要在注释中显示题干。                                                                                                                                                                                                                                                                    | `false`            |
-| `leetcode.useEndpointTranslation`                                                       | 是否显示翻译版本内容。                                                                                                                                                                                                                                                                                                                                                                | `true`            |
+
+| 配置项名称                        | 描述                                                                                                                                                                                                                                                                                                          | 默认值             |
+| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
+| `leetcode.hideSolved`             | 指定是否要隐藏已解决的问题                                                                                                                                                                                                                                                                                    | `false`            |
+| `leetcode.defaultLanguage`        | 指定答题时使用的默认语言,可选语言有:`bash`, `c`, `cpp`, `csharp`, `golang`, `java`, `javascript`, `kotlin`, `mysql`, `php`, `python`,`python3`,`ruby`, `rust`, `scala`, `swift`, `typescript`                                                                                                               | `N/A`              |
+| `leetcode.useWsl`                 | 指定是否启用 WSL                                                                                                                                                                                                                                                                                              | `false`            |
+| `leetcode.endpoint`               | 指定使用的终端,可用终端有:`leetcode`, `leetcode-cn`                                                                                                                                                                                                                                                         | `leetcode`         |
+| `leetcode.workspaceFolder`        | 指定保存文件的工作区目录                                                                                                                                                                                                                                                                                      | `""`               |
+| `leetcode.filePath`               | 指定生成题目文件的相对文件夹路径名和文件名。点击查看[更多详细用法](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/%E8%87%AA%E5%AE%9A%E4%B9%89%E9%A2%98%E7%9B%AE%E6%96%87%E4%BB%B6%E7%9A%84%E7%9B%B8%E5%AF%B9%E6%96%87%E4%BB%B6%E5%A4%B9%E8%B7%AF%E5%BE%84%E5%92%8C%E6%96%87%E4%BB%B6%E5%90%8D)。 |                    |
+| `leetcode.enableStatusBar`        | 指定是否在 VS Code 下方显示插件状态栏。                                                                                                                                                                                                                                                                       | `true`             |
+| `leetcode.editor.shortcuts`       | 指定在编辑器内所自定义的快捷方式。可用的快捷方式有: `submit`, `test`, `star`, `solution`, `description`。                                                                                                                                                                                                     | `["submit, test"]` |
+| `leetcode.enableSideMode`         | 指定在解决一道题时,是否将`问题预览`、`高票答案`与`提交结果`窗口集中在编辑器的第二栏。                                                                                                                                                                                                                        | `true`             |
+| `leetcode.nodePath`               | 指定 `Node.js` 可执行文件的路径。如:C:\Program Files\nodejs\node.exe                                                                                                                                                                                                                                         | `node`             |
+| `leetcode.showCommentDescription` | 指定是否要在注释中显示题干。                                                                                                                                                                                                                                                                                  | `false`            |
+| `leetcode.useEndpointTranslation` | 是否显示翻译版本内容。                                                                                                                                                                                                                                                                                        | `true`             |
+| `leetcode.allowReportData`        | 为了更好的产品体验允许上报用户埋数据                                                                                                                                                                                                                                                                          | `true`             |
 
 ## 需要帮助?
+
 在遇到任何问题时,可以先查看一下[疑难解答](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/%E7%96%91%E9%9A%BE%E8%A7%A3%E7%AD%94)以及[常见问题](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98)寻求帮助。
 
 如果您的问题依然没有解决,可以在 [Gitter Channel](https://gitter.im/vscode-leetcode/Lobby) 联系我们,或者您也可以[记录一个新的 issue](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/new/choose)。
diff --git a/package-lock.json b/package-lock.json
index 76397db2..2ac17cf5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,6 +9,7 @@
             "version": "0.18.1",
             "license": "MIT",
             "dependencies": {
+                "axios": "^1.6.8",
                 "fs-extra": "^10.0.0",
                 "highlight.js": "^10.7.2",
                 "lodash": "^4.17.21",
@@ -220,6 +221,29 @@
             "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
             "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
         },
+        "node_modules/axios": {
+            "version": "1.6.8",
+            "resolved": "https://r.cnpmjs.org/axios/-/axios-1.6.8.tgz",
+            "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
+            "dependencies": {
+                "follow-redirects": "^1.15.6",
+                "form-data": "^4.0.0",
+                "proxy-from-env": "^1.1.0"
+            }
+        },
+        "node_modules/axios/node_modules/form-data": {
+            "version": "4.0.0",
+            "resolved": "https://r2.cnpmjs.org/form-data/-/form-data-4.0.0.tgz",
+            "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+            "dependencies": {
+                "asynckit": "^0.4.0",
+                "combined-stream": "^1.0.8",
+                "mime-types": "^2.1.12"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
         "node_modules/balanced-match": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -642,6 +666,19 @@
                 "node": ">=8"
             }
         },
+        "node_modules/follow-redirects": {
+            "version": "1.15.6",
+            "resolved": "https://r.cnpmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+            "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+            "engines": {
+                "node": ">=4.0"
+            },
+            "peerDependenciesMeta": {
+                "debug": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/forever-agent": {
             "version": "0.6.1",
             "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -1341,6 +1378,11 @@
                 "node": ">= 0.6.6"
             }
         },
+        "node_modules/proxy-from-env": {
+            "version": "1.1.0",
+            "resolved": "https://r2.cnpmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+            "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+        },
         "node_modules/psl": {
             "version": "1.8.0",
             "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
@@ -2294,6 +2336,28 @@
             "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
             "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
         },
+        "axios": {
+            "version": "1.6.8",
+            "resolved": "https://r.cnpmjs.org/axios/-/axios-1.6.8.tgz",
+            "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
+            "requires": {
+                "follow-redirects": "^1.15.6",
+                "form-data": "^4.0.0",
+                "proxy-from-env": "^1.1.0"
+            },
+            "dependencies": {
+                "form-data": {
+                    "version": "4.0.0",
+                    "resolved": "https://r2.cnpmjs.org/form-data/-/form-data-4.0.0.tgz",
+                    "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+                    "requires": {
+                        "asynckit": "^0.4.0",
+                        "combined-stream": "^1.0.8",
+                        "mime-types": "^2.1.12"
+                    }
+                }
+            }
+        },
         "balanced-match": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -2635,6 +2699,11 @@
                 "path-exists": "^4.0.0"
             }
         },
+        "follow-redirects": {
+            "version": "1.15.6",
+            "resolved": "https://r.cnpmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+            "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA=="
+        },
         "forever-agent": {
             "version": "0.6.1",
             "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -3189,6 +3258,11 @@
                 "winston": "2.1.x"
             }
         },
+        "proxy-from-env": {
+            "version": "1.1.0",
+            "resolved": "https://r2.cnpmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+            "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+        },
         "psl": {
             "version": "1.8.0",
             "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
diff --git a/package.json b/package.json
index db0d475a..702956c1 100644
--- a/package.json
+++ b/package.json
@@ -2,8 +2,8 @@
     "name": "vscode-leetcode",
     "displayName": "LeetCode",
     "description": "Solve LeetCode problems in VS Code",
-    "version": "0.18.1",
-    "author": "Sheng Chen",
+    "version": "0.18.2",
+    "author": "LeetCode",
     "publisher": "LeetCode",
     "license": "MIT",
     "icon": "resources/LeetCode.png",
@@ -182,15 +182,20 @@
                     "when": "view == leetCodeExplorer",
                     "group": "navigation@3"
                 },
+                {
+                    "command": "leetcode.signout",
+                    "when": "view == leetCodeExplorer",
+                    "group": "overflow@1"
+                },
                 {
                     "command": "leetcode.pickOne",
                     "when": "view == leetCodeExplorer",
-                    "group": "overflow@0"
+                    "group": "overflow@2"
                 },
                 {
                     "command": "leetcode.problems.sort",
                     "when": "view == leetCodeExplorer",
-                    "group": "overflow@1"
+                    "group": "overflow@3"
                 }
             ],
             "view/item/context": [
@@ -294,12 +299,6 @@
                         "scope": "application",
                         "description": "Hide solved problems."
                     },
-                    "leetcode.showLocked": {
-                        "type": "boolean",
-                        "default": false,
-                        "scope": "application",
-                        "description": "Show locked problems."
-                    },
                     "leetcode.defaultLanguage": {
                         "type": "string",
                         "enum": [
@@ -700,6 +699,12 @@
                             "Acceptance Rate (Descending)"
                         ],
                         "description": "Sorting strategy for problems list."
+                    },
+                    "leetcode.allowReportData": {
+                        "type": "boolean",
+                        "default": true,
+                        "scope": "application",
+                        "description": "Allow LeetCode to report anonymous usage data to improve the product."
                     }
                 }
             }
@@ -723,6 +728,7 @@
         "typescript": "^4.3.2"
     },
     "dependencies": {
+        "axios": "^1.6.8",
         "fs-extra": "^10.0.0",
         "highlight.js": "^10.7.2",
         "lodash": "^4.17.21",
diff --git a/src/commands/list.ts b/src/commands/list.ts
index 7e7b36a7..3ebe236a 100644
--- a/src/commands/list.ts
+++ b/src/commands/list.ts
@@ -1,7 +1,6 @@
 // Copyright (c) jdneo. All rights reserved.
 // Licensed under the MIT license.
 
-import * as vscode from "vscode";
 import { leetCodeExecutor } from "../leetCodeExecutor";
 import { leetCodeManager } from "../leetCodeManager";
 import { IProblem, ProblemState, UserStatus } from "../shared";
@@ -13,10 +12,9 @@ export async function listProblems(): Promise<IProblem[]> {
         if (leetCodeManager.getStatus() === UserStatus.SignedOut) {
             return [];
         }
-        const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode");
-        const showLocked: boolean = !!leetCodeConfig.get<boolean>("showLocked");
+
         const useEndpointTranslation: boolean = settingUtils.shouldUseEndpointTranslation();
-        const result: string = await leetCodeExecutor.listProblems(showLocked, useEndpointTranslation);
+        const result: string = await leetCodeExecutor.listProblems(true, useEndpointTranslation);
         const problems: IProblem[] = [];
         const lines: string[] = result.split("\n");
         const reg: RegExp = /^(.)\s(.{1,2})\s(.)\s\[\s*(\d*)\s*\]\s*(.*)\s*(Easy|Medium|Hard)\s*\((\s*\d+\.\d+ %)\)/;
diff --git a/src/commands/show.ts b/src/commands/show.ts
index 3aebce8f..eccf5571 100644
--- a/src/commands/show.ts
+++ b/src/commands/show.ts
@@ -10,19 +10,30 @@ import { LeetCodeNode } from "../explorer/LeetCodeNode";
 import { leetCodeChannel } from "../leetCodeChannel";
 import { leetCodeExecutor } from "../leetCodeExecutor";
 import { leetCodeManager } from "../leetCodeManager";
-import { IProblem, IQuickItemEx, languages, ProblemState } from "../shared";
+import { Endpoint, IProblem, IQuickItemEx, languages, PREMIUM_URL_CN, PREMIUM_URL_GLOBAL, ProblemState } from "../shared";
 import { genFileExt, genFileName, getNodeIdFromFile } from "../utils/problemUtils";
 import * as settingUtils from "../utils/settingUtils";
 import { IDescriptionConfiguration } from "../utils/settingUtils";
-import { DialogOptions, DialogType, openSettingsEditor, promptForOpenOutputChannel, promptForSignIn, promptHintMessage } from "../utils/uiUtils";
+import {
+    DialogOptions,
+    DialogType,
+    openSettingsEditor,
+    openUrl,
+    promptForOpenOutputChannel,
+    promptForSignIn,
+    promptHintMessage,
+} from "../utils/uiUtils";
 import { getActiveFilePath, selectWorkspaceFolder } from "../utils/workspaceUtils";
 import * as wsl from "../utils/wslUtils";
 import { leetCodePreviewProvider } from "../webview/leetCodePreviewProvider";
 import { leetCodeSolutionProvider } from "../webview/leetCodeSolutionProvider";
 import * as list from "./list";
+import { getLeetCodeEndpoint } from "./plugin";
+import { globalState } from "../globalState";
 
 export async function previewProblem(input: IProblem | vscode.Uri, isSideMode: boolean = false): Promise<void> {
     let node: IProblem;
+
     if (input instanceof vscode.Uri) {
         const activeFilePath: string = input.fsPath;
         const id: string = await getNodeIdFromFile(activeFilePath);
@@ -40,7 +51,14 @@ export async function previewProblem(input: IProblem | vscode.Uri, isSideMode: b
         isSideMode = true;
     } else {
         node = input;
+        const { isPremium } = globalState.getUserStatus() ?? {};
+        if (input.locked && !isPremium) {
+            const url = getLeetCodeEndpoint() === Endpoint.LeetCode ? PREMIUM_URL_GLOBAL : PREMIUM_URL_CN;
+            openUrl(url);
+            return;
+        }
     }
+
     const needTranslation: boolean = settingUtils.shouldUseEndpointTranslation();
     const descString: string = await leetCodeExecutor.getDescription(node.id, needTranslation);
     leetCodePreviewProvider.show(descString, node, isSideMode);
@@ -64,13 +82,10 @@ export async function searchProblem(): Promise<void> {
         promptForSignIn();
         return;
     }
-    const choice: IQuickItemEx<IProblem> | undefined = await vscode.window.showQuickPick(
-        parseProblemsToPicks(list.listProblems()),
-        {
-            matchOnDetail: true,
-            placeHolder: "Select one problem",
-        },
-    );
+    const choice: IQuickItemEx<IProblem> | undefined = await vscode.window.showQuickPick(parseProblemsToPicks(list.listProblems()), {
+        matchOnDetail: true,
+        placeHolder: "Select one problem",
+    });
     if (!choice) {
         return;
     }
@@ -79,11 +94,14 @@ export async function searchProblem(): Promise<void> {
 
 export async function showSolution(input: LeetCodeNode | vscode.Uri): Promise<void> {
     let problemInput: string | undefined;
-    if (input instanceof LeetCodeNode) { // Triggerred from explorer
+    if (input instanceof LeetCodeNode) {
+        // Triggerred from explorer
         problemInput = input.id;
-    } else if (input instanceof vscode.Uri) { // Triggerred from Code Lens/context menu
+    } else if (input instanceof vscode.Uri) {
+        // Triggerred from Code Lens/context menu
         problemInput = `"${input.fsPath}"`;
-    } else if (!input) { // Triggerred from command
+    } else if (!input) {
+        // Triggerred from command
         problemInput = await getActiveFilePath();
     }
 
@@ -112,7 +130,12 @@ async function fetchProblemLanguage(): Promise<string | undefined> {
     if (defaultLanguage && languages.indexOf(defaultLanguage) < 0) {
         defaultLanguage = undefined;
     }
-    const language: string | undefined = defaultLanguage || await vscode.window.showQuickPick(languages, { placeHolder: "Select the language you want to use", ignoreFocusOut: true });
+    const language: string | undefined =
+        defaultLanguage ||
+        (await vscode.window.showQuickPick(languages, {
+            placeHolder: "Select the language you want to use",
+            ignoreFocusOut: true,
+        }));
     // fire-and-forget default language query
     (async (): Promise<void> => {
         if (language && !defaultLanguage && leetCodeConfig.get<boolean>("hint.setDefaultLanguage")) {
@@ -120,7 +143,7 @@ async function fetchProblemLanguage(): Promise<string | undefined> {
                 `Would you like to set '${language}' as your default language?`,
                 DialogOptions.yes,
                 DialogOptions.no,
-                DialogOptions.never,
+                DialogOptions.never
             );
             if (choice === DialogOptions.yes) {
                 leetCodeConfig.update("defaultLanguage", language, true /* UserSetting */);
@@ -149,10 +172,7 @@ async function showProblemInternal(node: IProblem): Promise<void> {
             .get<string>(`filePath.${language}.folder`, leetCodeConfig.get<string>(`filePath.default.folder`, ""))
             .trim();
         const fileName: string = leetCodeConfig
-            .get<string>(
-                `filePath.${language}.filename`,
-                leetCodeConfig.get<string>(`filePath.default.filename`) || genFileName(node, language),
-            )
+            .get<string>(`filePath.${language}.filename`, leetCodeConfig.get<string>(`filePath.default.filename`) || genFileName(node, language))
             .trim();
 
         let finalPath: string = path.join(workspaceFolder, fileFolder, fileName);
@@ -172,12 +192,15 @@ async function showProblemInternal(node: IProblem): Promise<void> {
 
         await leetCodeExecutor.showProblem(node, language, finalPath, descriptionConfig.showInComment, needTranslation);
         const promises: any[] = [
-            vscode.window.showTextDocument(vscode.Uri.file(finalPath), { preview: false, viewColumn: vscode.ViewColumn.One }),
+            vscode.window.showTextDocument(vscode.Uri.file(finalPath), {
+                preview: false,
+                viewColumn: vscode.ViewColumn.One,
+            }),
             promptHintMessage(
                 "hint.commentDescription",
                 'You can config how to show the problem description through "leetcode.showDescription".',
                 "Open settings",
-                (): Promise<any> => openSettingsEditor("leetcode.showDescription"),
+                (): Promise<any> => openSettingsEditor("leetcode.showDescription")
             ),
         ];
         if (descriptionConfig.showInWebview) {
@@ -195,12 +218,17 @@ async function showDescriptionView(node: IProblem): Promise<void> {
 }
 async function parseProblemsToPicks(p: Promise<IProblem[]>): Promise<Array<IQuickItemEx<IProblem>>> {
     return new Promise(async (resolve: (res: Array<IQuickItemEx<IProblem>>) => void): Promise<void> => {
-        const picks: Array<IQuickItemEx<IProblem>> = (await p).map((problem: IProblem) => Object.assign({}, {
-            label: `${parseProblemDecorator(problem.state, problem.locked)}${problem.id}.${problem.name}`,
-            description: "",
-            detail: `AC rate: ${problem.passRate}, Difficulty: ${problem.difficulty}`,
-            value: problem,
-        }));
+        const picks: Array<IQuickItemEx<IProblem>> = (await p).map((problem: IProblem) =>
+            Object.assign(
+                {},
+                {
+                    label: `${parseProblemDecorator(problem.state, problem.locked)}${problem.id}.${problem.name}`,
+                    description: "",
+                    detail: `AC rate: ${problem.passRate}, Difficulty: ${problem.difficulty}`,
+                    value: problem,
+                }
+            )
+        );
         resolve(picks);
     });
 }
@@ -266,14 +294,11 @@ async function resolveTagForProblem(problem: IProblem): Promise<string | undefin
     if (problem.tags.length === 1) {
         return problem.tags[0];
     }
-    return await vscode.window.showQuickPick(
-        problem.tags,
-        {
-            matchOnDetail: true,
-            placeHolder: "Multiple tags available, please select one",
-            ignoreFocusOut: true,
-        },
-    );
+    return await vscode.window.showQuickPick(problem.tags, {
+        matchOnDetail: true,
+        placeHolder: "Multiple tags available, please select one",
+        ignoreFocusOut: true,
+    });
 }
 
 async function resolveCompanyForProblem(problem: IProblem): Promise<string | undefined> {
diff --git a/src/explorer/LeetCodeTreeDataProvider.ts b/src/explorer/LeetCodeTreeDataProvider.ts
index 4764934a..9c298944 100644
--- a/src/explorer/LeetCodeTreeDataProvider.ts
+++ b/src/explorer/LeetCodeTreeDataProvider.ts
@@ -8,12 +8,14 @@ import { leetCodeManager } from "../leetCodeManager";
 import { Category, defaultProblem, ProblemState } from "../shared";
 import { explorerNodeManager } from "./explorerNodeManager";
 import { LeetCodeNode } from "./LeetCodeNode";
+import { globalState } from "../globalState";
 
 export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider<LeetCodeNode> {
-
     private context: vscode.ExtensionContext;
 
-    private onDidChangeTreeDataEvent: vscode.EventEmitter<LeetCodeNode | undefined | null> = new vscode.EventEmitter<LeetCodeNode | undefined | null>();
+    private onDidChangeTreeDataEvent: vscode.EventEmitter<LeetCodeNode | undefined | null> = new vscode.EventEmitter<
+        LeetCodeNode | undefined | null
+    >();
     // tslint:disable-next-line:member-ordering
     public readonly onDidChangeTreeData: vscode.Event<any> = this.onDidChangeTreeDataEvent.event;
 
@@ -46,7 +48,7 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider<LeetCod
         }
 
         return {
-            label: element.isProblem ? `[${element.id}] ${element.name}` : element.name,
+            label: element.isProblem ? `[${element.id}] ${element.name}` + this.parsePremiumUnLockIconPath(element) : element.name,
             tooltip: this.getSubCategoryTooltip(element),
             collapsibleState: element.isProblem ? vscode.TreeItemCollapsibleState.None : vscode.TreeItemCollapsibleState.Collapsed,
             iconPath: this.parseIconPathFromProblemState(element),
@@ -59,16 +61,20 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider<LeetCod
     public getChildren(element?: LeetCodeNode | undefined): vscode.ProviderResult<LeetCodeNode[]> {
         if (!leetCodeManager.getUser()) {
             return [
-                new LeetCodeNode(Object.assign({}, defaultProblem, {
-                    id: "notSignIn",
-                    name: "Sign in to LeetCode",
-                }), false),
+                new LeetCodeNode(
+                    Object.assign({}, defaultProblem, {
+                        id: "notSignIn",
+                        name: "Sign in to LeetCode",
+                    }),
+                    false
+                ),
             ];
         }
-        if (!element) { // Root view
+        if (!element) {
+            // Root view
             return explorerNodeManager.getRootNodes();
         } else {
-            switch (element.id) { // First-level
+            switch (element.id) {
                 case Category.All:
                     return explorerNodeManager.getAllNodes();
                 case Category.Favorite:
@@ -92,13 +98,14 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider<LeetCod
         if (!element.isProblem) {
             return "";
         }
+        const { isPremium } = globalState.getUserStatus() ?? {};
         switch (element.state) {
             case ProblemState.AC:
                 return this.context.asAbsolutePath(path.join("resources", "check.png"));
             case ProblemState.NotAC:
                 return this.context.asAbsolutePath(path.join("resources", "x.png"));
             case ProblemState.Unknown:
-                if (element.locked) {
+                if (element.locked && !isPremium) {
                     return this.context.asAbsolutePath(path.join("resources", "lock.png"));
                 }
                 return this.context.asAbsolutePath(path.join("resources", "blank.png"));
@@ -107,6 +114,14 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider<LeetCod
         }
     }
 
+    private parsePremiumUnLockIconPath(element: LeetCodeNode): string {
+        const { isPremium } = globalState.getUserStatus() ?? {};
+        if (isPremium && element.locked) {
+            return "  🔓";
+        }
+        return "";
+    }
+
     private getSubCategoryTooltip(element: LeetCodeNode): string {
         // return '' unless it is a sub-category node
         if (element.isProblem || element.id === "ROOT" || element.id in Category) {
@@ -130,11 +145,7 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider<LeetCod
             }
         }
 
-        return [
-            `AC: ${acceptedNum}`,
-            `Failed: ${failedNum}`,
-            `Total: ${childernNodes.length}`,
-        ].join(os.EOL);
+        return [`AC: ${acceptedNum}`, `Failed: ${failedNum}`, `Total: ${childernNodes.length}`].join(os.EOL);
     }
 }
 
diff --git a/src/extension.ts b/src/extension.ts
index dfd91683..439673f8 100644
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -24,10 +24,12 @@ import { leetCodePreviewProvider } from "./webview/leetCodePreviewProvider";
 import { leetCodeSolutionProvider } from "./webview/leetCodeSolutionProvider";
 import { leetCodeSubmissionProvider } from "./webview/leetCodeSubmissionProvider";
 import { markdownEngine } from "./webview/markdownEngine";
+import TrackData from "./utils/trackingUtils";
+import { globalState } from "./globalState";
 
 export async function activate(context: vscode.ExtensionContext): Promise<void> {
     try {
-        if (!await leetCodeExecutor.meetRequirements(context)) {
+        if (!(await leetCodeExecutor.meetRequirements(context))) {
             throw new Error("The environment doesn't meet requirements.");
         }
 
@@ -37,6 +39,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
         });
 
         leetCodeTreeDataProvider.initialize(context);
+        globalState.initialize(context);
 
         context.subscriptions.push(
             leetCodeStatusBarController,
@@ -55,22 +58,51 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
             vscode.commands.registerCommand("leetcode.signin", () => leetCodeManager.signIn()),
             vscode.commands.registerCommand("leetcode.signout", () => leetCodeManager.signOut()),
             vscode.commands.registerCommand("leetcode.manageSessions", () => session.manageSessions()),
-            vscode.commands.registerCommand("leetcode.previewProblem", (node: LeetCodeNode) => show.previewProblem(node)),
+            vscode.commands.registerCommand("leetcode.previewProblem", (node: LeetCodeNode) => {
+                TrackData.report({
+                    event_key: `vscode_open_problem`,
+                    type: "click",
+                    extra: JSON.stringify({
+                        problem_id: node.id,
+                        problem_name: node.name,
+                    }),
+                });
+                show.previewProblem(node);
+            }),
             vscode.commands.registerCommand("leetcode.showProblem", (node: LeetCodeNode) => show.showProblem(node)),
             vscode.commands.registerCommand("leetcode.pickOne", () => show.pickOne()),
             vscode.commands.registerCommand("leetcode.searchProblem", () => show.searchProblem()),
             vscode.commands.registerCommand("leetcode.showSolution", (input: LeetCodeNode | vscode.Uri) => show.showSolution(input)),
             vscode.commands.registerCommand("leetcode.refreshExplorer", () => leetCodeTreeDataProvider.refresh()),
-            vscode.commands.registerCommand("leetcode.testSolution", (uri?: vscode.Uri) => test.testSolution(uri)),
-            vscode.commands.registerCommand("leetcode.submitSolution", (uri?: vscode.Uri) => submit.submitSolution(uri)),
+            vscode.commands.registerCommand("leetcode.testSolution", (uri?: vscode.Uri) => {
+                TrackData.report({
+                    event_key: `vscode_runCode`,
+                    type: "click",
+                    extra: JSON.stringify({
+                        path: uri?.path,
+                    }),
+                });
+                return test.testSolution(uri);
+            }),
+            vscode.commands.registerCommand("leetcode.submitSolution", (uri?: vscode.Uri) => {
+                TrackData.report({
+                    event_key: `vscode_submit`,
+                    type: "click",
+                    extra: JSON.stringify({
+                        path: uri?.path,
+                    }),
+                });
+                return submit.submitSolution(uri);
+            }),
             vscode.commands.registerCommand("leetcode.switchDefaultLanguage", () => switchDefaultLanguage()),
             vscode.commands.registerCommand("leetcode.addFavorite", (node: LeetCodeNode) => star.addFavorite(node)),
             vscode.commands.registerCommand("leetcode.removeFavorite", (node: LeetCodeNode) => star.removeFavorite(node)),
-            vscode.commands.registerCommand("leetcode.problems.sort", () => plugin.switchSortingStrategy()),
+            vscode.commands.registerCommand("leetcode.problems.sort", () => plugin.switchSortingStrategy())
         );
 
         await leetCodeExecutor.switchEndpoint(plugin.getLeetCodeEndpoint());
         await leetCodeManager.getLoginStatus();
+        vscode.window.registerUriHandler({ handleUri: leetCodeManager.handleUriSignIn });
     } catch (error) {
         leetCodeChannel.appendLine(error.toString());
         promptForOpenOutputChannel("Extension initialization failed. Please open output channel for details.", DialogType.error);
diff --git a/src/globalState.ts b/src/globalState.ts
new file mode 100644
index 00000000..49d38421
--- /dev/null
+++ b/src/globalState.ts
@@ -0,0 +1,55 @@
+// Copyright (c) leo.zhao. All rights reserved.
+// Licensed under the MIT license.
+
+import * as vscode from "vscode";
+
+const CookieKey = "leetcode-cookie";
+const UserStatusKey = "leetcode-user-status";
+
+export type UserDataType = {
+    isSignedIn: boolean;
+    isPremium: boolean;
+    username: string;
+    avatar: string;
+    isVerified?: boolean;
+};
+
+class GlobalState {
+    private context: vscode.ExtensionContext;
+    private _state: vscode.Memento;
+    private _cookie: string;
+    private _userStatus: UserDataType;
+
+    public initialize(context: vscode.ExtensionContext): void {
+        this.context = context;
+        this._state = this.context.globalState;
+    }
+
+    public setCookie(cookie: string): any {
+        this._cookie = cookie;
+        return this._state.update(CookieKey, this._cookie);
+    }
+    public getCookie(): string | undefined {
+        return this._cookie ?? this._state.get(CookieKey);
+    }
+
+    public setUserStatus(userStatus: UserDataType): any {
+        this._userStatus = userStatus;
+        return this._state.update(UserStatusKey, this._userStatus);
+    }
+
+    public getUserStatus(): UserDataType | undefined {
+        return this._userStatus ?? this._state.get(UserStatusKey);
+    }
+
+    public removeCookie(): void {
+        this._state.update(CookieKey, undefined);
+    }
+
+    public removeAll(): void {
+        this._state.update(CookieKey, undefined);
+        this._state.update(UserStatusKey, undefined);
+    }
+}
+
+export const globalState: GlobalState = new GlobalState();
diff --git a/src/leetCodeManager.ts b/src/leetCodeManager.ts
index 089390d3..1b2d4af2 100644
--- a/src/leetCodeManager.ts
+++ b/src/leetCodeManager.ts
@@ -6,10 +6,14 @@ import { EventEmitter } from "events";
 import * as vscode from "vscode";
 import { leetCodeChannel } from "./leetCodeChannel";
 import { leetCodeExecutor } from "./leetCodeExecutor";
-import { IQuickItemEx, loginArgsMapping, UserStatus } from "./shared";
+import { Endpoint, loginArgsMapping, urls, urlsCn, UserStatus } from "./shared";
 import { createEnvOption } from "./utils/cpUtils";
-import { DialogType, promptForOpenOutputChannel } from "./utils/uiUtils";
+import { DialogType, openUrl, promptForOpenOutputChannel } from "./utils/uiUtils";
 import * as wsl from "./utils/wslUtils";
+import { getLeetCodeEndpoint } from "./commands/plugin";
+import { globalState } from "./globalState";
+import { queryUserData } from "./request/query-user-data";
+import { parseQuery, sleep } from "./utils/toolUtils";
 
 class LeetCodeManager extends EventEmitter {
     private currentUser: string | undefined;
@@ -21,6 +25,7 @@ class LeetCodeManager extends EventEmitter {
         super();
         this.currentUser = undefined;
         this.userStatus = UserStatus.SignedOut;
+        this.handleUriSignIn = this.handleUriSignIn.bind(this);
     }
 
     public async getLoginStatus(): Promise<void> {
@@ -31,118 +36,40 @@ class LeetCodeManager extends EventEmitter {
         } catch (error) {
             this.currentUser = undefined;
             this.userStatus = UserStatus.SignedOut;
+            globalState.removeAll();
         } finally {
             this.emit("statusChanged");
         }
     }
 
-    public async signIn(): Promise<void> {
-        const picks: Array<IQuickItemEx<string>> = [];
-        picks.push(
-            {
-                label: "LeetCode Account",
-                detail: "Use LeetCode account to login (US endpoint is not supported)",
-                value: "LeetCode",
-            },
-            {
-                label: "Third-Party: GitHub",
-                detail: "Use GitHub account to login",
-                value: "GitHub",
-            },
-            {
-                label: "Third-Party: LinkedIn",
-                detail: "Use LinkedIn account to login",
-                value: "LinkedIn",
-            },
-            {
-                label: "LeetCode Cookie",
-                detail: "Use LeetCode cookie copied from browser to login",
-                value: "Cookie",
-            },
-        );
-        const choice: IQuickItemEx<string> | undefined = await vscode.window.showQuickPick(picks);
-        if (!choice) {
-            return;
-        }
-        const loginMethod: string = choice.value;
-        const commandArg: string | undefined = loginArgsMapping.get(loginMethod);
-        if (!commandArg) {
-            throw new Error(`The login method "${loginMethod}" is not supported.`);
-        }
-        const isByCookie: boolean = loginMethod === "Cookie";
-        const inMessage: string = isByCookie ? "sign in by cookie" : "sign in";
+    public async handleUriSignIn(uri: vscode.Uri): Promise<void> {
         try {
-            const userName: string | undefined = await new Promise(async (resolve: (res: string | undefined) => void, reject: (e: Error) => void): Promise<void> => {
-
-                const leetCodeBinaryPath: string = await leetCodeExecutor.getLeetCodeBinaryPath();
-
-                const childProc: cp.ChildProcess = wsl.useWsl()
-                    ? cp.spawn("wsl", [leetCodeExecutor.node, leetCodeBinaryPath, "user", commandArg], { shell: true })
-                    : cp.spawn(leetCodeExecutor.node, [leetCodeBinaryPath, "user", commandArg], {
-                        shell: true,
-                        env: createEnvOption(),
-                    });
-
-                childProc.stdout?.on("data", async (data: string | Buffer) => {
-                    data = data.toString();
-                    leetCodeChannel.append(data);
-                    if (data.includes("twoFactorCode")) {
-                        const twoFactor: string | undefined = await vscode.window.showInputBox({
-                            prompt: "Enter two-factor code.",
-                            ignoreFocusOut: true,
-                            validateInput: (s: string): string | undefined => s && s.trim() ? undefined : "The input must not be empty",
-                        });
-                        if (!twoFactor) {
-                            childProc.kill();
-                            return resolve(undefined);
-                        }
-                        childProc.stdin?.write(`${twoFactor}\n`);
-                    }
-                    const successMatch: RegExpMatchArray | null = data.match(this.successRegex);
-                    if (successMatch && successMatch[1]) {
-                        childProc.stdin?.end();
-                        return resolve(successMatch[1]);
-                    } else if (data.match(this.failRegex)) {
-                        childProc.stdin?.end();
-                        return reject(new Error("Faile to login"));
-                    }
-                });
-
-                childProc.stderr?.on("data", (data: string | Buffer) => leetCodeChannel.append(data.toString()));
-
-                childProc.on("error", reject);
-                const name: string | undefined = await vscode.window.showInputBox({
-                    prompt: "Enter username or E-mail.",
-                    ignoreFocusOut: true,
-                    validateInput: (s: string): string | undefined => s && s.trim() ? undefined : "The input must not be empty",
-                });
-                if (!name) {
-                    childProc.kill();
-                    return resolve(undefined);
+            await vscode.window.withProgress({ location: vscode.ProgressLocation.Notification }, async (progress: vscode.Progress<{}>) => {
+                progress.report({ message: "Fetching user data..." });
+                const queryParams = parseQuery(uri.query);
+                const cookie = queryParams["cookie"];
+                if (!cookie) {
+                    promptForOpenOutputChannel(`Failed to get cookie. Please log in again`, DialogType.error);
+                    return;
                 }
-                childProc.stdin?.write(`${name}\n`);
-                const pwd: string | undefined = await vscode.window.showInputBox({
-                    prompt: isByCookie ? "Enter cookie" : "Enter password.",
-                    password: true,
-                    ignoreFocusOut: true,
-                    validateInput: (s: string): string | undefined => s ? undefined : isByCookie ? "Cookie must not be empty" : "Password must not be empty",
-                });
-                if (!pwd) {
-                    childProc.kill();
-                    return resolve(undefined);
+                globalState.setCookie(cookie);
+                const data = await queryUserData();
+                globalState.setUserStatus(data);
+                await this.setCookieToCli(cookie, data.username);
+                if (data.username) {
+                    vscode.window.showInformationMessage(`Successfully ${data.username}.`);
+                    this.currentUser = data.username;
+                    this.userStatus = UserStatus.SignedIn;
+                    this.emit("statusChanged");
                 }
-                childProc.stdin?.write(`${pwd}\n`);
             });
-            if (userName) {
-                vscode.window.showInformationMessage(`Successfully ${inMessage}.`);
-                this.currentUser = userName;
-                this.userStatus = UserStatus.SignedIn;
-                this.emit("statusChanged");
-            }
         } catch (error) {
-            promptForOpenOutputChannel(`Failed to ${inMessage}. Please open the output channel for details`, DialogType.error);
+            promptForOpenOutputChannel(`Failed to log in. Please open the output channel for details`, DialogType.error);
         }
+    }
 
+    public async signIn(): Promise<void> {
+        openUrl(this.getAuthLoginUrl());
     }
 
     public async signOut(): Promise<void> {
@@ -151,6 +78,7 @@ class LeetCodeManager extends EventEmitter {
             vscode.window.showInformationMessage("Successfully signed out.");
             this.currentUser = undefined;
             this.userStatus = UserStatus.SignedOut;
+            globalState.removeAll();
             this.emit("statusChanged");
         } catch (error) {
             // swallow the error when sign out.
@@ -174,6 +102,51 @@ class LeetCodeManager extends EventEmitter {
 
         return "Unknown";
     }
+
+    public getAuthLoginUrl(): string {
+        switch (getLeetCodeEndpoint()) {
+            case Endpoint.LeetCodeCN:
+                return urlsCn.authLoginUrl;
+            case Endpoint.LeetCode:
+            default:
+                return urls.authLoginUrl;
+        }
+    }
+
+    public setCookieToCli(cookie: string, name: string): Promise<void> {
+        return new Promise(async (resolve: (res: void) => void, reject: (e: Error) => void) => {
+            const leetCodeBinaryPath: string = await leetCodeExecutor.getLeetCodeBinaryPath();
+
+            const childProc: cp.ChildProcess = wsl.useWsl()
+                ? cp.spawn("wsl", [leetCodeExecutor.node, leetCodeBinaryPath, "user", loginArgsMapping.get("Cookie") ?? ""], {
+                      shell: true,
+                  })
+                : cp.spawn(leetCodeExecutor.node, [leetCodeBinaryPath, "user", loginArgsMapping.get("Cookie") ?? ""], {
+                      shell: true,
+                      env: createEnvOption(),
+                  });
+
+            childProc.stdout?.on("data", async (data: string | Buffer) => {
+                data = data.toString();
+                leetCodeChannel.append(data);
+                const successMatch: RegExpMatchArray | null = data.match(this.successRegex);
+                if (successMatch && successMatch[1]) {
+                    childProc.stdin?.end();
+                    return resolve();
+                } else if (data.match(this.failRegex)) {
+                    childProc.stdin?.end();
+                    return reject(new Error("Faile to login"));
+                }
+            });
+
+            childProc.stderr?.on("data", (data: string | Buffer) => leetCodeChannel.append(data.toString()));
+
+            childProc.on("error", reject);
+            childProc.stdin?.write(`${name}\n`);
+            await sleep(800);
+            childProc.stdin?.write(`${cookie}\n`);
+        });
+    }
 }
 
 export const leetCodeManager: LeetCodeManager = new LeetCodeManager();
diff --git a/src/request/query-user-data.ts b/src/request/query-user-data.ts
new file mode 100644
index 00000000..ffcca1e1
--- /dev/null
+++ b/src/request/query-user-data.ts
@@ -0,0 +1,25 @@
+import { UserDataType } from "../globalState";
+import { getUrl } from "../shared";
+import { LcAxios } from "../utils/httpUtils";
+
+const graphqlStr = `
+    query globalData {
+        userStatus {
+            isPremium
+            isVerified
+            username
+            avatar
+            isSignedIn
+        }
+    }
+`;
+
+export const queryUserData = async (): Promise<UserDataType> => {
+    return LcAxios(getUrl("userGraphql"), {
+        method: "POST",
+        data: {
+            query: graphqlStr,
+            variables: {},
+        },
+    }).then((res) => res.data.data.userStatus);
+};
diff --git a/src/shared.ts b/src/shared.ts
index 84b529cc..8c6a825a 100644
--- a/src/shared.ts
+++ b/src/shared.ts
@@ -63,6 +63,7 @@ export enum ProblemState {
     AC = 1,
     NotAC = 2,
     Unknown = 3,
+    Locked = 4,
 }
 
 export enum Endpoint {
@@ -102,11 +103,7 @@ export enum Category {
     Favorite = "Favorite",
 }
 
-export const supportedPlugins: string[] = [
-    "company",
-    "solution.discuss",
-    "leetcode.cn",
-];
+export const supportedPlugins: string[] = ["company", "solution.discuss", "leetcode.cn"];
 
 export enum DescriptionConfiguration {
     InWebView = "In Webview",
@@ -124,3 +121,36 @@ export enum SortingStrategy {
     FrequencyAsc = "Frequency (Ascending)",
     FrequencyDesc = "Frequency (Descending)",
 }
+
+export const PREMIUM_URL_CN = "https://leetcode.cn/premium-payment/?source=vscode";
+export const PREMIUM_URL_GLOBAL = "https://leetcode.com/subscribe/?ref=lp_pl&source=vscode";
+
+export const urls = {
+    // base urls
+    base: "https://leetcode.com",
+    graphql: "https://leetcode.com/graphql",
+    userGraphql: "https://leetcode.com/graphql",
+    login: "https://leetcode.com/accounts/login/",
+    authLoginUrl: "https://leetcode.com/authorize-login/vscode/?path=leetcode.vscode-leetcode",
+};
+
+export const urlsCn = {
+    // base urls
+    base: "https://leetcode.cn",
+    graphql: "https://leetcode.cn/graphql",
+    userGraphql: "https://leetcode.cn/graphql/noj-go/",
+    login: "https://leetcode.cn/accounts/login/",
+    authLoginUrl: "https://leetcode.cn/authorize-login/vscode/?path=leetcode.vscode-leetcode",
+};
+
+export const getUrl = (key: string) => {
+    const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode");
+    const point = leetCodeConfig.get<string>("endpoint", Endpoint.LeetCode);
+    switch (point) {
+        case Endpoint.LeetCodeCN:
+            return urlsCn[key];
+        case Endpoint.LeetCode:
+        default:
+            return urls[key];
+    }
+};
diff --git a/src/utils/httpUtils.ts b/src/utils/httpUtils.ts
new file mode 100644
index 00000000..aa6e205d
--- /dev/null
+++ b/src/utils/httpUtils.ts
@@ -0,0 +1,28 @@
+import axios, { AxiosRequestConfig, AxiosPromise } from "axios";
+import { omit } from "lodash";
+import { globalState } from "../globalState";
+import { DialogType, promptForOpenOutputChannel } from "./uiUtils";
+
+const referer = "vscode-lc-extension";
+
+export function LcAxios<T = any>(path: string, settings?: AxiosRequestConfig): AxiosPromise<T> {
+    const cookie = globalState.getCookie();
+    if (!cookie) {
+        promptForOpenOutputChannel(
+            `Failed to obtain the cookie. Please log in again.`,
+            DialogType.error
+        );
+        return Promise.reject("Failed to obtain the cookie.");
+    }
+    return axios(path, {
+        headers: {
+            referer: referer,
+            "content-type": "application/json",
+            cookie,
+            ...(settings && settings.headers),
+        },
+        xsrfCookieName: "csrftoken",
+        xsrfHeaderName: "X-CSRFToken",
+        ...(settings && omit(settings, "headers")),
+    });
+}
diff --git a/src/utils/toolUtils.ts b/src/utils/toolUtils.ts
new file mode 100644
index 00000000..6437226d
--- /dev/null
+++ b/src/utils/toolUtils.ts
@@ -0,0 +1,26 @@
+export function sleep(ms) {
+    return new Promise((resolve) => setTimeout(resolve, ms));
+}
+
+export function parseQuery(query: string): { [key: string]: string } {
+    const queryObject: { [key: string]: string } = {};
+
+    if (!query) {
+        return queryObject;
+    }
+
+    let keyValuePairs = query.split("&");
+    keyValuePairs.forEach((pair) => {
+        const firstEqualsIndex = pair.indexOf("=");
+        if (firstEqualsIndex !== -1) {
+            const key = pair.substring(0, firstEqualsIndex);
+            const value = pair.substring(firstEqualsIndex + 1);
+            queryObject[decodeURIComponent(key)] = decodeURIComponent(value);
+        } else {
+            // If no equals sign is found, treat the whole string as key with empty value
+            queryObject[decodeURIComponent(pair)] = "";
+        }
+    });
+
+    return queryObject;
+}
diff --git a/src/utils/trackingUtils.ts b/src/utils/trackingUtils.ts
new file mode 100644
index 00000000..4333bfae
--- /dev/null
+++ b/src/utils/trackingUtils.ts
@@ -0,0 +1,130 @@
+import * as vscode from "vscode";
+import axios from "axios";
+import { getLeetCodeEndpoint } from "../commands/plugin";
+import { Endpoint } from "../shared";
+import { leetCodeManager } from "../leetCodeManager";
+
+const getTimeZone = (): string => {
+    const endPoint: string = getLeetCodeEndpoint();
+    if (endPoint === Endpoint.LeetCodeCN) {
+        return "Asia/Shanghai";
+    } else {
+        return "UTC";
+    }
+};
+
+interface IReportData {
+    event_key: string;
+    type?: "click" | "expose" | string;
+    anonymous_id?: string;
+    tid?: number;
+    ename?: string; // event name
+    href?: string;
+    referer?: string;
+    extra?: string;
+    target?: string;
+}
+
+interface ITrackData {
+    reportCache: IReportData[];
+    isSubmit: boolean;
+    report: (reportItems: IReportData | IReportData[]) => void;
+    submitReport: (useSendBeason: boolean) => Promise<void>;
+    reportUrl: string;
+}
+
+const testReportUrl = "https://analysis.lingkou.xyz/i/event";
+const prodReportUrl = "https://analysis.leetcode.cn/i/event";
+
+function getReportUrl() {
+    if (process.env.NODE_ENV === "production") {
+        return prodReportUrl;
+    } else {
+        return testReportUrl;
+    }
+}
+
+const _charStr = "abacdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+=";
+
+function RandomIndex(min: number, max: number, i: number) {
+    let index = Math.floor(Math.random() * (max - min + 1) + min);
+    const numStart = _charStr.length - 10;
+    if (i === 0 && index >= numStart) {
+        index = RandomIndex(min, max, i);
+    }
+    return index;
+}
+
+function getRandomString(len: number) {
+    const min = 0;
+    const max = _charStr.length - 1;
+    let _str = "";
+    len = len || 15;
+    for (let i = 0, index; i < len; i++) {
+        index = RandomIndex(min, max, i);
+        _str += _charStr[index];
+    }
+    return _str;
+}
+
+function getAllowReportDataConfig() {
+    const leetCodeConfig = vscode.workspace.getConfiguration("leetcode");
+    const allowReportData = !!leetCodeConfig.get<boolean>("allowReportData");
+    return allowReportData;
+}
+
+class TrackData implements ITrackData {
+    public reportCache: IReportData[] = [];
+
+    public isSubmit: boolean = false;
+
+    public reportUrl: string = getReportUrl();
+
+    private sendTimer: NodeJS.Timeout | undefined;
+
+    public report = (reportItems: IReportData | IReportData[]) => {
+        if (!getAllowReportDataConfig()) return;
+
+        this.sendTimer && clearTimeout(this.sendTimer);
+
+        if (!Array.isArray(reportItems)) {
+            reportItems = [reportItems];
+        }
+        let randomId = getRandomString(60);
+        reportItems.forEach((item) => {
+            this.reportCache.push({
+                ...item,
+                referer: "vscode",
+                target: leetCodeManager.getUser() ?? "",
+                anonymous_id: item.anonymous_id ?? (randomId as string),
+            });
+        });
+        this.sendTimer = setTimeout(this.submitReport, 800);
+    };
+
+    public submitReport = async () => {
+        if (!getAllowReportDataConfig()) return;
+        const dataList = JSON.stringify(this.reportCache);
+
+        if (!this.reportCache.length || this.isSubmit) {
+            return;
+        }
+        this.reportCache = [];
+        try {
+            this.isSubmit = true;
+            axios.defaults.withCredentials = true;
+            await axios.post(this.reportUrl, `dataList=${encodeURIComponent(dataList)}`, {
+                headers: {
+                    "Content-Type": "application/x-www-form-urlencoded",
+                    "x-timezone": getTimeZone(),
+                },
+            });
+        } catch (e) {
+            this.reportCache = this.reportCache.concat(JSON.parse(dataList));
+        } finally {
+            this.isSubmit = false;
+        }
+    };
+}
+
+export default new TrackData();
diff --git a/src/webview/leetCodePreviewProvider.ts b/src/webview/leetCodePreviewProvider.ts
index 78b40991..86060de5 100644
--- a/src/webview/leetCodePreviewProvider.ts
+++ b/src/webview/leetCodePreviewProvider.ts
@@ -8,7 +8,6 @@ import { ILeetCodeWebviewOption, LeetCodeWebview } from "./LeetCodeWebview";
 import { markdownEngine } from "./markdownEngine";
 
 class LeetCodePreviewProvider extends LeetCodeWebview {
-
     protected readonly viewType: string = "leetcode.preview";
     private node: IProblem;
     private description: IDescription;
@@ -23,11 +22,6 @@ class LeetCodePreviewProvider extends LeetCodeWebview {
         this.node = node;
         this.sideMode = isSideMode;
         this.showWebviewInternal();
-        // Comment out this operation since it sometimes may cause the webview become empty.
-        // Waiting for the progress of the VS Code side issue: https://github.com/microsoft/vscode/issues/3742
-        // if (this.sideMode) {
-        //     this.hideSideBar(); // For better view area
-        // }
     }
 
     protected getWebviewOption(): ILeetCodeWebviewOption {
@@ -46,7 +40,7 @@ class LeetCodePreviewProvider extends LeetCodeWebview {
     }
 
     protected getWebviewContent(): string {
-        const button: { element: string, script: string, style: string } = {
+        const button: { element: string; script: string; style: string } = {
             element: `<button id="solve">Code Now</button>`,
             script: `const button = document.getElementById('solve');
                     button.onclick = () => vscode.postMessage({
@@ -73,32 +67,26 @@ class LeetCodePreviewProvider extends LeetCodeWebview {
         };
         const { title, url, category, difficulty, likes, dislikes, body } = this.description;
         const head: string = markdownEngine.render(`# [${title}](${url})`);
-        const info: string = markdownEngine.render([
-            `| Category | Difficulty | Likes | Dislikes |`,
-            `| :------: | :--------: | :---: | :------: |`,
-            `| ${category} | ${difficulty} | ${likes} | ${dislikes} |`,
-        ].join("\n"));
+        const info: string = markdownEngine.render(
+            [
+                `| Category | Difficulty | Likes | Dislikes |`,
+                `| :------: | :--------: | :---: | :------: |`,
+                `| ${category} | ${difficulty} | ${likes} | ${dislikes} |`,
+            ].join("\n")
+        );
         const tags: string = [
             `<details>`,
             `<summary><strong>Tags</strong></summary>`,
-            markdownEngine.render(
-                this.description.tags
-                    .map((t: string) => `[\`${t}\`](https://leetcode.com/tag/${t})`)
-                    .join(" | "),
-            ),
+            markdownEngine.render(this.description.tags.map((t: string) => `[\`${t}\`](${this.getTagLink(t)})`).join(" | ")),
             `</details>`,
         ].join("\n");
         const companies: string = [
             `<details>`,
             `<summary><strong>Companies</strong></summary>`,
-            markdownEngine.render(
-                this.description.companies
-                    .map((c: string) => `\`${c}\``)
-                    .join(" | "),
-            ),
+            markdownEngine.render(this.description.companies.map((c: string) => `\`${c}\``).join(" | ")),
             `</details>`,
         ].join("\n");
-        const links: string = markdownEngine.render(`[Discussion](${this.getDiscussionLink(url)}) | [Solution](${this.getSolutionLink(url)})`);
+        const links: string = markdownEngine.render(`[Submissions](${this.getSubmissionsLink(url)}) | [Solution](${this.getSolutionsLink(url)})`);
         return `
             <!DOCTYPE html>
             <html>
@@ -149,18 +137,23 @@ class LeetCodePreviewProvider extends LeetCodeWebview {
 
     private parseDescription(descString: string, problem: IProblem): IDescription {
         const [
-            /* title */, ,
-            url, ,
-            /* tags */, ,
-            /* langs */, ,
-            category,
+            ,
+            ,
+            /* title */ url,
+            ,
+            ,
+            ,
+            ,
+            ,
+            /* tags */ /* langs */ category,
             difficulty,
             likes,
             dislikes,
-            /* accepted */,
-            /* submissions */,
-            /* testcase */, ,
-            ...body
+            ,
+            ,
+            ,
+            ,
+            /* accepted */ /* submissions */ /* testcase */ ...body
         ] = descString.split("\n");
         return {
             title: problem.name,
@@ -175,19 +168,22 @@ class LeetCodePreviewProvider extends LeetCodeWebview {
         };
     }
 
-    private getDiscussionLink(url: string): string {
+    private getTagLink(tag: string): string {
         const endPoint: string = getLeetCodeEndpoint();
         if (endPoint === Endpoint.LeetCodeCN) {
-            return url.replace("/description/", "/comments/");
+            return `https://leetcode.cn/tag/${tag}?source=vscode`;
         } else if (endPoint === Endpoint.LeetCode) {
-            return url.replace("/description/", "/discuss/?currentPage=1&orderBy=most_votes&query=");
+            return `https://leetcode.com/tag/${tag}?source=vscode`;
         }
 
-        return "https://leetcode.com";
+        return "https://leetcode.com?source=vscode";
     }
 
-    private getSolutionLink(url: string): string {
-        return url.replace("/description/", "/solution/");
+    private getSolutionsLink(url: string): string {
+        return url.replace("/description/", "/solutions/") + "?source=vscode";
+    }
+    private getSubmissionsLink(url: string): string {
+        return url.replace("/description/", "/submissions/") + "?source=vscode";
     }
 }
 

From b495812689351b5bdd043187ed143968510d799a Mon Sep 17 00:00:00 2001
From: tomoyachen <42526054+tomoyachen@users.noreply.github.com>
Date: Fri, 26 Jul 2024 15:43:28 +0800
Subject: [PATCH 43/47] fix: fix login issue in VS Code Insiders (#966) (#968)

ogin issue on VS Code Insiders #968
---
 src/shared.ts | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/shared.ts b/src/shared.ts
index 8c6a825a..2301f7f6 100644
--- a/src/shared.ts
+++ b/src/shared.ts
@@ -125,13 +125,15 @@ export enum SortingStrategy {
 export const PREMIUM_URL_CN = "https://leetcode.cn/premium-payment/?source=vscode";
 export const PREMIUM_URL_GLOBAL = "https://leetcode.com/subscribe/?ref=lp_pl&source=vscode";
 
+const protocol = vscode.env.appName.includes('Insiders') ? "vscode-insiders" : "vscode"
+
 export const urls = {
     // base urls
     base: "https://leetcode.com",
     graphql: "https://leetcode.com/graphql",
     userGraphql: "https://leetcode.com/graphql",
     login: "https://leetcode.com/accounts/login/",
-    authLoginUrl: "https://leetcode.com/authorize-login/vscode/?path=leetcode.vscode-leetcode",
+    authLoginUrl: `https://leetcode.com/authorize-login/${protocol}/?path=leetcode.vscode-leetcode`,
 };
 
 export const urlsCn = {
@@ -140,7 +142,7 @@ export const urlsCn = {
     graphql: "https://leetcode.cn/graphql",
     userGraphql: "https://leetcode.cn/graphql/noj-go/",
     login: "https://leetcode.cn/accounts/login/",
-    authLoginUrl: "https://leetcode.cn/authorize-login/vscode/?path=leetcode.vscode-leetcode",
+    authLoginUrl: `https://leetcode.cn/authorize-login/${protocol}/?path=leetcode.vscode-leetcode`,
 };
 
 export const getUrl = (key: string) => {

From bbc041da250ccd2032d36318de2e71bc76e60ca6 Mon Sep 17 00:00:00 2001
From: tomoyachen <42526054+tomoyachen@users.noreply.github.com>
Date: Tue, 30 Jul 2024 14:15:10 +0800
Subject: [PATCH 44/47] feat: re-add cookie-based login method (#969)

* feat: re-add cookie-based login method

* chore: optimize tslint config

* chore : change build.yml

---------

Co-authored-by: leo.zhao <zale0201@gmail.com>
---
 .github/workflows/build.yml | 21 ----------
 .vscode/settings.json       |  2 +-
 src/leetCodeManager.ts      | 83 ++++++++++++++++++++++++++++++-------
 src/utils/httpUtils.ts      |  2 +-
 src/utils/toolUtils.ts      |  2 +-
 src/utils/trackingUtils.ts  |  2 +-
 tslint.json                 | 44 ++++++++------------
 7 files changed, 89 insertions(+), 67 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 2bdeaa49..dd9a1c24 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -48,24 +48,3 @@ jobs:
 
       - name: VSCE Packge
         run: npx vsce package
-
-  darwin:
-    name: macOS
-    runs-on: macos-latest
-    timeout-minutes: 30
-    steps:
-      - uses: actions/checkout@v2
-
-      - name: Setup Node.js environment
-        uses: actions/setup-node@v2
-        with:
-          node-version: 14
-
-      - name: Install Node.js modules
-        run: npm install
-
-      - name: Lint
-        run: npm run lint
-
-      - name: VSCE Packge
-        run: npx vsce package
diff --git a/.vscode/settings.json b/.vscode/settings.json
index b5f72312..5e5ca483 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,5 +1,5 @@
 {
-    "editor.formatOnSave": true,
+    "editor.formatOnSave": false,
     "editor.insertSpaces": true,
     "editor.tabSize": 4,
     "files.insertFinalNewline": true,
diff --git a/src/leetCodeManager.ts b/src/leetCodeManager.ts
index 1b2d4af2..16ec3782 100644
--- a/src/leetCodeManager.ts
+++ b/src/leetCodeManager.ts
@@ -6,14 +6,14 @@ import { EventEmitter } from "events";
 import * as vscode from "vscode";
 import { leetCodeChannel } from "./leetCodeChannel";
 import { leetCodeExecutor } from "./leetCodeExecutor";
-import { Endpoint, loginArgsMapping, urls, urlsCn, UserStatus } from "./shared";
+import { Endpoint, IQuickItemEx, loginArgsMapping, urls, urlsCn, UserStatus } from "./shared";
 import { createEnvOption } from "./utils/cpUtils";
 import { DialogType, openUrl, promptForOpenOutputChannel } from "./utils/uiUtils";
 import * as wsl from "./utils/wslUtils";
 import { getLeetCodeEndpoint } from "./commands/plugin";
 import { globalState } from "./globalState";
 import { queryUserData } from "./request/query-user-data";
-import { parseQuery, sleep } from "./utils/toolUtils";
+import { parseQuery } from "./utils/toolUtils";
 
 class LeetCodeManager extends EventEmitter {
     private currentUser: string | undefined;
@@ -42,6 +42,19 @@ class LeetCodeManager extends EventEmitter {
         }
     }
 
+    private async updateUserStatusWithCookie(cookie: string): Promise<void> {
+        globalState.setCookie(cookie);
+        const data = await queryUserData();
+        globalState.setUserStatus(data);
+        await this.setCookieToCli(cookie, data.username);
+        if (data.username) {
+            vscode.window.showInformationMessage(`Successfully ${data.username}.`);
+            this.currentUser = data.username;
+            this.userStatus = UserStatus.SignedIn;
+            this.emit("statusChanged");
+        }
+    }
+
     public async handleUriSignIn(uri: vscode.Uri): Promise<void> {
         try {
             await vscode.window.withProgress({ location: vscode.ProgressLocation.Notification }, async (progress: vscode.Progress<{}>) => {
@@ -52,24 +65,61 @@ class LeetCodeManager extends EventEmitter {
                     promptForOpenOutputChannel(`Failed to get cookie. Please log in again`, DialogType.error);
                     return;
                 }
-                globalState.setCookie(cookie);
-                const data = await queryUserData();
-                globalState.setUserStatus(data);
-                await this.setCookieToCli(cookie, data.username);
-                if (data.username) {
-                    vscode.window.showInformationMessage(`Successfully ${data.username}.`);
-                    this.currentUser = data.username;
-                    this.userStatus = UserStatus.SignedIn;
-                    this.emit("statusChanged");
-                }
+
+                await this.updateUserStatusWithCookie(cookie)
+
             });
         } catch (error) {
             promptForOpenOutputChannel(`Failed to log in. Please open the output channel for details`, DialogType.error);
         }
     }
 
+    public async handleInputCookieSignIn(): Promise<void> {
+        const cookie: string | undefined = await vscode.window.showInputBox({
+            prompt: 'Enter LeetCode Cookie',
+            password: true,
+            ignoreFocusOut: true,
+            validateInput: (s: string): string | undefined =>
+                s ? undefined : 'Cookie must not be empty',
+        })
+
+        await this.updateUserStatusWithCookie(cookie || '')
+    }
+
     public async signIn(): Promise<void> {
-        openUrl(this.getAuthLoginUrl());
+        const picks: Array<IQuickItemEx<string>> = []
+        picks.push(
+            {
+                label: 'Web Authorization',
+                detail: 'Open browser to authorize login on the website',
+                value: 'WebAuth',
+                description: '[Recommended]'
+            },
+            {
+                label: 'LeetCode Cookie',
+                detail: 'Use LeetCode cookie copied from browser to login',
+                value: 'Cookie',
+            }
+        )
+
+        const choice: IQuickItemEx<string> | undefined = await vscode.window.showQuickPick(picks)
+        if (!choice) {
+            return
+        }
+        const loginMethod: string = choice.value
+
+        if (loginMethod === 'WebAuth') {
+            openUrl(this.getAuthLoginUrl())
+            return
+        }
+
+        try {
+            await vscode.window.withProgress({ location: vscode.ProgressLocation.Notification, title: "Fetching user data..." }, async () => {
+                await this.handleInputCookieSignIn()
+            });
+        } catch (error) {
+            promptForOpenOutputChannel(`Failed to log in. Please open the output channel for details`, DialogType.error);
+        }
     }
 
     public async signOut(): Promise<void> {
@@ -136,15 +186,16 @@ class LeetCodeManager extends EventEmitter {
                 } else if (data.match(this.failRegex)) {
                     childProc.stdin?.end();
                     return reject(new Error("Faile to login"));
+                } else if (data.match(/login: /)) {
+                    childProc.stdin?.write(`${name}\n`);
+                } else if (data.match(/cookie: /)) {
+                    childProc.stdin?.write(`${cookie}\n`);
                 }
             });
 
             childProc.stderr?.on("data", (data: string | Buffer) => leetCodeChannel.append(data.toString()));
 
             childProc.on("error", reject);
-            childProc.stdin?.write(`${name}\n`);
-            await sleep(800);
-            childProc.stdin?.write(`${cookie}\n`);
         });
     }
 }
diff --git a/src/utils/httpUtils.ts b/src/utils/httpUtils.ts
index aa6e205d..b7771734 100644
--- a/src/utils/httpUtils.ts
+++ b/src/utils/httpUtils.ts
@@ -16,7 +16,7 @@ export function LcAxios<T = any>(path: string, settings?: AxiosRequestConfig): A
     }
     return axios(path, {
         headers: {
-            referer: referer,
+            referer,
             "content-type": "application/json",
             cookie,
             ...(settings && settings.headers),
diff --git a/src/utils/toolUtils.ts b/src/utils/toolUtils.ts
index 6437226d..ce37e185 100644
--- a/src/utils/toolUtils.ts
+++ b/src/utils/toolUtils.ts
@@ -9,7 +9,7 @@ export function parseQuery(query: string): { [key: string]: string } {
         return queryObject;
     }
 
-    let keyValuePairs = query.split("&");
+    const keyValuePairs = query.split("&");
     keyValuePairs.forEach((pair) => {
         const firstEqualsIndex = pair.indexOf("=");
         if (firstEqualsIndex !== -1) {
diff --git a/src/utils/trackingUtils.ts b/src/utils/trackingUtils.ts
index 4333bfae..56b1a6fb 100644
--- a/src/utils/trackingUtils.ts
+++ b/src/utils/trackingUtils.ts
@@ -90,7 +90,7 @@ class TrackData implements ITrackData {
         if (!Array.isArray(reportItems)) {
             reportItems = [reportItems];
         }
-        let randomId = getRandomString(60);
+        const randomId = getRandomString(60);
         reportItems.forEach((item) => {
             this.reportCache.push({
                 ...item,
diff --git a/tslint.json b/tslint.json
index 34776be7..a686a2c7 100644
--- a/tslint.json
+++ b/tslint.json
@@ -1,36 +1,28 @@
 {
     "defaultSeverity": "error",
-    "extends": [
-        "tslint:recommended"
-    ],
+    "extends": ["tslint:recommended"],
     "jsRules": {},
     "rules": {
-        "forin": false,
         "object-literal-sort-keys": false,
-        "indent": [
-            true,
-            "spaces"
-        ],
+        "ordered-imports": [false],
+        "indent": [true, "spaces"],
         "no-string-literal": false,
         "no-namespace": false,
-        "max-line-length": [
-            false,
-            120
-        ],
-        "typedef": [
-            true,
-            "call-signature",
-            "arrow-call-signature",
-            "parameter",
-            "arrow-parameter",
-            "property-declaration",
-            "variable-declaration",
-            "member-variable-declaration"
-        ],
-        "variable-name": [
-            true,
-            "allow-leading-underscore"
-        ]
+        "max-line-length": [false, 120],
+        "typedef": false,
+        "no-implicit-dependencies": [true, ["vscode"]],
+        "trailing-comma": false,
+        "no-any": false,
+        "object-literal-key-quotes": [true, "consistent-as-needed"],
+        "prefer-object-spread": false,
+        "no-unnecessary-await": false,
+        "semicolon": [false],
+        "quotemark": [false],
+        "member-ordering": [false],
+        "variable-name": [false],
+        "curly": false,
+        "interface-over-type-literal": [false],
+        "no-unused-expression": false
     },
     "rulesDirectory": []
 }

From 67101c96dc41feee1700bee854642037734511b1 Mon Sep 17 00:00:00 2001
From: "leo.zhao" <zale0201@gmail.com>
Date: Tue, 30 Jul 2024 14:34:46 +0800
Subject: [PATCH 45/47] chore(package.json): add build and publish for vscode
 in scripts config

---
 package.json | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 702956c1..b270a2d3 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
     "name": "vscode-leetcode",
     "displayName": "LeetCode",
     "description": "Solve LeetCode problems in VS Code",
-    "version": "0.18.2",
+    "version": "0.18.3",
     "author": "LeetCode",
     "publisher": "LeetCode",
     "license": "MIT",
@@ -714,7 +714,9 @@
         "vscode:prepublish": "npm run compile",
         "compile": "tsc -p ./",
         "watch": "tsc -watch -p ./",
-        "lint": "tslint --project tsconfig.json -e src/*.d.ts -t verbose"
+        "lint": "tslint --project tsconfig.json -e src/*.d.ts -t verbose",
+        "build": "vsce package",
+        "vs-publish": "vsce publish"
     },
     "devDependencies": {
         "@types/fs-extra": "^9.0.11",

From 6f4292544185b0406673bf2669747aa72dcdc49a Mon Sep 17 00:00:00 2001
From: "leo.zhao" <zale0201@gmail.com>
Date: Tue, 30 Jul 2024 15:18:15 +0800
Subject: [PATCH 46/47] chore: add change log

---
 CHANGELOG.md | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0de174fc..a7d482aa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,18 @@ All notable changes to the "leetcode" extension will be documented in this file.
 
 Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
 
+## [0.18.3]
+### Added
+- re-add cookie-based login method  [PR#969](https://github.com/LeetCode-OpenSource/vscode-leetcode/pull/969)
+
+## [0.18.2]
+### Fixed
+- fix login issue on VS Code Insiders  [PR#968](https://github.com/LeetCode-OpenSource/vscode-leetcode/pull/968)
+
+## [0.18.1]
+### Changed
+- change login way and add tracking logic option [PR#944](https://github.com/LeetCode-OpenSource/vscode-leetcode/pull/944)
+
 ## [0.18.0]
 ### Added
 - Add `star` command in shortcuts [PR#601](https://github.com/LeetCode-OpenSource/vscode-leetcode/pull/601)

From 586b3e45fe0af299775436f2e8ea2a6ed5cdb8c6 Mon Sep 17 00:00:00 2001
From: "leo.zhao" <zale0201@gmail.com>
Date: Fri, 13 Sep 2024 14:47:56 +0800
Subject: [PATCH 47/47] fix: change graphql api path

---
 CHANGELOG.md  | 4 ++++
 package.json  | 2 +-
 src/shared.ts | 2 +-
 3 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index a7d482aa..b9d7d46e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,10 @@ All notable changes to the "leetcode" extension will be documented in this file.
 
 Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
 
+## [0.18.4]
+### Added
+- change graphql path
+
 ## [0.18.3]
 ### Added
 - re-add cookie-based login method  [PR#969](https://github.com/LeetCode-OpenSource/vscode-leetcode/pull/969)
diff --git a/package.json b/package.json
index b270a2d3..53552b74 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
     "name": "vscode-leetcode",
     "displayName": "LeetCode",
     "description": "Solve LeetCode problems in VS Code",
-    "version": "0.18.3",
+    "version": "0.18.4",
     "author": "LeetCode",
     "publisher": "LeetCode",
     "license": "MIT",
diff --git a/src/shared.ts b/src/shared.ts
index 2301f7f6..e8b59d89 100644
--- a/src/shared.ts
+++ b/src/shared.ts
@@ -140,7 +140,7 @@ export const urlsCn = {
     // base urls
     base: "https://leetcode.cn",
     graphql: "https://leetcode.cn/graphql",
-    userGraphql: "https://leetcode.cn/graphql/noj-go/",
+    userGraphql: "https://leetcode.cn/graphql/",
     login: "https://leetcode.cn/accounts/login/",
     authLoginUrl: `https://leetcode.cn/authorize-login/${protocol}/?path=leetcode.vscode-leetcode`,
 };