diff --git a/.gitignore b/.gitignore index bab3f9cc93..1e203969ad 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,4 @@ packages/ Thumbs.db /Samples/All/net7-mvc/Senparc.Weixin.Sample.Net7/App_Data/NeuChar /Samples/All/net7-mvc/Senparc.Weixin.Sample.Net7/App_Data/WeChat_OfficialAccount/ +node_modules diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js new file mode 100644 index 0000000000..e3fd1f04cd --- /dev/null +++ b/docs/.vuepress/config.js @@ -0,0 +1,313 @@ +module.exports = { + base: "/docs/", + head: [ + ["link", { rel: "shortcut icon", type: "image/x-icon", href: "/icon.jpg" }], + ["script", {}, ``], + ], + locales: { + "/": { + lang: "en-US", + title: "Wechat.NET SDK", + description: + "With Senparc.Weixin, you can easily and quickly develop applications for all platforms of wechat (including wechat public number, mini program, mini game, enterprise number, open platform, wechat Pay, JS-SDK, wechat hardware/Bluetooth, etc.). The Demo of this project is also suitable for beginners to learn.NET programming.", + }, + "/zh/": { + lang: "zh-CN", + title: "微信 .NET SDK文档", + description: + "使用 Senparc.Weixin,您可以方便快速地开发微信全平台的应用(包括微信公众号、小程序、小游戏、企业号、开放平台、微信支付、JS-SDK、微信硬件/蓝牙,等等)。本项目的 Demo 同样适合初学者进行 .NET 编程学习。", + }, + }, + // evergreen: true, + port: 8080, + plugins: ["@vuepress/back-to-top"], + themeConfig: { + repo: "JeffreySu/WeiXinMPSDK", + // 自定义仓库链接文字。默认从 `themeConfig.repo` 中自动推断为 + // "GitHub"/"GitLab"/"Bitbucket" 其中之一,或是 "Source"。 + // repoLabel: '查看源码', + + // 以下为可选的编辑链接选项 + + // 假如你的文档仓库和项目本身不在一个仓库: + // docsRepo: 'vuejs/vuepress', + // 假如文档不是放在仓库的根目录下: + docsDir: "docs", + // 假如文档放在一个特定的分支下: + docsBranch: "master", + // 默认是 false, 设置为 true 来启用 + editLinks: true, + // 默认为 "Edit this page" + // editLinkText: '帮助我们改善此页面!', + locales: { + "/": { + label: "English", + repoLabel: "Github", + selectText: "Languages", + ariaLabel: "Select language", + editLinkText: "Edit this page on GitHub", + lastUpdated: "Last Updated", + nav: [ + { text: "Guide", link: "/guide/" }, + { + text: "Ecosystem", + items: [ + { + text: "Project", + items: [ + { text: "Dynamic WebApi", link: "/dynamic-webapi/index" }, + ], + }, + { + text: "Help", + items: [ + { + text: "Online Resources", + link: "https://sdk.weixin.senparc.com/", + }, + { text: "FAQ", link: "https://weixin.senparc.com/QA" }, + { + text: "QQ Group(342319110)", + link: "http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=U6bvyUB9eRZDX3I4Cd1jwx2ig_sMiQxJ&authKey=qZ5NScUhiwa%2B2nvBWQk%2BKQJbZbjxCF8U6F7DFCTox1DEWnif3ZzK5jUhGuBoHieV&noverify=0&group_code=342319110", + }, + { text: "NeuCharFramework", link: "https://www.ncf.pub/" }, + ], + }, + ], + }, + { text: "Gitee", link: "https://gitee.com/JeffreySu/WeiXinMPSDK" }, + ], + sidebar: { + "/guide/": [ + { + title: "Guide", + collapsable: false, + children: ["", "lab"], + }, + { + title: "MP", + collapsable: false, + children: [ + "mp/source_code", + "mp/install", + "mp/registration", + "mp/MessageHandler", + "mp/AdvancedInterface", + "mp/JSSDK", + "mp/OAuth2.0", + "mp/MenuSetup", + "mp/Advanced", + ], + }, + { + title: "WXOpen", + collapsable: false, + children: [ + "wxopen/Source_code", + "wxopen/install", + "wxopen/Registration", + "wxopen/MessageHandler", + "wxopen/Advanced_Interface", + "wxopen/Client_Development", + "wxopen/Applet_Request_Service", + "wxopen/Sign_in", + "wxopen/Get_phone_number", + "wxopen/Other", + "wxopen/Advanced", + ], + }, + { + title: "Work", + collapsable: false, + children: [ + "work/Source_code", + "work/install", + "work/Registration", + "work/MessageHandler", + "work/Advanced_Interface", + "work/JSSDK_General", + "work/JSSDK_agentConfig", + "work/OAuth2.0", + "work/MenuSetting", + "work/Advanced", + ], + }, + { + title: "TenpayV3", + collapsable: false, + children: [ + "tenpayv3/Source_code", + "tenpayv3/install", + "tenpayv3/Registration", + "tenpayv3/JASPI", + "tenpayv3/Payment_callbacks", + "tenpayv3/Native_Payments", + "tenpayv3/Refunds", + "tenpayv3/Advanced", + ], + }, + { + title: "TenpayV2", + collapsable: false, + children: [ + "tenpayv2/Source_code", + "tenpayv2/install", + "tenpayv2/Registration", + "tenpayv2/JASPI_Payment", + "tenpayv2/Payment_callbacks", + "tenpayv2/Native_Payment", + "tenpayv2/Refunds", + "tenpayv2/Advanced", + ], + }, + { + title: "Newly Release", + collapsable: false, + children: ["/guide/release/new_function", "/guide/release/log"], + }, + ], + "/dynamic-webapi/": [ + { + title: "Dynamic WebApi", + collapsable: false, + }, + ], + }, + }, + "/zh/": { + label: "简体中文", + repoLabel: "查看源码", + selectText: "选择语言", + ariaLabel: "选择语言", + editLinkText: "在 GitHub 上编辑此页", + lastUpdated: "上次更新", + nav: [ + { text: "指南", link: "/zh/guide/" }, + { + text: "生态系统", + items: [ + { + text: "项目", + items: [ + { text: "动态WebApi", link: "/zh/dynamic-webapi/index" }, + ], + }, + { + text: "帮助", + items: [ + { text: "在线资源", link: "https://sdk.weixin.senparc.com/" }, + { text: "问答社区", link: "https://weixin.senparc.com/QA" }, + { + text: "QQ群(342319110)", + link: "http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=U6bvyUB9eRZDX3I4Cd1jwx2ig_sMiQxJ&authKey=qZ5NScUhiwa%2B2nvBWQk%2BKQJbZbjxCF8U6F7DFCTox1DEWnif3ZzK5jUhGuBoHieV&noverify=0&group_code=342319110", + }, + { text: "NeuCharFramework", link: "https://www.ncf.pub/" }, + ], + }, + ], + }, + { text: "Gitee", link: "https://gitee.com/JeffreySu/WeiXinMPSDK" }, + ], + sidebar: { + "/zh/guide/": [ + { + title: "概要", + collapsable: false, + children: ["", "库和组件"], + }, + { + title: "公众号", + collapsable: false, + children: [ + "MP/源码", + "MP/如何安装", + "MP/注册", + "MP/MessageHandler", + "MP/高级接口", + "MP/JSSDK", + "MP/OAuth2.0", + "MP/菜单设置", + "MP/进阶", + ], + }, + { + title: "小程序", + collapsable: false, + children: [ + "WxOpen/源码", + "WxOpen/如何安装", + "WxOpen/注册", + "WxOpen/MessageHandler", + "WxOpen/高级接口", + "WxOpen/客户端开发", + "WxOpen/小程序服务请求", + "WxOpen/登录", + "WxOpen/获取手机号", + "WxOpen/其他", + "WxOpen/进阶", + ], + }, + { + title: "企业微信", + collapsable: false, + children: [ + "Work/源码", + "Work/如何安装", + "Work/注册", + "Work/MessageHandler", + "Work/高级接口", + "Work/JSSDK常规", + "Work/JSSDK_agentConfig", + "Work/OAuth2.0", + "Work/菜单设置", + "Work/进阶", + ], + }, + { + title: "微信支付V3", + collapsable: false, + children: [ + "TenPayV3/源码", + "TenPayV3/如何安装", + "TenPayV3/注册", + "TenPayV3/JASPI", + "TenPayV3/支付回调", + "TenPayV3/Native支付", + "TenPayV3/退款", + "TenPayV3/进阶", + ], + }, + { + title: "微信支付V2", + collapsable: false, + children: [ + "TenPayV2/源码", + "TenPayV2/如何安装", + "TenPayV2/注册", + "TenPayV2/JASPI", + "TenPayV2/支付回调", + "TenPayV2/Native支付", + "TenPayV2/退款", + "TenPayV2/进阶", + ], + }, + { + title: "新发布", + collapsable: false, + children: [ + "/zh/guide/release/new_function", + "/zh/guide/release/log", + ], + }, + ], + "/zh/dynamic-webapi/": [ + { + title: "动态WebApi", + collapsable: false, + }, + ], + }, + }, + }, + }, +}; diff --git a/docs/.vuepress/public/icon.jpg b/docs/.vuepress/public/icon.jpg new file mode 100644 index 0000000000..4d11faa86d Binary files /dev/null and b/docs/.vuepress/public/icon.jpg differ diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000000..8a7d57c260 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,19 @@ +--- +home: true +heroImage: /icon.jpg +heroText: JeffreySu/WeiXinMPSDK +tagline: Easily build extended apps for all wechat platforms +actionText: Get Started → +actionLink: /guide/ +features: +- title: Wide Application + details: Senparc.Weixin SDK with the highest usage rate at present. +- title: Multi-Platform + details: MP、WxOpen、Tenpay V2/V3、JS-SDK、Open、Work…… +- title: Scalability + details: Senparc.Weixin SDK Extension components are used to provide a series of extension modules such as cache and WebSocket. +--- + +::: slot footer +Apache License Version 2.0 | Copyright © 2006-present [JeffreySu/WeiXinMPSDK](https://github.com/JeffreySu/WeiXinMPSDK) +::: diff --git a/docs/dynamic-webapi/index.md b/docs/dynamic-webapi/index.md new file mode 100644 index 0000000000..830b2c9156 --- /dev/null +++ b/docs/dynamic-webapi/index.md @@ -0,0 +1 @@ +# Dynamic WebApi diff --git a/docs/guide/README.md b/docs/guide/README.md new file mode 100644 index 0000000000..b901a99f07 --- /dev/null +++ b/docs/guide/README.md @@ -0,0 +1,23 @@ +# About + +With Senparc.Weixin, you can easily and quickly develop WeChat's full-platform applications (including WeChat Public, Applets, Games, Enterprise, Open Platform, WeChat Pay, JS-SDK, WeChat Hardware/Bluetooth, and more). The demo of this project is also suitable for beginners to learn .NET programming. + +Currently Senparc.Weixin already supports almost all WeChat platform modules and interfaces, and also supports [.NET 3.5 / 4.0 / 4.5 / .NET Standard 2.x / .NET Core 2.x / .NET Core 3.x / .NET 6.0](https://github.com/JeffreySu/WeiXinMPSDK/tree/Developer) Multiple frameworks. + +Senparc.Weixin SDK is currently the most used WeChat .NET SDK, is also one of the most popular .NET open source projects in China, is the only selected **2021 "Science and Innovation China" open source innovation list**[[1]](https://tv.sohu.com/v/dXMvOTkyNjI2MTAvMzI3NjU3NDI0LnNodG1s.html?key=/v/dXMvOTkyNjI2MTAvMzI3NjU3NDI0LnNodG1s.html?vid=327657424&vid=327657424) [[2]](http://cccst.org.cn/mtgz/art/2022/art_cd16c511a4c143f5ae50fc799abc0c74.html) + +The project has been open-sourced since 2012, and officially released to GitHub since January 2013. In the past 10 years, we have kept the project continuously updated, and shared the complete source code and design ideas without reservation, hoping that more people can benefit from it, understand and spread the spirit of open source, and help China's open-source cause together! We are grateful to all the friends who have helped us along the way! + +## Team + +Senparc.Weixin is maintained by the core team of Senparc Networks and Senparc Developer Community, and is receiving a lot of support from community members and all walks of life, welcome to join us! + +## Support + +Senparc.Weixin provides 100% source code, online Sample, documents, books, video courses, online developer platform, Q&A platform, QQ / WeChat group, as well as occasional online / offline sharing sessions and other forms of support services, and adhere to the uninterrupted maintenance of the source code, the release of new versions. + +Contact email: zsu@senparc.com + +## Open Source Protocol + +Senaprc.Weixin uses [APACHE LICENSE V2.0](https://www.apache.org/licenses/LICENSE-2.0) open source protocol to support commercial use. diff --git a/docs/guide/lab.md b/docs/guide/lab.md new file mode 100644 index 0000000000..737b5b498e --- /dev/null +++ b/docs/guide/lab.md @@ -0,0 +1,71 @@ +# Libraries and Components + +## Senparc.Weixin SDK + +The basic SDK for each WeChat platform, contains most of the APIs of the current WeChat platform, and the focus of WeChat development is on the use of these libraries. + +| # | Function Module | Nuget Package Name | Nuget Version | Current Site Runtime Version | .NET 4.6.2 | .NET Core 2.x / 3.x | .NET 6.0 / 7.0 | +| --- | ----------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | +| 1 | SDK Public Base Library | [Senparc.Weixin](https://www.nuget.org/packages/Senparc.Weixin) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin) | [v6.16.3](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 2 | MP JSSDK Shake Around | [Senparc.Weixin.MP](https://www.nuget.org/packages/Senparc.Weixin.MP) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.MP.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.MP) | [v16.19.2](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 3 | MP MvcExtension | [Senparc.Weixin.MP.Mvc](https://www.nuget.org/packages/Senparc.Weixin.MP.Mvc) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.MP.Mvc.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.MP.Mvc) | [v7.12.12](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 4 | WxOpen | [Senparc.Weixin.WxOpen](https://www.nuget.org/packages/Senparc.Weixin.WxOpen) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.WxOpen.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.WxOpen) | [v3.16.2](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 5 | Tenpay | [Senparc.Weixin.TenPay](https://www.nuget.org/packages/Senparc.Weixin.TenPay) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.TenPay.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.TenPay) | [v1.12.13](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 6 | TenPay V3(new) | [Senparc.Weixin.TenPayV3](https://www.nuget.org/packages/Senparc.Weixin.TenPayV3) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.TenPayV3.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.TenPayV3) | [v0.7.10](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-N-lightgrey.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 7 | Open Platform | [Senparc.Weixin.Open](https://www.nuget.org/packages/Senparc.Weixin.Open) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.Open.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.Open) | [v4.14.25](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 8 | Enterprise Weixin | [Senparc.Weixin.Work](https://www.nuget.org/packages/Senparc.Weixin.Work) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.Work.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.Work) | [v3.16.2](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | + +## ASP.NET Runtime Base Libraries for Senparc.Weixin SDK + +These libraries are based on the ASP.NET runtime and rely on a number of ASP.NET features to perform a number of ASP.NET and ASP.NET Core based operations. +Another reason for separating these libraries is so that the Senparc.Weixin SDK core libraries can be deployed independently of the ASP.NET runtime. +Weixin SDK core libraries can be deployed in specialised environments such as lightweight containers (e.g. Docker), the command line (Console), the desktop (Desktop / WinForm / WPF / Blazor / MAUI / UWP), or even mobile applications (Apps). + +| # | Function Module | Nuget Package Name | Nuget Version | Current Site Runtime Version | .NET 4.6.2 | .NET Core 2.x / 3.x | .NET 6.0 / 7.0 | +| --- | -------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | +| 1 | ASP.NET Runtime Base Library | [Senparc.Weixin.AspNet](https://www.nuget.org/packages/Senparc.Weixin.AspNet) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.AspNet.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.AspNet) | [v1.0.4](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 2 | Public Message Middleware | [Senparc.Weixin.MP.Middleware](https://www.nuget.org/packages/Senparc.Weixin.MP.Middleware) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.MP.Middleware.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.MP.Middleware) | [v1.0.5](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 3 | Applet Messaging Middleware | [Senparc.Weixin.WxOpen.Middleware](https://www.nuget.org/packages/Senparc.Weixin.WxOpen.Middleware) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.WxOpen.Middleware.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.WxOpen.Middleware) | [v1.0.5](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 4 | Enterprise Weixin Messaging Middleware | [Senparc.Weixin.Work.Middleware](https://www.nuget.org/packages/Senparc.Weixin.Work.Middleware) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.Work.Middleware.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.Work.Middleware) | [v1.0.5](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | + +## Senparc.Weixin SDK Extensions + +Senparc.Weixin SDK extensions are used to provide a series of extension modules such as caching, WebSocket, etc. +These modules are a part of the official Senparc.Weixin SDK. +These modules are an official implementation of Senparc, and almost all extensions are strictly interface oriented.Therefore, you can also extend and interface to WeChat SDK or other systems. + +| # | Function Module | Nuget Package Name | Nuget Version | Current Site Runtime Version | .NET 4.6.2 | .NET Core 2.x / 3.x | .NET 6.0 / 7.0 | +| --- | ----------------------------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | +| 1 | Redis Cache (StackExchange.Redis) | [Senparc.Weixin.Cache.Redis](https://www.nuget.org/packages/Senparc.Weixin.Cache.Redis) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.Cache.Redis.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.Cache.Redis) | [v2.15.12](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 2 | Redis Cache (CsRedis) | [Senparc.Weixin.Cache.CsRedis](https://www.nuget.org/packages/Senparc.Weixin.Cache.CsRedis) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.Cache.CsRedis.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.Cache.CsRedis) | [v0.8.12](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 3 | Memcached Cache | [Senparc.Weixin.Cache.Memcached](https://www.nuget.org/packages/Senparc.Weixin.Cache.Memcached) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.Cache.Memcached.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.Cache.Memcached) | [v2.13.12](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 4 | WebSocket Module | [Senparc.WebSocket](https://www.nuget.org/packages/Senparc.WebSocket) | [![img](https://img.shields.io/nuget/v/Senparc.WebSocket.svg?style=flat)](https://www.nuget.org/packages/Senparc.WebSocket) | [v0.17.12](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | + +## Cross-Platform Support Library: Senparc.NeuChar + +NeuChar is a set of standards for cross-platform services (e.g., cross-WeChat, WeChat Applet, Nail, QQ Applet, Baidu Applet, etc.) provided by Senparc. +Use one set of code to serve multiple platforms at the same time. Currently, Senparc.Weixin SDK is an implementation of the NeuChar standard for WeChat. +You can also use NeuChar to extend to more platforms. +https://www.neuchar.com is a visual cross-platform configuration platform based on the NeuChar standard provided by Senparc. + +| # | Function Module | Nuget Package Name | Nuget Version | Current Site Runtime Version | .NET 4.6.2 | .NET Core 2.x / 3.x | .NET 6.0 / 7.0 | +| --- | ------------------------------------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | +| 1 | NeuChar Cross-platform Support library | [Senparc.NeuChar](https://www.nuget.org/packages/Senparc.NeuChar) | [![img](https://img.shields.io/nuget/v/Senparc.NeuChar.svg?style=flat)](https://www.nuget.org/packages/Senparc.NeuChar) | [v2.3.1](https://github.com/Senparc/NeuChar) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 2 | NeuChar APP and NeuChar Ending | [Senparc.NeuChar.App](https://www.nuget.org/packages/Senparc.NeuChar.App) | [![img](https://img.shields.io/nuget/v/Senparc.NeuChar.App.svg?style=flat)](https://www.nuget.org/packages/Senparc.NeuChar.App) | [v1.3.1](https://github.com/Senparc/NeuChar) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 3 | NeuChar's ASP.NET Runtime Support Libraries | [Senparc.NeuChar.AspNet](https://www.nuget.org/packages/Senparc.NeuChar.AspNet) | [![img](https://img.shields.io/nuget/v/Senparc.NeuChar.AspNet.svg?style=flat)](https://www.nuget.org/packages/Senparc.NeuChar.AspNet) | [v1.3.2](https://github.com/Senparc/NeuChar) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | + +## Underlying Public Foundation Library: Senparc.CO2NET + +Senparc.CO2NET is a public base extension library for the .NET Framework and .NET Core, containing the basic helper classes needed for regular development. +Developers can use CO2NET directly to provide public base methods to their projects, eliminating the need to repeatedly prepare and maintain public code. +You can use CO2NET in almost any project. [view source](https://github.com/Senparc/Senparc.CO2NET) + +| # | Function Module | Nuget Package Name | Nuget Version | Current Site Runtime Version | .NET 4.6.2 | .NET Core 2.x / 3.x | .NET 6.0 / 7.0 | +| --- | --------------------------------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | +| 1 | CO2NET Base Library | [Senparc.CO2NET](https://www.nuget.org/packages/Senparc.CO2NET) | [![img](https://img.shields.io/nuget/v/Senparc.CO2NET.svg?style=flat)](https://www.nuget.org/packages/Senparc.CO2NET) | [v2.2.1](https://github.com/Senparc/Senparc.CO2NET) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 2 | APM Libraries | [Senparc.CO2NET.APM](https://www.nuget.org/packages/Senparc.CO2NET.APM) | [![img](https://img.shields.io/nuget/v/Senparc.CO2NET.APM.svg?style=flat)](https://www.nuget.org/packages/Senparc.CO2NET.APM) | [v1.2.5](https://github.com/Senparc/Senparc.CO2NET) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 3 | Redis Libraries (StackExchange.Redis) | [Senparc.CO2NET.Cache.Redis](https://www.nuget.org/packages/Senparc.CO2NET.Cache.Redis) | [![img](https://img.shields.io/nuget/v/Senparc.CO2NET.Cache.Redis.svg?style=flat)](https://www.nuget.org/packages/Senparc.CO2NET.Cache.Redis) | [v4.1.4](https://github.com/Senparc/Senparc.CO2NET) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 4 | Redis Library (CSRedis) | [Senparc.CO2NET.Cache.CsRedis](https://www.nuget.org/packages/Senparc.CO2NET.Cache.CsRedis) | [![img](https://img.shields.io/nuget/v/Senparc.CO2NET.Cache.CsRedis.svg?style=flat)](https://www.nuget.org/packages/Senparc.CO2NET.Cache.CsRedis) | [v1.1.5](https://github.com/Senparc/Senparc.CO2NET) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 5 | Memcached Library | [Senparc.CO2NET.Cache.Memcached](https://www.nuget.org/packages/Senparc.CO2NET.Cache.Memcached) | [![img](https://img.shields.io/nuget/v/Senparc.CO2NET.Cache.Memcached.svg?style=flat)](https://www.nuget.org/packages/Senparc.CO2NET.Cache.Memcached) | [v4.1.4](https://github.com/Senparc/Senparc.CO2NET) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 6 | CO2NET for ASP.NET | [Senparc.CO2NET.AspNet](https://www.nuget.org/packages/Senparc.CO2NET.AspNet) | [![img](https://img.shields.io/nuget/v/Senparc.CO2NET.AspNet.svg?style=flat)](https://www.nuget.org/packages/Senparc.CO2NET.AspNet) | [v1.1.5](https://github.com/Senparc/Senparc.CO2NET) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 7 | WebApi Engine Library (new) | [Senparc.CO2NET.WebApi](https://www.nuget.org/packages/Senparc.CO2NET.WebApi) | [![img](https://img.shields.io/nuget/v/Senparc.CO2NET.WebApi.svg?style=flat)](https://www.nuget.org/packages/Senparc.CO2NET.WebApi) | [v1.4.2](https://github.com/Senparc/Senparc.CO2NET) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-N-lightgrey.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | diff --git a/docs/guide/mp/Advanced.md b/docs/guide/mp/Advanced.md new file mode 100644 index 0000000000..9426f405b6 --- /dev/null +++ b/docs/guide/mp/Advanced.md @@ -0,0 +1,11 @@ +# Advanced + +The current example shows the most basic and commonly used functions, if you need to know more advanced play and have solid programming skills, please refer to the full example. + +> The full example solution file: +> +> Senparc.Weixin SDK source file root directory [/Samples/All/net7-mvc/Senparc.Weixin.Sample.Net7.sln](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/Samples/All/net7-mvc) + +> Be sure to read the readme file: +> +> Senparc.Weixin SDK source file root directory [/Samples/All/net7-mvc/readme.md](https://github.com/JeffreySu/WeiXinMPSDK/blob/master/Samples/All/net7-mvc/readme.md) diff --git a/docs/guide/mp/AdvancedInterface.md b/docs/guide/mp/AdvancedInterface.md new file mode 100644 index 0000000000..61885a1cdc --- /dev/null +++ b/docs/guide/mp/AdvancedInterface.md @@ -0,0 +1,29 @@ +# Advanced Interface + +After completing the usual registration in the `Program.cs` file, you can use the Advanced Interface anywhere in your programme. + +> Notes: +> +> 1. The configuration of advanced interfaces is not related to `MessageHandler`, they can be used independently or in conjunction with each other. +> +> 2. The first parameter of almost all advanced interfaces in the SDK supports passing either AppId or AccessToken, usually named `appIdOrAccessToken`, the SDK will automatically recognise whether the input is an AppId or an AccessToken based on the characteristics of the parameter, and make a distinction between them. + +## Calling interfaces with AppId (recommended) + +For example, we can call a high-level interface in any method: + +```cs +var appId = Senparc.Weixin.Config.SenparcWeixinSetting.AppId; +var result = await Senparc.Weixin.MP.AdvancedAPIs.UserApi.GetAsync(appId);//Get follower OpenId information +``` + +> The appId parameter must be registered, so that even if the AccessToken has expired, the SDK will handle it automatically. If the appId is not registered, you need to get the AccessToken first, and then call the interface. + +## Calling an interface with an AccessToken (not recommended) + +```cs +var accessToken = Senparc.Weixin.MP.CommonApi.GetTokenAsync(appId, appSecret);//get AccessToken +var result = await Senparc.Weixin.MP.AdvancedAPIs.UserApi.GetAsync(accessToken);//get the follower OpenId information +``` + +> Note: Using AccessToken to call an interface does not guarantee the validity of the current AccessToken, so it is recommended to check the validity before using it, and use `try-catch` to catch an exception if the AccessToken is not available, and then retry. Therefore, calling an interface directly with an AccessToken is not recommended for general use. diff --git a/docs/guide/mp/JSSDK.md b/docs/guide/mp/JSSDK.md new file mode 100644 index 0000000000..4c6150e553 --- /dev/null +++ b/docs/guide/mp/JSSDK.md @@ -0,0 +1,90 @@ +# JSSDK + +JSSDK is used to provide WeChat's built-in browser interface capabilities, such as forwarding control, calling camera permissions (photo, video), file uploading, closing windows, evoking code scanning windows, and so on. + +To use JSSDK only in the built-in browser, there are two steps: "Getting signature information on the server side" and "Configuring JSSDK on the web side". + +## Server-side signature retrieval + +The backend can automatically get all the JSSDK parameters needed by the frontend by using the `JSSDKHelper.GetJsSdkUiPackageAsync()` method: + +```cs +public async Task Index() +{ + var jssdkUiPackage = await JSSDKHelper.GetJsSdkUiPackageAsync(appId, appSecret, Request) + return View(jssdkUiPackage); +} +``` + +> Reference file for this project: +> /Controllers/**_WeixiJSSDKnController.cs_** + +## Configure JSSDK on web side + +Parameters configured in the back-end can be set directly in the front-end JS using `wx.config`, for example, the following code will customise the title and image of the forwarded message when forwarding a web page: + +```JS +wx.config({ + debug: false, // 开启调试模式 + appId: '@Model.AppId', // 必填,公众号的唯一标识 + timestamp: '@Model.Timestamp', // 必填,生成签名的时间戳 + nonceStr: '@Model.NonceStr', // 必填,生成签名的随机串 + signature: '@Model.Signature',// 必填,签名 + jsApiList: [ + 'checkJsApi', + 'onMenuShareTimeline', + 'onMenuShareAppMessage' + ] + }); + + wx.error(function (res) { + console.log(res); + alert('验证失败'); + }); + + wx.ready(function () { + var url = 'https://sdk.weixin.senparc.com'; + var link = url + '/'; + var imgUrl = url + '/images/v2/ewm_01.png'; + + //转发到朋友圈 + wx.onMenuShareTimeline({ + title: 'JSSDK朋友圈转发测试', + link: link, + imgUrl: imgUrl, + success: function () { + alert('转发成功!'); + }, + cancel: function () { + alert('转发失败!'); + } + }); + //转发给朋友 + wx.onMenuShareAppMessage({ + title: 'JSSDK朋友圈转发测试', + desc: '转发给朋友', + link: link, + imgUrl: imgUrl, + type: 'link', + dataUrl: '', + success: function () { + alert('转发成功!'); + }, + cancel: function () { + alert('转发失败!'); + } + }); + }); +``` + +> Tip: Passing a ViewModel in MVC needs to be defined at the top of the .cshtml file: +> +> ```cs +> @model Senparc.Weixin.MP.Helpers.JsSdkUiPackage +> ``` + +> Reference file for this project: +> +> /Views/WeixinJSSDK/**_Index.cshtml_** + +For more setting details, please refer to: [JS-SDK description document](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html). diff --git a/docs/guide/mp/MenuSetup.md b/docs/guide/mp/MenuSetup.md new file mode 100644 index 0000000000..816f43c54b --- /dev/null +++ b/docs/guide/mp/MenuSetup.md @@ -0,0 +1,72 @@ +# Menu Setup + +The public menu is an important element of the public interface, and the use of the menu is divided into two parts: **Setup** and **Use**. + +## Setting + +Method 1 (recommended): Use the background interface of WeChat public number to set up the menu (without using the development mode), which is omitted here. + +Method 2 (recommended): Use visual editor (No Code): [Click to view the introduction](https://sdk.weixin.senparc.com/Menu). + +Method 3: Setup using code (only needs to be executed once, it is recommended to put it in the administrator background and run it manually), e.g.: + +```CS +public async Task CreateMenuAsync() +{ + ButtonGroup bg = new ButtonGroup(); + + // Define the first level menu + var subButton = new SubButton() + { + name = "First level menu" + }; + bg.button.Add(subButton); + + // Subordinate secondary menu + subButton.sub_button.Add(new SingleViewButton() + { + url = "https://book.weixin.senparc.com/book/link?code=SenparcRobotMenu", + name = "WeChat Development In-Depth Analysis" + }); + subButton.sub_button.Add(new SingleClickButton() + { + key = "OneClick", + name = "OneClick Test" + }); + subButton.sub_button.Add(new SingleViewButton() + { + url = "https://weixin.senparc.com/", + name = "Url Jump" + }); + + //Add up to 3 first level custom menus and up to 5 submenus under each menu. + + var result = await CommonApi.CreateMenuAsync(appId, bg); +} +``` + +## Use + +After setting up the menu, when the client clicks on the menu, the WeChat server will automatically push the response callback information to the message URL (i.e., within the MessageHandler that has been set up), just override (`override`) the corresponding method in the CustomMessageHandler. For example, for the above **Method 3** menu that has already been set to take effect, when the user clicks the [Click to Test] button, we can receive and process it in the CustomMessageHandler: + +```cs +public override async Task OnEvent_ClickRequestAsync(RequestMessageEvent_Click requestMessage) +{ + var requestMessage = CreateResponseMessage(); + + if (requestMessage.EventKey == "OneClick") + { + reponseMessage.Content = "You clicked on the [OneClick Test] button"; + } + else + { + reponseMessage.Content = "You clicked the other event button"; + } + + return reponseMessage; +} +``` + +> Reference document for this project: +> +> /MessageHandlers/**_CustomMessageHandler_Events.cs_** diff --git a/docs/guide/mp/MessageHandler.md b/docs/guide/mp/MessageHandler.md new file mode 100644 index 0000000000..752ae40ba6 --- /dev/null +++ b/docs/guide/mp/MessageHandler.md @@ -0,0 +1,61 @@ +# MessageHandler + +The `MessageHandler` is used to handle messages from the WeChat public number dialogue window. + +The SDK has all the basic functionality needed for the developer, the developer just needs to create a custom subclass to supplement the business logic that needs to be customised. + +## Custom MessageHandler + +In the current example, we named our custom MessageHandler `CustomMessageHandler`. + +> **CustomMessageHandler.cs Reference file for this project:** +> +> /MessageHandlers/ directory +> **_CustomMessageHandler.cs_** MessageHandler main file + General Message Handling +> **_CustomMessageHandler_Events.cs_** MessageHandler Event Message Handler +> **_CustomMessageContext.cs_** Custom rewrite of DefaultMpMessageContext context (optional) + +Of all the `override` methods demonstrated in `CustomMessageHandler*.cs`, only the `DefaultResponseMessage()` method is required to be overridden, and all the other `OnXxxRequest()` methods are optional, so that when a message is sent by a user, and the corresponding override method cannot be found, then the `DefaultMpMessage()` method is called. When the user sends a message and can't find a corresponding override method, the `DefaultResponseMessage()` method will be called. + +The MessageHandler has two ways of carrying the message so that it can be accessed externally (by the WeChat server) via a URL. These are the **Middleware method** (recommended) and the **Controller method**. The `CustomMessageHandler` used by both methods is common, so it can be switched and co-exist at any time. + +## Middleware way to host MessageHandler + +The middleware approach is the recommended and simplest way to introduce middleware without creating any new files, just below the `Program.cs` file after all Senparc.Weixin registration code has been executed: + +```cs +app.UseMessageHandlerForMp( + "/WeixinAsync", + CustomMessageHandler.GenerateMessageHandler, + (options) => { + options.AccountSettingFunc = (context) => + Senparc.Weixin.Config.SenparcWeixinSetting; + } +); +``` + +Once done, the MessageHandler can be accessed via Url **`Domain/WeixinAsync`**, set to the message URL of the public backend. + +[test /WeixinAsync](https://sdk.weixin.senparc.com/WeixinAsync) + +> Reference document for this project: +> +> /**_Program.cs_** + +For more middleware approaches, please refer to: ["Using MessageHandler Middleware in .NET Core 2.0/3.0"](https://www.cnblogs.com/szw/p/Wechat-MessageHandler-Middleware.html) (also applicable to . 6.0 and above). + +## Controller approach to hosting MessageHandler + +When the middleware approach doesn't meet your needs, you can use a Controller to "unfold" the execution process and control or intervene more precisely at each step of the execution. + +To use Controller, you need to create 2 Actions, which correspond to WeChat background authentication (Get request) and real message push (Post request). The project example is located in `WeixinController.cs`. + +> WeixinController.cs Reference file for this project: +> +> /**_Controllers/WeixinController.cs_** + +Once done, you can access MessageHandler via Url **`Domain/Weixin`**, set as the message URL of public backend. + +[Test /Weixin](https://sdk.weixin.senparc.com/Weixin) + +For more Controller methods, please refer to: ["Understanding MessageHandler"](https://www.cnblogs.com/szw/p/3414862.html) (Recommended to use full set of asynchronous methods) diff --git a/docs/guide/mp/OAuth2.0.md b/docs/guide/mp/OAuth2.0.md new file mode 100644 index 0000000000..408d06356d --- /dev/null +++ b/docs/guide/mp/OAuth2.0.md @@ -0,0 +1,112 @@ +# OAuth 2.0 + +When you need to get the user's OpenId, avatar, nickname and other information on the web page, you need to use OAuth 2.0 to communicate with WeChat server. + +For more information, please refer to the official documentation: [Web Authorisation](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#4). + +The SDK has already encapsulated all the related processes, you just need to refer to the example for a simple 3-step configuration. + +## Step 1: Set up the login page + +In the login page, you need to set the official OAuth 2.0 request URL (called **AuthorizeUrl**) and bring the returnUrl after successful login. + +Since WeChat authorisation has two methods (**snsapi_userinfo** and **snsapi_base**), the code below directly provides two ways to get the **AuthorizeUrl**: + +```cs +public ActionResult Index(string returnUrl) +{ + ViewData["returnUrl"] = returnUrl; + + // This page directs the user to click on authorisation + ViewData["UrlUserInfo"] = + OAuthApi.GetAuthorizeUrl(appId, + "http://sdk.weixin.senparc.com/oauth2/UserInfoCallback?returnUrl=" + returnUrl.UrlEncode(), + null, OAuthScope.snsapi_userinfo);//snsapi_userinfo method callback address + + ViewData["UrlBase"] = + OAuthApi.GetAuthorizeUrl(appId, + "http://sdk.weixin.senparc.com/oauth2/BaseCallback?returnUrl=" + returnUrl.UrlEncode(), + null, OAuthScope.snsapi_base);//snsapi_base way callback address + return View(); +} +``` + +The above `returnUrl` parameter is usually the URL before jumping to the login page, or it can be the URL you want the user to jump to after completing the authorisation. + +> Note: The above URL and path need to be matched to your own server address in the public backend (refer to the document: [Web Authorisation](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorisation.html#4)). + +> Reference document for this project: +> +> /Controllers/**_OAuth2Controller.cs_** + +## Step 2: Front-end login page setup + +The ultimate function of the login page is to direct the user to open the **AuthorizeUrl**, which can be done using a direct connection: + +```cs + +Click here to test snsapi_userinfo + + +Click here to test snsapi_userinfo +``` + +> Documentation references for this item: +> +> /Views/OAuth2/**_Index.cshtml_** + +## Step 3: Configure the post-login callback page + +After successful authorisation, the webpage will automatically jump to the callback URL set in the first step (`"http://sdk.weixin.senparc.com/oauth2/UserInfoCallback?returnUrl=" + returnUrl.UrlEncode()`), take **UserInfoCallback** as an example: + +```cs +public ActionResult UserInfoCallback(string code, string returnUrl) +{ + if (string.IsNullOrEmpty(code)) + { + return Content("You have denied authorisation!") ; + } + + OAuthAccessTokenResult result = null; + + // Pass, exchange code for access_token. + { + result = OAuthApi.GetAccessToken(appId, appSecret, code); + } + catch (Exception ex) + { + return Content(ex.Message); + } + if (result.errcode ! = ReturnCode.Request was successful) + { + return Content("Error: " + result.errmsg); + } + + // The following 2 data can also be encapsulated into a class of their own and stored in a database (combined with caching is recommended) + // If you can ensure the security, you can store the access_token in the user's cookie, each person's access_token is different + HttpContext.Session.SetString("OAuthAccessTokenStartTime", SystemTime.Now.ToString()); + HttpContext.Session.SetString("OAuthAccessToken", result.ToJson()); + + //Because the first step is to choose the OAuthScope.snsapi_userinfo, here you can further get user details + try + { + if (!string.IsNullOrEmpty(returnUrl)) + { + return Redirect(returnUrl); + } + + OAuthUserInfo userInfo = OAuthApi.GetUserInfo(result.access_token, result.openid); + return View(userInfo); + } + catch (ErrorJsonResultException ex) + { + return Content(ex.Message); + } +} +``` + +In the above code, the `returnUrl` is the `returnUrl` passed to **AuthorizeUrl** in the `Index()` method of the first step, when all the operations of obtaining and saving the user information are completed, the `returnUrl` is used to jump to the page before the login, and complete the whole closed-loop login operation. + +> Reference document for this project: +> +> /Controllers/**_OAuth2Controller.cs_** diff --git a/docs/guide/mp/install.md b/docs/guide/mp/install.md new file mode 100644 index 0000000000..be308f29cc --- /dev/null +++ b/docs/guide/mp/install.md @@ -0,0 +1,72 @@ +# How to install? + +You can either directly reference the Senparc.Weixin source code for development, or you can reference the packaged dlls (via Nuget packages, recommended) to get official updates at any time. Note: You can only use either the source code or the Nuget package. + +## Referencing the source code + +You can reference (copy) the assemblies you need to reference in the current solution, under the **Libraries** directory, to the solution of your development environment, please note that you need to reference the dependent projects at the same time, e.g., `Senparc.Weixin` is a project that all projects need to depend on. + +The current example project uses a direct reference to the source code by default, which can be seen in the .csproj file: + +```cs + + + + + +``` + +## Referencing assemblies (recommended) + +You can install Nuget packages automatically through `Visual Studio`, `Visual Studio Code`, `dotnet command line`, and many other ways. + +### Visual Studio + +In the development project [Solution Explorer], right click on the module where you need to add `Senparc.Weixin.MP`, click [Manage Nuget Packages], enter **Senparc.Weixin.MP** in the [Browse] tab, and click the [Install] button on the right side. MP, and then click the [Install] button on the right side: +![通过 Visual Studio 安装](https://sdk.weixin.senparc.com/Docs/MP/images/home-install-01.png) + +### Visual Studio Code + +First of all, make sure that you have installed [VS Code](https://code.visualstudio.com/) and the dotnet command line (it will be installed automatically after installing the [.NET SDK ](https://dotnet.microsoft.com/en-us/download)). + +Then, open the solution or project directory and press Ctrl+~ to open the Terminal panel: + +![通过 VS Code 安装](https://sdk.weixin.senparc.com/Docs/MP/images/home-install-03.png) + +Go to the directory of the project where you need to add the module Senparc.Weixin.MP and type: + +> ```bash +> dotnet add package Senparc.Weixin.MP +> ``` + +To install the Senparc.Weixin.MP module + +![Install via VS Code](https://sdk.weixin.senparc.com/Docs/MP/images/home-install-04.png) + +After the installation is complete, you can see the corresponding .csproj file, being added references such as: + +```cs + + + +``` + +### dotnet command line + +First of all, make sure that you have installed the dotnet command line (it will be installed automatically after installing the [.NET SDK](https://dotnet.microsoft.com/en-us/download)). + +Go to the directory of the project where you want to add the module Senparc.Weixin.MP and enter: + +> ```cs +> dotnet add package Senparc.Weixin.MP +> ``` + +![Install via dotnet CLI](https://sdk.weixin.senparc.com/Docs/MP/images/home-install-02.png) + +After the installation is complete, you can view the corresponding .csproj file that was added to the reference, for example: + +```cs + + + +``` diff --git a/docs/guide/mp/registration.md b/docs/guide/mp/registration.md new file mode 100644 index 0000000000..962731d029 --- /dev/null +++ b/docs/guide/mp/registration.md @@ -0,0 +1,58 @@ +# Registration + +## Global Registration + +The registration process for all Senparc.Weixin SDKs is similar. + +First, complete the overall registration code for all Senparc.Weixin SDKs. Add the following code in Program.cs: + +![Register Senparc.Weixin](https://sdk.weixin.senparc.com/Docs/MP/images/home-dev-register-01.png) + +Notes: + +1. `builder.Services.AddMemoryCache()` Senparc.Weixin supports multiple cache strategies like native cache, Redis, Memcached etc. By default native cache is used, so it needs to be enabled here. + +2. `builder.Services.AddSenparcWeixinServices(builder.Configuration)` is used to complete the registration of Senparc.Weixin. + +3. `app.UseSenparcWeixin()` method is used to configure and enable Senparc.Weixin. + +The above code is the same for all Senparc.Weixin sub-modules, and only 3 lines are needed. + +> Reference file for this project: +> +> /**_Program.cs_** + +## Official Account Registration + +Insert the following code in the delegate method on line 17 of the above code to complete the default official account registration: + +```cs +register.RegisterMpAccount(weixinSetting, "[Senparc Network Assistant]Official Account"); +``` + +![Register WeChat Official Account](https://sdk.weixin.senparc.com/Docs/MP/images/home-dev-register-02.png "Register WeChat Official Account") + +The value of `weixinSetting` comes from `appsettings.json` by default: + +```json + "SenparcWeixinSetting": { + "IsDebug": true, + + "Token": "#{Token}#", + "EncodingAESKey": "#{EncodingAESKey}#", + "WeixinAppId": "#{WeixinAppId}#", + "WeixinAppSecret": "#{WeixinAppSecret}#" + } +``` + +![Configuration Parameters](https://sdk.weixin.senparc.com/Docs/MP/images/home-dev-register-03.png "Configuration Parameters") + +Where `Token`, `EncodingAESKey`, `WeixinAppId` and `WeixinAppSecret` correspond to the configuration parameters in the WeChat Official Account backend. + +> Reference file for this project: +> +> /**_appsettings.json_** + +Configuration is complete. + +> Tip: The registered information can be obtained through `Senparc.Weixin.Config.SenparcWeixinSetting`. diff --git a/docs/guide/mp/source_code.md b/docs/guide/mp/source_code.md new file mode 100644 index 0000000000..0252ef1fc1 --- /dev/null +++ b/docs/guide/mp/source_code.md @@ -0,0 +1,15 @@ +# Source Code + +## Senparc.Weixin SDK source code + +GitHub: [https://github.com/JeffreySu/WeiXinMPSDK](https://github.com/JeffreySu/WeiXinMPSDK) (faster updates) + +Gitee: [https://gitee.com/JeffreySu/WeiXinMPSDK](https://gitee.com/JeffreySu/WeiXinMPSDK) (sync from GitHub) + +## Packaging code + +Nuget package address: [https://www.nuget.org/packages/Senparc.Weixin.MP](https://www.nuget.org/packages/Senparc.Weixin.MP) + +## Local source files + +Senparc.Weixin.MP Source location: [/src/Senparc.Weixin.MP](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/src/Senparc.Weixin.MP) diff --git a/docs/guide/release/log.md b/docs/guide/release/log.md new file mode 100644 index 0000000000..afdcffef3e --- /dev/null +++ b/docs/guide/release/log.md @@ -0,0 +1,5 @@ +# ChangeLog + +## 2023-08-12 Update + + 1.Add Docs document instructions diff --git a/docs/guide/release/new_function.md b/docs/guide/release/new_function.md new file mode 100644 index 0000000000..163b6c4d8a --- /dev/null +++ b/docs/guide/release/new_function.md @@ -0,0 +1 @@ +# Document module use cases diff --git a/docs/guide/tenpayv2/Advanced.md b/docs/guide/tenpayv2/Advanced.md new file mode 100644 index 0000000000..9426f405b6 --- /dev/null +++ b/docs/guide/tenpayv2/Advanced.md @@ -0,0 +1,11 @@ +# Advanced + +The current example shows the most basic and commonly used functions, if you need to know more advanced play and have solid programming skills, please refer to the full example. + +> The full example solution file: +> +> Senparc.Weixin SDK source file root directory [/Samples/All/net7-mvc/Senparc.Weixin.Sample.Net7.sln](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/Samples/All/net7-mvc) + +> Be sure to read the readme file: +> +> Senparc.Weixin SDK source file root directory [/Samples/All/net7-mvc/readme.md](https://github.com/JeffreySu/WeiXinMPSDK/blob/master/Samples/All/net7-mvc/readme.md) diff --git a/docs/guide/tenpayv2/JASPI_Payment.md b/docs/guide/tenpayv2/JASPI_Payment.md new file mode 100644 index 0000000000..9024b58607 --- /dev/null +++ b/docs/guide/tenpayv2/JASPI_Payment.md @@ -0,0 +1,165 @@ +# JASPI Payment + +## JSAPI Payment + +To use WeChat payment in WeChat public web page, you must complete the payment process with the help of JSAPI. + +First of all, you need to create a product page and provide an entry point to place an order on the page, e.g. one-click purchase. +(implementation omitted) + +In the current example, 3 key pages are provided: ProductList, ProductItem and JsApi (JSAPI order payment). + +## ProductList ProductList + +**Backend** + +Reference code: ProductList() method under TenPayV3Controller. + +```cs +public ActionResult ProductList() +{ + var products = ProductModel.GetFakeProductList(); + return View(products); +} +``` + +> Reference file for this project: +> +> /Controllers/**_TenPayV3Controller.cs_** + +**Frontend** + +> Reference file for this project: +> +> /Views/TenPayV3/**_ProductItem.cshtml_** + +**Effects** + +[Open Preview](https://sdk.weixin.senparc.com/TenPayV3/ProductList) + +![商品列表](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-dev-jsapi-01.png) + +## ProductItem Product details + +**Backend** + +Reference code: ProductItem() method under TenPayV3Controller. + +```cs +public ActionResult ProductItem(int productId, int hc) +{ + var products = ProductModel.GetFakeProductList(); + var product = products.FirstOrDefault(z => z.Id == productId); + if (product == null || product.GetHashCode() ! = GetHashCode() !=hc) + { + return Content("Product information doesn't exist or was entered illegally! 2003"); + } + + // Determine if it is being microsoft + if (Senparc.Weixin.BrowserUtility.BrowserUtility.SideInWeixinBrowser(HttpContext)) + { + // Being on WeChat side, directly jump to WeChat payment page + return RedirectToAction("JsApi", new { productId = productId, hc = hc }); + } + else + { + // Open it on PC and provide QR code scanning for payment + return View(product); + } +} +``` + +> Description: The above code uses `SideInWeixinBrowser()` method to judge the running environment of the current page, if it is opened in WeChat, it will directly enter the JsApi payment page (see the introduction of the devolved JsApi), if it is opened in a non-WeChat environment (e.g., PC), it will display the product details and provide a choice of payment methods. + +> Reference file for this project: +> +> /Controllers/**_TenPayV3Controller.cs_** + +**Front-end**. + +> Reference file for this project: +> +> /Views/TenPayV3/**_ProductItem.cshtml_** + +**Effects** + +> This project reference file: /Views/TenPayV3/ProductItem.cshtml + +Select a product from [Product List](https://sdk.weixin.senparc.com/TenPayV3/ProductList) and click on it, you can see the detail page if you are on PC: + +![商品列表](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-dev-jsapi-02.png) + +The above **Payment Method 2: "Sweep" Payment** There is a QR code automatically generated according to the selected product at the bottom of the page, use WeChat on your mobile phone to sweep it, then you can enter the corresponding product order page (i.e., JsApi order page). + +## JSAPI order payment page + +**Backend** + +After the user clicks the order button, a prepaid order needs to be generated in the backend and registered on the page, please refer to `TenPayV3Controller.JsApi()` for the code. + +```cs +[CustomOAuth(null, "/TenpayV3/OAuthCallback")] +public ActionResult JsApi(int productId, int hc) +{ + try + + { + //Get the product information + //... + // Call JsApi to get prepayment information. + //... + + return View(); + } + catch (Exception ex) + { + //... + } + +} +``` + +> Reference file for this project: +> +> /Controllers/TenPayV3Controller.cs + +In the above code, the `productId` parameter is the number of the product, here as a Sample demonstration, it is a simulated list from memory and query, in the actual project, the product information is usually stored in the database, according to the `productId` from the data to find the product data; the `hc` function is to ensure the validity of the current memory information is set to the corresponding product information HashCode, you do not need to use it in the actual development project can be ignored. The `hc` function is set to ensure the validity of the current memory information corresponding to the product information HashCode, the actual development of the project need not be used, can be ignored. + +In this process, the most critical code is: `var result = TenPayOldV3.Unifiedorder(xmlDataInfo)`, `result.prepay_id` is the "prepayment ID", the front-end page must rely on prepay_id in order to make the mobile phone call the ID. id in order for the mobile phone to evoke WeChat payment. At this point, the current order number has already been registered in the WeChat Payment backend. + +Note: This method uses the **[CustomOAuth]** feature, which is used to automatically use the OAuth function of WeChat public number to identify the user's identity, and this feature belongs to the public number category, so it will not be expanded here. + +**Front-end** + +The key operation of the front-end is to execute the JS code when the user clicks the "Pay" button: + +```JS +WeixinJSBridge.invoke( + "getBrandWCPayRequest", + { + appId: "", //public name, passed in by merchant + timeStamp: "", //timestamp + nonceStr: "", //random string + package: "", //extension package + signType: "MD5", //WeChat signature type:MD5 + paySign: "", //WeChat signature + }, + function (res) { + if (res.err_msg == "get_brand_wcpay_request:ok") { + //Payment successful + } + } +); +``` + +> Reference file for this project: +> +> /Views/TenPayV3/**_JsApi.cshtml_** + +**Effects** + +![订单支付页面](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-dev-jsapi-03.jpg) + +![点击唤起支付](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-dev-jsapi-04.jpg) + +![支付成功](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-dev-jsapi-05.jpg) diff --git a/docs/guide/tenpayv2/Native_Payment.md b/docs/guide/tenpayv2/Native_Payment.md new file mode 100644 index 0000000000..35558b1928 --- /dev/null +++ b/docs/guide/tenpayv2/Native_Payment.md @@ -0,0 +1,138 @@ +# Native Payment + +Native payment is used for offline (or outside of WeChat environment) payment, by scanning the QR code through WeChat, which will evoke the personal WeChat payment to complete the payment process. + +There are many controls to generate QR code, take [ZXing.Net](https://www.nuget.org/packages/ZXing.Net) as an example, create the method in `TenPayV3Controller`: + +```cs +/// +/// Native Payment Model 1 +/// +public ActionResult Native() +{ + try + { + RequestHandler nativeHandler = new RequestHandler(null); string timeStamp = TenPayV3Util. + string timeStamp = TenPayV3Util.GetTimestamp(); string nonceStr = TenPayV3Util. + string nonceStr = TenPayV3Util.GetNoncestr(); + + // Product Id, user defined + string productId = SystemTime.Now.ToString("yyyyMMddHHmmss"); + + nativeHandler.SetParameter("appid", TenPayV3Info.AppId); + nativeHandler.SetParameter("mch_id", TenPayV3Info.MchId); + nativeHandler.SetParameter("time_stamp", timeStamp); + nativeHandler.SetParameter("nonce_str", nonceStr); + nativeHandler.SetParameter("product_id", productId); + string sign = nativeHandler.CreateMd5Sign("key", TenPayV3Info.Key); + + var url = TenPayOldV3.NativePay(TenPayV3Info.AppId, timeStamp, TenPayV3Info.MchId, nonceStr, productId, sign); + + BitMatrix bitMatrix; + bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, 600, 600); var bw = new ZXing. + var bw = new ZXing.BarcodeWriterPixelData(); + + var pixelData = bw.Write(bitMatrix); + var bitmap = new System.Drawing.Bitmap(pixelData.Width, pixelData.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb); + + var fileStream = new MemoryStream(); + + var bitmapData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, pixelData.Width, pixelData.Height), System.Drawing.Imaging. ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb); + try + { + // we assume that the row stride of the bitmap is aligned to 4 byte multiplied by the width of the image + System.Runtime.InteropServices.Marshal.Copy(pixelData.Pixels, 0, bitmapData.Scan0, pixelData.Pixels.Length); + } + finally + { + bitmap.UnlockBits(bitmapData); + } + bitmap.Save(_fileStream, System.Drawing.Imaging.ImageFormat.Png); + _fileStream.Seek(0, SeekOrigin.Begin); + + return File(_fileStream, "image/png"); + } + catch (Exception ex) + { + SenparcTrace.SendCustomLog("TenPayV3.Native Execution error", ex.Message); + Message; SenparcTrace.BaseExceptionLog(ex); throw; + } + +} +``` + +> Reference file for this project: +> +> /Controllers/**_TenPayV3Controller.cs_** + +The above process will automatically generate the payment QR code corresponding to the specified merchant and specified product (productId), and the front-end HTML call is as follows: + +```HTML +Scanning code for payment +``` + +After the user sweeps the code to complete the payment, WeChat server will automatically request the callback address, such as /TenPayV3/NativeNotifyUrl, the code is as follows: + +```cs +public ActionResult NativeNotifyUrl() +{ + ResponseHandler resHandler = new ResponseHandler(null); + + // Return the request to WeChat + RequestHandler res = new RequestHandler(null); // + + string openId = resHandler.GetParameter("openid"); //Return to WeChat. + string productId = resHandler.GetParameter("product_id"); + + if (openId == null || productId == null) + { + res.SetParameter("return_code", "FAIL"); + res.SetParameter("return_msg", "callback data exception");; + } + + // Create the payment response object + //RequestHandler packageReqHandler = new RequestHandler(null); + + var sp_billno = SystemTime.Now.ToString("HHmmss") + TenPayV3Util.BuildRandomStr(26); // up to 32 bits + var nonceStr = TenPayV3Util.GetNoncestr(); + + var xmlDataInfo = new TenPayV3UnifiedorderRequestData(TenPayV3Info.AppId, TenPayV3Info.MchId, "test", sp_billno, 1, HttpContext. UserHostAddress()? .ToString(), TenPayV3Info.TenPayV3Notify, TenPay.TenPayV3Type.JSAPI, openId, TenPayV3Info.Key, nonceStr); + + try + { + // Call the Unified Order Interface + var result = TenPayOldV3.Unifiedorder(xmlDataInfo); + + // Create an answer message to return to WeChat + res.SetParameter("return_code", result.return_code); + res.SetParameter("return_msg", result.return_msg ?? "OK"); + res.SetParameter("appid", result.appid); + res.SetParameter("mch_id", result.mch_id); + res.SetParameter("nonce_str", result.nonce_str); + res.SetParameter("prepay_id", result.prepay_id); + res.SetParameter("result_code", result.result_code); + res.SetParameter("err_code_des", "OK"); + string nativeReqSign = res.CreateMd5Sign("key", TenPayV3Info.Key); + + res.SetParameter("sign", nativeReqSign); + } + catch (Exception) + { + res.SetParameter("return_code", "FAIL"); res. + res.SetParameter("return_msg", "Uniform order failure"); + } + + return Content(res.ParseXML()); +} +``` + +> Reference file for this project: +> +> /Controllers/**_TenPayV3Controller.cs_** + +> Tip: +> +> The callback address setting location for Native payment is located at: WeChat Pay backend > Product Centre > Development Configuration > Native Payment Callback Link. +> +> ![Native 支付回调链接设置 ](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/native-setting-01.png) diff --git a/docs/guide/tenpayv2/Payment_callbacks.md b/docs/guide/tenpayv2/Payment_callbacks.md new file mode 100644 index 0000000000..9349967a0a --- /dev/null +++ b/docs/guide/tenpayv2/Payment_callbacks.md @@ -0,0 +1,61 @@ +# Payment callbacks + +## Payment Callback + +When a user completes a payment on the WeChat side, the WeChat server will actively push a notification to the application server. This message will only occur between the official WeChat server and the application server, without the user's involvement, and with additional signature checking so that it is trusted. + +> **Note: Never trust the status of the mobile client completing the payment and using this to notify the app server that the user has completed the payment!** + +Taking JsApi payment as an example, when initiating a unified payment, the callback address will be requested (`notifyUrl` parameter in `TenPayV3UnifiedorderRequestData`, see **JSAPI Payment** related note). + +> Note: The settings of the callback address may be different for different payment methods, such as "Native Payment", which is set in WeChat Payment's admin background. + +## Define the callback entry + +```cs +/// +/// +public ActionResult PayNotifyUrl() +{ + try + { + ResponseHandler resHandler = new ResponseHandler(HttpContext); string return_code = resHandler. + + string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler. + string return_msg = resHandler.GetParameter("return_msg"); string return_msg = resHandler. + + GetParameter("return_msg"); string return_msg = resHandler. + + resHandler.SetKey(TenPayV3Info.Key); + //Verify that the request was sent from WeChat (secure) + if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") + { + res = "SUCCESS"; //correct order processing + // Until here, the transaction is not considered truly successful and database operations can be performed, but don't forget to return the message in the prescribed format! + } + else + { + res = "wrong";// incorrect order processing + } + + /* Here you can do the order processing logic */ + + string xml = string.Format(@" + + +", return_code, return_msg); + return Content(xml, "text/xml"); + } + catch (Exception ex) + { + WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); + throw; + } +} +``` + +> Reference file for this project: +> +> /Controllers/**_TenPayV3Controller.cs_** diff --git a/docs/guide/tenpayv2/Refunds.md b/docs/guide/tenpayv2/Refunds.md new file mode 100644 index 0000000000..74dd54ba29 --- /dev/null +++ b/docs/guide/tenpayv2/Refunds.md @@ -0,0 +1,132 @@ +# Refunds + +## Refund + +The core code for the refund method is as follows: + +```cs +/// +/// Refund request interface +/// +/// +public ActionResult Refund() +{ + try + { + string nonceStr = TenPayV3Util.GetNoncestr(); string outTradeNo = HttpContext. + + string outTradeNo = HttpContext.Session.GetString("BillNo"); + + string outRefundNo = "OutRefunNo-" + SystemTime.Now.Ticks; int totalFee = int. + int totalFee = int.Parse(HttpContext.Session.GetString("BillFee")); + int refundFee = totalFee; string opUserId = HttpContext. + string opUserId = TenPayV3Info. + var notifyUrl = "https://sdk.weixin.senparc.com/TenPayV3/RefundNotifyUrl"; + var dataInfo = new TenPayV3RefundRequestData(TenPayV3Info.AppId, TenPayV3Info.MchId, TenPayV3Info.Key, + null, nonceStr, null, outTradeNo, outRefundNo, totalFee, refundFee, opUserId, null, notifyUrl: notifyUrl); + + var result = TenPayOldV3.Refund(_serviceProvider, dataInfo);//certificate address, password, set in configuration file and automatically recorded when registering WeChat payment information + + ViewData["Message"] = $"Refund result: {result.result_code} {result.err_code_des}. You can refresh the current page to see the latest results." ; + return View(); + } + catch (Exception ex) + { + WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex));; } catch (Exception ex) { WeixinTrace. + + ExceptionLog(new WeixinException(ex.Message, ex)); throw; + } +} +``` + +> Reference file for this project: +> +> /Controllers/**_TenPayV3Controller.cs_** + +> Explanation: The above code is for demonstration purpose, and it can only refund the order that I have paid without login, so BillNo (order number) is stored in the Session, which can be put into the URL or Post parameter to make request during actual development, and pay attention to do the authority verification! + +## Refund callback + +In the process of calling the refund interface, there is a `notifyUrl` parameter, this address is used to receive the refund information sent by WeChat server callback information. The code is as follows: + +```cs +/// +/// +public ActionResult RefundNotifyUrl() +{ + string responseCode = "FAIL"; + string responseMsg = "FAIL"; + try + { + ResponseHandler resHandler = new ResponseHandler(HttpContext); + + string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler. + string return_msg = resHandler.GetParameter("return_msg"); + + WeixinTrace.SendCustomLog("Trace RefundNotifyUrl Message", resHandler.ParseXML()); + + if (return_code == "SUCCESS") + { + responseCode = "SUCCESS"; + responseMsg = "OK"; + + string appId = resHandler.GetParameter("appid"); + string mch_id = resHandler.GetParameter("mch_id"); + string nonce_str = resHandler.GetParameter("nonce_str"); + string req_info = resHandler.GetParameter("req_info"); + + if (!appId.Equals(Senparc.Weixin.Config.SenparcWeixinSetting.TenPayV3_AppId)) + { + /* + * Caution: + * The filter is added here only because ShengPai Demo often has other public numbers wrongly set our address, which + * causing it to not be able to decrypt properly, there is no need to filter for normal use! + */ + SenparcTrace.SendCustomLog("AppId of RefundNotifyUrl is incorrect", + $"appId:{appId}\r\nmch_id:{mch_id}\r\nreq_info:{req_info}"); + + return Content("faild"); + } + + var decodeReqInfo = TenPayV3Util.DecodeRefundReqInfo(req_info, TenPayV3Info.Key);// decode + var decodeDoc = XDocument.Parse(decodeReqInfo); + + //Get the information needed in the interface. + string transaction_id = decodeDoc.Root.Element("transaction_id").Value; + string out_trade_no = decodeDoc.Root.Element("out_trade_no").Value; + string refund_id = decodeDoc.Root.Element("refund_id").Value; + string out_refund_no = decodeDoc.Root.Element("out_refund_no").Value; + int total_fee = int.Parse(decodeDoc.Root.Element("total_fee").Value); + int? settlement_total_fee = decodeDoc.Root.Element("settlement_total_fee") != null + ? int.Parse(decodeDoc.Root.Element("settlement_total_fee").Value) + : null as int?; + int refund_fee = int.Parse(decodeDoc.Root.Element("refund_fee").Value); + int tosettlement_refund_feetal_fee = int.Parse(decodeDoc.Root.Element("settlement_refund_fee").Value); + string refund_status = decodeDoc.Root.Element("refund_status").Value; + string success_time = decodeDoc.Root.Element("success_time").Value; + string refund_recv_accout = decodeDoc.Root.Element("refund_recv_accout").Value; + string refund_account = decodeDoc.Root.Element("refund_account").Value; + string refund_request_source = decodeDoc.Root.Element("refund_request_source").Value; + + // Validation passed, proceed to subsequent business processing + } + } + catch (Exception ex) + { + responseMsg = ex.Message; + WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); + } + + string xml = string.Format(@" + + +", responseCode, responseMsg); + return Content(xml, "text/xml"); +} +``` + +> Reference file for this project: +> +> /Controllers/**_TenPayV3Controller.cs_** diff --git a/docs/guide/tenpayv2/Registration.md b/docs/guide/tenpayv2/Registration.md new file mode 100644 index 0000000000..9655d004ed --- /dev/null +++ b/docs/guide/tenpayv2/Registration.md @@ -0,0 +1,86 @@ +# Registration + +## Global Registration + +The registration process is similar for all Senparc.Weixin SDKs. + +First, complete the overall registration code for all Senparc.Weixin SDKs. Add the following code to Program.cs: + +![注册 Senparc.Weixin](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-dev-register-01.png) + +Instructions: + +1. `builder.Services.AddMemoryCache()` Senparc.Weixin supports various caching strategies such as local cache, Redis, Memcached, etc. Local cache is used by default, and you need to activate local cache at this time. +2. `builder.Services.AddSenparcWeixinServices(builder.Configuration)` is used to complete the registration of Senparc. +3. `app.UseSenparcWeixin()` method is used to configure and enable Senparc. + +The above code is the same for all Senparc.Weixin descendant modules, only 3 lines of code are needed. + +> Reference file for this project: +> +> /**_Program.cs_** + +## Public number registration + +Inserting code into the delegate method in line 27 of the above code will complete the registration of the default public number as well as WeChat Pay: + +```cs + // Register public number information (can be executed multiple times to register multiple public numbers) + register.RegisterMpAccount(weixinSetting, "[Shengpai Networks Little Helper] public number");; + // Register Weixin Payment (can be executed multiple times, register multiple Weixin Payments) + register.RegisterTenpayOld(weixinSetting, "[Shengpai Networks Little Helper] WeChat Payment (V2)");; +``` + +![注册微信公众号](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-dev-register-02.png) + +> Attention: +> +> The above code registers both public number and WeChat payment (V2), because WeChat payment needs to provide the identification of WeChat user (OpenId), and the OpenId must come from WeChat public number, applet and other modules. If you need to use WeChat Pay within the applet, you need to register the applet accordingly. + +The value of `weixinSetting` comes from `appsettings.json` by default: + +```json +"SenparcWeixinSetting": { + "IsDebug": true, + + //public + "Token": "#{Token}#", + "EncodingAESKey": "#{EncodingAESKey}#", + "WeixinAppId": "#{WeixinAppId}#", + "WeixinAppSecret": "#{WeixinAppSecret}#", + + //Weixin Pay + //Weixin Pay V3 (old document V3) + "TenPayV3_AppId": "#{TenPayV3_AppId}#", + "TenPayV3_AppSecret": "#{TenPayV3_AppSecret}#", + "TenPayV3_SubAppId": "#{TenPayV3_SubAppId}#", + "TenPayV3_SubAppSecret": "#{TenPayV3_SubAppSecret}#", + "TenPayV3_MchId": "#{TenPayV3_MchId}#", + "TenPayV3_SubMchId": "#{TenPayV3_SubMchId}#", //Sub-merchant, leave blank if you don't have one. + "TenPayV3_Key": "#{TenPayV3_Key}#", /* Sub-merchant, leave blank if you don't have one. + /* Certificate path (APIv3 can not be used) + * 1, physical path, such as: D:\\cert\\\apiclient_cert.p12 + * 2, relative path, such as: ~ / App_Data / cert / apiclient_cert.p12, note: must be placed in App_Data and other protected directories, to avoid leaks + * Note: Certificate download address: https://pay.weixin.qq.com/index.php/account/api_cert + */ + "TenPayV3_CertPath": "#{TenPayV3_CertPath}#", //(V3 API can not be used) Certificate Path + "TenPayV3_CertSecret": "#{TenPayV3_CertSecret}#", //(not used by V3 API) Payment certificate password (original password is the same as MchId) + "TenPayV3_TenpayNotify": "#{TenPayV3_TenpayNotify}#", //http://YourDomainName/TenpayV3/PayNotifyUrl + //If you don't set TenPayV3_WxOpenTenpayNotify, the default is to add "WxOpen" at the end of the value of TenPayV3_TenpayNotify + "TenPayV3_WxOpenTenpayNotify": "#{TenPayV3_WxOpenTenpayNotify}#" //http://YourDomainName/TenpayV3/PayNotifyUrlWxOpen + } +``` + +Among them, `Token`, `EncodingAESKey`, `WeixinAppId` and `WeixinAppSecret` correspond to the configuration parameters of WeChat Public Number backend. + +Special Note: The `TenPayV3_CertPath` parameter supports both full physical path and relative path (starting with `~/` relative to the application root directory). The certificate file must be placed in a protected directory such as App_Data to avoid leakage. + +![配置参数](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-dev-register-03.png) + +> Reference file for this project: +> +> /**_appsettings.json_** + +Configuration complete. + +> Tip: Information for auto-registration can be obtained from `Senparc.Weixin.Config.SenparcWeixinSetting`. diff --git a/docs/guide/tenpayv2/Source_code.md b/docs/guide/tenpayv2/Source_code.md new file mode 100644 index 0000000000..70542914c5 --- /dev/null +++ b/docs/guide/tenpayv2/Source_code.md @@ -0,0 +1,15 @@ +# Source code + +## Senparc.Weixin SDK source code + +GitHub: [https://github.com/JeffreySu/WeiXinMPSDK](https://github.com/JeffreySu/WeiXinMPSDK)(updated faster) + +Gitee: [https://gitee.com/JeffreySu/WeiXinMPSDK](https://gitee.com/JeffreySu/WeiXinMPSDK) (sync from GitHub) + +## Package code + +Nuget package address: [https://www.nuget.org/packages/Senparc.Weixin.TenPay](https://www.nuget.org/packages/Senparc.Weixin.TenPay) + +## Local source files + +Senparc.Weixin.TenPay source code location: [/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPay](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPay) diff --git a/docs/guide/tenpayv2/install.md b/docs/guide/tenpayv2/install.md new file mode 100644 index 0000000000..f9fa1874b4 --- /dev/null +++ b/docs/guide/tenpayv2/install.md @@ -0,0 +1,58 @@ +# How to install + +You can either directly reference the Senparc.Weixin source code for development, or you can reference the packaged dlls (via Nuget packages, which is recommended) to get official updates at any time. Note: You can only use either the source code or the Nuget package. + +## Referencing assemblies (recommended) + +You can install Nuget packages automatically via `Visual Studio`, `Visual Studio Code`, `dotnet command line` and many other ways. + +### Visual Studio + +In the [Solution Explorer] of the development project, right click on the module you need to add Senparc.Weixin.Tenpay, click [Manage Nuget Packages], enter **Senparc.Weixin.Tenpay** in the [Browse] tab, and click the [Install] button on the right side. As shown in the picture below: + +![通过 Visual Studio 安装](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-install-01.png) + +### Visual Studio Code + +First, make sure you have installed [VS Code](https://code.visualstudio.com/) and dotnet command line (it will be installed automatically after installing [.NET SDK](https://dotnet.microsoft.com/en-us/download)). + +Then, open the solution or project directory and press Ctrl+~ to open the terminal panel: + +![通过 VS Code 安装](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-install-03.png) + +Go to the directory of the project where you need to add the module Senparc.Weixin.Tenpay and type: + +> ```cs +> dotnet add package Senparc.Weixin.Tenpay +> ``` + +![通过 VS Code 安装](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-install-04.png) + +After the installation is complete, you can see the corresponding .csproj file that was added with a reference such as: + +```cs + + + +``` + +### dotnet command line + +First of all, make sure that you have installed the dotnet command line (it will be installed automatically after installing the [.NET SDK](https://dotnet.microsoft.com/en-us/download)). + +Go to the directory of the project where you want to add the Senparc.Weixin.Tenpay module and enter: + +> ```cs +> dotnet add package Senparc.Weixin.Tenpay +> ``` + +![通过 dotnet CLI 安装](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-install-02.png) + +After the installation is complete, you can see the corresponding .csproj file, which is being added with references such as: + +```cs + + + + +``` diff --git a/docs/guide/tenpayv3/Advanced.md b/docs/guide/tenpayv3/Advanced.md new file mode 100644 index 0000000000..9426f405b6 --- /dev/null +++ b/docs/guide/tenpayv3/Advanced.md @@ -0,0 +1,11 @@ +# Advanced + +The current example shows the most basic and commonly used functions, if you need to know more advanced play and have solid programming skills, please refer to the full example. + +> The full example solution file: +> +> Senparc.Weixin SDK source file root directory [/Samples/All/net7-mvc/Senparc.Weixin.Sample.Net7.sln](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/Samples/All/net7-mvc) + +> Be sure to read the readme file: +> +> Senparc.Weixin SDK source file root directory [/Samples/All/net7-mvc/readme.md](https://github.com/JeffreySu/WeiXinMPSDK/blob/master/Samples/All/net7-mvc/readme.md) diff --git a/docs/guide/tenpayv3/JASPI.md b/docs/guide/tenpayv3/JASPI.md new file mode 100644 index 0000000000..cbb22efa3c --- /dev/null +++ b/docs/guide/tenpayv3/JASPI.md @@ -0,0 +1,197 @@ +# JSAPI + +## JSAPI Payment + +To use WeChat payment in WeChat public web page, you must complete the payment process with the help of JSAPI. + +First of all, you need to create a product page and provide an entry point to place an order on the page, e.g. one-click purchase. +(implementation omitted) + +In the current example, 3 key pages are provided: ProductList, ProductItem and JsApi (JSAPI order payment). + +## ProductList ProductList + +**Backend** + +Reference code: ProductList() method under `TenPayApiV3Controller`. + +```cs +public ActionResult ProductList() +{ + var products = ProductModel.GetFakeProductList(); + return View(products); +} +``` + +> Reference file for this project: +> +> /**_Controllers/TenPayApiV3Controller.cs_** + +**Frontend** + +> Reference file for this project: +> +> /**_/Views/TenPayApiV3/ProductItem.cshtml_** + +**Effects** + +[Open Preview](https://sdk.weixin.senparc.com/TenpayApiV3/ProductList) + +![商品列表](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-dev-jsapi-01.png) + +## ProductItem Product details + +**Backend** + +Reference code: `ProductItem() method under TenPayApiV3Controller`. + +```cs +public ActionResult ProductItem(int productId, int hc) +{ + var products = ProductModel.GetFakeProductList(); + var product = products.FirstOrDefault(z => z.Id == productId); + if (product == null || product.GetHashCode() ! = GetHashCode() ! + hc) { + return Content("Product information doesn't exist or was entered illegally! 2003"); + } + + // Determine if it is being microsoft + if (Senparc.Weixin.BrowserUtility.BrowserUtility.SideInWeixinBrowser(HttpContext)) + { + // Being on WeChat side, directly jump to WeChat payment page + return RedirectToAction("JsApi", new { productId = productId, hc = hc }); + } + else + { + // Open it on PC and provide QR code scanning for payment + return View(product); + } + +} +``` + +> Description: The above code uses `SideInWeixinBrowser()` method to judge the running environment of the current page, if it is opened in WeChat, it will directly enter the JsApi payment page (see the introduction of the devolved JsApi), if it is opened in a non-WeChat environment (e.g., PC), it will display the product details and provide a choice of payment methods. + +> Reference file for this project: +> +> /**_Controllers/TenPayApiV3Controller.cs_** + +**Frontend** + +> Reference file for this project: +> +> **_/Views/TenPayApiV3/ProductItem.cshtml_** + +**Effects** + +Select a product from [Product List](https://sdk.weixin.senparc.com/TenPayApiV3/ProductList) and click on it, you can see the detail page if you are on PC: + +![商品列表](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-dev-jsapi-02.png) + +The above **Payment Method 2: "Sweep" Payment** There is a QR code automatically generated according to the selected product at the bottom of the page, use WeChat on your mobile phone to sweep it, then you can enter the corresponding product order page (i.e., JsApi order page). + +## JSAPI order payment page + +**Backend** + +After the user clicks the order button, a prepaid order needs to be generated in the backend and registered on the page, please refer to `TenPayApiV3Controller.JsApi()` + +```cs +[CustomOAuth(null, "/TenpayApiV3/OAuthCallback")] +public ActionResult JsApi(int productId, int hc) +{ + try + { + //Get the product information + //... + + // Call JsApi to get prepayment information. + //Request information + TransactionsRequestData jsApiRequestData = new(TenPayV3Info.AppId, TenPayV3Info.MchId, name, + sp_billno, new TenpayDateTime(DateTime.Now.AddHours(1), false), null, notifyUrl, null, + new() { currency = "CNY", total = price }, new(openId), null, null, null); + + // request interface + var basePayApis2 = new Senparc.Weixin.TenPayV3.TenPayHttpClient.BasePayApis2(_httpClient, + _tenpayV3Setting); + var result = await basePayApis2.JsApiAsync(jsApiRequestData); + + if (result.VerifySignSuccess ! = true) + { + throw new WeixinException("Error getting prepay_id result verification!") ; + } + + // Get the UI information package + var jsApiUiPackage = TenPaySignHelper.GetJsApiUiPackage(TenPayV3Info.AppId, result.prepay_id); + ViewData["jsApiUiPackage"] = jsApiUiPackage; + + // Other logic + //... + + return View(); + } + catch (Exception ex) + { + //... + } +} +``` + +> Reference file for this project: +> +> /**_Controllers/TenPayApiV3Controller.cs_** + +In the above code, the `productId` parameter is the number of the product, which is used as a Sample to simulate the list and query from the memory, in the actual project, the product information is usually stored in the database, and the product data will be found according to the `productId`; the `hc` function is a HashCode of the corresponding product information, which is set in order to make sure the validity of the current memory information. The `hc` function is set to ensure the validity of the current memory information corresponding to the product information HashCode, the actual development projects do not need to use, can be ignored. + +In this process, the most critical code is: `var result = TenPayOldV3.Unifiedorder(xmlDataInfo)`, `result.prepay_id` is the "prepayment ID", the front-end page must rely on prepay_id in order to make the mobile phone call the ID. id in order for the mobile phone to evoke WeChat payment. At this point, the current order number has already been registered in the WeChat Payment backend. + +Note: This method uses the **[CustomOAuth]** feature, which is used to automatically use the OAuth function of WeChat public number to identify the user's identity, and this feature belongs to the public number category, so it will not be expanded here. + +**Front-end** + +The key operation of the front-end is to execute the JS code when the user clicks the "Pay" button: + +```cs +// The WeixinJSBridgeReady event is triggered when the built-in WeChat browser completes its internal initialisation. +document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() { + // Public Payment + jQuery('a#getBrandWCPayRequest').click(function (e) { + WeixinJSBridge.invoke('getBrandWCPayRequest', { + "appId":"@jsApiUiPackage.AppId", // public name, passed in by the merchant + "timeStamp":"@jsApiUiPackage.Timestamp", // timestamp + "nonceStr":"@jsApiUiPackage.NonceStr", //random string + "package":"@Html.Raw(jsApiUiPackage.PrepayIdPackage)", //extension package + "signType": "RSA", //WeChat V3 Signature Type:RSA + "paySign": "@Html.Raw(jsApiUiPackage.Signature)" //WeChat Signature + }, function (res) { + + //alert(JSON.stringify(res)); + + if (res.err_msg == "get_brand_wcpay_request:ok") { + if (confirm('Payment successful! Click "OK" to enter the refund process test.')) { + location.href = '/Docs/TenPayV3/TenpayApiV3/Refund'; + } + //console.log(JSON.stringify(res)); + }else{ + alert(JSON.stringify(res)); } + } + // Using the above method to determine the front-end return, the WeChat team would like to point out that res.err_msg will return ok if the user pays successfully, but it is not guaranteed to be reliable. + // Therefore, the WeChat team suggests that when the ok return is received, the merchant back-end should be asked if it has received a notification that the transaction has been successful; if it has received a notification, the front-end should display the successful transaction interface; if it has not received a notification, the merchant back-end should take the initiative to call the Query Orders interface to query the current state of the order, and then feed back to the front-end to display the corresponding interface. + }). + + }); +``` + +> Note: WeChat Pay ApiV2 and ApiV3 have totally different difference in order interface, please pay attention if you upgrade! + +> Reference file for this project: +> +> /**_Views/TenpayApiV3/JsApi.cshtml_** + +**effect** + +![订单支付页面](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-dev-jsapi-03.jpg) + +![点击唤起支付](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-dev-jsapi-04.jpg) + +![支付成功](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-dev-jsapi-05.jpg) diff --git a/docs/guide/tenpayv3/Native_Payments.md b/docs/guide/tenpayv3/Native_Payments.md new file mode 100644 index 0000000000..4d1e068ba0 --- /dev/null +++ b/docs/guide/tenpayv3/Native_Payments.md @@ -0,0 +1,75 @@ +# Native Payments + +## Native Payment + +Native payment is used for offline (or outside of WeChat environment) payment, by scanning the QR code through WeChat, it will evoke the personal WeChat payment to complete the payment process. + +There are many controls to generate QR code, take [ZXing.Net](https://www.nuget.org/packages/ZXing.Net) as an example, create the method in `TenPayApiV3Controller`: + +```cs +/// +/// +/// NativePayCode(int productId, int hc) +{ + var products = ProductModel.GetFakeProductList(); + var product = products.FirstOrDefault(z => z.Id == productId); var product = products. + if (product == null || product.GetHashCode() ! = GetHashCode() ! + hc) { + return Content("Product information doesn't exist or was entered illegally! 2004"); + } + + // Use Native payment, output QR code and display it + MemoryStream fileStream = null; // output the URL of the image + var price = (int)(product.Price * 100); var name = product.Name + "); //Output the URL of the image. + var name = product.Name + " - WeChat Pay V3 - Native Payment"; + var sp_billno = string.Format("{0}{1}{2}", TenPayV3Info.MchId/*10 digits*/, SystemTime.Now.ToString("yyyyyMMddHHmmss"), + TenPayV3Util.BuildRandomStr(6)); var notifyUrl = TenPayV3Util. + + var notifyUrl = TenPayV3Info.TenPayV3Notify.Replace("/TenpayApiV3/", "/TenpayApiV3/"); + + TransactionsRequestData requestData = new(TenPayV3Info.AppId, TenPayV3Info.MchId, name, sp_billno, new TenpayDateTime(DateTime.Now. AddHours(1)), null, notifyUrl, null, new() { currency = "CNY", total = price }, null, null, null, null); + + BasePayApis basePayApis = new BasePayApis(); var result = await basePayApis + var result = await basePayApis.NativeAsync(requestData); + // Perform secure signature verification + if (result.VerifySignSuccess == true) + { + fileStream = QrCodeHelper.GerQrCodeStream(result.code_url); + } + else + { + fileStream = QrCodeHelper.GetTextImageStream("Native Pay failed signature verification, unable to display QR code"); + } + return File(fileStream, "image/png"); +} +``` + +> Reference file for this project: +> +> /Controllers/TenPayApiV3Controller.cs + +The above process will automatically generate the payment QR code corresponding to the specified merchant and specified product (productId), and the front-end HTML call is as follows: + +```html +Scan code to pay +``` + +After the user sweeps the code to complete the payment, WeChat server will automatically request the callback address, such as /TenpayApiV3/NativeNotifyUrl, with the following code: + +``` +//to be added +``` + +> Reference file for this project: +> +> /Controllers/TenPayApiV3Controller.cs + +> Tip: +> +> The callback address setting location for Native payment is located at: WeChat Payment Backend > Product Centre > Development Configuration > Native Payment Callback Link. +> +> ![Native 支付回调链接设置 ](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/native-setting-01.png) diff --git a/docs/guide/tenpayv3/Payment_callbacks.md b/docs/guide/tenpayv3/Payment_callbacks.md new file mode 100644 index 0000000000..da7bc2f1a0 --- /dev/null +++ b/docs/guide/tenpayv3/Payment_callbacks.md @@ -0,0 +1,65 @@ +# Payment callbacks + +## Payment Callback + +When a user completes a payment on the WeChat side, the WeChat server will actively push a notification to the application server. This message will only occur between the official WeChat server and the application server, without the user's involvement, and with additional signature checking so that it is trusted. + +> **Note: Never trust the status of the mobile client completing the payment and using this to notify the app server that the user has completed the payment!** + +Taking JsApi payment as an example, when initiating a unified payment, the callback address will be requested (`notifyUrl` parameter in `TenPayV3UnifiedorderRequestData`, see **JSAPI Payment** related note). + +> Note: The settings of the callback address may be different for different payment methods, such as "Native Payment", which is set in the admin background of WeChat Payment. + +## Define the callback entry + +```cs +/// +/// +public async Task PayNotifyUrl() +{ + async Task PayNotifyUrl() + { + /// Get the payment notification message sent asynchronously by the WeChat server. + var resHandler = new TenPayNotifyHandler(HttpContext); var orderReturnJson = await resHandler. + var orderReturnJson = await resHandler.AesGcmDecryptGetObjectAsync(); + + //Get the payment status + string trade_state = orderReturnJson.trade_state; + + //Verify that the request was sent from WeChat (secure) + NotifyReturnData returnData = new(); + + //Verify reliable payment state + if (orderReturnJson.VerifySignSuccess == true && trade_state == "SUCCESS") + { + returnData.code = "SUCCESS"; // correct order processing + /* Tip: + * 1. Until here, the transaction can be considered truly successful and database operations can be performed, but don't forget to return a message in the specified format! + * 2, the above judgement already has a relatively high level of security, but also to access the IP judgement to further strengthen the security. + * 3, the following demonstration is to send a successful payment template message prompts, non-essential. + */ + } + else + { + returnData.code = "FAILD"; // incorrect order processing + returnData.message = "Verification failed"; + + // Here you can send the user payment failure alerts, etc. + } + + return Json(returnData); + } + catch (Exception ex) + { + WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); + throw; + + } +} +``` + +> Reference file for this project: +> +> /Controllers/**_TenPayApiV3Controller.cs_** diff --git a/docs/guide/tenpayv3/Refunds.md b/docs/guide/tenpayv3/Refunds.md new file mode 100644 index 0000000000..5eb9e87ec2 --- /dev/null +++ b/docs/guide/tenpayv3/Refunds.md @@ -0,0 +1,111 @@ +# Refunds + +## Refund + +The core code for the refund method is as follows: + +```cs +/// +/// Refund request interface +/// +/// +public async Task Refund() +{ + Refund() { async Task Refund() + { + string nonceStr = TenPayV3Util.GetNoncestr(); string outTradeNo = HttpContext. + + string outTradeNo = HttpContext.Session.GetString("BillNo"); + if (!TradeNumberToTransactionId.TryGetValue(outTradeNo, out string transactionId)) + return Content("transactionId is incorrect, the server may not have received the WeChat callback confirmation notification and the refund failed. Please refresh and try again later.") ; + } + + string outRefundNo = "OutRefunNo-" + SystemTime.Now.Ticks; + int totalFee = int.Parse(HttpContext.Session.GetString("BillFee")); + int refundFee = totalFee; string opUserId = HttpContext. + string opUserId = TenPayV3Info. + var notifyUrl = "https://sdk.weixin.senparc.com/TenpayApiV3/RefundNotifyUrl"; + + var dataInfo = new RefundRequsetData(transactionId, null, outRefundNo, "Senparc TenPayV3 demo refund test", notifyUrl, null, new RefundRequsetData. Amount(refundFee, null, refundFee, "CNY"), null); var result = await _basePayV3 demo Refund Test + + var result = await _basePayApis.RefundAsync(dataInfo); + + return View(); + } + catch (Exception ex) + { + WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); + ExceptionLog(new WeixinException(ex.Message, ex)); throw; + } +} +``` + +> Reference file for this project: +> +> /Controllers/TenPayApiV3Controller.cs + +> Explanation: The above code is for demonstration purpose, and it can only refund the order that I have paid without logging in, so the BillNo (order number) exists in the Session, and it can be put into the URL or Post parameter to make the request during the actual development process, and pay attention to do a good job of permissions validation! + +## Refund callback + +In the process of calling the refund interface, there is a `notifyUrl` parameter, this address is used to receive the refund information sent by WeChat server callback information. The code is as follows: + +```cs +/// +/// +public async Task RefundNotifyUrl() +{ + WeixinTrace.SendCustomLog("RefundNotifyUrl was accessed", "IP" + HttpContext.UserHostAddress()? .ToString()); + + NotifyReturnData returnData = new(); + notifyReturnData = new(); returnData = new(); try + var notifyReturnData = new(); try + var resHandler = new TenPayNotifyHandler(HttpContext); var refundNotifyJson = new TenPayNotifyHandler(HttpContext); notifyReturnData + var refundNotifyJson = await resHandler.AesGcmDecryptGetObjectAsync(); + + WeixinTrace.SendCustomLog("Trace RefundNotifyUrl message", refundNotifyJson.ToJson()); + + string refund_status = refundNotifyJson.refund_status; + if (/*refundNotifyJson.VerifySignSuccess == true &*/ refund_status == "SUCCESS") + { + returnData.code = "SUCCESS"; + returnData.message = "OK"; + + // Get the information needed in the interface Example + string transaction_id = refundNotifyJson.transaction_id; string out_trade_no = refundNotifyJson. + string out_trade_no = refundNotifyJson.out_trade_no; string refund_id = refundNotifyJson. + string refund_id = refundNotifyJson.refund_id; string out_refund_no = refundNotifyJson. + string out_refund_no = refundNotifyJson.out_refund_no; int total_fee = refundNotifyJson. + int total_fee = refundNotifyJson.amount.payer_total; int refund_fee = refundNotifyJson.amount. + int refund_fee = refundNotifyJson.amount.refund; + + // Fill in the logic + WeixinTrace.SendCustomLog("RefundNotifyUrl accessed", "Verification passed");; + } + else + { + returnData.code = "FAILD"; + returnData.message = "Authentication Failed"; + WeixinTrace.SendCustomLog("RefundNotifyUrl was accessed", "Authentication failed"); + + } + + // Perform subsequent business processing + } + catch (Exception ex) + { + returnData.code = "FAILD"; + returnData.message = ex. + WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); + } + + //https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay3_3.shtml + return Json(returnData); +} +``` + +> Reference file for this project: +> +> /Controllers/TenPayApiV3Controller.cs diff --git a/docs/guide/tenpayv3/Registration.md b/docs/guide/tenpayv3/Registration.md new file mode 100644 index 0000000000..50ce6f942c --- /dev/null +++ b/docs/guide/tenpayv3/Registration.md @@ -0,0 +1,84 @@ +# Registration + +## Global Registration + +The registration process is similar for all Senparc.Weixin SDKs. + +First, complete the overall registration code for all Senparc.Weixin SDKs. Add the following code to Program.cs: + +![注册 Senparc.Weixin](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-dev-register-01.png) + +Instructions: + +1. `builder.Services.AddMemoryCache()` Senparc.Weixin supports various caching strategies such as local cache, Redis, Memcached, etc. Local cache is used by default. +2. `builder.Services.AddSenparcWeixinServices(builder.Configuration)` is used to complete the registration of Senparc. +3. `app.UseSenparcWeixin()` method is used to configure and enable Senparc. + +The above code is the same for all Senparc.Weixin descendant modules, only 3 lines of code are needed. + +> Reference file for this project: +> +> /**_Program.cs_** + +## Public Registration + +Insert code into the delegate method in line 27 of the above code to complete the registration of the default public number as well as Weixin payment: + +```cs + // Register public number information (can be executed multiple times to register multiple public numbers) + register.RegisterMpAccount(weixinSetting, "[Shengpai Networks Little Helper] Public No.");; //Register public number information (can be executed multiple times, register multiple public numbers) + // Register Weixin Payment (can be executed multiple times, register multiple Weixin Payments) + register.RegisterTenpayApiV3(weixinSetting, "[Shengpai Networks Little Helper] WeChat Payment (ApiV3)");; +``` + +![注册微信公众号](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-dev-register-02.png) + +> Attention: +> +> The above code registers both public number and WeChat payment (V2), because WeChat payment needs to provide the identification of WeChat user (OpenId), and OpenId must come from WeChat public number, applet and other modules. If you need to use WeChat Pay within the applet, you need to register the applet accordingly. + +The value of `weixinSetting` comes from `appsettings.json` by default: + +```json + "SenparcWeixinSetting": { + "IsDebug": true, + } + +//public +"Token": "#{Token}#", +"EncodingAESKey": "#{EncodingAESKey}#", +"WeixinAppId": "#{WeixinAppId}#", +"WeixinAppSecret": "#{WeixinAppSecret}#", + +// Weixin Pay V3 +"TenPayV3_AppId": "#{TenPayV3_AppId}#", +"TenPayV3_AppSecret": "#{TenPayV3_AppSecret}#", +"TenPayV3_SubAppId": "#{TenPayV3_SubAppId}#", +"TenPayV3_SubAppSecret": "#{TenPayV3_SubAppSecret}#", +"TenPayV3_MchId": "#{TenPayV3_MchId}#", +"TenPayV3_SubMchId": "#{TenPayV3_SubMchId}#", //Sub-merchant, leave blank if you don't have one. +"TenPayV3_Key": "#{TenPayV3_Key}#", //Sub-merchant, leave blank if you don't have one. +"TenPayV3_TenpayNotify": "#{TenPayV3_TenpayNotify}#", //http://YourDomainName/TenpayApiV3/PayNotifyUrl +/* Payment certificate private key + * 1, support plaintext private key (no newline characters) + * 2, private key file path (such as: ~/App_Data/cert/apiclient_key.pem), note: must be placed in App_Data and other protected directories, to avoid leaks + */ +"TenPayV3_PrivateKey": "#{TenPayV3_PrivateKey}#", //(new) certificate private key +"TenPayV3_SerialNumber": "#{TenPayV3_SerialNumber}#", //(new) certificate serial number +"TenPayV3_ApiV3Key": "#{TenPayV3_APIv3Key}#", //(new) APIv3 key + +``` + +![配置参数](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-dev-register-03.png) + +Where `Token`, `EncodingAESKey`, `WeixinAppId` and `WeixinAppSecret` correspond to the configuration parameters of the WeChat public backend. + +Special Note: `TenPayV3_PrivateKey` can use the already processed private key, or you can directly provide the private key file downloaded from the official website of WeChat Pay (extract the file apiclient_key.pem in the downloaded zip and copy it to the secure path, recommended `App_Data` directory), the virtual path starts from the root directory of the website. It must start with `~/`, such as `~/App_Data/cert/apiclient_key.pem`, SDK will process it fully automatically. + +> Reference file for this project: +> +> /appsettings.json + +Configuration complete. + +> Tip: The auto-registration information can be obtained via `Senparc.Weixin.Config.SenparcWeixinSetting`. diff --git a/docs/guide/tenpayv3/Source_code.md b/docs/guide/tenpayv3/Source_code.md new file mode 100644 index 0000000000..d9be8538a5 --- /dev/null +++ b/docs/guide/tenpayv3/Source_code.md @@ -0,0 +1,15 @@ +# Source code + +## Senparc.Weixin SDK source code + +GitHub: [https://github.com/JeffreySu/WeiXinMPSDK](https://github.com/JeffreySu/WeiXinMPSDK) (updated faster) + +Gitee: [https://gitee.com/JeffreySu/WeiXinMPSDK](https://gitee.com/JeffreySu/WeiXinMPSDK) (sync from GitHub) + +## Package code + +Nuget package address: [https://www.nuget.org/packages/Senparc.Weixin.TenpayV3](https://www.nuget.org/packages/Senparc.Weixin.TenpayV3) + +## Local source files + +Senparc.Weixin.TenpayV3 Source Code Location: [/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3) diff --git a/docs/guide/tenpayv3/install.md b/docs/guide/tenpayv3/install.md new file mode 100644 index 0000000000..abc3fb99e2 --- /dev/null +++ b/docs/guide/tenpayv3/install.md @@ -0,0 +1,58 @@ +# How to install? + +You can either directly reference the Senparc.Weixin source code for development, or you can reference the packaged dlls (via Nuget packages, which is recommended) to get official updates at any time. Note: You can only use either the source code or the Nuget package. + +## Referencing assemblies (recommended) + +You can install Nuget packages automatically via `Visual Studio`, `Visual Studio Code`, `dotnet command line`, and many other ways. + +### Visual Studio + +In the [Solution Explorer] of the development project, right click on the module you need to add Senparc.Weixin.TenpayV3, click [Manage Nuget Packages], enter **Senparc.Weixin.TenpayV3** in the [Browse] tab, and click the [Install] button on the right side. As shown in the picture below: + +![通过 Visual Studio 安装](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-install-01.png) + +### Visual Studio Code + +First, make sure you have installed [VS Code](https://code.visualstudio.com/) and dotnet command line (it will be installed automatically after installing [.NET SDK](https://dotnet.microsoft.com/en-us/download)). + +Then, open the solution or project directory and press Ctrl+~ to open the terminal panel: + +![通过 VS Code 安装](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-install-03.png) + +Go to the directory of the project where you need to add the module Senparc.Weixin.Tenpay and type: + +> ```cs +> dotnet add package Senparc.Weixin.TenpayV3 +> ``` + +![通过 VS Code 安装](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-install-04.png) + +After the installation is complete, you can see the corresponding .csproj file, which is being added with references such as: + +```cs + + + +``` + +### dotnet command line + +First of all, make sure that the dotnet command line is installed (it will be installed automatically after installing [.NET SDK](https://dotnet.microsoft.com/en-us/download)). + +Go to the directory of the project where you want to add the module Senparc.Weixin.TenpayV3 and enter: + +> ```cs +> dotnet add package Senparc.Weixin.TenpayV3 +> ``` + +! [Install via dotnet CLI](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-install-02.png) + +After the installation is complete, you can see the corresponding .csproj file, which is being added with references such as: + +```cs + + + + +``` diff --git a/docs/guide/work/Advanced.md b/docs/guide/work/Advanced.md new file mode 100644 index 0000000000..9426f405b6 --- /dev/null +++ b/docs/guide/work/Advanced.md @@ -0,0 +1,11 @@ +# Advanced + +The current example shows the most basic and commonly used functions, if you need to know more advanced play and have solid programming skills, please refer to the full example. + +> The full example solution file: +> +> Senparc.Weixin SDK source file root directory [/Samples/All/net7-mvc/Senparc.Weixin.Sample.Net7.sln](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/Samples/All/net7-mvc) + +> Be sure to read the readme file: +> +> Senparc.Weixin SDK source file root directory [/Samples/All/net7-mvc/readme.md](https://github.com/JeffreySu/WeiXinMPSDK/blob/master/Samples/All/net7-mvc/readme.md) diff --git a/docs/guide/work/Advanced_Interface.md b/docs/guide/work/Advanced_Interface.md new file mode 100644 index 0000000000..2a6cf0707e --- /dev/null +++ b/docs/guide/work/Advanced_Interface.md @@ -0,0 +1,69 @@ +# Advanced Interface + +After completing the usual registration in the `Program.cs` file, you can use the Advanced Interface anywhere in your programme. + +> Notes: +> +> 1. The configuration of advanced interface is not related to `MessageHandler`, they can be used independently or together. +> 2. Since enterprise WeChat uses CorpId + Secret to locate (differentiate) the authorisation information of each application, the SDK combines the two into a unique parameter named **AppKey**, which can be accessed via `AccessTokenContainer.BuildingKey(string corpId, string corpSecret)`. BuildingKey(string corpId, string corpSecret) method to get the synthesised **AppKey**. +> 3. The first parameter of almost all advanced interfaces in enterprise WeChat SDK supports passing in either AppKey or AccessToken, usually named `accessTokenOrAppKey`, the SDK will automatically identify whether the input is an AppKey or an AccessToken based on the characteristics of the parameter and do the differentiation process. + +## Calling interfaces with AppKey (recommended) + +For example, we can call a high-level interface in any of the methods: + +```cs +public async Task TryApiTryApiByAppKey() +{ + // Get the registration information + var workWeixinSetting = Config.SenparcWeixinSetting.WorkSetting; + // Get the AppKey + var appKey = AccessTokenContainer.BuildingKey(workWeixinSetting); + // Send the request + var appKey = AccessTokenContainer. + { + // Send a text reminder + var result = await Senparc.Weixin.Work.AdvancedAPIs.MassApi.SendTextAsync(appKey, "001", "This is a message from EnterpriseWeixin");; + return Content("OK"); + } + catch (ErrorJsonResultException ex) + { + return Content($"Error: {ex.Message}"); + } +} +``` + +The `workWeixinSetting` parameter must be the registered enterprise WeChat information (including CorpId and Secret), so that even if the AccessToken is expired, the SDK will process it automatically. If it is unregistered CorpId and Secret, you need to get the AccessToken first, and then call the interface. + +> Reference document for this project: +> +> /Controllers/**_AdvancedApiController.cs_** + +## Calling an interface using an AccessToken (not recommended) + +```cs +public async Task TryApiByAccessToken() +{ + // Get the registration information + var workWeixinSetting = Config.SenparcWeixinSetting.WorkSetting; + // Get the AccessToken + var accessToken = await AccessTokenContainer.GetTokenAsync(workWeixinSetting.WeixinCorpId, workWeixinSetting.WeixinCorpSecret); + //WeixinCorpSecret + workWeixinSetting.WeixinCorpSecret + { + //Send a text reminder + var result = await Senparc.Weixin.Work.AdvancedAPIs.MassApi.SendTextAsync(accessToken, "001", "This is a message from Corporate Weixin");// Send a text alert. + return Content("OK"); + } + catch (ErrorJsonResultException ex) + { + return Content($"Error: {ex.Message}"); + } +} +``` + +> Note: Calling an interface with an AccessToken does not guarantee the validity of the current AccessToken, so it is recommended to check the validity before using it, and use `try-catch` to catch an exception if the AccessToken is not available, and then retry. Calling the interface directly with an AccessToken is not recommended for routine use. + +> This project reference: +> +> /Controllers/**_AdvancedApiController.cs_** diff --git a/docs/guide/work/JSSDK_General.md b/docs/guide/work/JSSDK_General.md new file mode 100644 index 0000000000..5b4a1c08cf --- /dev/null +++ b/docs/guide/work/JSSDK_General.md @@ -0,0 +1,92 @@ +# JSSDK (General) + +JSSDK is used to provide WeChat's built-in browser interface capabilities, such as forwarding control, calling camera permissions (photo, video), file uploading, closing windows, evoking code scanning windows, and so on. + +To use the JSSDK only in the built-in browser, there are two steps: "Get signature information from server side" and "Configure JSSDK on web side". + +The web-side JSSDK configuration of enterprise WeChat is similar to that of the public website, but there is an additional configuration method named `wx.agentConfig()`. Here we introduce the regular method, `wx.agentConfig()` supporting method please see [JSSDK (agentConfig)] tag. + +## Getting signature information on the server side + +The backend can automatically get all the JSSDK parameters needed for the frontend to run by using the `JSSDKHelper.GetJsSdkUiPackageAsync()` method: + +```cs +public async Task Index() +{ + // Current URL + var url = "https://sdk.work.weixin.senparc.com/JSSDK/"; + // Get the enterprise weixin configuration + var workSetting = Senparc.Weixin.Config. + // Get the JsApiTicket (confidential information, not to be shared) + var jsApiTicket = await JsApiTicketContainer.GetTicketAsync(workSetting.WeixinCorpId, workSetting.WeixinCorpSecret, false); // Get the UI packaging information. + // Get the UI package information + var jsApiUiPackage = await JSSDKHelper.GetJsApiUiPackageAsync(workSetting.WeixinCorpId, workSetting.WeixinCorpSecret, url, jsApiTicket, false); // Get the UI packaged information. var jsApiUiPackage = await JSSDKHelper.GetJsApiUiPackageAsync(workSetting. false); + +ViewData["jsApiUiPackage"] = jsApiUiPackage; +return View(); + +} +``` + +> Reference documentation for this project: +> +> /Controllers/**_JSSDKnController.cs_** - Index() method + +## Configure JSSDK on the web side + +Parameters configured in the back-end are set directly in the front-end JS using `wx.config`, e.g. the following code will complete the forwarding of a web page from within an enterprise WeChat to a **personal WeChat**: + +```cs +$(function(){ + wx.config({ + beta: true, // must be written this way, otherwise there will be problems with the wx.invoke call form jsapi + debug: true, // enable debug mode, the return value of all api calls will be alerted on the client side, if you want to see the incoming parameters, you can open it on the pc side, and the parameter information will be typed out through the log, and it will only be printed when it is on the pc side. + appId: '@jsApiUiPackage.AppId', // mandatory, the corpID of enterprise weibo + timestamp: @jsApiUiPackage.Timestamp, // mandatory, the timestamp for signature generation + nonceStr: '@jsApiUiPackage. + signature: '@jsApiUiPackage.Signature', // mandatory, signature, see Appendix - JS-SDK Signature Algorithm for Using Permissions + jsApiList: ['shareWechatMessage'] // mandatory, a list of JS interfaces to be used, any interface to be called needs to be passed in + }); + +​ wx.checkJsApi({ +​ jsApiList: ['shareWechatMessage'], // list of JS interfaces to be checked, see Appendix 2 for a list of all JS interfaces, } +​ success: function(res) { +​ // Return as a key-value pair, true for available api values, false for unavailable ones. +​ // e.g. {"checkResult":{"chooseImage":true}, "errMsg": "checkJsApi:ok"} +​ //alert("wx.config success: "+JSON.stringify(res));; +​ } +​ }). +}); + +wx.ready(function(){ + // Config information will be validated after the execution of the ready method, all interfaces must be called after the result of the config interface, config is a client-side asynchronous operation, so if you need to call the relevant interfaces when the page is loaded, you must put the relevant interfaces in the ready function to ensure the correct implementation.For interfaces that are called only when triggered by the user, they can be called directly and do not need to be placed in the ready function. +}); + +wx.error(function(res){ + // Config information validation failure will execute the error function, such as signature expiration caused by the validation failure, the specific error message can open the debug mode of the config to view, you can also view the res parameter in the return, for SPA can be updated here signature. + console.log(res); + alert(res); +}); + +function invoke(){ + wx.invoke( + "shareWechatMessage", { + title: 'Enterprise WeChat JSSDK Demo - Forward', // Share title + desc: 'From Senparc.Weixin.Work', // share description + link: 'https://sdk.work.weixin.senparc.com/JSSDK', // Share link + imgUrl: '' // Share the cover + }, function(res) { + if (res.err_msg == "shareWechatMessage:ok") { + } + } + ); +} +``` + +HTML page to trigger: `Forward to WeChat` + +> Reference document for this project: +> +> /Views/JSSDK/**_Index.cshtml_** + +For more setting details, please refer to: [JS-SDK description document](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html). diff --git a/docs/guide/work/JSSDK_agentConfig.md b/docs/guide/work/JSSDK_agentConfig.md new file mode 100644 index 0000000000..c2a415cb47 --- /dev/null +++ b/docs/guide/work/JSSDK_agentConfig.md @@ -0,0 +1,130 @@ +# JSSDK(agentConfig) + +`wx.agentConfig()` is used for some specific interfaces (e.g. approval stream interface, clipboard interface, etc.), but generally the prerequisites need to be used first with the regular JSSDK (refer to the [JSSDK (Regular)] tag), so this is an addition. + +The `wx.agentConfig()` is also divided into two parts, server-side and client-side. + +## Server-side getting signature information + +The backend, in addition to the backend's `JSSDKHelper.GetJsSdkUiPackageAsync()` method to get the parameters needed to run the regular JSSDK, also needs to use the same method, passing in different parameters to get the corresponding parameters for `agetntConfig`: + +```cs +public async Task AgentConfig() +{ + //This demonstrates the support of multiple apps registration at the same time, please refer to appsettings.json file. + var workSetting = Senparc.Weixin.Config.SenparcWeixinSetting["Enterprise Weixin Approval"] as ISenparcWeixinSettingForWork; var workSetting = Senparc.Weixin.Config. + var url = "https://sdk.weixin.senparc.com/Work/Approval"; + + // Get the UI information package + + /* Caution: + * jsApiUiPackage is required for all applications + */ + var jsApiTicket = await JsApiTicketContainer.GetTicketAsync(workSetting.WeixinCorpId, workSetting.WeixinCorpSecret, false); + var jsApiUiPackage = await JSSDKHelper.GetJsApiUiPackageAsync(workSetting.WeixinCorpId, workSetting.WeixinCorpSecret, url, jsApiTicket, false); + ViewData["jsApiUiPackage"] = jsApiUiPackage; + + /* Notes: + * 1, here you need to use WeixinCorpAgentId, not WeixinCorpId + * 2, agentJsApiUiPackage whether need to provide, please refer to the official document, here demonstrates the most complex case + */ + ViewData["thirdNo"] = DateTime.Now.Ticks + Guid.NewGuid().ToString("n"); + ViewData["corpId"] = workSetting.WeixinCorpId; + ViewData["agentId"] = workSetting.WeixinCorpAgentId; + var agentConfigJsApiTicket = await JsApiTicketContainer.GetTicketAsync(workSetting.WeixinCorpId, workSetting.WeixinCorpSecret, true); + var agentJsApiUiPackage = await JSSDKHelper.GetJsApiUiPackageAsync(workSetting.WeixinCorpId, workSetting.WeixinCorpSecret, url, workSetting.WeixinCorpId, workSetting.WeixinCorpSecret, url, agentConfigJsApiTicket, true); + ViewData["agentJsApiUiPackage"] = agentJsApiUiPackage; + + return View(); +} +``` + +> Note: The above method uses the +> +> `Senparc.Weixin.Config.SenparcWeixinSetting["Enterprise Weixin Approval"] ` +> +> to get a different Weixin configuration from the previous one, please refer to this project's +> +> `appsetting.json` +> +> file for the setting method: +> +> ```json +> "Items": { +> // Add multiple Enterprise WeChat apps +> "Enterprise Weixin Approval": { +> "WeixinCorpId": "#{WeixinCorpId2}#", +> "WeixinCorpAgentId": "#{WeixinCorpAgentId2}#", +> "WeixinCorpSecret": "#{WeixinCorpSecret2}#", +> "WeixinCorpToken": "#{WeixinCorpToken2}#", +> "WeixinCorpEncodingAESKey": "#{WeixinCorpEncodingAESKey2}#"} +> } +> ``` +> +> This method is also common to all other modules (e.g. Public, Applet, Weixin Pay, etc.). + +> Reference file for this project: +> +> /Controllers/**_JSSDKnController.cs_** - AgentConfig() method +> +> /**_appsettings.json_** + +## Configuring the JSSDK on the web side + +In addition to the usual JSSDK configuration, the web side needs to add `wx.agentConfig()`'' configuration before executing specific JsApi methods: + +```cs +function invoke(){ + wx.agentConfig({ + corpid: '@ViewData["corpId"]', // mandatory, the corpid of the enterprise wx, must be the same as the currently logged in enterprise + agentid: '@ViewData["agentId"]', // mandatory, the application id of enterprise weibo (e.g. 1000247) + timestamp: @agentJsApiUiPackage.Timestamp + nonceStr: '@agentJsApiUiPackage.NonceStr', // Mandatory, random string to generate the signature + signature: '@agentJsApiUiPackage.Signature', // mandatory, signature, see Appendix - JS-SDK Signature Algorithm for Using Permissions + jsApiList: ['thirdPartyOpenPage'], // Required, pass in the name of the interface to be used + success: function(res) { + +​ // Callback +​ wx.invoke('thirdPartyOpenPage', { +​ "oaType": "10001",// String +​ // "templateId": "C4NxepvGj51gbkeGXHQgYRArW96WrxRinNfyCxo7N",// SYS +​ "templateId": "247bcb886d0374a0a1f749c52794ba1a_622421053",// Open +​ "thirdNo": "",// String +​ "extData": { +​ 'fieldList': [{ +​ 'title': 'Approval Type', // String "extData": { 'fieldList': [{ 'title': 'Approval Type', { +​ 'type': 'text', +​ 'value': 'Article Approval', +​ }, +​ { +​ 'title': 'Preview', +​ 'type': 'link', +​ 'value': 'https://weixin.senparc.com', +​ }] +​ } +​ }, +​ function(res) { +​ // Output the interface's callback information +​ console.log(res); +​ alert('wx.invoke result:'+JSON.stringify (res)); +​ }); +}, + fail: function(res) { // output console. +​ if(res.errMsg.indexOf('function not exist') > -1) + { +​ alert('Version too low, please upgrade') +​ } +​ else + { +​ alert('wx.invoke fail:'+JSON.stringify(res)); +​ } +​ } + }); +} +``` + +HTML page to trigger: `Click to invoke the approval process`. + +> Reference document for this project: +> +> /Views/JSSDK/**_Index.cshtml_** diff --git a/docs/guide/work/MenuSetting.md b/docs/guide/work/MenuSetting.md new file mode 100644 index 0000000000..e421c5d37c --- /dev/null +++ b/docs/guide/work/MenuSetting.md @@ -0,0 +1,77 @@ +# Menu Setting + +Custom menu is an important element of the enterprise WeChat application interface, the use of the menu is divided into **Setup** and **Use** two links. + +## Setting + +Method 1: In the background of enterprise WeChat [Application Management], in an application setting interface, [Function] area [Custom Menu] to set (without using the development mode), here is omitted. + +Method 2: Use the code to set (only need to execute once, it is recommended to put it in the administrator background and run it manually), such as: + +```cs +public async Task CreateMenuTest() +{ + ButtonGroup bg = new ButtonGroup(); + + // Click + bg.button.Add(new SingleClickButton() + { + name = "OneClick Test", + key = "OneClick", + type = MenuButtonType.click.ToString(), //This type is already set by default, this is only for demonstration purposes + }); + + //Second level menu + var subButton = new SubButton() + { + name = "Secondary Menu" + }; var subButton = new SubButton() { name = "Secondary Menu"; } + subButton.sub_button.Add(new SingleClickButton() + { + key = "SubClickRoot_Text", + name = "Return Text" + }); + subButton.sub_button.Add(new SingleViewButton() + { + url = "https://weixin.senparc.com", + name = "Url Jump" + }); + bg.button.Add(subButton); + + var workWeixinSetting = Config.SenparcWeixinSetting.WorkSetting; + var appKey = AccessTokenContainer.BuildingKey(workWeixinSetting); + int agentId; + if (!int.TryParse(workWeixinSetting.WeixinCorpAgentId, out agentId)) + { + throw new WeixinException("WeixinCorpAgentId must be an integer!") ; + } + var result = await CommonApi.CreateMenuAsync(appKey, agentId, bg); + + Assert.IsNotNull(result); + Assert.AreEqual("ok", result.errmsg); +} +``` + +## Use + +After setting up the menu, when the client clicks on the menu, the WeChat server will automatically push the response callback information to the message URL (i.e., within the MessageHandler that has been set up), just override (`override`) the corresponding method in the WorkCustomMessageHandler. For example, for the above **Method 2** menu that has already been set to take effect, when the user clicks the [Click to Test] button, we can receive and process it in the WorkCustomMessageHandler: + +```cs +public override IWorkResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage) +{ + var replyMessage = CreateResponseMessage(); + if (requestMessage.EventKey == "SubClickRoot_Text") + { + reponseMessage.Content = "You clicked the [Back to Text] button"; + } + else + { + reponseMessage.Content = "You clicked the Other Events button"; + } + return reponseMessage; +} +``` + +> Reference file for this project: +> +> /MessageHandlers/**_WorkCustomMessageHandler.cs_** diff --git a/docs/guide/work/MessageHandler.md b/docs/guide/work/MessageHandler.md new file mode 100644 index 0000000000..3484021832 --- /dev/null +++ b/docs/guide/work/MessageHandler.md @@ -0,0 +1,58 @@ +# MessageHandler + +The `MessageHandler` is used to handle messages from the enterprise WeChat dialogue window. + +The SDK has all the basic functionality needed for the developer, the developer just needs to create a custom subclass to supplement the business logic that needs to be customised. + +## Custom MessageHandler + +In the current example, we named our custom MessageHandler `WorkCustomMessageHandler`. + +> WorkCustomMessageHandler.cs Reference file for this project: +> +> /MessageHandlers/ directory +> **_WorkCustomMessageHandler.cs_** MessageHandler main file, responsible for general message handling. +> **_WorkCustomMessageContext.cs_** Custom rewrite of DefaultMpMessageContext context (optional) + +Of all the demonstrated override methods in `WorkCustomMessageHandler.cs`, only the `DefaultResponseMessage()` method is required to be overridden, and all the other `OnXxxRequest()` methods are optional, so that when the user sends a message, and the corresponding override method cannot be found, then the message will be handled by the `DefaultMpMessageContext.cs`. When the user sends a message and can't find a corresponding overridden method, the `DefaultResponseMessage()` method will be called. + +The MessageHandler has two ways of carrying the message so that it can be accessed externally (by the WeChat server) via a URL. These are the **Middleware method** (recommended) and the **Controller method**. The `WorkCustomMessageHandler` used in both ways is common, so it can be switched and coexisted at any time. + +## Middleware approach to hosting MessageHandler + +The middleware approach is the recommended and most simplified way, there is no need to create any new files, just introduce the middleware in the `Program.cs` file underneath all the Senparc.Weixin registration code after it has been executed: + +```cs +app.UseMessageHandlerForWork("/WorkAsync", WorkCustomMessageHandler.GenerateMessageHandler, options => +{ + options.AccountSettingFunc = context => Senparc.Weixin.Config.SenparcWeixinSetting; +}); +``` + +Once done, the MessageHandler can be accessed via Url **`Domain/WorkAsync`**, set to the message URL of the public backend. + +[test /WorkAsync](https://sdk.weixin.senparc.com/WorkAsync) + +> Reference document for this project: +> +> /**_Program.cs_** + +[Test /Work](https://sdk.weixin.senparc.com/Work) + +For more middleware approaches, please refer to (the same way as public use): ["Using MessageHandler Middleware in .NET Core 2.0/3.0"](https://www.cnblogs.com/szw/p/Wechat-MessageHandler-Middleware.html) (also for .NET 6.0 and above). + +## Controller approach to hosting MessageHandler + +When the middleware approach is not enough, you can use a Controller to "expand" the execution process and control or intervene more precisely at each step. + +To use Controller, you need to create 2 Actions, which correspond to WeChat background authentication (Get request) and real message push (Post request). The project example is located in WorkController.cs. + +> WorkController.cs Reference file for this project: +> +> /Controllers/**_WorkController.cs_** + +Once done, you can access the MessageHandler via Url **`Domain/Work`**, set to the message URL of the public backend. + +[Test /Work](https://sdk.weixin.senparc.com/Work) + +For more Controller methods, please refer to [Understanding MessageHandler](https://www.cnblogs.com/szw/p/3414862.html) (recommended to use the full set of asynchronous methods). diff --git a/docs/guide/work/OAuth2.0.md b/docs/guide/work/OAuth2.0.md new file mode 100644 index 0000000000..79ced12781 --- /dev/null +++ b/docs/guide/work/OAuth2.0.md @@ -0,0 +1,101 @@ +# OAuth 2.0 + +When you need to get the user's UserId, avatar, salutation and other information on the web page, you need to use OAuth 2.0 to communicate with WeChat server. + +For more information, please refer to the official document: [Web Authorisation Login](https://developer.work.weixin.qq.com/document/path/91335). + +The SDK has already encapsulated all the related processes, you just need to refer to the example for a simple 3-step configuration. + +## Step 1: Set up the login page + +In the login page, you need to set the official OAuth 2.0 request URL (called **AuthorizeUrl**) and bring the returnUrl after successful login. + +Since WeChat has two types of authorisation: **snsapi_userinfo** and **snsapi_base**, and enterprise self-built apps use **snsapi_base**, this is the method used in this example to introduce the way of obtaining **AuthorizeUrl** from **snsapi_base** (the default). This method is also compatible in all scenarios: + +```cs +public IActionResult Index(string returnUrl) +{ + // Set your own URL + var url = "https://4424-222-93-135-159.ngrok.io"; + + // This page directs the user to click on authorisation + var oauthUrl = + OAuth2Api.GetCode(_corpId, $"{url}/OAuth2/BaseCallback?returnUrl={returnUrl.UrlEncode()}", + null, null);//snsapi_base way callback address + + ViewData["UrlBase"] = oauthUrl; + ViewData["returnUrl"] = returnUrl; + + return View(); +} +``` + +The above `returnUrl` parameter is usually the URL before jumping to the login page, or it can be the URL you want the user to jump to after completing the authorisation. + +> Note: The above URL and path need to be matched to the address of your own server in the public backend (refer to the document: [Web Authorisation Login](https://developer.work.weixin.qq.com/document/path/91335)). + +> Reference document for this project: +> +> /Controllers/OAuth2Controller.cs + +## Step 2: Front-end login page setup + +The ultimate function of the login page is to direct the user to open the **AuthorizeUrl**, which can be done using a direct connection: + +```cs +Click here to test snsapi_base +``` + +> This item is a reference document: +> +> /Views/**_OAuth2/Index.cshtml_** + +## Step 3: Configure the post-login callback page + +After successful authorisation, the web page will automatically jump to the callback URL (`$"{url}/OAuth2/BaseCallback?returnUrl={returnUrl.UrlEncode()}"`) set in the first step: + +```cs +public async Task BaseCallback(string code, string returnUrl) +{ +​ if (string.IsNullOrEmpty(code)) + { +​ return Content("You have declined authorisation!") ; + } + +​try + { +​ var appKey = AccessTokenContainer.BuildingKey(_workWeixinSetting); +​ var accessToken = await AccessTokenContainer.GetTokenAsync(_corpId, _corpSecret); +​ // Get user information Test link: https://open.work.weixin.qq.com/wwopen/devtool/interface?doc_id=10019 + +​ var oauthResult = await OAuth2Api.GetUserIdAsync(accessToken, code); +​ var userId = oauthResult.UserId; +​ GetMemberResult result = await MailListApi.GetMemberAsync(appKey, userId); + +​ If (result.errcode ! = ReturnCode_Work.Request successful) +​ { +​ return Content("Error: " + result.errmsg); +​ } + +​ ViewData["returnUrl"] = returnUrl; + +​ /* Caution: + +​ \* In the actual scenario, you should jump to returnUrl instead of staying on the Callback page. + +​ \* Because when the user refreshes the URL of this page, the actual code and other parameters are invalid, and the user will get an error message. + +​ */ +​ return View(result); +​ } +​ catch (Exception ex) + { +​ return Content("Error: " + ex.Message); + } +} +``` + +In the above code, the `returnUrl` is the `returnUrl` passed to **AuthorizeUrl** in the `Index()` method in the first step, when all the operations of obtaining and saving the user's information are completed, the `returnUrl` is used to jump to the page before the login, completing the whole closed-loop login operation. + +> Reference document for this project: +> /Controllers/\*\*\*\*OAuth2Controller.cs diff --git a/docs/guide/work/Registration.md b/docs/guide/work/Registration.md new file mode 100644 index 0000000000..ba7581721a --- /dev/null +++ b/docs/guide/work/Registration.md @@ -0,0 +1,65 @@ +# Registration + +## Global Registration + +The registration process is similar for all Senparc.Weixin SDKs. + +First, complete the overall registration code for all Senparc.Weixin SDKs. Add the following code to Program.cs: + +![注册 Senparc.Weixin](https://sdk.weixin.senparc.com/Docs/Work/images/home-dev-register-01.png) + +Instructions: + +1. `builder.Services.AddMemoryCache()` Senparc.Weixin supports various caching strategies such as local cache, Redis, Memcached, etc. Local cache is used by default. +2. `builder.Services.AddSenparcWeixinServices(builder.Configuration)` is used to complete the registration of Senparc. +3. `app.UseSenparcWeixin()` method is used to configure and enable Senparc. + +The above code is the same for all Senparc.Weixin descendant modules, only 3 lines of code are needed. + +> Reference file for this project: +> +> /**_Program.cs_** + +## Enterprise Weixin + +Insert code into the delegate method in line 17 of the above code to complete the registration of the default public number: + +```cs +register.RegisterWorkAccount(weixinSetting, "[Shengpai Networks] Enterprise WeChat"); +``` + +![注册微信公众号](https://sdk.weixin.senparc.com/Docs/Work/images/home-dev-register-02.png) + +where the value of `weixinSetting` comes from `appsettings.json` by default:`json`. + +```json +"SenparcWeixinSetting": { + // The following is the SenparcWeixinSetting microsoft configuration for Senparc.Weixin + //Note: All string values may be used for dictionary indexing, so please do not leave empty strings (but you can remove the corresponding whole setting as needed)! + + // WeChat Global + "IsDebug": true, + + //The following unused parameters can be deleted, and the key will be invalidated after modification + + //Corporate Weixin + "WeixinCorpId": "#{WeixinCorpId}#", + "WeixinCorpAgentId": "#{WeixinCorpAgentId}#", + "WeixinCorpSecret": "#{WeixinCorpSecret}#", + "WeixinCorpToken": "#{WeixinCorpToken}#", + "WeixinCorpEncodingAESKey": "#{WeixinCorpEncodingAESKey}#" + + // More configuration information for other platforms can be appended +} + +``` + +Among them, `WeixinCorpId` is the **corpId** unique to each enterprise WeChat account, `WeixinCorpAgentId` and `WeixinCorpSecret` correspond to the **agentId** and **secret** of each different application, `WeixinCorpToken` and ` WeixinCorpEncodingAESKey` correspond to the configuration parameters of the backend of the current application's messaging interface. + +> Reference document for this project: +> +> /**_appsettings.json_** + +Configuration complete. + +> Tip: The auto-registration information can be obtained via `Senparc.Weixin.Config.SenparcWeixinSetting`. diff --git a/docs/guide/work/Source_code.md b/docs/guide/work/Source_code.md new file mode 100644 index 0000000000..984254dd86 --- /dev/null +++ b/docs/guide/work/Source_code.md @@ -0,0 +1,15 @@ +# Source code + +## Senparc.Weixin SDK source code + +GitHub: [github_WeiXinMPSDK](https://github.com/JeffreySu/WeiXinMPSDK) (updated faster) + +Gitee: [gitee_WeiXinMPSDK](https://gitee.com/JeffreySu/WeiXinMPSDK) (sync from GitHub) + +## Package code + +Nuget package address: [https://www.nuget.org/packages/Senparc.Weixin.Work](https://www.nuget.org/packages/Senparc.Weixin.Work) + +## Local source files + +Senparc.Weixin.Work source code location: [/src/Senparc.Weixin.Work](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/src/Senparc.Weixin.Work) diff --git a/docs/guide/work/install.md b/docs/guide/work/install.md new file mode 100644 index 0000000000..65187652b0 --- /dev/null +++ b/docs/guide/work/install.md @@ -0,0 +1,67 @@ +# How to install? + +You can either directly reference the Senparc.Weixin source code for development, or you can reference the packaged dlls (via Nuget packages, which is recommended) to get official updates at any time. Note: You can only use either the source code or the Nuget package. + +## Referencing source code + +You can reference (copy) the assemblies you need to reference in the current solution, under the **Libraries** directory, to the solution of your development environment, please note that you need to reference the dependent projects at the same time, for example, the `Senparc.Weixin` project is a dependency of all projects. + +The current example project uses a direct reference to the source code by default, which can be seen in the .csproj file: + +```cs + + + + + +``` + +## Referencing assemblies (recommended) + +You can install Nuget packages automatically via `Visual Studio`, `Visual Studio Code`, `dotnet command line`, and many other ways. + +### Visual Studio + +In the Solution Explorer of the development project, right-click the module you want to add Senparc.Weixin.Work, click Manage Nuget Packages, enter **Senparc.Weixin.Work** in the Browse tab, and click the Install button on the right side. As shown in the following figure: + +![通过 Visual Studio 安装](https://sdk.weixin.senparc.com/Docs/Work/images/home-install-01.png) + +## Visual Studio Code + +First, make sure you have installed [VS Code](https://code.visualstudio.com/) and dotnet command line (it will be installed automatically after installing [.NET SDK](https://dotnet.microsoft.com/en-us/download)). + +Then, open the directory where the solution or project is located, press Ctrl+~ to open the Terminal panel, go to the directory of the project where you need to add the module Senparc.Weixin.Work and type: + +> ```cs +> dotnet add package Senparc.Weixin.Work +> ``` + +![通过 VS Code 安装](https://sdk.weixin.senparc.com/Docs/Work/images/home-install-03.png) + +After the installation is complete, you can see the corresponding .csproj file, which has been added as a reference, for example: + +```cs + + + +``` + +## dotnet command line + +First of all, make sure that you have installed the dotnet command line (it will be installed automatically after installing the [.NET SDK](https://dotnet.microsoft.com/en-us/download)). + +Go to the directory of the project where you want to add the Senparc.Weixin.Work module and type: + +> ```cs +> dotnet add package Senparc.Weixin.Work +> ``` + +![通过 dotnet CLI 安装](https://sdk.weixin.senparc.com/Docs/Work/images/home-install-02.png) + +After the installation is complete, you can see the corresponding .csproj file, which is added with references such as: + +```cs + + + +``` diff --git a/docs/guide/wxopen/Advanced.md b/docs/guide/wxopen/Advanced.md new file mode 100644 index 0000000000..9426f405b6 --- /dev/null +++ b/docs/guide/wxopen/Advanced.md @@ -0,0 +1,11 @@ +# Advanced + +The current example shows the most basic and commonly used functions, if you need to know more advanced play and have solid programming skills, please refer to the full example. + +> The full example solution file: +> +> Senparc.Weixin SDK source file root directory [/Samples/All/net7-mvc/Senparc.Weixin.Sample.Net7.sln](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/Samples/All/net7-mvc) + +> Be sure to read the readme file: +> +> Senparc.Weixin SDK source file root directory [/Samples/All/net7-mvc/readme.md](https://github.com/JeffreySu/WeiXinMPSDK/blob/master/Samples/All/net7-mvc/readme.md) diff --git a/docs/guide/wxopen/Advanced_Interface.md b/docs/guide/wxopen/Advanced_Interface.md new file mode 100644 index 0000000000..7fe6004749 --- /dev/null +++ b/docs/guide/wxopen/Advanced_Interface.md @@ -0,0 +1,38 @@ +# Advanced Interface + +After completing the usual registration in the `Program.cs` file, you can use the Advanced Interface anywhere in your programme. + +> Notes: +> +> 1. The configuration of advanced interfaces is not related to `MessageHandler`, they can be used independently or in conjunction with each other. +> +> 2. The first parameter of almost all advanced interfaces in the SDK supports passing either AppId or AccessToken, usually named `appIdOrAccessToken`, the SDK will automatically recognise whether the input is an AppId or an AccessToken based on the characteristics of the parameter, and make a distinction between them. + +## Calling interfaces with AppId (recommended) + +For example, we can call a high-level interface in any method: + +```cs +using Senparc.Weixin.WxOpen.AdvancedAPIs; + +var appId = Senparc.Weixin.Config.SenparcWeixinSetting.WxOpenAppId; +var openId = "xxx"; var content = "This is a customer service message. +var content = "This is a customer service message. +var result = await CustomApi.SendTextAsync(appId, openId, content);// send customer service message +``` + +> The appId parameter must be registered, so that even if the AccessToken is expired, the SDK will process it automatically. If the appId is unregistered, you need to get the AccessToken first, and then call the interface. + +## Calling an interface with an AccessToken (not recommended) + +```cs +var accessToken = Senparc.Weixin.MP.CommonApi.GetTokenAsync(appId, appSecret);//get AccessToken +var openId = "xxx"; +var content = "This is a customer service message"; +var result = await CustomApi.SendTextAsync(accessToken, openId, content);//Send the customer service message +``` + +> Notes: +> +> 1. Using AccessToken to invoke an interface does not guarantee the validity of the current AccessToken, so it is recommended to check the validity before using it, and use `try-catch` to catch the exception that the AccessToken is not available, and then retry. Therefore, it is not recommended to use AccessToken to call the interface in regular cases. +> 2. Applets and public numbers use the same AccessToken fetching interface, so here we call the same method of public numbers in `Senparc.Weixin.MP` class library. Because `Senparc.Weixin.WxOpen` module already depends on `Senparc.Weixin.MP` by default, so you don't need to install MP module manually. diff --git a/docs/guide/wxopen/Applet_Request_Service.md b/docs/guide/wxopen/Applet_Request_Service.md new file mode 100644 index 0000000000..d98896091f --- /dev/null +++ b/docs/guide/wxopen/Applet_Request_Service.md @@ -0,0 +1,112 @@ +# Applet Request Service + +The applet client can use Ajax-like functionality to send requests to the server and get the response information (usually JSON). + +## Place the button that triggers the request + +After completing the basic preparations for [client-side development], on the page (e.g. **/pages/index/index.wxml**), create a button for triggering the request: + +```html + +``` + +In the above code, `type`, `class` and `hover-class` set the type, regular style and click style of the button respectively, and `bindtap="doRequest"` specifies that after clicking, it will be handled by the `doRequest()` method (function). + +> Reference documentation for this project: +> +> Senparc.Weixin.WxOpen.AppDemo/**_pages/index/index.wxml_** + +## Request server methods + +The `doRequest()` method is written in the **index.js** file: + +```js +// Handling wx.request requests +doRequest:function(){ + var that = this; + wx.request({ + url: wx.getStorageSync('domainName') + '/WxOpen/RequestData', + data: { nickName : that.data.userInfo.nickName}, + method: 'POST', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT + header: { 'content-type':'application/x-www-form-urlencoded'}, + success: function(res){ + // success + var json = res.data; + // Modal dialogue + wx.showModal({ + title: 'Received Message', + content: json.msg, showCancel:false, + showCancel:false, + success: function(res) { + if (res.confirm) { + console.log('User clicked OK') + } + } + }); + }, + fail: function() { + // fail + }, + complete: function() { + // complete + } + }) +}, +``` + +In the above code + +1. `wx.request(...) ` method is used to make a request to the server side, similar to **axios.get() / .post()** or **$.ajax()** in other JS frameworks. +2. `url` is used to specify the API address to be sent. Where `wx.getStorageSync('domainName')` is used to flexibly specify the domain name of the development or production environment (see the **app.js** file in this directory). +3. data" is used to store the data to be submitted, here we get `userInfo.nickName` from the local data centre, when the user is logged in, we can get the **WeChat nickname**, otherwise it is **undefined**. 4. +4. method` is the name of the requested method, currently POST submission is used. 5. +5. `header` is a parameter in the current request header, which can usually also be used to provide user authentication tokens in JWT mode. 6. +6. `success` is the callback after a successful response (200) to the current request. the sample code shows that after receiving the success message a modal dialogue box will pop up to show the return content. click the [OK] button. the console will output the relevant logs. +7. The "Fail" and "Finish" methods are used to handle the failed request and the unified operation after the whole request is completed respectively. + +> Reference documentation for this project: +> +> Senparc.Weixin.WxOpen.AppDemo/**_pages/index/index.js_** + +## Server-side interfaces + +The server side can use various methods that can accept requests, such as pages, Actions in MVC, Web Api, middleware, and even aspx, ashx, and so on. The above request address is used in the local environment. + +The above request address for local environment is **https://localhost:44367/WxOpen/RequestData**, we create an Action of RequestData under WxOpenController to receive the request: + +```cs +[HttpPost] +public ActionResult RequestData(string nickName) +{ + var data = new + { + msg = string.Format("Server time: {0}, Nickname: {1}", SystemTime.Now.LocalDateTime, nickName) + }; + return Json(data); +} +``` + +> Reference file for this project: +> +> /Controllers/**_WxOpenController.cs_** + +## Test + +Click the [Get Data] button: + +![发送请求](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-request-01.png) + +Since you are not currently logged in, nicknames are not available, so you can display them after logging in. + +> Tip: For login operations, see the [Login] tab. + +Click the [OK] button: + +![点击确定按钮](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-request-02.png) diff --git a/docs/guide/wxopen/Client_Development.md b/docs/guide/wxopen/Client_Development.md new file mode 100644 index 0000000000..8fc39b5405 --- /dev/null +++ b/docs/guide/wxopen/Client_Development.md @@ -0,0 +1,13 @@ +# Client development + +## Preparing for Development + +To develop the applet client (the applet interface displayed within WeChat on mobile phones), you need to use [WeChat Developer Tools](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html). + +> WeChat applet sample project reference file: +> +> Senparc.Weixin SDK source file root directory/**_Samples/WxOpen/Senparc.Weixin.WxOpen.AppDemo/_** + +The above sample project opens as shown below: + +![小程序客户端](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-client-01.png) diff --git a/docs/guide/wxopen/Get_phone_number.md b/docs/guide/wxopen/Get_phone_number.md new file mode 100644 index 0000000000..83f8e53fc9 --- /dev/null +++ b/docs/guide/wxopen/Get_phone_number.md @@ -0,0 +1,92 @@ +# Get phone number + +Note: The interface of the applet to get the mobile phone number has been upgraded, the previous way to get the mobile phone number directly in the client has been eliminated (the left side of the example [Get Mobile Phone Number] button), and the latest interface is to use the code to get the mobile phone number in the server background the right side of the example [Get Mobile Phone Number (Code)] button. + +![入口页面](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-phone-01.png) + +When the user clicks on it, the system carries out an authorisation prompt: + +![授权手机号](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-phone-02.png) + +Click the [Allow] button to get the mobile phone number by accessing the back-end interface: + +![授权手机号](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-phone-03.png) + +## Client + +Place buttons in the Index.wxml file: + +```xml + +``` + +> Reference file for this project: +> +> Senparc.Weixin.WxOpen.AppDemo/**_pages/index/index.wxml_** + +In the above code, `open-type="getPhoneNumber"` specifies the use of the current button to get the phone number, and `bindgetphonenumber="getUserPhoneNumber"` specifies that the handling method is `getUserPhoneNumber` (corresponding to the .js file) : + +```js +getUserPhoneNumber:function(e){ + wx.request({ + url: wx.getStorageSync('domainName') + '/WxOpen/GetUserPhoneNumber?code=' + e.detail.code, + success: function (res) { + // Success + var json = res.data; +​ if(!json.success){ +​ wx.showModal({ +​ title: 'Exception occurred during decryption', +​ content: json.msg, +​ showCancel: false +​ }); +​ return; +​ } +​ // Module Dialog +​ var phoneNumberData = json.phoneInfo; +​ var msg = 'Phone Number: ' + phoneNumberData.phoneNumber+ +​ 'Mobile Phone Number (without area code): ' + phoneNumberData.purePhoneNumber+ +​ '(Area code (country code)' + phoneNumberData.countryCode+ +​ 'Watermark information:' + JSON.stringify(phoneNumberData.watermark); + +​ wx.showModal({ +​ title: 'Receive server-side phone number information via code', +​ content: msg, +​ showCancel: false +​ }); +​ } +​ }) + } +``` + +When the user clicks the button and authorises the phone number, the above method will be triggered and submitted to the server backend via `e.code` provided by the `e` parameter of the **/WxOpen/GetUserPhoneNumber** address, which exchanges the user's phone number with the `code` and stores or returns it to the frontend. The modal dialogue box in the above code is for demonstration purposes only, there is no need to pop up this message again in the actual project. + +> Reference file for this project: +> Senparc.Weixin.WxOpen.AppDemo/**_/pages/index/index.js_** + +## Backend code - GetUserPhoneNumber + +```cs +public async Task GetUserPhoneNumber(string code) +{ + try + { + var result = await BusinessApi.GetUserPhoneNumberAsync(WxOpenAppId, code); + return Json(new { success = true, phoneInfo = result.phone_info }); + } + catch (Exception ex) + { + return Json(new { success = false, msg = ex.Message }); + } +} +``` + +> Reference documentation for this project: +> Controllers/**_WxOpenController.cs_** diff --git a/docs/guide/wxopen/MessageHandler.md b/docs/guide/wxopen/MessageHandler.md new file mode 100644 index 0000000000..db25ac9d86 --- /dev/null +++ b/docs/guide/wxopen/MessageHandler.md @@ -0,0 +1,56 @@ +# MessageHandler + +The `MessageHandler` is used to handle messages from the app's customer service dialogue window and other push messages from WeChat servers. + +The SDK has prepared all the basic functionality needed for the developer, the developer only needs to create a custom subclass to supplement the business logic that needs to be customised. + +## Custom MessageHandler + +In the current example, we named our custom MessageHandler `CustomWxOpenMessageHandler`. + +> CustomWxOpenMessageHandler.cs Reference file for this project: +> +> /MessageHandlers/ directory +> **_CustomWxOpenMessageHandler.cs_** MessageHandler Message Handler +> **_CustomWxOpenMessageContext.cs_** Custom rewrite of DefaultMpMessageContext context (optional) + +Of all the `override` methods demonstrated in `CustomWxOpenMessageHandler.cs`, only the `DefaultResponseMessageAsync()` method is mandatory, and all the other `OnXxxRequestAsync()` methods are optional, which is useful for handling messages sent by the user when the corresponding message cannot be found. All other `OnXxxRequestAsync()` methods are optional, when the user sends a message and can't find the corresponding overridden method, the `DefaultResponseMessageAsync()` method will be called. + +The MessageHandler has two ways of carrying the message so that it can be accessed externally (WeChat server) via URL. These are the **Middleware method** (recommended) and the **Controller method**. The `CustomWxOpenMessageHandler` used in both ways is common, so it can be switched and coexisted at any time. + +## Middleware way to host MessageHandler + +The middleware approach is the recommended and simplest way, no need to create any new files, just introduce the middleware in the `Program.cs` file underneath all Senparc.Weixin registration code after execution: + +```cs +app.UseMessageHandlerForWxOpen("/WxOpenAsync", CustomWxOpenMessageHandler.GenerateMessageHandler, options => +{ + options.AccountSettingFunc = context => Senparc.Weixin.Config.SenparcWeixinSetting; +}); +``` + +Once done, the MessageHandler can be accessed via Url **`Domain/WxOpenAsync`**, set to the message URL of the public backend. + +[test /WxOpenAsync](https://sdk.weixin.senparc.com/WxOpenAsync) + +> Reference document for this project: +> +> /**_Program.cs_** + +For more middleware approaches, please refer to: ["Using MessageHandler Middleware in .NET Core 2.0/3.0"](https://www.cnblogs.com/szw/p/Wechat-MessageHandler-Middleware.html) (also available for . 6.0 and above, same usage as public). + +## Controller approach to hosting MessageHandler + +When the middleware approach can't satisfy your needs, you can use a Controller to "expand" the execution process and control or intervene more precisely at each step of the execution. + +To use Controller, you need to create 2 Actions (both with ActionName `Index`), which correspond to WeChat background authentication (Get request) and real message push (Post request). The project example is located in WxOpenController.cs. + +> WxOpenController.cs Reference file for this project: +> +> /**_Controllers/WxOpenController.cs_** + +Once done, the MessageHandler can be accessed via Url **`Domain/WxOpen`**, set to the message URL of the public backend. + +[Test /WxOpen](https://sdk.weixin.senparc.com/WxOpen) + +For more Controller methods, please refer to: ["Understanding MessageHandler"](https://www.cnblogs.com/szw/p/3414862.html) (recommended to use the full set of asynchronous methods, the basic usage is the same as that of the public number) diff --git a/docs/guide/wxopen/Other.md b/docs/guide/wxopen/Other.md new file mode 100644 index 0000000000..4277314046 --- /dev/null +++ b/docs/guide/wxopen/Other.md @@ -0,0 +1,19 @@ +# Other + +For more interface usage, please refer to the method in [Get Mobile Number], refer to the client (.wxml, .js) and backend (WxController.cs) files, the usage is almost the same. + +> Backend reference file for this project: +> +> /Controllers/**_WxOpenController.cs_** +> +> Client-side reference file: +> +> Senparc.Weixin.WxOpen.AppDemo/**_app.js_** - Global Methods +> +> Senparc.Weixin.WxOpen.AppDemo/**_pages/index_** - Home page files. +> +> Senparc.Weixin.WxOpen.AppDemo/**_pages/Login_** - Login page files +> +> Senparc.Weixin.WxOpen.AppDemo/**_pages/QrCode_** - Get QR Code file +> +> Senparc.Weixin.WxOpen.AppDemo/**_pages/websocket_signalr_** - WebSocket files (advanced) diff --git a/docs/guide/wxopen/Registration.md b/docs/guide/wxopen/Registration.md new file mode 100644 index 0000000000..e8afd95851 --- /dev/null +++ b/docs/guide/wxopen/Registration.md @@ -0,0 +1,58 @@ +# Registration + +## Global Registration + +The registration process is similar for all Senparc.Weixin SDKs. + +First, complete the overall registration code for all Senparc.Weixin SDKs. Add the following code to Program.cs: + +![注册 Senparc.Weixin](https://sdk.weixin.senparc.com/Docs/WxOpen/images/home-dev-register-01.png) + +Instructions: + +1. `builder.Services.AddMemoryCache()` Senparc.Weixin supports various caching strategies such as local cache, Redis, Memcached, etc. Local cache is used by default. +2. `builder.Services.AddSenparcWeixinServices(builder.Configuration)` is used to complete the registration of Senparc. +3. `app.UseSenparcWeixin()` method is used to configure and enable Senparc. + +The above code is the same for all Senparc.Weixin descendant modules, only 3 lines of code are needed. + +> Reference file for this project: +> +> /**_Program.cs_** + +## Public Registration + +Insert code into the delegate method in line 17 of the above code to complete the registration of the default public number: + +```cs +register.RegisterWxOpenAccount(weixinSetting, "[Shengpai Networks Little Helper] applet"); +``` + +![注册微信公众号](https://sdk.weixin.senparc.com/Docs/WxOpen/images/home-dev-register-02.png) + +where the value of `weixinSetting` comes from `appsettings.json` by default: + +```js + + "SenparcWeixinSetting": { + "IsDebug": true, + + // Applet. + "WxOpenAppId": "#{WxOpenAppId}#", + "WxOpenAppSecret": "#{WxOpenAppSecret}#", + "WxOpenToken": "#{WxOpenToken}#", + "WxOpenEncodingAESKey": "#{WxOpenEncodingAESKey}#" + } +``` + +![配置参数](https://sdk.weixin.senparc.com/Docs/WxOpen/images/home-dev-register-03.png) + +Where `WxOpenToken`, `WxOpenEncodingAESKey`, `WxOpenAppId` and `WxOpenAppSecret` correspond to the configuration parameters of the WeChat public backend. + +> Reference document for this project: +> +> /**_appsettings.json_** + +Configuration is complete. + +> Tip: The information of auto-registration can be obtained by `Senparc.Weixin.Config.SenparcWeixinSetting`. diff --git a/docs/guide/wxopen/Sign_in.md b/docs/guide/wxopen/Sign_in.md new file mode 100644 index 0000000000..14614d12b5 --- /dev/null +++ b/docs/guide/wxopen/Sign_in.md @@ -0,0 +1,318 @@ +# Sign in + +## Introduction + +Most applets need to identify the user's identity (OpenId) and obtain the user's avatar, nickname and other information to provide user identification, personalised information display services. In this case, it is necessary to use the applet login interface. + +## Client - enter the login page + +User login is initiated on the applet side. Generally speaking, a separate page can be made for placing instructions and login buttons. Firstly, an entry button is placed on the entry page: + +```cs + +``` + +Clicking the button triggers the `getUserInfo()` method in the .js file: + +```js + getUserInfo: function(){ + wx.navigateTo({ + url: '../Login/Login', + }) + } +``` + +This button will direct the page to a separate Login page. + +![跳转到登录页](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-login-01.png) + +> Reference files for this project: Senparc.Weixin.WxOpen.AppDemo/**_pages/index/index.wxml_** Senparc.Weixin.WxOpen.AppDemo/**_pages/index/index.js_** + +## Client - Login Page + +The login page contains the system login display, privacy agreement, etc., and includes a button that triggers the final applet client login event: + +```xml + + + Hello,, + The current applet is a functional experience applet for Senparc.Weixin SDK, including subscription messages, get user authorisation information, mobile phone number, WebSocket, customer service messages and other demo content, most of the content needs to be authorised to carry out, click on the [Get Avatar Nickname] button for authorisation in order to enter the test page. + If you do not wish to authorise, please simply close this page. + + +``` + +![登录页面](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-login-02.png) + +> Reference documents for this item: +> +> Senparc.Weixin.WxOpen.AppDemo/**_pages/Login/Login.wxml_** + +The [Get Avatar Nickname] button binds the method `getUserInfo()`, which is added in **Login.js**: + +```js +var app = getApp() +getUserInfo: function (e) { + var that = this; + app.getUserInfo(e, function(userInfo){ + app.globalData.userInfo = userInfo + that.setData({ + userInfo: userInfo, hasUserInfo: userInfo, hasUserInfo. + hasUserInfo: true + }); + wx.navigateTo({ + url: '... /index/index', + }) + }); + } +``` + +> Reference file for this project: +> +> Senparc.Weixin.WxOpen.AppDemo/**_pages/Login/Login.js_** + +In the above code, global methods are introduced using `var app = getApp()` (the code is in the root directory **app.js**), where the `app.getUserInfo()` method code is as follows (in order to be closer to the actual usage scenarios, we show **Login** + **GetUserInfo** in a coherent code): + +```js +getUserInfo:function(cb,callback){ + var that = this + if(this.globalData.userInfo){ + typeof cb == "function" && cb(this.globalData.userInfo) + }else{ + // Get the userInfo and check it. + console.log('Preparing to call wx.getUserProfile'); + wx.getUserProfile({ + desc: 'Used to complete member profile', // Declare the use of the user's personal information after obtaining it, which will be displayed in a popup window later, please fill in with caution + success: function (userInfoRes) { + console.log('getUserProfile', userInfoRes); + that.globalData.userInfo = userInfoRes.userInfo + typeof cb == "function" && cb(that.globalData.userInfo) + typeof callback == "function" && callback(userInfoRes.userInfo) + + // Call the login interface + wx.login({ + success: function (res) { + // swap openid & session_key + wx.request({ + url: wx.getStorageSync('domainName') + '/WxOpen/OnLogin', + method: 'POST', + header: { 'content-type': 'application/x-www-form-urlencoded' } + data: { + code: res.code + }, success:function(json) + success:function(json){ + console.log('wx.login - request-/WxOpen/OnLogin Result:', json); + var result = json.data; + if(result.success) + { + wx.setStorageSync('sessionId', result.sessionId); + // Checksum + wx.request({ + url: wx.getStorageSync('domainName') + '/WxOpen/CheckWxOpenSignature', + method: 'POST', + header: { 'content-type': 'application/x-www-form-urlencoded' } + data: { + sessionId: result.sessionId,//wx.getStorageSync('sessionId'), + rawData:userInfoRes.rawData, + signature:userInfoRes.signature + }, + success:function(json){ + console.log(json.data); + if(!json.data.success){ + alert(json.data.msg); + } + } + }); + + // decrypt the data (recommended to be put in the checksum success callback function, here for demonstration only) + wx.request({ + url: wx.getStorageSync('domainName') + '/WxOpen/DecodeEncryptedData', + method: 'POST', + header: { 'content-type': 'application/x-www-form-urlencoded' } + data: { + 'type': "userInfo" + sessionId: result.sessionId,//wx.getStorageSync('sessionId'), + encryptedData: userInfoRes.encryptedData, + iv: userInfoRes.iv + }, + success:function(json){ + console.log('Data decrypted:', json.data); + } + }); + }else{ + console.log('Storing session failed!' , json); + } + } + }) + } + }) + } + }); + } + } +``` + +> The above code is the core code of the entire WeChat login client. + +Among them: + +1. `wx.getUserProfile` is used to invoke the interface to get user information, which is not directly related to the login behaviour itself, but in order to ensure the correctness of the user information, the encrypted information will be used in the subsequent callbacks after the successful login to get the real user information, and therefore needs to be triggered first. + +2. `wx.login` is the login interface of the applet client, where `success` is the callback function after login. In the callback function, we use `wx.request` to send a request to the server-side **/WxOpen/OnLogin** address with the `success` callback parameter `res.code`, which will be used to exchange `code` for a `session_key` using the server-side API and stored on the server-side. At the same time, a temporary user identity token, `SessionId`, is generated and returned to the client. + After successful callback, use `wx.setStorageSync('sessionId', result.sessionId);` to store the received `SessionId` in the local cache. 3. + +3. Although `userInfoRes.rawData` has provided the user information in plaintext, it does not ensure that it is secure (untampered with or complete), so a request needs to be sent to the server to verify its authenticity. + + Continue to use the `wx.request` method to request the **/WxOpen/CheckWxOpenSignature** address, sending the `sessionId` as well as the `userInfoRes.rawData` and `userInfoRes.signature` obtained in step 1, to verify the information's authenticity. After passing the validation, you can use `rawData` directly in the client. + + > Note: Some developers will send the validated `rawData` to the server for safekeeping and consider it valid, **this is a risky practice and should be discarded**, the correct practice is to send `userInfoRes.encryptedData` to the server in the following way (**/WxOpen/DecodeEncryptedData**) as described in the code above. encryptedData`to the server. Because: firstly, there is no way to ensure that`rawData` has not been tampered with from the time it is successfully verified to the time it is sent to the server in plaintext; secondly, the transmission of sensitive user information in plaintext is vulnerable to eavesdropping and stealing, and this practice itself should not appear anywhere in the entire project. + +4. After authenticity (signature) verification, continue to use `wx.request` to request the server's **/WxOpen/DecodeEncryptedData** address, sending the `sessionId` and the `userInfoRes.encryptedData` and `userInfoRes.encryptedData` you got in step 1, and `userInfoRes.encryptedData`. userInfoRes.iv`, the server side will decrypt `encryptedData` to get the user information and store it. + +> Reference document for this project: +> +> Senparc.Weixin.**_WxOpen.AppDemo/app.js_** + +## Server Side - OnLogin + +The server side **/WxOpen/OnLogin** code is as follows: + +```cs +[HttpPost] +public ActionResult OnLogin(string code) + { + try + { + var jsonResult = SnsApi.JsCode2Json(WxOpenAppId, WxOpenAppSecret, code); + if (jsonResult.errcode == ReturnCode.Request Success) + { + //Session["WxOpenUser"] = jsonResult; //Use Session to save login information (not recommended) + // Use SessionContainer to manage login information (recommended) + var unionId = ""; + var sessionBag = SessionContainer.UpdateSession(null, jsonResult.openid, jsonResult.session_key, unionId); + + // Note: SessionKey is sensitive information in production environments and cannot be transferred! + return Json(new { success = true, msg = "OK", sessionId = sessionBag.Key, sessionKey = sessionBag.SessionKey/* This parameter must not be exposed to the client! This parameter must not be exposed to the client! */ }); + } + else { + return Json(new { success = false, msg = jsonResult.errmsg }); + } + } + catch (Exception ex) + { + return Json(new { success = false, msg = ex.Message }); + } +} +``` + +> Special note: `SessionKey` is very sensitive information, the above code is just for demonstration, to prove to the client that it has been generated, and should not be passed to the client during actual development! + +> Reference files for this project: +> +> /Controllers/**_WxOpenController.cs_** + +## Server-side - CheckWxOpenSignature + +Server-side **_/WxOpen/CheckWxOpenSignature_** The code is as follows: + +```cs +[HttpPost] +public ActionResult CheckWxOpenSignature(string sessionId, string rawData, string signature) +{ + try + { + var checkSuccess = Senparc.Weixin.WxOpen.Helpers.EncryptHelper.CheckSignature(sessionId, rawData, signature); + return Json(new { success = checkSuccess, msg = checkSuccess ? "Signature check success" : "Signature check failure" }); + } + catch (Exception ex) + { + return Json(new { success = false, msg = ex.Message }); + } +} +``` + +> Reference file for this project: +> +> /Controllers/**_WxOpenController.cs_** + +## Server-side - DecodeEncryptedData + +Server Side **/WxOpen/DecodeEncryptedData** The code is as follows: + +```cs +public async Task DecodeEncryptedData(string type, string sessionId, string encryptedData, string iv) +{ + DecodeEntityBase decodedEntity = null; + + try + { + switch (type.ToUpper()) + { + case "USERINFO"://wx.getUserInfo() + decodedEntity = EncryptHelper.DecodeUserInfoBySessionId( + sessionId, + encryptedData, iv); + break; + default: + break; + } + } + catch (Exception ex) + { + WeixinTrace.SendCustomLog("EncryptHelper.DecodeUserInfoBySessionId method error", $@"sessionId: {sessionId} +encryptedData: {encryptedData} +iv: {iv} +sessionKey: { (await SessionContainer. +CheckRegisteredAsync(sessionId) + ? (await SessionContainer.GetSessionAsync(sessionId)).SessionKey + : "Unsaved sessionId")} + +Exception Message: +{ex.ToString()} +"); + } + + // checkWatermark + var checkWatermark = false; + if (decodedEntity ! = null) + { + checkWatermark = decodedEntity.CheckWatermark(WxOpenAppId); + + // save user information (optional) + if (checkWatermark && decodedEntity is DecodedUserInfo decodedUserInfo) + { + var sessionBag = await SessionContainer.GetSessionAsync(sessionId); + if (sessionBag != null) + { + await SessionContainer.AddDecodedUserInfoAsync(sessionBag, decodedUserInfo); + } + } + } + + // Note: This is a demo only, please do not pass sensitive information to the client! + return Json(new + { + success = checkWatermark, //decodedEntity = decodedEntity, } + //decodedEntity = decodedEntity, + msg = $"Watermark verification: {(checkWatermark ? "Passed" : "Failed")}" + }); +} +``` + +> Reference file for this project: +> +> /Controllers/**_WxOpenController.cs_** + +## Finish + +After completing the code, run the server-side program and the applet client, click the [Get Avatar Nickname] button in the client, enter the login page, click the [Get Avatar Nickname] button, and you can see the pop-up system to confirm the authorization dialogue window: + +![授权界面](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-login-03.png) + +Click the [Allow] button, you can automatically complete the entire automatic login, user information capture process: + +![完成登录和用户信息获取](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-login-04.png) + +At this time, click the [Get Data] button again, you can see the user information that has been captured: + +![用户信息](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-login-05.png) diff --git a/docs/guide/wxopen/Source_code.md b/docs/guide/wxopen/Source_code.md new file mode 100644 index 0000000000..f2e1deb718 --- /dev/null +++ b/docs/guide/wxopen/Source_code.md @@ -0,0 +1,15 @@ +# Source code + +## Senparc.Weixin SDK source code + +GitHub: [https://github.com/JeffreySu/WeiXinMPSDK](https://github.com/JeffreySu/WeiXinMPSDK) (updated faster) + +Gitee: [https://gitee.com/JeffreySu/WeiXinMPSDK](https://gitee.com/JeffreySu/WeiXinMPSDK) (sync from GitHub) + +## Package code + +Nuget package address: [https://www.nuget.org/packages/Senparc.Weixin.WxOpen](https://www.nuget.org/packages/Senparc.Weixin.WxOpen) + +## Local source files + +Senparc.Weixin.WxOpen source code location: [/src/Senparc.Weixin.WxOpen](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/src/Senparc.Weixin.WxOpen) diff --git a/docs/guide/wxopen/install.md b/docs/guide/wxopen/install.md new file mode 100644 index 0000000000..14848da238 --- /dev/null +++ b/docs/guide/wxopen/install.md @@ -0,0 +1,70 @@ +# How to install? + +You can either directly reference the Senparc.Weixin source code for development, or you can reference the packaged dlls (via Nuget packages, recommended) to get official updates at any time. Note: You can only use either the source code or the Nuget package. + +## Referencing the source code + +You can open **. /All/net6-mvc/** before the solution (full advanced example), in the **Libraries** directory, will need to refer to the reference assembly reference (copy) to your development environment in the solution, please note that you need to refer to dependent projects at the same time, such as `Senparc.Weixin` project is all the projects need to rely on. + +The current example project uses a direct reference to the source code by default, which can be seen in the .csproj file: + +```cs + + + + +``` + +## Referencing assemblies (recommended) + +You can install Nuget packages automatically via `Visual Studio`, `Visual Studio Code`, `dotnet command line`, and many other ways. + +### Visual Studio + +In the [Solution Explorer] of the development project, right-click on the module you need to add Senparc.Weixin.WxOpen, click [Manage Nuget Packages], enter **Senparc.Weixin.TenPay** in the [Browse] tab, and click the [Install] button on the right side. As shown in the picture below: + +![通过 Visual Studio 安装](https://sdk.weixin.senparc.com/Docs/WxOpen/images/home-install-01.png) + +### Visual Studio Code + +First, make sure you have installed [VS Code](https://code.visualstudio.com/) and dotnet command line (it will be installed automatically after installing [.NET SDK](https://dotnet.microsoft.com/en-us/download)). + +Then, open the solution or project directory and press Ctrl+~ to open the terminal panel: + +![通过 VS Code 安装](https://sdk.weixin.senparc.com/Docs/WxOpen/images/home-install-03.png "打开 VS Code 终端面板") + +Go to the directory of the project where you need to add the module Senparc.Weixin.WxOpen and type: + +> ```cs +> dotnet add package Senparc.Weixin.WxOpen +> ``` + +![通过 VS Code 安装](https://sdk.weixin.senparc.com/Docs/WxOpen/images/home-install-04.png "安装 Senparc.Weixin.WxOpen 模块") + +After the installation is complete, you can see the corresponding .csproj file, being added references such as: + +```cs + + + +``` + +### dotnet command line + +First of all, make sure that the dotnet command line is installed (it will be installed automatically after installing the [.NET SDK](https://dotnet.microsoft.com/en-us/download)). + +Go to the directory of the project where you want to add the Senparc.Weixin.WxOpen module and type: + +> ```cs +> dotnet add package Senparc.Weixin.WxOpen +> ``` + +![通过 dotnet CLI 安装](https://sdk.weixin.senparc.com/Docs/WxOpen/images/home-install-02.png "通过 dotnet CLI 安装") + +After the installation is complete, you can see the corresponding .csproj file that was added with a reference such as: + +```cs + + + +``` diff --git a/docs/zh/README.md b/docs/zh/README.md new file mode 100644 index 0000000000..71a909af89 --- /dev/null +++ b/docs/zh/README.md @@ -0,0 +1,19 @@ +--- +home: true +heroImage: /icon.jpg +heroText: JeffreySu/WeiXinMPSDK +tagline: 轻松打造微信各平台的扩展应用 +actionText: 快速上手 → +actionLink: /zh/guide/ +features: +- title: 应用广泛 + details: 目前使用率最高的微信 .NET SDK。 +- title: 多平台 + details: 微信公众号、小程序、微信支付V2/V3、JS-SDK、开放平台、企业号、企业微信…… +- title: 可扩展 + details: Senparc.Weixin SDK 扩展组件用于提供缓存、WebSocket 等一系列扩展模块。 +--- + +::: slot footer +Apache License Version 2.0 | Copyright © 2006-present [JeffreySu/WeiXinMPSDK](https://github.com/JeffreySu/WeiXinMPSDK) +::: diff --git a/docs/zh/dynamic-webapi/index.md b/docs/zh/dynamic-webapi/index.md new file mode 100644 index 0000000000..347066c468 --- /dev/null +++ b/docs/zh/dynamic-webapi/index.md @@ -0,0 +1 @@ +# 动态webapi diff --git a/docs/zh/guide/MP/JSSDK.md b/docs/zh/guide/MP/JSSDK.md new file mode 100644 index 0000000000..01c6a5d703 --- /dev/null +++ b/docs/zh/guide/MP/JSSDK.md @@ -0,0 +1,87 @@ +# JSSDK + +JSSDK 用于提供微信内置浏览器接口的能力,例如转发控制、调用摄像头权限(拍照、视频)、文件上传、关闭窗口、唤起扫码窗口,等等。 + +要在内置浏览器中只用 JSSDK,分为“服务端获取签名信息”和“网页端配置 JSSDK”两步。 + +## 服务端获取签名信息 + +后端通过 `JSSDKHelper.GetJsSdkUiPackageAsync()` 方法即可自动获取前端所需的所有 JSSDK 运行所需参数: + +```cs +public async Task Index() +{ + var jssdkUiPackage = await JSSDKHelper.GetJsSdkUiPackageAsync(appId, appSecret, Request.AbsoluteUri()); + return View(jssdkUiPackage); +} +``` + +> 本项目参考文件: +> +> /Controllers/**_WeixiJSSDKnController.cs_** + +## 网页端配置 JSSDK + +后端配置完成的参数,直接在前端 JS 中使用 `wx.config` 进行设置,例如以下代码将完成在转发网页时自定义转发消息的标题和图片: + +```js +wx.config({ + debug: false, // 开启调试模式 + appId: "@Model.AppId", // 必填,公众号的唯一标识 + timestamp: "@Model.Timestamp", // 必填,生成签名的时间戳 + nonceStr: "@Model.NonceStr", // 必填,生成签名的随机串 + signature: "@Model.Signature", // 必填,签名 + jsApiList: ["checkJsApi", "onMenuShareTimeline", "onMenuShareAppMessage"], +}); + +wx.error(function (res) { + console.log(res); + alert("验证失败"); +}); + +wx.ready(function () { + var url = "https://sdk.weixin.senparc.com"; + var link = url + ""; + var imgUrl = url + "/images/v2/ewm_01.png"; + + //转发到朋友圈 + wx.onMenuShareTimeline({ + title: "JSSDK朋友圈转发测试", + link: link, + imgUrl: imgUrl, + success: function () { + alert("转发成功!"); + }, + cancel: function () { + alert("转发失败!"); + }, + }); + //转发给朋友 + wx.onMenuShareAppMessage({ + title: "JSSDK朋友圈转发测试", + desc: "转发给朋友", + link: link, + imgUrl: imgUrl, + type: "link", + dataUrl: "", + success: function () { + alert("转发成功!"); + }, + cancel: function () { + alert("转发失败!"); + }, + }); +}); +``` + +> 提示:在 MVC 中传递 ViewModel 需要在 .cshtml 文件顶部定义: +> +> ```cs +> @model Senparc.Weixin.MP.Helpers.JsSdkUiPackage +> ``` + +> 本项目参考文件: +> +> /Views/WeixinJSSDK/**_Index.cshtml_** + +更多设置详情请参考:[JS-SDK 说明文档](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html)。 diff --git a/docs/zh/guide/MP/MessageHandler.md b/docs/zh/guide/MP/MessageHandler.md new file mode 100644 index 0000000000..b4bdbe9bb9 --- /dev/null +++ b/docs/zh/guide/MP/MessageHandler.md @@ -0,0 +1,58 @@ +# MessageHandler + +`MessageHandler` 用于处理微信公众号对话窗口的消息。 + +SDK 已经为开发者准备好了所有需要的基础功能,开发者只需要创建一个自定义的子类,补充需要自定义的业务逻辑。 + +## 自定义 MessageHandler + +当前示例中,我们给自定义的 MessageHandler 取名 `CustomMessageHandler`。 + +> **CustomMessageHandler.cs 本项目参考文件:** +> +> /MessageHandlers/ 目录 +> **_CustomMessageHandler.cs_** MessageHandler 主文件 + 普通消息处理 +> **_CustomMessageHandler_Events.cs_** MessageHandler 事件消息处理 +> **_CustomMessageContext.cs_** 自定义重写 DefaultMpMessageContext 上下文(可选) + +`CustomMessageHandler*.cs` 中所有演示的重写(`override`)方法中,只有 `DefaultResponseMessage()` 方法是必须重写的,其他所有 `OnXxxRequest()` 方法都为可选,当用户发送的消息,找不到对应重写方法时,则调用 `DefaultResponseMessage()` 方法。 + +MessageHandler 有两种承载方式,使其可以被外部(微信服务器)通过 URL 访问到。分别是**中间件方式**(推荐)和 **Controller 方式**。两种方式所使用的 `CustomMessageHandler` 是通用的,因此可以随时切换和共存。 + +## 中间件方式承载 MessageHandler + +中间件方式是推荐的方式,也是最简化的方式,无需创建任何新文件,只需在 `Program.cs` 文件所有 Senparc.Weixin 注册代码执行后的下方,引入中间件: + +```cs +app.UseMessageHandlerForMp("/WeixinAsync", CustomMessageHandler.GenerateMessageHandler, options => +{ + options.AccountSettingFunc = context => Senparc.Weixin.Config.SenparcWeixinSetting; +}); + +``` + +完成后,即可通过 Url **`域名/WeixinAsync`** 访问 MessageHandler,设置为公众号后台的消息 URL。 + +[测试 /WeixinAsync](https://sdk.weixin.senparc.com/WeixinAsync) + +> 本项目参考文件: +> +> /**_Program.cs_** + +更多中间件方式请参考:[《在 .NET Core 2.0/3.0 中使用 MessageHandler 中间件》](https://www.cnblogs.com/szw/p/Wechat-MessageHandler-Middleware.html)(同样适用于 .NET 6.0 及以上)。 + +## Controller 方式承载 MessageHandler + +当中间件的方式满足不了需求时,可以使用 Controller 将执行过程“展开”,对每一步执行进行更加精确的控制或干预。 + +使用 Controller 方式,需要创建 2 个 Action,分别对应微信后台验证(Get 请求),以及真实消息推送(Post 请求)。本项目示例位于 `WeixinController.cs`中。 + +> WeixinController.cs 本项目参考文件: +> +> /**_Controllers/WeixinController.cs_** + +完成后,即可通过 Url **`域名/Weixin`** 访问 MessageHandler,设置为公众号后台的消息 URL。 + +[测试 /Weixin](https://sdk.weixin.senparc.com/Weixin) + +更多 Controller 方式请参考:[《了解 MessageHandler》](https://www.cnblogs.com/szw/p/3414862.html)(推荐使用全套异步方法) diff --git a/docs/zh/guide/MP/OAuth2.0.md b/docs/zh/guide/MP/OAuth2.0.md new file mode 100644 index 0000000000..8f525bbb26 --- /dev/null +++ b/docs/zh/guide/MP/OAuth2.0.md @@ -0,0 +1,113 @@ +# OAuth 2.0 + +当你需要在网页上获取用户的 OpenId、头像、昵称等信息的时候,就需要使用 OAuth 2.0 的方式和微信服务器通讯。 + +更多信息请参考官方文档:[网页授权](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#4)。 + +SDK 已经封装了所有相关的过程,您只需要参考示例进行简单的 3 步配置即可。 + +## 第一步:设置登录页面 + +登录页面中需要设置官方 OAuth 2.0 的请求 URL(称为 **AuthorizeUrl**),并带上登录成功后的 returnUrl。 + +由于微信授权具有两种方式(**snsapi_userinfo** 和 **snsapi_base**,下方代码直接提供了两种获取 **AuthorizeUrl** 的方式: + +```cs +public ActionResult Index(string returnUrl) +{ + ViewData["returnUrl"] = returnUrl; + + //此页面引导用户点击授权 + ViewData["UrlUserInfo"] = + OAuthApi.GetAuthorizeUrl(appId, + "http://sdk.weixin.senparc.com/oauth2/UserInfoCallback?returnUrl=" + returnUrl.UrlEncode(), + null, OAuthScope.snsapi_userinfo);//snsapi_userinfo方式回调地址 + + ViewData["UrlBase"] = + OAuthApi.GetAuthorizeUrl(appId, + "http://sdk.weixin.senparc.com/oauth2/BaseCallback?returnUrl=" + returnUrl.UrlEncode(), + null, OAuthScope.snsapi_base);//snsapi_base方式回调地址 + return View(); +} +``` + +上述 `returnUrl` 参数一般为跳转到登陆页面之前的 URL,也可以是希望用户完成授权之后跳转到的 URL。 + +> 注意:上述的网址和路径需要在公众号后台匹配成你自己服务器的地址(参考文档:[网页授权](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#4))。 + +> 本项目参考文件: +> +> /Controllers/**_OAuth2Controller.cs_** + +## 第二步:前端登录页面设置 + +登录页面最终的功能是引导用户打开 **AuthorizeUrl**,可以直接使用连接的方式: + +```cs + +点击这里测试snsapi_userinfo + + +点击这里测试snsapi_userinfo +``` + +> 本项目参考文件: +> +> /Views/OAuth2/**_Index.cshtml_** + +## 第三步:配置登陆后回调页面 + +授权成功后,网页将自动跳转到第一步中设置的回调 URL(`"http://sdk.weixin.senparc.com/oauth2/UserInfoCallback?returnUrl=" + returnUrl.UrlEncode()`),以 **UserInfoCallback** 为例: + +```cs +public ActionResult UserInfoCallback(string code, string returnUrl) +{ + if (string.IsNullOrEmpty(code)) + { + return Content("您拒绝了授权!"); + } + + OAuthAccessTokenResult result = null; + + //通过,用code换取access_token + try + { + result = OAuthApi.GetAccessToken(appId, appSecret, code); + } + catch (Exception ex) + { + return Content(ex.Message); + } + if (result.errcode != ReturnCode.请求成功) + { + return Content("错误:" + result.errmsg); + } + + //下面2个数据也可以自己封装成一个类,储存在数据库中(建议结合缓存) + //如果可以确保安全,可以将access_token存入用户的cookie中,每一个人的access_token是不一样的 + HttpContext.Session.SetString("OAuthAccessTokenStartTime", SystemTime.Now.ToString()); + HttpContext.Session.SetString("OAuthAccessToken", result.ToJson()); + + //因为第一步选择的是OAuthScope.snsapi_userinfo,这里可以进一步获取用户详细信息 + try + { + if (!string.IsNullOrEmpty(returnUrl)) + { + return Redirect(returnUrl); + } + + OAuthUserInfo userInfo = OAuthApi.GetUserInfo(result.access_token, result.openid); + return View(userInfo); + } + catch (ErrorJsonResultException ex) + { + return Content(ex.Message); + } +} +``` + +上述代码中,传入的 `returnUrl` 即第一步 `Index()` 方法中传入到 **AuthorizeUrl** 中的 `returnUrl`,当所有用户信息获取、保存等操作完成后,借助 `returnUrl` 跳转到登陆之前的页面,完成整个闭环的登录操作。 + +> 本项目参考文件: +> +> /Controllers/**_OAuth2Controller.cs_** diff --git "a/docs/zh/guide/MP/\345\246\202\344\275\225\345\256\211\350\243\205.md" "b/docs/zh/guide/MP/\345\246\202\344\275\225\345\256\211\350\243\205.md" new file mode 100644 index 0000000000..ec39b26fbf --- /dev/null +++ "b/docs/zh/guide/MP/\345\246\202\344\275\225\345\256\211\350\243\205.md" @@ -0,0 +1,73 @@ +# 如何安装? + +您可以直接引用 Senparc.Weixin 的源码进行开发,也可以引用已经打包完成的 dll(通过 Nuget 包,推荐),以方便随时获取官方的更新。注意:直接引用源码和引用 Nuget 包只能二选一。 + +## 引用源码 + +您可以在当前解决方案中,**Libraries** 目录下,将所需要引用的程序集引用(复制)到您开发环境的解决方案中,请注意需要同时引用被依赖的项目,如 `Senparc.Weixin` 项目是所有项目都需要依赖的。 + +当前示例项目默认就使用了直接引用源码的方式,可从 .csproj 文件中看到引用方式: + +```cs + + + + + +``` + +## 引用程序集(推荐) + +您可以通过 `Visual Studio`、`Visual Studio Code`、`dotnet 命令行` 等多种方式自动安装 Nuget 包。 + +### Visual Studio + +在开发项目【解决方案资源管理器】中,对需要添加 Senparc.Weixin.MP 的模块点击右键,点击【管理 Nuget 程序包】,在【浏览】标签中输入 **Senparc.Weixin.MP**,点击右侧【安装】按钮。如下图所示: + +![通过 Visual Studio 安装](https://sdk.weixin.senparc.com/Docs/MP/images/home-install-01.png) + +### Visual Studio Code + +首先,确认已经安装好 [VS Code](https://code.visualstudio.com/) 以及 dotnet 命令行(安装 [.NET SDK](https://dotnet.microsoft.com/en-us/download) 后会自动安装)。 + +然后,打开解决方案或项目所在目录,按 Ctrl+~,打开终端面板: + +![通过 VS Code 安装](https://sdk.weixin.senparc.com/Docs/MP/images/home-install-03.png) + +进入需要添加 Senparc.Weixin.MP 的模块的项目的目录,输入: + +> ```cs +> dotnet add package Senparc.Weixin.MP +> ``` + +安装 Senparc.Weixin.MP 模块 + +![通过 VS Code 安装](https://sdk.weixin.senparc.com/Docs/MP/images/home-install-04.png) + +安装完成后,可查看对应 .csproj 文件,被添加引用,如: + +```cs + + + +``` + +### dotnet 命令行 + +首先,确认已经安装好 dotnet 命令行(安装 [.NET SDK](https://dotnet.microsoft.com/en-us/download) 后会自动安装)。 + +进入需要添加 Senparc.Weixin.MP 的模块的项目的目录,输入: + +> ```cs +> dotnet add package Senparc.Weixin.MP +> ``` + +![通过 dotnet CLI 安装](https://sdk.weixin.senparc.com/Docs/MP/images/home-install-02.png) + +安装完成后,可查看对应 .csproj 文件,被添加引用,如: + +```cs + + + +``` diff --git "a/docs/zh/guide/MP/\346\263\250\345\206\214.md" "b/docs/zh/guide/MP/\346\263\250\345\206\214.md" new file mode 100644 index 0000000000..913c737837 --- /dev/null +++ "b/docs/zh/guide/MP/\346\263\250\345\206\214.md" @@ -0,0 +1,56 @@ +# 注册 + +## 全局注册 + +所有的 Senparc.Weixin SDK 注册过程都是类似的。 + +首先,完成所有 Senparc.Weixin SDK 的整体注册代码。在 Program.cs 中加入以下代码: + +![注册 Senparc.Weixin](https://sdk.weixin.senparc.com/Docs/MP/images/home-dev-register-01.png) + +说明: + +1. `builder.Services.AddMemoryCache()` Senparc.Weixin 支持本机缓存、Redis、Memcached 等多种缓存策略,默认使用本机缓存,此时需要激活本地缓存。 +2. `builder.Services.AddSenparcWeixinServices(builder.Configuration)` 用于完成 Senparc.Weixin 的注册。 +3. `app.UseSenparcWeixin()` 方法用于配置和启用 Senparc.Weixin。 + +以上代码对于所有的 Senparc.Weixin 下级模块都是相同的,只需要 3 句代码。 + +> 本项目参考文件: +> +> /**_Program.cs_** + +## 公众号注册 + +在上述代码中的第 17 行委托方法中插入代码,即可完成默认公众号的注册: + +```cs +register.RegisterMpAccount(weixinSetting, "【盛派网络小助手】公众号"); +``` + +![注册微信公众号](https://sdk.weixin.senparc.com/Docs/MP/images/home-dev-register-02.png "注册微信公众号") + +其中,`weixinSetting` 的值默认来自于 `appsettings.json`: + +```json + "SenparcWeixinSetting": { + "IsDebug": true, + + "Token": "#{Token}#", + "EncodingAESKey": "#{EncodingAESKey}#", + "WeixinAppId": "#{WeixinAppId}#", + "WeixinAppSecret": "#{WeixinAppSecret}#" + } +``` + +![配置参数](https://sdk.weixin.senparc.com/Docs/MP/images/home-dev-register-03.png "配置参数") + +其中,`Token`、`EncodingAESKey`、`WeixinAppId` 和 `WeixinAppSecret` 对应了微信公众号后台的配置参数。 + +> 本项目参考文件: +> +> /**_appsettings.json_** + +配置完成。 + +> 提示:自动注册的信息可通过 `Senparc.Weixin.Config.SenparcWeixinSetting` 获取。 diff --git "a/docs/zh/guide/MP/\346\272\220\347\240\201.md" "b/docs/zh/guide/MP/\346\272\220\347\240\201.md" new file mode 100644 index 0000000000..1b4978d264 --- /dev/null +++ "b/docs/zh/guide/MP/\346\272\220\347\240\201.md" @@ -0,0 +1,15 @@ +# 源码 + +## Senparc.Weixin SDK 源码 + +GitHub:[https://github.com/JeffreySu/WeiXinMPSDK](https://github.com/JeffreySu/WeiXinMPSDK)(更新更快) + +Gitee:[https://gitee.com/JeffreySu/WeiXinMPSDK](https://gitee.com/JeffreySu/WeiXinMPSDK)(从 GitHub 同步) + +## 打包代码 + +Nuget 包地址:[https://www.nuget.org/packages/Senparc.Weixin.MP](https://www.nuget.org/packages/Senparc.Weixin.MP) + +## 本地源码文件 + +Senparc.Weixin.MP 源码位置:[/src/Senparc.Weixin.MP](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/src/Senparc.Weixin.MP) diff --git "a/docs/zh/guide/MP/\350\217\234\345\215\225\350\256\276\347\275\256.md" "b/docs/zh/guide/MP/\350\217\234\345\215\225\350\256\276\347\275\256.md" new file mode 100644 index 0000000000..7bdfea2daa --- /dev/null +++ "b/docs/zh/guide/MP/\350\217\234\345\215\225\350\256\276\347\275\256.md" @@ -0,0 +1,72 @@ +# 菜单设置 + +公众号菜单是公众号界面的重要元素,菜单的使用分为 **设置** 和 **使用** 两个环节。 + +## 设置 + +方法一:使用微信公众号后台界面设置(不使用开发模式),此处略。 + +方法二(推荐):使用可视化编辑器(No Code):[点击查看介绍](https://sdk.weixin.senparc.com/Menu)。 + +方法三:使用代码进行设置(只需要执行一次,建议放在管理员后台,手动运行),如: + +```cs +public async Task CreateMenuAsync() +{ + ButtonGroup bg = new ButtonGroup(); + + //定义一级菜单 + var subButton = new SubButton() + { + name = "一级菜单" + }; + bg.button.Add(subButton); + + //下属二级菜单 + subButton.sub_button.Add(new SingleViewButton() + { + url = "https://book.weixin.senparc.com/book/link?code=SenparcRobotMenu", + name = "《微信开发深度解析》" + }); + subButton.sub_button.Add(new SingleClickButton() + { + key = "OneClick", + name = "单击测试" + }); + subButton.sub_button.Add(new SingleViewButton() + { + url = "https://weixin.senparc.com/", + name = "Url跳转" + }); + + //最多可添加 3 个一级自定义菜单,每个菜单下最多 5 个子菜单 + + var result = await CommonApi.CreateMenuAsync(appId, bg); +} +``` + +## 使用 + +设置完菜单后,当客户端点击菜单时,微信服务器会自动推送响应的回调信息到消息 URL(即已经设置好的 MessageHandler 内),只需在 CustomMessageHandler 中重写(`override`)对应的方法即可。如针对上述 **方法三** 已经设定生效的菜单,当用户点击【单击测试】按钮时,我们可以在 CustomMessageHandler 中进行接收和处理: + +```cs +public override async Task OnEvent_ClickRequestAsync(RequestMessageEvent_Click requestMessage) +{ + var reponseMessage = CreateResponseMessage(); + + if (requestMessage.EventKey == "OneClick") + { + reponseMessage.Content = "您点击了【单击测试】按钮"; + } + else + { + reponseMessage.Content = "您点击了其他事件按钮"; + } + + return reponseMessage; +} +``` + +> 本项目参考文件: +> +> /MessageHandlers/**_CustomMessageHandler_Events.cs_** diff --git "a/docs/zh/guide/MP/\350\277\233\351\230\266.md" "b/docs/zh/guide/MP/\350\277\233\351\230\266.md" new file mode 100644 index 0000000000..1b32c519b3 --- /dev/null +++ "b/docs/zh/guide/MP/\350\277\233\351\230\266.md" @@ -0,0 +1,11 @@ +# 进阶 + +当前示例展示了最基本和常用的功能,如果您需要了解更多高级玩法,并且有扎实的编程功底,请参考完整示例。 + +> 完整示例解决方案文件: +> +> Senparc.Weixin SDK 源文件根目录[/Samples/All/net7-mvc/Senparc.Weixin.Sample.Net7.sln](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/Samples/All/net7-mvc) + +> 务必阅读 readme 文件: +> +> Senparc.Weixin SDK 源文件根目录[/Samples/All/net7-mvc/readme.md](https://github.com/JeffreySu/WeiXinMPSDK/blob/master/Samples/All/net7-mvc/readme.md) diff --git "a/docs/zh/guide/MP/\351\253\230\347\272\247\346\216\245\345\217\243.md" "b/docs/zh/guide/MP/\351\253\230\347\272\247\346\216\245\345\217\243.md" new file mode 100644 index 0000000000..d301a67975 --- /dev/null +++ "b/docs/zh/guide/MP/\351\253\230\347\272\247\346\216\245\345\217\243.md" @@ -0,0 +1,27 @@ +# 高级接口 + +完成 `Program.cs` 文件中的常规注册后,即可在程序的任意地方使用高级接口。 + +> 注意: +> 1、高级接口的配置和 `MessageHandler` 没有关联,两者可以独立或配合使用。 +> 2、SDK 内几乎所有高级接口的第一个参数同时支持传入 AppId 或 AccessToken,通常名称为 `appIdOrAccessToken`,SDK 会根据参数特征自动识别输入的是 AppId 还是 AccessToken,并做区分处理。 + +## 使用 AppId 调用接口(推荐) + +例如,我们可以在任意一个方法中调用一个高级接口: + +```cs +var appId = Senparc.Weixin.Config.SenparcWeixinSetting.AppId; +var result = await Senparc.Weixin.MP.AdvancedAPIs.UserApi.GetAsync(appId);//获取关注者 OpenId 信息 +``` + +> appId 参数,必须是已经经过注册的,这样即使 AccessToken 过期,SDK 也会全自动处理。如果是未经过注册的 appId,则需要先获取 AccessToken,然后调用接口。 + +## 使用 AccessToken 调用接口(不推荐) + +```cs +var accessToken = Senparc.Weixin.MP.CommonApi.GetTokenAsync(appId, appSecret);//获取 AccessToken +var result = await Senparc.Weixin.MP.AdvancedAPIs.UserApi.GetAsync(accessToken);//获取关注者 OpenId 信息 +``` + +> 注意:使用 AccessToken 方式调用接口,无法保证当前 AccessToken 的有效性,因此建议使用前进行有效性校验,并使用 `try-catch` 方式捕获 AccessToken 不可用的异常,然后进行重试。因此直接使用 AccessToken 调用接口的方式并不推荐在常规情况下使用。 diff --git a/docs/zh/guide/README.md b/docs/zh/guide/README.md new file mode 100644 index 0000000000..5c76861b02 --- /dev/null +++ b/docs/zh/guide/README.md @@ -0,0 +1,23 @@ +# 关于 + +使用 Senparc.Weixin,您可以方便快速地开发微信全平台的应用(包括微信公众号、小程序、小游戏、企业号、开放平台、微信支付、JS-SDK、微信硬件/蓝牙,等等)。本项目的 Demo 同样适合初学者进行 .NET 编程学习。 + +目前 Senparc.Weixin 已经支持几乎所有微信平台模块和接口,并同时支持 [.NET 3.5 / 4.0 / 4.5 / .NET Standard 2.x / .NET Core 2.x / .NET Core 3.x / .NET 6.0](https://github.com/JeffreySu/WeiXinMPSDK/tree/Developer) 多种框架。 + +Senparc.Weixin SDK 是目前使用率最高的微信 .NET SDK,也是国内最受欢迎的 .NET 开源项目之一,是唯一入选 **2021“科创中国”开源创新榜**[[1]](https://tv.sohu.com/v/dXMvOTkyNjI2MTAvMzI3NjU3NDI0LnNodG1s.html?key=/v/dXMvOTkyNjI2MTAvMzI3NjU3NDI0LnNodG1s.html?vid=327657424&vid=327657424) [[2]](http://cccst.org.cn/mtgz/art/2022/art_cd16c511a4c143f5ae50fc799abc0c74.html)的 .NET 项目。 + +项目自 2012 年开源,2013 年 1 月起正式发布到 GitHub。10 年来,我们一直保持着项目的持续更新,并将完整的源代码以及设计思想毫无保留地分享给大家,希望有更多的人可以从中受益,理解并传播开源的精神,一同助力中国开源事业!感恩一路上给我们提供帮助的朋友们! + +## 团队 + +Senparc.Weixin 由盛派网络及盛派开发者社区核心团队负责维护,同时正在得到大量来自社区成员和社会各界的支持,欢迎加入我们! + +## 支持 + +Senparc.Weixin 提供 100% 源码、线上 Sample、文档、图书、视频课程、线上开发者平台、问答平台、QQ / 微信群,以及不定期的线上/线下分享会等各种形式的支持服务,并坚持不间断维护源码,发布新版本。 + +联系邮箱:zsu@senparc.com + +## 开源协议 + +Senaprc.Weixin 使用 [APACHE LICENSE V2.0](https://www.apache.org/licenses/LICENSE-2.0) 开源协议,支持商用。 diff --git a/docs/zh/guide/TenPayV2/JASPI.md b/docs/zh/guide/TenPayV2/JASPI.md new file mode 100644 index 0000000000..aefe571dfa --- /dev/null +++ b/docs/zh/guide/TenPayV2/JASPI.md @@ -0,0 +1,161 @@ +# JASPI 支付 + +## JSAPI 支付 + +在微信公众号网页中使用微信支付,必须借助 JSAPI,完成支付流程。 + +首先,需要创建一个商品页面,并在页面上提供一个下订单的入口,例如:一键购买。 +(具体实现此处略) + +当前示例中,提供了 3 个关键的页面:ProductList(商品列表)、ProductItem(商品详情) 和 JsApi(JSAPI 订单支付)。 + +## ProductList 商品列表 + +**后端** + +参考代码:TenPayV3Controller 下的 ProductList() 方法。 + +```cs +public ActionResult ProductList() +{ + var products = ProductModel.GetFakeProductList(); + return View(products); +} +``` + +> 本项目参考文件: +> +> /Controllers/**_TenPayV3Controller.cs_** + +**前端** + +> 本项目参考文件: +> +> /Views/TenPayV3/**_ProductItem.cshtml_** + +**效果** + +[打开预览](https://sdk.weixin.senparc.com/TenPayV3/ProductList) + +![商品列表](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-dev-jsapi-01.png) + +## ProductItem 商品详情 + +**后端** + +参考代码:TenPayV3Controller 下的 ProductItem() 方法。 + +```cs +public ActionResult ProductItem(int productId, int hc) +{ + var products = ProductModel.GetFakeProductList(); + var product = products.FirstOrDefault(z => z.Id == productId); + if (product == null || product.GetHashCode() != hc) + { + return Content("商品信息不存在,或非法进入!2003"); + } + + //判断是否正在微信端 + if (Senparc.Weixin.BrowserUtility.BrowserUtility.SideInWeixinBrowser(HttpContext)) + { + //正在微信端,直接跳转到微信支付页面 + return RedirectToAction("JsApi", new { productId = productId, hc = hc }); + } + else + { + //在PC端打开,提供二维码扫描进行支付 + return View(product); + } +} +``` + +> 说明:上述代码使用 `SideInWeixinBrowser()` 方法对当前页面的运行环境做了判断,如果是在微信内打开,则直接进入 JsApi 支付页面(见下放 JsApi 的介绍),如果在非微信内部打开(如 PC),则展示商品详情,并提供多种支付方式的选择。 + +> 本项目参考文件: +> +> /Controllers/**_TenPayV3Controller.cs_** + +**前端** + +> 本项目参考文件: +> +> /Views/TenPayV3/ProductItem.cshtml + +**效果** + +从 [商品列表](https://sdk.weixin.senparc.com/TenPayV3/ProductList) 中选择一个商品点击,如果在 PC 端,则可以看到详情页面: + +![商品列表](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-dev-jsapi-02.png) + +上述的**支付方式二:“扫一扫”支付**下方有一个根据所选商品自动生成的二维码,使用手机微信扫一扫,即可进入对应的商品订单页面(即 JsApi 订单页面)。 + +## JSAPI 订单支付页面 + +**后端** + +用户点击下单按钮后,需要在后台生成一个预支付订单并在页面上登记,代码请参考 `TenPayV3Controller.JsApi()` + +```cs +[CustomOAuth(null, "/TenpayV3/OAuthCallback")] +public ActionResult JsApi(int productId, int hc) +{ + try + { + //获取产品信息 + //... + //调用 JsApi 获取预支付信息 + //... + + return View(); + } + catch (Exception ex) + { + //... + } +} +``` + +> 本项目参考文件: +> +> /Controllers/**_TenPayV3Controller.cs_** + +上述代码中,传入的 `productId` 参数是商品的编号,此处作为 Sample 演示,是从内存中模拟列表并查询,实际项目中,商品信息一般存储在数据库中,根据 `productId` 从数据中查找商品数据;`hc` 函数是为了确保当前内存信息的有效性而设置的对应商品信息的 HashCode,实际开发项目中无需使用,可忽略。 + +此过程中,最关键的代码是:`var result = TenPayOldV3.Unifiedorder(xmlDataInfo)`,`result.prepay_id` 即“预支付 ID”,前端页面必须凭借 prepay_id 才能让手机端唤起微信支付。此时,当前订单编号已经在微信支付后台进行了注册。 + +注意:该方法使用了 **[CustomOAuth]** 特性,用于自动使用微信公众号的 OAuth 功能识别用户身份,此功能属于公众号范畴,不在这里展开。 + +**前端** + +前端的关键操作是当用户点击“支付”按钮后,执行 JS 代码: + +```JS +WeixinJSBridge.invoke( + "getBrandWCPayRequest", + { + appId: "", //公众号名称,由商户传入 + timeStamp: "", //时间戳 + nonceStr: "", //随机串 + package: "", //扩展包 + signType: "MD5", //微信签名方式:MD5 + paySign: "", //微信签名 + }, + function (res) { + if (res.err_msg == "get_brand_wcpay_request:ok") { + //支付成功 + } + } +); +``` + +> 本项目参考文件: +> +> /Views/TenPayV3/**_JsApi.cshtml_** + +**效果** + +![订单支付页面](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-dev-jsapi-03.jpg) + +![点击唤起支付](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-dev-jsapi-04.jpg) + +![支付成功](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-dev-jsapi-05.jpg) diff --git "a/docs/zh/guide/TenPayV2/Native\346\224\257\344\273\230.md" "b/docs/zh/guide/TenPayV2/Native\346\224\257\344\273\230.md" new file mode 100644 index 0000000000..55c072d026 --- /dev/null +++ "b/docs/zh/guide/TenPayV2/Native\346\224\257\344\273\230.md" @@ -0,0 +1,139 @@ +# Native 支付 + +Native 支付用于线下(或微信环境以外)的支付,通过微信扫描二维码,唤起个人微信支付完成支付过程。 + +生成二维码的控件很多,以 [ZXing.Net](https://www.nuget.org/packages/ZXing.Net) 为例,在 `TenPayV3Controller` 中创建方法: + +```cs +/// +/// 原生支付 模式一 +/// +/// +public ActionResult Native() +{ + try + { + RequestHandler nativeHandler = new RequestHandler(null); + string timeStamp = TenPayV3Util.GetTimestamp(); + string nonceStr = TenPayV3Util.GetNoncestr(); + + //商品Id,用户自行定义 + string productId = SystemTime.Now.ToString("yyyyMMddHHmmss"); + + nativeHandler.SetParameter("appid", TenPayV3Info.AppId); + nativeHandler.SetParameter("mch_id", TenPayV3Info.MchId); + nativeHandler.SetParameter("time_stamp", timeStamp); + nativeHandler.SetParameter("nonce_str", nonceStr); + nativeHandler.SetParameter("product_id", productId); + string sign = nativeHandler.CreateMd5Sign("key", TenPayV3Info.Key); + + var url = TenPayOldV3.NativePay(TenPayV3Info.AppId, timeStamp, TenPayV3Info.MchId, nonceStr, productId, sign); + + BitMatrix bitMatrix; + bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, 600, 600); + var bw = new ZXing.BarcodeWriterPixelData(); + + var pixelData = bw.Write(bitMatrix); + var bitmap = new System.Drawing.Bitmap(pixelData.Width, pixelData.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb); + + var fileStream = new MemoryStream(); + + var bitmapData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, pixelData.Width, pixelData.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb); + try + { + // we assume that the row stride of the bitmap is aligned to 4 byte multiplied by the width of the image + System.Runtime.InteropServices.Marshal.Copy(pixelData.Pixels, 0, bitmapData.Scan0, pixelData.Pixels.Length); + } + finally + { + bitmap.UnlockBits(bitmapData); + } + bitmap.Save(_fileStream, System.Drawing.Imaging.ImageFormat.Png); + _fileStream.Seek(0, SeekOrigin.Begin); + + return File(_fileStream, "image/png"); + } + catch (Exception ex) + { + SenparcTrace.SendCustomLog("TenPayV3.Native 执行出错", ex.Message); + SenparcTrace.BaseExceptionLog(ex); + + throw; + } +} +``` + +> 本项目参考文件: +> +> /Controllers/**_TenPayV3Controller.cs_** + +上述过程将自动生成对应于指定商户、指定商品(productId)的付款二维码,前端 HTML 调用方式如下: + +```HTML +扫码付款 +``` + +用户扫码完成支付后,微信服务器会自动请求回调地址,如 /TenPayV3/NativeNotifyUrl,代码如下: + +```cs +public ActionResult NativeNotifyUrl() +{ + ResponseHandler resHandler = new ResponseHandler(null); + + //返回给微信的请求 + RequestHandler res = new RequestHandler(null); + + string openId = resHandler.GetParameter("openid"); + string productId = resHandler.GetParameter("product_id"); + + if (openId == null || productId == null) + { + res.SetParameter("return_code", "FAIL"); + res.SetParameter("return_msg", "回调数据异常"); + } + + //创建支付应答对象 + //RequestHandler packageReqHandler = new RequestHandler(null); + + var sp_billno = SystemTime.Now.ToString("HHmmss") + TenPayV3Util.BuildRandomStr(26);//最多32位 + var nonceStr = TenPayV3Util.GetNoncestr(); + + var xmlDataInfo = new TenPayV3UnifiedorderRequestData(TenPayV3Info.AppId, TenPayV3Info.MchId, "test", sp_billno, 1, HttpContext.UserHostAddress()?.ToString(), TenPayV3Info.TenPayV3Notify, TenPay.TenPayV3Type.JSAPI, openId, TenPayV3Info.Key, nonceStr); + + try + { + //调用统一订单接口 + var result = TenPayOldV3.Unifiedorder(xmlDataInfo); + + //创建应答信息返回给微信 + res.SetParameter("return_code", result.return_code); + res.SetParameter("return_msg", result.return_msg ?? "OK"); + res.SetParameter("appid", result.appid); + res.SetParameter("mch_id", result.mch_id); + res.SetParameter("nonce_str", result.nonce_str); + res.SetParameter("prepay_id", result.prepay_id); + res.SetParameter("result_code", result.result_code); + res.SetParameter("err_code_des", "OK"); + + string nativeReqSign = res.CreateMd5Sign("key", TenPayV3Info.Key); + res.SetParameter("sign", nativeReqSign); + } + catch (Exception) + { + res.SetParameter("return_code", "FAIL"); + res.SetParameter("return_msg", "统一下单失败"); + } + + return Content(res.ParseXML()); +} +``` + +> 本项目参考文件: +> +> /Controllers/TenPayV3Controller.cs + +> 提示: +> +> Native 支付的回调地址设置位置位于:微信支付后台 > 产品中心 > 开发配置 > Native 支付回调链接。 +> +> ![Native 支付回调链接设置 ](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/native-setting-01.png)Native diff --git "a/docs/zh/guide/TenPayV2/\345\246\202\344\275\225\345\256\211\350\243\205.md" "b/docs/zh/guide/TenPayV2/\345\246\202\344\275\225\345\256\211\350\243\205.md" new file mode 100644 index 0000000000..ffe2d1296c --- /dev/null +++ "b/docs/zh/guide/TenPayV2/\345\246\202\344\275\225\345\256\211\350\243\205.md" @@ -0,0 +1,57 @@ +# 如何安装 + +您可以直接引用 Senparc.Weixin 的源码进行开发,也可以引用已经打包完成的 dll(通过 Nuget 包,推荐),以方便随时获取官方的更新。注意:直接引用源码和引用 Nuget 包只能二选一。 + +# 引用程序集(推荐) + +您可以通过 `Visual Studio`、`Visual Studio Code`、`dotnet 命令行` 等多种方式自动安装 Nuget 包。 + +## Visual Studio + +在开发项目【解决方案资源管理器】中,对需要添加 Senparc.Weixin.Tenpay 的模块点击右键,点击【管理 Nuget 程序包】,在【浏览】标签中输入 **Senparc.Weixin.Tenpay**,点击右侧【安装】按钮。如下图所示: + +![通过 Visual Studio 安装](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-install-01.png) + +## Visual Studio Code + +首先,确认已经安装好 [VS Code](https://code.visualstudio.com/) 以及 dotnet 命令行(安装 [.NET SDK](https://dotnet.microsoft.com/en-us/download) 后会自动安装)。 + +然后,打开解决方案或项目所在目录,按 Ctrl+~,打开终端面板: + +![通过 VS Code 安装](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-install-03.png) + +进入需要添加 Senparc.Weixin.Tenpay 的模块的项目的目录,输入: + +> ```cs +> dotnet add package Senparc.Weixin.Tenpay +> ``` + +![通过 VS Code 安装](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-install-04.png)安装 Senparc.Weixin.Tenpay 模块 + +安装完成后,可查看对应 .csproj 文件,被添加引用,如: + +```cs + + + +``` + +## dotnet 命令行 + +首先,确认已经安装好 dotnet 命令行(安装 [.NET SDK](https://dotnet.microsoft.com/en-us/download) 后会自动安装)。 + +进入需要添加 Senparc.Weixin.Tenpay 的模块的项目的目录,输入: + +> ```cs +> dotnet add package Senparc.Weixin.Tenpay +> ``` + +![通过 dotnet CLI 安装](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-install-02.png) + +安装完成后,可查看对应 .csproj 文件,被添加引用,如: + +```cs + + + +``` diff --git "a/docs/zh/guide/TenPayV2/\346\224\257\344\273\230\345\233\236\350\260\203.md" "b/docs/zh/guide/TenPayV2/\346\224\257\344\273\230\345\233\236\350\260\203.md" new file mode 100644 index 0000000000..51c55d0709 --- /dev/null +++ "b/docs/zh/guide/TenPayV2/\346\224\257\344\273\230\345\233\236\350\260\203.md" @@ -0,0 +1,61 @@ +# 支付回调 + +## 支付回调 + +当用户在微信端完成支付后,微信服务器会主动推送一条通知到应用服务器。这条信息只会在微信官方服务器和应用服务器之间发生,不会有用户的参与,并且附加签名校验,因此才是可信的。 + +> **注意:千万不能信任手机客户端完成支付的状态,并以此通知应用服务器用户已完成支付!** + +以 JsApi 支付为例,当发起统一支付时,会要求填写回调地址(`TenPayV3UnifiedorderRequestData` 中的 `notifyUrl` 参数,见 **JSAPI 支付** 相关说明)。 + +> 注意:不同的支付方式提供回调地址的设置可能不同,如“Native 支付”,则是在微信支付的管理后台设置。 + +## 定义回调入口 + +```cs +/// +/// JS-SDK支付回调地址(在统一下单接口中设置notify_url) +/// +/// +public ActionResult PayNotifyUrl() +{ + try + { + ResponseHandler resHandler = new ResponseHandler(HttpContext); + + string return_code = resHandler.GetParameter("return_code"); + string return_msg = resHandler.GetParameter("return_msg"); + + string res = null; + + resHandler.SetKey(TenPayV3Info.Key); + //验证请求是否从微信发过来(安全) + if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") + { + res = "success";//正确的订单处理 + //直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! + } + else + { + res = "wrong";//错误的订单处理 + } + + /* 这里可以进行订单处理的逻辑 */ + + string xml = string.Format(@" + + +", return_code, return_msg); + return Content(xml, "text/xml"); + } + catch (Exception ex) + { + WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); + throw; + } +} +``` + +> 本项目参考文件: +> +> /Controllers/TenPayV3Controller.cs diff --git "a/docs/zh/guide/TenPayV2/\346\263\250\345\206\214.md" "b/docs/zh/guide/TenPayV2/\346\263\250\345\206\214.md" new file mode 100644 index 0000000000..bc5fcdb6f5 --- /dev/null +++ "b/docs/zh/guide/TenPayV2/\346\263\250\345\206\214.md" @@ -0,0 +1,86 @@ +# 注册 + +## 全局注册 + +所有的 Senparc.Weixin SDK 注册过程都是类似的。 + +首先,完成所有 Senparc.Weixin SDK 的整体注册代码。在 Program.cs 中加入以下代码: + +![注册 Senparc.Weixin](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-dev-register-01.png) + +说明: + +1. `builder.Services.AddMemoryCache()` Senparc.Weixin 支持本机缓存、Redis、Memcached 等多种缓存策略,默认使用本机缓存,此时需要激活本地缓存。 +2. `builder.Services.AddSenparcWeixinServices(builder.Configuration)` 用于完成 Senparc.Weixin 的注册。 +3. `app.UseSenparcWeixin()` 方法用于配置和启用 Senparc.Weixin。 + +以上代码对于所有的 Senparc.Weixin 下级模块都是相同的,只需要 3 句代码。 + +> 本项目参考文件: +> +> /Program.cs + +## 公众号注册 + +在上述代码中的第 27 行委托方法中插入代码,即可完成默认公众号以及微信支付的注册: + +```cs + //注册公众号信息(可以执行多次,注册多个公众号) + register.RegisterMpAccount(weixinSetting, "【盛派网络小助手】公众号"); + //注册微信支付(可以执行多次,注册多个微信支付) + register.RegisterTenpayOld(weixinSetting, "【盛派网络小助手】微信支付(V2)"); +``` + +![注册微信公众号](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-dev-register-02.png)注册微信公众号和微信新支付 + +> 注意: +> +> 上述代码同时注册了公众号和微信支付(V2),因为微信支付需要提供微信用户的标识(OpenId),OpenId 必须来自微信公众号、小程序等模块。如果需要在小程序内使用微信支付,则需要对应注册小程序。 + +其中,`weixinSetting` 的值默认来自于 `appsettings.json`: + +```JSON + "SenparcWeixinSetting": { + "IsDebug": true, + + //公众号 + "Token": "#{Token}#", + "EncodingAESKey": "#{EncodingAESKey}#", + "WeixinAppId": "#{WeixinAppId}#", + "WeixinAppSecret": "#{WeixinAppSecret}#", + + //微信支付 + //微信支付V3(旧版文档V3) + "TenPayV3_AppId": "#{TenPayV3_AppId}#", + "TenPayV3_AppSecret": "#{TenPayV3_AppSecret}#", + "TenPayV3_SubAppId": "#{TenPayV3_SubAppId}#", + "TenPayV3_SubAppSecret": "#{TenPayV3_SubAppSecret}#", + "TenPayV3_MchId": "#{TenPayV3_MchId}#", + "TenPayV3_SubMchId": "#{TenPayV3_SubMchId}#", //子商户,没有可留空 + "TenPayV3_Key": "#{TenPayV3_Key}#", + /* 证书路径(APIv3 可不使用) + * 1、物理路径如:D:\\cert\\apiclient_cert.p12 + * 2、相对路径,如:~/App_Data/cert/apiclient_cert.p12,注意:必须放在 App_Data 等受保护的目录下,避免泄露 + * 备注:证书下载地址:https://pay.weixin.qq.com/index.php/account/api_cert + */ + "TenPayV3_CertPath": "#{TenPayV3_CertPath}#", //(V3 API 可不使用)证书路径 + "TenPayV3_CertSecret": "#{TenPayV3_CertSecret}#", //(V3 API 可不使用)支付证书密码(原始密码和 MchId 相同) + "TenPayV3_TenpayNotify": "#{TenPayV3_TenpayNotify}#", //http://YourDomainName/TenpayV3/PayNotifyUrl + //如果不设置TenPayV3_WxOpenTenpayNotify,默认在 TenPayV3_TenpayNotify 的值最后加上 "WxOpen" + "TenPayV3_WxOpenTenpayNotify": "#{TenPayV3_WxOpenTenpayNotify}#" //http://YourDomainName/TenpayV3/PayNotifyUrlWxOpen + } +``` + +其中,`Token`、`EncodingAESKey`、`WeixinAppId` 和 `WeixinAppSecret` 对应了微信公众号后台的配置参数。 + +特别说明:`TenPayV3_CertPath` 参数同时支持完整的物理路径或相对路径(相对于程序根目录以 `~/` 开头)。证书文件必须放在 App_Data 等受保护的目录下,避免泄露。 + +![配置参数](https://sdk.weixin.senparc.com/Docs/TenPayV2/images/home-dev-register-03.png) + +> 本项目参考文件: +> +> /appsettings.json + +配置完成。 + +> 提示:自动注册的信息可通过 `Senparc.Weixin.Config.SenparcWeixinSetting` 获取。 diff --git "a/docs/zh/guide/TenPayV2/\346\272\220\347\240\201.md" "b/docs/zh/guide/TenPayV2/\346\272\220\347\240\201.md" new file mode 100644 index 0000000000..6a49abb779 --- /dev/null +++ "b/docs/zh/guide/TenPayV2/\346\272\220\347\240\201.md" @@ -0,0 +1,15 @@ +# 源码 + +## Senparc.Weixin SDK 源码 + +GitHub:[https://github.com/JeffreySu/WeiXinMPSDK](https://github.com/JeffreySu/WeiXinMPSDK)(更新更快) + +Gitee:[https://gitee.com/JeffreySu/WeiXinMPSDK](https://gitee.com/JeffreySu/WeiXinMPSDK)(从 GitHub 同步) + +## 打包代码 + +Nuget 包地址:[https://www.nuget.org/packages/Senparc.Weixin.TenPay](https://www.nuget.org/packages/Senparc.Weixin.TenPay) + +## 本地源码文件 + +Senparc.Weixin.TenPay 源码位置:[/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPay](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPay) diff --git "a/docs/zh/guide/TenPayV2/\350\277\233\351\230\266.md" "b/docs/zh/guide/TenPayV2/\350\277\233\351\230\266.md" new file mode 100644 index 0000000000..1b32c519b3 --- /dev/null +++ "b/docs/zh/guide/TenPayV2/\350\277\233\351\230\266.md" @@ -0,0 +1,11 @@ +# 进阶 + +当前示例展示了最基本和常用的功能,如果您需要了解更多高级玩法,并且有扎实的编程功底,请参考完整示例。 + +> 完整示例解决方案文件: +> +> Senparc.Weixin SDK 源文件根目录[/Samples/All/net7-mvc/Senparc.Weixin.Sample.Net7.sln](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/Samples/All/net7-mvc) + +> 务必阅读 readme 文件: +> +> Senparc.Weixin SDK 源文件根目录[/Samples/All/net7-mvc/readme.md](https://github.com/JeffreySu/WeiXinMPSDK/blob/master/Samples/All/net7-mvc/readme.md) diff --git "a/docs/zh/guide/TenPayV2/\351\200\200\346\254\276.md" "b/docs/zh/guide/TenPayV2/\351\200\200\346\254\276.md" new file mode 100644 index 0000000000..3ae841f9e3 --- /dev/null +++ "b/docs/zh/guide/TenPayV2/\351\200\200\346\254\276.md" @@ -0,0 +1,131 @@ +# 退款 + +## 退款 + +退款方法核心代码如下: + +```cs +/// +/// 退款申请接口 +/// +/// +public ActionResult Refund() +{ + try + { + string nonceStr = TenPayV3Util.GetNoncestr(); + + string outTradeNo = HttpContext.Session.GetString("BillNo"); + + string outRefundNo = "OutRefunNo-" + SystemTime.Now.Ticks; + int totalFee = int.Parse(HttpContext.Session.GetString("BillFee")); + int refundFee = totalFee; + string opUserId = TenPayV3Info.MchId; + var notifyUrl = "https://sdk.weixin.senparc.com/TenPayV3/RefundNotifyUrl"; + var dataInfo = new TenPayV3RefundRequestData(TenPayV3Info.AppId, TenPayV3Info.MchId, TenPayV3Info.Key, + null, nonceStr, null, outTradeNo, outRefundNo, totalFee, refundFee, opUserId, null, notifyUrl: notifyUrl); + + var result = TenPayOldV3.Refund(_serviceProvider, dataInfo);//证书地址、密码,在配置文件中设置,并在注册微信支付信息时自动记录 + + ViewData["Message"] = $"退款结果:{result.result_code} {result.err_code_des}。您可以刷新当前页面查看最新结果。"; + return View(); + } + catch (Exception ex) + { + WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); + + throw; + } +} +``` + +> 本项目参考文件: +> +> /Controllers/**_TenPayV3Controller.cs_** + +> 说明:上述代码为了方便演示,并限定在没有登录功能的情况下只能退款本人自己支付过的订单,因此将 BillNo(订单号)存在 Session 中,实际开发过程中可放入 URL 或 Post 参数中进行请求,并注意做好权限验证! + +## 退款回调 + +在退款接口调用过程中,有一个 `notifyUrl` 的参数,此地址用于接收微信服务器发送的退款信息回调信息。代码如下: + +```cs +/// +/// 退款通知地址 +/// +/// +public ActionResult RefundNotifyUrl() +{ + string responseCode = "FAIL"; + string responseMsg = "FAIL"; + try + { + ResponseHandler resHandler = new ResponseHandler(HttpContext); + + string return_code = resHandler.GetParameter("return_code"); + string return_msg = resHandler.GetParameter("return_msg"); + + WeixinTrace.SendCustomLog("跟踪RefundNotifyUrl信息", resHandler.ParseXML()); + + if (return_code == "SUCCESS") + { + responseCode = "SUCCESS"; + responseMsg = "OK"; + + string appId = resHandler.GetParameter("appid"); + string mch_id = resHandler.GetParameter("mch_id"); + string nonce_str = resHandler.GetParameter("nonce_str"); + string req_info = resHandler.GetParameter("req_info"); + + if (!appId.Equals(Senparc.Weixin.Config.SenparcWeixinSetting.TenPayV3_AppId)) + { + /* + * 注意: + * 这里添加过滤只是因为盛派Demo经常有其他公众号错误地设置了我们的地址, + * 导致无法正常解密,平常使用不需要过滤! + */ + SenparcTrace.SendCustomLog("RefundNotifyUrl 的 AppId 不正确", + $"appId:{appId}\r\nmch_id:{mch_id}\r\nreq_info:{req_info}"); + return Content("faild"); + } + + var decodeReqInfo = TenPayV3Util.DecodeRefundReqInfo(req_info, TenPayV3Info.Key);//解密 + var decodeDoc = XDocument.Parse(decodeReqInfo); + + //获取接口中需要用到的信息 + string transaction_id = decodeDoc.Root.Element("transaction_id").Value; + string out_trade_no = decodeDoc.Root.Element("out_trade_no").Value; + string refund_id = decodeDoc.Root.Element("refund_id").Value; + string out_refund_no = decodeDoc.Root.Element("out_refund_no").Value; + int total_fee = int.Parse(decodeDoc.Root.Element("total_fee").Value); + int? settlement_total_fee = decodeDoc.Root.Element("settlement_total_fee") != null + ? int.Parse(decodeDoc.Root.Element("settlement_total_fee").Value) + : null as int?; + int refund_fee = int.Parse(decodeDoc.Root.Element("refund_fee").Value); + int tosettlement_refund_feetal_fee = int.Parse(decodeDoc.Root.Element("settlement_refund_fee").Value); + string refund_status = decodeDoc.Root.Element("refund_status").Value; + string success_time = decodeDoc.Root.Element("success_time").Value; + string refund_recv_accout = decodeDoc.Root.Element("refund_recv_accout").Value; + string refund_account = decodeDoc.Root.Element("refund_account").Value; + string refund_request_source = decodeDoc.Root.Element("refund_request_source").Value; + + //验证通过,进行后续业务处理 + } + } + catch (Exception ex) + { + responseMsg = ex.Message; + WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); + } + + string xml = string.Format(@" + + +", responseCode, responseMsg); + return Content(xml, "text/xml"); +} +``` + +> 本项目参考文件: +> +> /Controllers/**_TenPayV3Controller.cs_** diff --git a/docs/zh/guide/TenPayV3/JASPI.md b/docs/zh/guide/TenPayV3/JASPI.md new file mode 100644 index 0000000000..9568b151b1 --- /dev/null +++ b/docs/zh/guide/TenPayV3/JASPI.md @@ -0,0 +1,196 @@ +# JSAPI + +## JSAPI 支付 + +在微信公众号网页中使用微信支付,必须借助 JSAPI,完成支付流程。 + +首先,需要创建一个商品页面,并在页面上提供一个下订单的入口,例如:一键购买。 +(具体实现此处略) + +当前示例中,提供了 3 个关键的页面:ProductList(商品列表)、ProductItem(商品详情) 和 JsApi(JSAPI 订单支付)。 + +## ProductList 商品列表 + +**后端** + +参考代码:`TenPayApiV3Controller` 下的 ProductList() 方法。 + +```cs +public ActionResult ProductList() +{ + var products = ProductModel.GetFakeProductList(); + return View(products); +} +``` + +> 本项目参考文件: +> +> /**_Controllers/TenPayApiV3Controller.cs_** + +**前端** + +> 本项目参考文件: +> +> **_/Views/TenPayApiV3/ProductItem.cshtml_** + +**效果** + +[打开预览](https://sdk.weixin.senparc.com/TenpayApiV3/ProductList) + +![商品列表](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-dev-jsapi-01.png) + +## ProductItem 商品详情 + +**后端** + +参考代码:`TenPayApiV3Controller` 下的 ProductItem() 方法。 + +```cs +public ActionResult ProductItem(int productId, int hc) +{ + var products = ProductModel.GetFakeProductList(); + var product = products.FirstOrDefault(z => z.Id == productId); + if (product == null || product.GetHashCode() != hc) + { + return Content("商品信息不存在,或非法进入!2003"); + } + + //判断是否正在微信端 + if (Senparc.Weixin.BrowserUtility.BrowserUtility.SideInWeixinBrowser(HttpContext)) + { + //正在微信端,直接跳转到微信支付页面 + return RedirectToAction("JsApi", new { productId = productId, hc = hc }); + } + else + { + //在PC端打开,提供二维码扫描进行支付 + return View(product); + } +} +``` + +> 说明:上述代码使用 `SideInWeixinBrowser()` 方法对当前页面的运行环境做了判断,如果是在微信内打开,则直接进入 JsApi 支付页面(见下放 JsApi 的介绍),如果在非微信内部打开(如 PC),则展示商品详情,并提供多种支付方式的选择。 + +> 本项目参考文件: +> +> /**_Controllers/TenPayApiV3Controller.cs_** + +**前端** + +> 本项目参考文件: +> +> **_/Views/TenPayApiV3/ProductItem.cshtml_** + +**效果** + +从 [商品列表](https://sdk.weixin.senparc.com/TenPayApiV3/ProductList) 中选择一个商品点击,如果在 PC 端,则可以看到详情页面: + +![商品列表](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-dev-jsapi-02.png) + +上述的**支付方式二:“扫一扫”支付**下方有一个根据所选商品自动生成的二维码,使用手机微信扫一扫,即可进入对应的商品订单页面(即 JsApi 订单页面)。 + +## JSAPI 订单支付页面 + +**后端** + +用户点击下单按钮后,需要在后台生成一个预支付订单并在页面上登记,代码请参考 `TenPayApiV3Controller.JsApi()` + +```cs +[CustomOAuth(null, "/TenpayApiV3/OAuthCallback")] +public ActionResult JsApi(int productId, int hc) +{ + try + { + //获取产品信息 + //... + + //调用 JsApi 获取预支付信息 + //请求信息 + TransactionsRequestData jsApiRequestData = new(TenPayV3Info.AppId, TenPayV3Info.MchId, name, + sp_billno, new TenpayDateTime(DateTime.Now.AddHours(1), false), null, notifyUrl, null, + new() { currency = "CNY", total = price }, new(openId), null, null, null); + + //请求接口 + var basePayApis2 = new Senparc.Weixin.TenPayV3.TenPayHttpClient.BasePayApis2(_httpClient, + _tenpayV3Setting); + var result = await basePayApis2.JsApiAsync(jsApiRequestData); + + if (result.VerifySignSuccess != true) + { + throw new WeixinException("获取 prepay_id 结果校验出错!"); + } + + //获取 UI 信息包 + var jsApiUiPackage = TenPaySignHelper.GetJsApiUiPackage(TenPayV3Info.AppId, result.prepay_id); + ViewData["jsApiUiPackage"] = jsApiUiPackage; + + //其他逻辑 + //... + + return View(); + } + catch (Exception ex) + { + //... + } +} +``` + +> 本项目参考文件: +> +> /**_Controllers/TenPayApiV3Controller.cs_** + +上述代码中,传入的 `productId` 参数是商品的编号,此处作为 Sample 演示,是从内存中模拟列表并查询,实际项目中,商品信息一般存储在数据库中,根据 `productId` 从数据中查找商品数据;`hc` 函数是为了确保当前内存信息的有效性而设置的对应商品信息的 HashCode,实际开发项目中无需使用,可忽略。 + +此过程中,最关键的代码是:`var result = TenPayOldV3.Unifiedorder(xmlDataInfo)`,`result.prepay_id` 即“预支付 ID”,前端页面必须凭借 prepay_id 才能让手机端唤起微信支付。此时,当前订单编号已经在微信支付后台进行了注册。 + +注意:该方法使用了 **[CustomOAuth]** 特性,用于自动使用微信公众号的 OAuth 功能识别用户身份,此功能属于公众号范畴,不在这里展开。 + +**前端** + +前端的关键操作是当用户点击“支付”按钮后,执行 JS 代码: + +```cs +// 当微信内置浏览器完成内部初始化后会触发WeixinJSBridgeReady事件。 +document.addEventListener('WeixinJSBridgeReady'). function onBridgeReady() { + //公众号支付 + jQuery('a#getBrandWCPayRequest').click(function (e) { + WeixinJSBridge.invoke('getBrandWCPayRequest', { + "appId": "@jsApiUiPackage.AppId", //公众号名称,由商户传入 + "timeStamp": "@jsApiUiPackage.Timestamp", //时间戳 + "nonceStr": "@jsApiUiPackage.NonceStr", //随机串 + "package": "@Html.Raw(jsApiUiPackage.PrepayIdPackage)",//扩展包 + "signType": "RSA", //微信V3签名方式:RSA + "paySign": "@Html.Raw(jsApiUiPackage.Signature)" //微信签名 + }, function (res) { + + //alert(JSON.stringify(res)); + + if (res.err_msg == "get_brand_wcpay_request:ok") { + if (confirm('支付成功!点击“确定”进入退款流程测试。')) { + location.href = '/Docs/TenPayV3/TenpayApiV3/Refund'; + } + //console.log(JSON.stringify(res)); + }else{ + alert(JSON.stringify(res)); + } + // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 + //因此微信团队建议,当收到ok返回时,向商户后台询问是否收到交易成功的通知,若收到通知,前端展示交易成功的界面;若此时未收到通知,商户后台主动调用查询订单接口,查询订单的当前状态,并反馈给前端展示相应的界面。 + }); + + }); +``` + +> 注意:微信支付 ApiV2 和 ApiV3 在订单接口有完全不同的区别,如果升级请留意! + +> 本项目参考文件: +> +> /**_Views/TenpayApiV3/JsApi.cshtml_** + +**效果** + +![订单支付页面](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-dev-jsapi-03.jpg) + +![点击唤起支付](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-dev-jsapi-04.jpg) + +![支付成功](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-dev-jsapi-05.jpg) diff --git "a/docs/zh/guide/TenPayV3/Native\346\224\257\344\273\230.md" "b/docs/zh/guide/TenPayV3/Native\346\224\257\344\273\230.md" new file mode 100644 index 0000000000..c4532ac4b0 --- /dev/null +++ "b/docs/zh/guide/TenPayV3/Native\346\224\257\344\273\230.md" @@ -0,0 +1,75 @@ +# Native 支付 + +## Native 支付 + +Native 支付用于线下(或微信环境以外)的支付,通过微信扫描二维码,唤起个人微信支付完成支付过程。 + +生成二维码的控件很多,以 [ZXing.Net](https://www.nuget.org/packages/ZXing.Net) 为例,在 `TenPayApiV3Controller` 中创建方法: + +```cs +/// +/// 使用 Native 支付 +/// +/// +/// +/// +public async Task NativePayCode(int productId, int hc) +{ + var products = ProductModel.GetFakeProductList(); + var product = products.FirstOrDefault(z => z.Id == productId); + if (product == null || product.GetHashCode() != hc) + { + return Content("商品信息不存在,或非法进入!2004"); + } + + //使用 Native 支付,输出二维码并展示 + MemoryStream fileStream = null;//输出图片的URL + var price = (int)(product.Price * 100); + var name = product.Name + " - 微信支付 V3 - Native 支付"; + var sp_billno = string.Format("{0}{1}{2}", TenPayV3Info.MchId/*10位*/, SystemTime.Now.ToString("yyyyMMddHHmmss"), + TenPayV3Util.BuildRandomStr(6)); + + var notifyUrl = TenPayV3Info.TenPayV3Notify.Replace("/TenpayApiV3/", "/TenpayApiV3/"); + + TransactionsRequestData requestData = new(TenPayV3Info.AppId, TenPayV3Info.MchId, name, sp_billno, new TenpayDateTime(DateTime.Now.AddHours(1)), null, notifyUrl, null, new() { currency = "CNY", total = price }, null, null, null, null); + + BasePayApis basePayApis = new BasePayApis(); + var result = await basePayApis.NativeAsync(requestData); + //进行安全签名验证 + if (result.VerifySignSuccess == true) + { + fileStream = QrCodeHelper.GerQrCodeStream(result.code_url); + } + else + { + fileStream = QrCodeHelper.GetTextImageStream("Native Pay 未能通过签名验证,无法显示二维码"); + } + return File(fileStream, "image/png"); +} +``` + +> 本项目参考文件: +> +> /Controllers/TenPayApiV3Controller.cs + +上述过程将自动生成对应于指定商户、指定商品(productId)的付款二维码,前端 HTML 调用方式如下: + +```HTML +扫码付款 +``` + +用户扫码完成支付后,微信服务器会自动请求回调地址,如 /TenpayApiV3/NativeNotifyUrl,代码如下: + +``` +//待补充 +``` + +> 本项目参考文件: +> +> /Controllers/**_TenPayApiV3Controller.cs_** + +> 提示: +> +> Native 支付的回调地址设置位置位于:微信支付后台 > 产品中心 > 开发配置 > Native 支付回调链接。 +> +> ![Native 支付回调链接设置 ](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/native-setting-01.png)Native 支付回调链接设置 diff --git "a/docs/zh/guide/TenPayV3/\345\246\202\344\275\225\345\256\211\350\243\205.md" "b/docs/zh/guide/TenPayV3/\345\246\202\344\275\225\345\256\211\350\243\205.md" new file mode 100644 index 0000000000..0ab5e86916 --- /dev/null +++ "b/docs/zh/guide/TenPayV3/\345\246\202\344\275\225\345\256\211\350\243\205.md" @@ -0,0 +1,57 @@ +# 如何安装? + +您可以直接引用 Senparc.Weixin 的源码进行开发,也可以引用已经打包完成的 dll(通过 Nuget 包,推荐),以方便随时获取官方的更新。注意:直接引用源码和引用 Nuget 包只能二选一。 + +## 引用程序集(推荐) + +您可以通过 `Visual Studio`、`Visual Studio Code`、`dotnet 命令行` 等多种方式自动安装 Nuget 包。 + +### Visual Studio + +在开发项目【解决方案资源管理器】中,对需要添加 Senparc.Weixin.TenpayV3 的模块点击右键,点击【管理 Nuget 程序包】,在【浏览】标签中输入 **Senparc.Weixin.TenpayV3**,点击右侧【安装】按钮。如下图所示: + +![通过 Visual Studio 安装](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-install-01.png) + +### Visual Studio Code + +首先,确认已经安装好 [VS Code](https://code.visualstudio.com/) 以及 dotnet 命令行(安装 [.NET SDK](https://dotnet.microsoft.com/en-us/download) 后会自动安装)。 + +然后,打开解决方案或项目所在目录,按 Ctrl+~,打开终端面板: + +![通过 VS Code 安装](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-install-03.png) + +进入需要添加 Senparc.Weixin.Tenpay 的模块的项目的目录,输入: + +> ```cs +> dotnet add package Senparc.Weixin.TenpayV3 +> ``` + +![通过 VS Code 安装](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-install-04.png) + +安装完成后,可查看对应 .csproj 文件,被添加引用,如: + +```cs + + + +``` + +### dotnet 命令行 + +首先,确认已经安装好 dotnet 命令行(安装 [.NET SDK](https://dotnet.microsoft.com/en-us/download) 后会自动安装)。 + +进入需要添加 Senparc.Weixin.TenpayV3 的模块的项目的目录,输入: + +> ```cs +> dotnet add package Senparc.Weixin.TenpayV3 +> ``` + +![通过 dotnet CLI 安装](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-install-02.png) + +安装完成后,可查看对应 .csproj 文件,被添加引用,如: + +```cs + + + +``` diff --git "a/docs/zh/guide/TenPayV3/\346\224\257\344\273\230\345\233\236\350\260\203.md" "b/docs/zh/guide/TenPayV3/\346\224\257\344\273\230\345\233\236\350\260\203.md" new file mode 100644 index 0000000000..4ac405d348 --- /dev/null +++ "b/docs/zh/guide/TenPayV3/\346\224\257\344\273\230\345\233\236\350\260\203.md" @@ -0,0 +1,64 @@ +# 支付回调 + +## 支付回调 + +当用户在微信端完成支付后,微信服务器会主动推送一条通知到应用服务器。这条信息只会在微信官方服务器和应用服务器之间发生,不会有用户的参与,并且附加签名校验,因此才是可信的。 + +> **注意:千万不能信任手机客户端完成支付的状态,并以此通知应用服务器用户已完成支付!** + +以 JsApi 支付为例,当发起统一支付时,会要求填写回调地址(`TenPayV3UnifiedorderRequestData` 中的 `notifyUrl` 参数,见 **JSAPI 支付** 相关说明)。 + +> 注意:不同的支付方式提供回调地址的设置可能不同,如“Native 支付”,则是在微信支付的管理后台设置。 + +## 定义回调入口 + +```cs +/// +/// JS-SDK支付回调地址(在下单接口中设置的 notify_url) +/// +/// +public async Task PayNotifyUrl() +{ + try + { + //获取微信服务器异步发送的支付通知信息 + var resHandler = new TenPayNotifyHandler(HttpContext); + var orderReturnJson = await resHandler.AesGcmDecryptGetObjectAsync(); + + //获取支付状态 + string trade_state = orderReturnJson.trade_state; + + //验证请求是否从微信发过来(安全) + NotifyReturnData returnData = new(); + + //验证可靠的支付状态 + if (orderReturnJson.VerifySignSuccess == true && trade_state == "SUCCESS") + { + returnData.code = "SUCCESS";//正确的订单处理 + /* 提示: + * 1、直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! + * 2、上述判断已经具有比较高的安全性以外,还可以对访问 IP 进行判断进一步加强安全性。 + * 3、下面演示的是发送支付成功的模板消息提示,非必须。 + */ + } + else + { + returnData.code = "FAILD";//错误的订单处理 + returnData.message = "验证失败"; + + //此处可以给用户发送支付失败提示等 + } + + return Json(returnData); + } + catch (Exception ex) + { + WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); + throw; + } +} +``` + +> 本项目参考文件: +> +> /Controllers/**_TenPayApiV3Controller.cs_** diff --git "a/docs/zh/guide/TenPayV3/\346\263\250\345\206\214.md" "b/docs/zh/guide/TenPayV3/\346\263\250\345\206\214.md" new file mode 100644 index 0000000000..17ce98a4b9 --- /dev/null +++ "b/docs/zh/guide/TenPayV3/\346\263\250\345\206\214.md" @@ -0,0 +1,83 @@ +# 注册 + +## 全局注册 + +所有的 Senparc.Weixin SDK 注册过程都是类似的。 + +首先,完成所有 Senparc.Weixin SDK 的整体注册代码。在 Program.cs 中加入以下代码: + +![注册 Senparc.Weixin](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-dev-register-01.png) + +说明: + +1. `builder.Services.AddMemoryCache()` Senparc.Weixin 支持本机缓存、Redis、Memcached 等多种缓存策略,默认使用本机缓存,此时需要激活本地缓存。 +2. `builder.Services.AddSenparcWeixinServices(builder.Configuration)` 用于完成 Senparc.Weixin 的注册。 +3. `app.UseSenparcWeixin()` 方法用于配置和启用 Senparc.Weixin。 + +以上代码对于所有的 Senparc.Weixin 下级模块都是相同的,只需要 3 句代码。 + +> 本项目参考文件: +> +> /Program.cs + +## 公众号注册 + +在上述代码中的第 27 行委托方法中插入代码,即可完成默认公众号以及微信支付的注册: + +```cs + //注册公众号信息(可以执行多次,注册多个公众号) + register.RegisterMpAccount(weixinSetting, "【盛派网络小助手】公众号"); + //注册微信支付(可以执行多次,注册多个微信支付) + register.RegisterTenpayApiV3(weixinSetting, "【盛派网络小助手】微信支付(ApiV3)"); +``` + +![注册微信公众号](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-dev-register-02.png) + +> 注意: +> +> 上述代码同时注册了公众号和微信支付(V2),因为微信支付需要提供微信用户的标识(OpenId),OpenId 必须来自微信公众号、小程序等模块。如果需要在小程序内使用微信支付,则需要对应注册小程序。 + +其中,`weixinSetting` 的值默认来自于 `appsettings.json`: + +```JSON + "SenparcWeixinSetting": { + "IsDebug": true, + + //公众号 + "Token": "#{Token}#", + "EncodingAESKey": "#{EncodingAESKey}#", + "WeixinAppId": "#{WeixinAppId}#", + "WeixinAppSecret": "#{WeixinAppSecret}#", + + //微信支付V3 + "TenPayV3_AppId": "#{TenPayV3_AppId}#", + "TenPayV3_AppSecret": "#{TenPayV3_AppSecret}#", + "TenPayV3_SubAppId": "#{TenPayV3_SubAppId}#", + "TenPayV3_SubAppSecret": "#{TenPayV3_SubAppSecret}#", + "TenPayV3_MchId": "#{TenPayV3_MchId}#", + "TenPayV3_SubMchId": "#{TenPayV3_SubMchId}#", //子商户,没有可留空 + "TenPayV3_Key": "#{TenPayV3_Key}#", + "TenPayV3_TenpayNotify": "#{TenPayV3_TenpayNotify}#", //http://YourDomainName/TenpayApiV3/PayNotifyUrl + /* 支付证书私钥 + * 1、支持明文私钥(无换行字符) + * 2、私钥文件路径(如:~/App_Data/cert/apiclient_key.pem),注意:必须放在 App_Data 等受保护的目录下,避免泄露 + */ + "TenPayV3_PrivateKey": "#{TenPayV3_PrivateKey}#", //(新)证书私钥 + "TenPayV3_SerialNumber": "#{TenPayV3_SerialNumber}#", //(新)证书序列号 + "TenPayV3_ApiV3Key": "#{TenPayV3_APIv3Key}#", //(新)APIv3 密钥 + } +``` + +![配置参数](https://sdk.weixin.senparc.com/Docs/TenPayV3/images/home-dev-register-03.png) + +其中,`Token`、`EncodingAESKey`、`WeixinAppId` 和 `WeixinAppSecret` 对应了微信公众号后台的配置参数。 + +特别说明: `TenPayV3_PrivateKey` 可使用已经处理好的私钥,也可以直接提供从微信支付官网下载的私钥文件(下载的压缩包中解压文件 apiclient_key.pem,并复制到安全的路径,推荐 `App_Data` 目录下),虚拟路径从网站根目录开始,必须以 `~/` 开头,如 `~/App_Data/cert/apiclient_key.pem`,SDK 将全自动处理。 + +> 本项目参考文件: +> +> /appsettings.json + +配置完成。 + +> 提示:自动注册的信息可通过 `Senparc.Weixin.Config.SenparcWeixinSetting` 获取。 diff --git "a/docs/zh/guide/TenPayV3/\346\272\220\347\240\201.md" "b/docs/zh/guide/TenPayV3/\346\272\220\347\240\201.md" new file mode 100644 index 0000000000..4ed97e8215 --- /dev/null +++ "b/docs/zh/guide/TenPayV3/\346\272\220\347\240\201.md" @@ -0,0 +1,15 @@ +# 源码 + +## Senparc.Weixin SDK 源码 + +GitHub:[https://github.com/JeffreySu/WeiXinMPSDK](https://github.com/JeffreySu/WeiXinMPSDK)(更新更快) + +Gitee:[https://gitee.com/JeffreySu/WeiXinMPSDK](https://gitee.com/JeffreySu/WeiXinMPSDK)(从 GitHub 同步) + +## 打包代码 + +Nuget 包地址:[https://www.nuget.org/packages/Senparc.Weixin.TenpayV3](https://www.nuget.org/packages/Senparc.Weixin.TenpayV3) + +## 本地源码文件 + +Senparc.Weixin.TenpayV3 源码位置:[/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3) diff --git "a/docs/zh/guide/TenPayV3/\350\277\233\351\230\266.md" "b/docs/zh/guide/TenPayV3/\350\277\233\351\230\266.md" new file mode 100644 index 0000000000..1b32c519b3 --- /dev/null +++ "b/docs/zh/guide/TenPayV3/\350\277\233\351\230\266.md" @@ -0,0 +1,11 @@ +# 进阶 + +当前示例展示了最基本和常用的功能,如果您需要了解更多高级玩法,并且有扎实的编程功底,请参考完整示例。 + +> 完整示例解决方案文件: +> +> Senparc.Weixin SDK 源文件根目录[/Samples/All/net7-mvc/Senparc.Weixin.Sample.Net7.sln](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/Samples/All/net7-mvc) + +> 务必阅读 readme 文件: +> +> Senparc.Weixin SDK 源文件根目录[/Samples/All/net7-mvc/readme.md](https://github.com/JeffreySu/WeiXinMPSDK/blob/master/Samples/All/net7-mvc/readme.md) diff --git "a/docs/zh/guide/TenPayV3/\351\200\200\346\254\276.md" "b/docs/zh/guide/TenPayV3/\351\200\200\346\254\276.md" new file mode 100644 index 0000000000..cba8a12473 --- /dev/null +++ "b/docs/zh/guide/TenPayV3/\351\200\200\346\254\276.md" @@ -0,0 +1,112 @@ +# 退款 + +## 退款 + +退款方法核心代码如下: + +```cs +/// +/// 退款申请接口 +/// +/// +public async Task Refund() +{ + try + { + string nonceStr = TenPayV3Util.GetNoncestr(); + + string outTradeNo = HttpContext.Session.GetString("BillNo"); + if (!TradeNumberToTransactionId.TryGetValue(outTradeNo, out string transactionId)) + { + return Content("transactionId 不正确,可能是服务器还没有收到微信回调确认通知,退款失败。请稍后刷新再试。"); + } + + string outRefundNo = "OutRefunNo-" + SystemTime.Now.Ticks; + int totalFee = int.Parse(HttpContext.Session.GetString("BillFee")); + int refundFee = totalFee; + string opUserId = TenPayV3Info.MchId; + var notifyUrl = "https://sdk.weixin.senparc.com/TenpayApiV3/RefundNotifyUrl"; + + var dataInfo = new RefundRequsetData(transactionId, null, outRefundNo, "Senparc TenPayV3 demo退款测试", notifyUrl, null, new RefundRequsetData.Amount(refundFee, null, refundFee, "CNY"), null); + + var result = await _basePayApis.RefundAsync(dataInfo); + + return View(); + } + catch (Exception ex) + { + WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); + throw; + } +} +``` + +> 本项目参考文件: +> +> /Controllers/**_TenPayApiV3Controller.cs_** + +> 说明:上述代码为了方便演示,并限定在没有登录功能的情况下只能退款本人自己支付过的订单,因此将 BillNo(订单号)存在 Session 中,实际开发过程中可放入 URL 或 Post 参数中进行请求,并注意做好权限验证! + +## 退款回调 + +在退款接口调用过程中,有一个 `notifyUrl` 的参数,此地址用于接收微信服务器发送的退款信息回调信息。代码如下: + +```cs +/// +/// 退款通知地址 +/// +/// +public async Task RefundNotifyUrl() +{ + WeixinTrace.SendCustomLog("RefundNotifyUrl被访问", "IP" + HttpContext.UserHostAddress()?.ToString()); + + NotifyReturnData returnData = new(); + try + { + var resHandler = new TenPayNotifyHandler(HttpContext); + var refundNotifyJson = await resHandler.AesGcmDecryptGetObjectAsync(); + + WeixinTrace.SendCustomLog("跟踪RefundNotifyUrl信息", refundNotifyJson.ToJson()); + + string refund_status = refundNotifyJson.refund_status; + if (/*refundNotifyJson.VerifySignSuccess == true &*/ refund_status == "SUCCESS") + { + returnData.code = "SUCCESS"; + returnData.message = "OK"; + + //获取接口中需要用到的信息 例 + string transaction_id = refundNotifyJson.transaction_id; + string out_trade_no = refundNotifyJson.out_trade_no; + string refund_id = refundNotifyJson.refund_id; + string out_refund_no = refundNotifyJson.out_refund_no; + int total_fee = refundNotifyJson.amount.payer_total; + int refund_fee = refundNotifyJson.amount.refund; + + //填写逻辑 + WeixinTrace.SendCustomLog("RefundNotifyUrl被访问", "验证通过"); + } + else + { + returnData.code = "FAILD"; + returnData.message = "验证失败"; + WeixinTrace.SendCustomLog("RefundNotifyUrl被访问", "验证失败"); + + } + + //进行后续业务处理 + } + catch (Exception ex) + { + returnData.code = "FAILD"; + returnData.message = ex.Message; + WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); + } + + //https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay3_3.shtml + return Json(returnData); +} +``` + +> 本项目参考文件: +> +> /Controllers/**_TenPayApiV3Controller.cs_** diff --git a/docs/zh/guide/Work/JSSDK_agentConfig.md b/docs/zh/guide/Work/JSSDK_agentConfig.md new file mode 100644 index 0000000000..fe30402c89 --- /dev/null +++ b/docs/zh/guide/Work/JSSDK_agentConfig.md @@ -0,0 +1,128 @@ +# JSSDK(agentConfig) + +`wx.agentConfig()` 用于某些特定的接口(如审批流接口、剪切板接口等),但一般前提都需要先使用到常规的 JSSDK(参考【JSSDK(常规)】标签),因此这是一个增加项。 + +`wx.agentConfig()` 同样分为服务器端和客户端两部分。 + +## 服务端获取签名信息 + +后端除了后端通过 `JSSDKHelper.GetJsSdkUiPackageAsync()` 方法获取常规 JSSDK 运行所需参数以外,还需要使用同一个方法,传入不同参数来获取 `agetntConfig` 的对应参数: + +```JS +public async Task AgentConfig() +{ + //此处演示同时支持多个应用的注册,请参考 appsettings.json 文件 + var workSetting = Senparc.Weixin.Config.SenparcWeixinSetting["企业微信审批"] as ISenparcWeixinSettingForWork; + var url = "https://sdk.weixin.senparc.com/Work/Approval"; + + //获取 UI 信息包 + + /* 注意: + * 所有应用中,jsApiUiPackage 是必备的 + */ + var jsApiTicket = await JsApiTicketContainer.GetTicketAsync(workSetting.WeixinCorpId, workSetting.WeixinCorpSecret, false); + var jsApiUiPackage = await JSSDKHelper.GetJsApiUiPackageAsync(workSetting.WeixinCorpId, workSetting.WeixinCorpSecret, url, jsApiTicket, false); + ViewData["jsApiUiPackage"] = jsApiUiPackage; + + /* 注意: + * 1、这里需要使用 WeixinCorpAgentId,而不是 WeixinCorpId + * 2、agentJsApiUiPackage 是否需要提供,请参考官方文档,此处演示了最复杂的情况 + */ + ViewData["thirdNo"] = DateTime.Now.Ticks + Guid.NewGuid().ToString("n"); + ViewData["corpId"] = workSetting.WeixinCorpId; + ViewData["agentId"] = workSetting.WeixinCorpAgentId; + var agentConfigJsApiTicket = await JsApiTicketContainer.GetTicketAsync(workSetting.WeixinCorpId, workSetting.WeixinCorpSecret, true); + var agentJsApiUiPackage = await JSSDKHelper.GetJsApiUiPackageAsync(workSetting.WeixinCorpId, workSetting.WeixinCorpSecret, url, agentConfigJsApiTicket, true); + ViewData["agentJsApiUiPackage"] = agentJsApiUiPackage; + + return View(); +} +``` + +> 注意:上述方法中,使用了 +> +> `Senparc.Weixin.Config.SenparcWeixinSetting["企业微信审批"]` +> +> 来获取与之前不同的微信配置,请参考本项目中 +> +> `appsetting.json` +> +> 文件中的设置方法: +> +> ```JSON +> "Items": { +> //添加多个企业微信应用 +> "企业微信审批": { +> "WeixinCorpId": "#{WeixinCorpId2}#", +> "WeixinCorpAgentId": "#{WeixinCorpAgentId2}#", +> "WeixinCorpSecret": "#{WeixinCorpSecret2}#", +> "WeixinCorpToken": "#{WeixinCorpToken2}#", +> "WeixinCorpEncodingAESKey": "#{WeixinCorpEncodingAESKey2}#"} +> } +> ``` +> +> 此方法对所有其他模块也通用(如公众号、小程序、微信支付等)。 + +> 本项目参考文件: +> +> /Controllers/**_JSSDKnController.cs_** - AgentConfig() 方法 +> +> /**_appsettings.json_** + +## 网页端配置 JSSDK + +网页端除了进行常规的 JSSDK 配置以外,还需要在执行特定的 JsApi 方法之前,添加 `wx.agentConfig()` 的配置: + +```cs +function invoke(){ + wx.agentConfig({ + corpid: '@ViewData["corpId"]', // 必填,企业微信的corpid,必须与当前登录的企业一致 + agentid: '@ViewData["agentId"]', // 必填,企业微信的应用id (e.g. 1000247) + timestamp: @agentJsApiUiPackage.Timestamp, // 必填,生成签名的时间戳 + nonceStr: '@agentJsApiUiPackage.NonceStr', // 必填,生成签名的随机串 + signature: '@agentJsApiUiPackage.Signature',// 必填,签名,见附录-JS-SDK使用权限签名算法 + jsApiList: ['thirdPartyOpenPage'], //必填,传入需要使用的接口名称 + success: function(res) { + + // 回调 + wx.invoke('thirdPartyOpenPage', { + "oaType": "10001",// String + //"templateId": "C4NxepvGj51gbkeGXHQgYRArW96WrxRinNfyCxo7N",//SYS + "templateId":"247bcb886d0374a0a1f749c52794ba1a_622421053",// Open + "thirdNo": "",// String + "extData": { + 'fieldList': [{ + 'title': '审批类型', + 'type': 'text', + 'value': '文章审批', + }, + { + 'title': '预览', + 'type': 'link', + 'value': 'https://weixin.senparc.com', + }], + } + }, + function(res) { + // 输出接口的回调信息 + console.log(res); + alert('wx.invoke result:'+JSON.stringify(res)); + }); + }, + fail: function(res) { + if(res.errMsg.indexOf('function not exist') > -1){ + alert('版本过低请升级') + } + else{ + alert('wx.invoke fail:'+JSON.stringify(res)); + } + } + }); +} +``` + +HTML 页面进行触发:`点击唤起审批流程` + +> 本项目参考文件: +> +> /Views/**_JSSDK/Index.cshtml_** diff --git "a/docs/zh/guide/Work/JSSDK\345\270\270\350\247\204.md" "b/docs/zh/guide/Work/JSSDK\345\270\270\350\247\204.md" new file mode 100644 index 0000000000..0048751988 --- /dev/null +++ "b/docs/zh/guide/Work/JSSDK\345\270\270\350\247\204.md" @@ -0,0 +1,91 @@ +# JSSDK(常规) + +JSSDK 用于提供微信内置浏览器接口的能力,例如转发控制、调用摄像头权限(拍照、视频)、文件上传、关闭窗口、唤起扫码窗口,等等。 + +要在内置浏览器中只用 JSSDK,分为“服务端获取签名信息”和“网页端配置 JSSDK”两步。 + +企业微信的网页端 JSSDK 配置,和公众号类似,不过多了一个名为 `wx.agentConfig()` 的配置方法。这里介绍常规的方法,`wx.agentConfig()` 配套方法请见【JSSDK(agentConfig】标签。 + +## 服务端获取签名信息 + +后端通过 `JSSDKHelper.GetJsSdkUiPackageAsync()` 方法即可自动获取前端所需的所有 JSSDK 运行所需参数: + +```cs +public async Task Index() +{ + // 当前 URL + var url = "https://sdk.work.weixin.senparc.com/JSSDK/"; + // 获取企业微信配置 + var workSetting = Senparc.Weixin.Config.SenparcWeixinSetting.WorkSetting; + // 获取 JsApiTicket(保密信息,不可外传) + var jsApiTicket = await JsApiTicketContainer.GetTicketAsync(workSetting.WeixinCorpId, workSetting.WeixinCorpSecret, false); + // 获取 UI 打包信息 + var jsApiUiPackage = await JSSDKHelper.GetJsApiUiPackageAsync(workSetting.WeixinCorpId, workSetting.WeixinCorpSecret, url, jsApiTicket, false); + + ViewData["jsApiUiPackage"] = jsApiUiPackage; + return View(); +} +``` + +> 本项目参考文件: +> +> /Controllers/**_JSSDKnController.cs_** - Index() 方法 + +## 网页端配置 JSSDK + +后端配置完成的参数,直接在前端 JS 中使用 `wx.config` 进行设置,例如以下代码将完成从企业微信内转发网页到**个人微信**: + +```cs +$(function(){ + wx.config({ + beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题 + debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 + appId: '@jsApiUiPackage.AppId', // 必填,企业微信的corpID + timestamp: @jsApiUiPackage.Timestamp, // 必填,生成签名的时间戳 + nonceStr: '@jsApiUiPackage.NonceStr', // 必填,生成签名的随机串 + signature: '@jsApiUiPackage.Signature',// 必填,签名,见 附录-JS-SDK使用权限签名算法 + jsApiList: ['shareWechatMessage'] // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来 + }); + + wx.checkJsApi({ + jsApiList: ['shareWechatMessage'], // 需要检测的JS接口列表,所有JS接口列表见附录2, + success: function(res) { + // 以键值对的形式返回,可用的api值true,不可用为false + // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"} + //alert("wx.config success:"+JSON.stringify(res)); + } + }); +}); + +wx.ready(function(){ + // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。 +}); + +wx.error(function(res){ + // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 + console.log(res); + alert(res); +}); + +function invoke(){ + wx.invoke( + "shareWechatMessage", { + title: '企业微信JSSDK 演示-转发', // 分享标题 + desc: '来自 Senparc.Weixin.Work', // 分享描述 + link: 'https://sdk.work.weixin.senparc.com/JSSDK', // 分享链接 + imgUrl: '' // 分享封面 + }, function(res) { + if (res.err_msg == "shareWechatMessage:ok") { + } + } + ); +} +``` + +HTML 页面进行触发:`转发到微信` + +> 本项目参考文件: +> +> /Views/JSSDK/**_Index.cshtml_** + +更多设置详情请参考:[JS-SDK 说明文档](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html)。 diff --git a/docs/zh/guide/Work/MessageHandler.md b/docs/zh/guide/Work/MessageHandler.md new file mode 100644 index 0000000000..bb2835540d --- /dev/null +++ b/docs/zh/guide/Work/MessageHandler.md @@ -0,0 +1,58 @@ +# MessageHandler + +`MessageHandler` 用于处理企业微信对话窗口的消息。 + +SDK 已经为开发者准备好了所有需要的基础功能,开发者只需要创建一个自定义的子类,补充需要自定义的业务逻辑。 + +## 自定义 MessageHandler + +当前示例中,我们给自定义的 MessageHandler 取名 `WorkCustomMessageHandler`。 + +> WorkCustomMessageHandler.cs 本项目参考文件: +> +> /MessageHandlers/ 目录 +> **_WorkCustomMessageHandler.cs_** MessageHandler 主文件,负责普通消息处理 +> **_WorkCustomMessageContext.cs_** 自定义重写 DefaultMpMessageContext 上下文(可选) + +`WorkCustomMessageHandler.cs` 中所有演示的重写(`override`)方法中,只有 `DefaultResponseMessage()` 方法是必须重写的,其他所有 `OnXxxRequest()` 方法都为可选,当用户发送的消息,找不到对应重写方法时,则调用 `DefaultResponseMessage()` 方法。 + +MessageHandler 有两种承载方式,使其可以被外部(微信服务器)通过 URL 访问到。分别是**中间件方式**(推荐)和 **Controller 方式**。两种方式所使用的 `WorkCustomMessageHandler` 是通用的,因此可以随时切换和共存。 + +## 中间件方式承载 MessageHandler + +中间件方式是推荐的方式,也是最简化的方式,无需创建任何新文件,只需在 `Program.cs` 文件所有 Senparc.Weixin 注册代码执行后的下方,引入中间件: + +```cs +app.UseMessageHandlerForWork("/WorkAsync", WorkCustomMessageHandler.GenerateMessageHandler, options => +{ + options.AccountSettingFunc = context => Senparc.Weixin.Config.SenparcWeixinSetting; +}); +``` + +完成后,即可通过 Url **`域名/WorkAsync`** 访问 MessageHandler,设置为公众号后台的消息 URL。 + +[测试 /WorkAsync](https://sdk.weixin.senparc.com/WorkAsync) + +> 本项目参考文件: +> +> /**_Program.cs_** + +[测试 /Work](https://sdk.weixin.senparc.com/Work) + +更多中间件方式请参考(和公众号使用方法相同):[《在 .NET Core 2.0/3.0 中使用 MessageHandler 中间件》](https://www.cnblogs.com/szw/p/Wechat-MessageHandler-Middleware.html)(同样适用于 .NET 6.0 及以上)。 + +## Controller 方式承载 MessageHandler + +当中间件的方式满足不了需求时,可以使用 Controller 将执行过程“展开”,对每一步执行进行更加精确的控制或干预。 + +使用 Controller 方式,需要创建 2 个 Action,分别对应微信后台验证(Get 请求),以及真实消息推送(Post 请求)。本项目示例位于 WorkController.cs 中。 + +> WorkController.cs 本项目参考文件: +> +> /Controllers/**_WorkController.cs_** + +完成后,即可通过 Url **`域名/Work`** 访问 MessageHandler,设置为公众号后台的消息 URL。 + +[测试 /Work](https://sdk.weixin.senparc.com/Work) + +更多 Controller 方式请参考(和公众号使用方法相同):[《了解 MessageHandler》](https://www.cnblogs.com/szw/p/3414862.html)(推荐使用全套异步方法) diff --git a/docs/zh/guide/Work/OAuth2.0.md b/docs/zh/guide/Work/OAuth2.0.md new file mode 100644 index 0000000000..5166357d15 --- /dev/null +++ b/docs/zh/guide/Work/OAuth2.0.md @@ -0,0 +1,98 @@ +# OAuth 2.0 + +当你需要在网页上获取用户的 UserId、头像、称呼等信息的时候,就需要使用 OAuth 2.0 的方式和微信服务器通讯。 + +更多信息请参考官方文档:[网页授权登录](https://developer.work.weixin.qq.com/document/path/91335)。 + +SDK 已经封装了所有相关的过程,您只需要参考示例进行简单的 3 步配置即可。 + +## 第一步:设置登录页面 + +登录页面中需要设置官方 OAuth 2.0 的请求 URL(称为 **AuthorizeUrl**),并带上登录成功后的 returnUrl。 + +由于微信授权具有两种方式:**snsapi_userinfo** 和 **snsapi_base**,企业自建应用使用 **snsapi_base**,因此本示例中使用此方式进行介绍 **snsapi_base**(默认)的 **AuthorizeUrl** 获取的方式(此方式也是所有场景下兼容的方式): + +```cs +public IActionResult Index(string returnUrl) +{ + // 设置自己的 URL + var url = "https://4424-222-93-135-159.ngrok.io"; + + //此页面引导用户点击授权 + var oauthUrl = + OAuth2Api.GetCode(_corpId, $"{url}/OAuth2/BaseCallback?returnUrl={returnUrl.UrlEncode()}", + null, null);//snsapi_base方式回调地址 + + ViewData["UrlBase"] = oauthUrl; + ViewData["returnUrl"] = returnUrl; + + return View(); +} +``` + +上述 `returnUrl` 参数一般为跳转到登陆页面之前的 URL,也可以是希望用户完成授权之后跳转到的 URL。 + +> 注意:上述的网址和路径需要在公众号后台匹配成你自己服务器的地址(参考文档:[网页授权登录](https://developer.work.weixin.qq.com/document/path/91335))。 + +> 本项目参考文件: +> +> /Controllers/OAuth2Controller.cs + +## 第二步:前端登录页面设置 + +登录页面最终的功能是引导用户打开 **AuthorizeUrl**,可以直接使用连接的方式: + +``` +点击这里测试snsapi_base +``` + +> 本项目参考文件: +> +> /Views/**_OAuth2/Index.cshtml_** + +## 第三步:配置登陆后回调页面 + +授权成功后,网页将自动跳转到第一步中设置的回调 URL(`$"{url}/OAuth2/BaseCallback?returnUrl={returnUrl.UrlEncode()}"`): + +```cs +public async Task BaseCallback(string code, string returnUrl) +{ + if (string.IsNullOrEmpty(code)) + { + return Content("您拒绝了授权!"); + } + + try + { + var appKey = AccessTokenContainer.BuildingKey(_workWeixinSetting); + var accessToken = await AccessTokenContainer.GetTokenAsync(_corpId, _corpSecret); + //获取用户信息 测试链接:https://open.work.weixin.qq.com/wwopen/devtool/interface?doc_id=10019 + var oauthResult = await OAuth2Api.GetUserIdAsync(accessToken, code); + var userId = oauthResult.UserId; + GetMemberResult result = await MailListApi.GetMemberAsync(appKey, userId); + + if (result.errcode != ReturnCode_Work.请求成功) + { + return Content("错误:" + result.errmsg); + } + + ViewData["returnUrl"] = returnUrl; + + /* 注意: + * 实际适用场景,此处应该跳转到 returnUrl,不要停留在 Callback页面上。 + * 因为当用户刷新此页面 URL 时,实际 code 等参数已失效,用户会受到错误信息。 + */ + return View(result); + } + catch (Exception ex) + { + return Content("错误:" + ex.Message); + } +} +``` + +上述代码中,传入的 `returnUrl` 即第一步 `Index()` 方法中传入到 **AuthorizeUrl** 中的 `returnUrl`,当所有用户信息获取、保存等操作完成后,借助 `returnUrl` 跳转到登陆之前的页面,完成整个闭环的登录操作。 + +> 本项目参考文件: +> +> /Controllers/**_OAuth2Controller.cs_** diff --git "a/docs/zh/guide/Work/\345\246\202\344\275\225\345\256\211\350\243\205.md" "b/docs/zh/guide/Work/\345\246\202\344\275\225\345\256\211\350\243\205.md" new file mode 100644 index 0000000000..44e9756d62 --- /dev/null +++ "b/docs/zh/guide/Work/\345\246\202\344\275\225\345\256\211\350\243\205.md" @@ -0,0 +1,67 @@ +# 如何安装? + +您可以直接引用 Senparc.Weixin 的源码进行开发,也可以引用已经打包完成的 dll(通过 Nuget 包,推荐),以方便随时获取官方的更新。注意:直接引用源码和引用 Nuget 包只能二选一。 + +## 引用源码 + +您可以在当前解决方案中,**Libraries** 目录下,将所需要引用的程序集引用(复制)到您开发环境的解决方案中,请注意需要同时引用被依赖的项目,如 `Senparc.Weixin` 项目是所有项目都需要依赖的。 + +当前示例项目默认就使用了直接引用源码的方式,可从 .csproj 文件中看到引用方式: + +```cs + + + + + +``` + +## 引用程序集(推荐) + +您可以通过 `Visual Studio`、`Visual Studio Code`、`dotnet 命令行` 等多种方式自动安装 Nuget 包。 + +### Visual Studio + +在开发项目【解决方案资源管理器】中,对需要添加 Senparc.Weixin.Work 的模块点击右键,点击【管理 Nuget 程序包】,在【浏览】标签中输入 **Senparc.Weixin.Work**,点击右侧【安装】按钮。如下图所示: + +![通过 Visual Studio 安装](https://sdk.weixin.senparc.com/Docs/Work/images/home-install-01.png) + +## Visual Studio Code + +首先,确认已经安装好 [VS Code](https://code.visualstudio.com/) 以及 dotnet 命令行(安装 [.NET SDK](https://dotnet.microsoft.com/en-us/download) 后会自动安装)。 + +然后,打开解决方案或项目所在目录,按 Ctrl+~,打开终端面板,进入需要添加 Senparc.Weixin.Work 的模块的项目的目录,输入: + +> ```cs +> dotnet add package Senparc.Weixin.Work +> ``` + +![通过 VS Code 安装](https://sdk.weixin.senparc.com/Docs/Work/images/home-install-03.png)安装 Senparc.Weixin.Work 模块 + +安装完成后,可查看对应 .csproj 文件,被添加引用,如: + +```cs + + + +``` + +## dotnet 命令行 + +首先,确认已经安装好 dotnet 命令行(安装 [.NET SDK](https://dotnet.microsoft.com/en-us/download) 后会自动安装)。 + +进入需要添加 Senparc.Weixin.Work 的模块的项目的目录,输入: + +> ```cs +> dotnet add package Senparc.Weixin.Work +> ``` + +![通过 dotnet CLI 安装](https://sdk.weixin.senparc.com/Docs/Work/images/home-install-02.png)通过 dotnet CLI 安装 + +安装完成后,可查看对应 .csproj 文件,被添加引用,如: + +```cs + + + +``` diff --git "a/docs/zh/guide/Work/\346\263\250\345\206\214.md" "b/docs/zh/guide/Work/\346\263\250\345\206\214.md" new file mode 100644 index 0000000000..e658c1d6de --- /dev/null +++ "b/docs/zh/guide/Work/\346\263\250\345\206\214.md" @@ -0,0 +1,64 @@ +# 注册 + +## 全局注册 + +所有的 Senparc.Weixin SDK 注册过程都是类似的。 + +首先,完成所有 Senparc.Weixin SDK 的整体注册代码。在 Program.cs 中加入以下代码: + +![注册 Senparc.Weixin](https://sdk.weixin.senparc.com/Docs/Work/images/home-dev-register-01.png) + +说明: + +1. `builder.Services.AddMemoryCache()` Senparc.Weixin 支持本机缓存、Redis、Memcached 等多种缓存策略,默认使用本机缓存,此时需要激活本地缓存。 +2. `builder.Services.AddSenparcWeixinServices(builder.Configuration)` 用于完成 Senparc.Weixin 的注册。 +3. `app.UseSenparcWeixin()` 方法用于配置和启用 Senparc.Weixin。 + +以上代码对于所有的 Senparc.Weixin 下级模块都是相同的,只需要 3 句代码。 + +> 本项目参考文件: +> +> /**_Program.cs_** + +## 企业微信 + +在上述代码中的第 17 行委托方法中插入代码,即可完成默认公众号的注册: + +```cs +register.RegisterWorkAccount(weixinSetting, "【盛派网络】企业微信"); +``` + +![注册微信公众号](https://sdk.weixin.senparc.com/Docs/Work/images/home-dev-register-02.png) + +其中,`weixinSetting` 的值默认来自于 `appsettings.json`: + +```JSON +"SenparcWeixinSetting": { + //以下为 Senparc.Weixin 的 SenparcWeixinSetting 微信配置 + //注意:所有的字符串值都可能被用于字典索引,因此请勿留空字符串(但可以根据需要,删除对应的整条设置)! + + //微信全局 + "IsDebug": true, + + //以下不使用的参数可以删除,key 修改后将会失效 + + //企业微信 + "WeixinCorpId": "#{WeixinCorpId}#", + "WeixinCorpAgentId": "#{WeixinCorpAgentId}#", + "WeixinCorpSecret": "#{WeixinCorpSecret}#", + "WeixinCorpToken": "#{WeixinCorpToken}#", + "WeixinCorpEncodingAESKey": "#{WeixinCorpEncodingAESKey}#" + + //可以追加更多其他平台的配置信息 +} +``` + +其中,`WeixinCorpId` 是每个企业微信账号独有的 **corpId**,`WeixinCorpAgentId` 和 `WeixinCorpSecret` 对应每个不同应用的 **agentId** 和 **secret**, `WeixinCorpToken` 和 `WeixinCorpEncodingAESKey` 对应了当前应用消息接口的后台的配置参数。 + +> 本项目参考文件: +> +> /**_appsettings.json_** + +配置完成。 + +> 提示:自动注册的信息可通过 `Senparc.Weixin.Config.SenparcWeixinSetting` 获取。 diff --git "a/docs/zh/guide/Work/\346\272\220\347\240\201.md" "b/docs/zh/guide/Work/\346\272\220\347\240\201.md" new file mode 100644 index 0000000000..0641c2aed7 --- /dev/null +++ "b/docs/zh/guide/Work/\346\272\220\347\240\201.md" @@ -0,0 +1,15 @@ +# 源码 + +## Senparc.Weixin SDK 源码 + +GitHub:[github_WeiXinMPSDK](https://github.com/JeffreySu/WeiXinMPSDK)(更新更快) + +Gitee:[gitee_WeiXinMPSDK](https://gitee.com/JeffreySu/WeiXinMPSDK) (从 GitHub 同步) + +## 打包代码 + +Nuget 包地址:[https://www.nuget.org/packages/Senparc.Weixin.Work](https://www.nuget.org/packages/Senparc.Weixin.Work) + +## 本地源码文件 + +Senparc.Weixin.Work 源码位置:[/src/Senparc.Weixin.Work](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/src/Senparc.Weixin.Work) diff --git "a/docs/zh/guide/Work/\350\217\234\345\215\225\350\256\276\347\275\256.md" "b/docs/zh/guide/Work/\350\217\234\345\215\225\350\256\276\347\275\256.md" new file mode 100644 index 0000000000..836b23df35 --- /dev/null +++ "b/docs/zh/guide/Work/\350\217\234\345\215\225\350\256\276\347\275\256.md" @@ -0,0 +1,79 @@ +# 菜单设置 + +自定义菜单是企业微信应用界面的重要元素,菜单的使用分为 **设置** 和 **使用** 两个环节。 + +## 设置 + +方法一:在企业微信后台【应用管理】中,某个应用设置界面中,【功能】区域【自定义菜单】中设置(不使用开发模式),此处略。 + +方法二:使用代码进行设置(只需要执行一次,建议放在管理员后台,手动运行),如: + +```cs +public async Task CreateMenuTest() +{ + ButtonGroup bg = new ButtonGroup(); + + //单击 + bg.button.Add(new SingleClickButton() + { + name = "单击测试", + key = "OneClick", + type = MenuButtonType.click.ToString(),//默认已经设为此类型,这里只作为演示 + }); + + //二级菜单 + var subButton = new SubButton() + { + name = "二级菜单" + }; + subButton.sub_button.Add(new SingleClickButton() + { + key = "SubClickRoot_Text", + name = "返回文本" + }); + subButton.sub_button.Add(new SingleViewButton() + { + url = "https://weixin.senparc.com", + name = "Url跳转" + }); + bg.button.Add(subButton); + + var workWeixinSetting = Config.SenparcWeixinSetting.WorkSetting; + var appKey = AccessTokenContainer.BuildingKey(workWeixinSetting); + int agentId; + if (!int.TryParse(workWeixinSetting.WeixinCorpAgentId, out agentId)) + { + throw new WeixinException("WeixinCorpAgentId 必须为整数!"); + } + var result = await CommonApi.CreateMenuAsync(appKey, agentId, bg); + + Assert.IsNotNull(result); + Assert.AreEqual("ok", result.errmsg); +} +``` + +## 使用 + +设置完菜单后,当客户端点击菜单时,微信服务器会自动推送响应的回调信息到消息 URL(即已经设置好的 MessageHandler 内),只需在 WorkCustomMessageHandler 中重写(`override`)对应的方法即可。如针对上述 **方法二** 已经设定生效的菜单,当用户点击【单击测试】按钮时,我们可以在 WorkCustomMessageHandler 中进行接收和处理: + +```cs +public override IWorkResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage) +{ + var reponseMessage = CreateResponseMessage(); + + if (requestMessage.EventKey == "SubClickRoot_Text") + { + reponseMessage.Content = "您点击了【返回文本】按钮"; + } + else + { + reponseMessage.Content = "您点击了其他事件按钮"; + } + + return reponseMessage; +} +``` + +> 本项目参考文件: +> +> /MessageHandlers/**_WorkCustomMessageHandler.cs_** diff --git "a/docs/zh/guide/Work/\350\277\233\351\230\266.md" "b/docs/zh/guide/Work/\350\277\233\351\230\266.md" new file mode 100644 index 0000000000..1b32c519b3 --- /dev/null +++ "b/docs/zh/guide/Work/\350\277\233\351\230\266.md" @@ -0,0 +1,11 @@ +# 进阶 + +当前示例展示了最基本和常用的功能,如果您需要了解更多高级玩法,并且有扎实的编程功底,请参考完整示例。 + +> 完整示例解决方案文件: +> +> Senparc.Weixin SDK 源文件根目录[/Samples/All/net7-mvc/Senparc.Weixin.Sample.Net7.sln](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/Samples/All/net7-mvc) + +> 务必阅读 readme 文件: +> +> Senparc.Weixin SDK 源文件根目录[/Samples/All/net7-mvc/readme.md](https://github.com/JeffreySu/WeiXinMPSDK/blob/master/Samples/All/net7-mvc/readme.md) diff --git "a/docs/zh/guide/Work/\351\253\230\347\272\247\346\216\245\345\217\243.md" "b/docs/zh/guide/Work/\351\253\230\347\272\247\346\216\245\345\217\243.md" new file mode 100644 index 0000000000..52cc4ac6ed --- /dev/null +++ "b/docs/zh/guide/Work/\351\253\230\347\272\247\346\216\245\345\217\243.md" @@ -0,0 +1,68 @@ +# 高级接口 + +完成 `Program.cs` 文件中的常规注册后,即可在程序的任意地方使用高级接口。 + +> 注意: +> 1、高级接口的配置和 `MessageHandler` 没有关联,两者可以独立或配合使用。 +> 2、由于企业微信使用 CorpId + Secret 来定位(区别)每个应用的授权信息,因此,SDK 中将两者合并成一个唯一参数,命名为 **AppKey**,可通过 `AccessTokenContainer.BuildingKey(string corpId, string corpSecret)` 方法获取合成后的 **AppKey**。 +> 3、企业微信 SDK 内几乎所有高级接口的第一个参数同时支持传入 AppKey 或 AccessToken,通常名称为 `accessTokenOrAppKey`,SDK 会根据参数特征自动识别输入的是 AppKey 还是 AccessToken,并做区分处理。 + +## 使用 AppKey 调用接口(推荐) + +例如,我们可以在任意一个方法中调用一个高级接口: + +```cs +public async Task TryApiTryApiByAppKey() +{ + // 获取注册信息 + var workWeixinSetting = Config.SenparcWeixinSetting.WorkSetting; + // 获取 AppKey + var appKey = AccessTokenContainer.BuildingKey(workWeixinSetting); + //发送请求 + try + { + //发送文字提醒 + var result = await Senparc.Weixin.Work.AdvancedAPIs.MassApi.SendTextAsync(appKey, "001", "这是一条来企业微信的消息"); + return Content("OK"); + } + catch (ErrorJsonResultException ex) + { + return Content($"出错啦:{ex.Message}"); + } +} +``` + +> `workWeixinSetting` 参数,必须是已经经过注册的企业微信信息(内部包括 CorpId 和 Secret),这样即使 AccessToken 过期,SDK 也会全自动处理。如果是未经过注册的 CorpId 和 Secret,则需要先获取 AccessToken,然后调用接口。 + +> 本项目参考文件: +> +> /Controllers/**_AdvancedApiController.cs_** + +## 使用 AccessToken 调用接口(不推荐) + +```cs +public async Task TryApiByAccessToken() +{ + // 获取注册信息 + var workWeixinSetting = Config.SenparcWeixinSetting.WorkSetting; + // 获取 AccessToken + var accessToken = await AccessTokenContainer.GetTokenAsync(workWeixinSetting.WeixinCorpId, workWeixinSetting.WeixinCorpSecret); + //发送请求 + try + { + //发送文字提醒 + var result = await Senparc.Weixin.Work.AdvancedAPIs.MassApi.SendTextAsync(accessToken, "001", "这是一条来企业微信的消息"); + return Content("OK"); + } + catch (ErrorJsonResultException ex) + { + return Content($"出错啦:{ex.Message}"); + } +} +``` + +> 注意:使用 AccessToken 方式调用接口,无法保证当前 AccessToken 的有效性,因此建议使用前进行有效性校验,并使用 `try-catch` 方式捕获 AccessToken 不可用的异常,然后进行重试。因此直接使用 AccessToken 调用接口的方式并不推荐在常规情况下使用。 + +> 本项目参考文件: +> +> /Controllers/**_AdvancedApiController.cs_** diff --git a/docs/zh/guide/WxOpen/MessageHandler.md b/docs/zh/guide/WxOpen/MessageHandler.md new file mode 100644 index 0000000000..06514169d3 --- /dev/null +++ b/docs/zh/guide/WxOpen/MessageHandler.md @@ -0,0 +1,57 @@ +# MessageHandler + +`MessageHandler` 用于处理小程序客服对话窗口的消息以及其他微信服务器的推送信息。 + +SDK 已经为开发者准备好了所有需要的基础功能,开发者只需要创建一个自定义的子类,补充需要自定义的业务逻辑。 + +## 自定义 MessageHandler + +当前示例中,我们给自定义的 MessageHandler 取名 `CustomWxOpenMessageHandler`。 + +> CustomWxOpenMessageHandler.cs 本项目参考文件: +> +> /MessageHandlers/ 目录 +> **_CustomWxOpenMessageHandler.cs_** MessageHandler 消息处理 +> **_CustomWxOpenMessageContext.cs_** 自定义重写 DefaultMpMessageContext 上下文(可选) + +`CustomWxOpenMessageHandler.cs` 中所有演示的重写(`override`)方法中,只有 `DefaultResponseMessageAsync()` 方法是必须重写的,其他所有 `OnXxxRequestAsync()` 方法都为可选,当用户发送的消息,找不到对应重写方法时,则调用 `DefaultResponseMessageAsync()` 方法。 + +MessageHandler 有两种承载方式,使其可以被外部(微信服务器)通过 URL 访问到。分别是**中间件方式**(推荐)和 **Controller 方式**。两种方式所使用的 `CustomWxOpenMessageHandler` 是通用的,因此可以随时切换和共存。 + +## 中间件方式承载 MessageHandler + +中间件方式是推荐的方式,也是最简化的方式,无需创建任何新文件,只需在 `Program.cs` 文件所有 Senparc.Weixin 注册代码执行后的下方,引入中间件: + +```cs +app.UseMessageHandlerForWxOpen("/WxOpenAsync", CustomWxOpenMessageHandler.GenerateMessageHandler, options => +{ + options.AccountSettingFunc = context => Senparc.Weixin.Config.SenparcWeixinSetting; +}); + +``` + +完成后,即可通过 Url **`域名/WxOpenAsync`** 访问 MessageHandler,设置为公众号后台的消息 URL。 + +[测试 /WxOpenAsync](https://sdk.weixin.senparc.com/WxOpenAsync) + +> 本项目参考文件: +> +> /**_Program.cs_** + +更多中间件方式请参考:[《在 .NET Core 2.0/3.0 中使用 MessageHandler 中间件》](https://www.cnblogs.com/szw/p/Wechat-MessageHandler-Middleware.html)(同样适用于 .NET 6.0 及以上,用法和公众号相同)。 + +## Controller 方式承载 MessageHandler + +当中间件的方式满足不了需求时,可以使用 Controller 将执行过程“展开”,对每一步执行进行更加精确的控制或干预。 + +使用 Controller 方式,需要创建 2 个 Action(ActionName 都为 `Index`),分别对应微信后台验证(Get 请求),以及真实消息推送(Post 请求)。本项目示例位于 WxOpenController.cs 中。 + +> WxOpenController.cs 本项目参考文件: +> +> /**_Controllers/WxOpenController.cs_** + +完成后,即可通过 Url **`域名/WxOpen`** 访问 MessageHandler,设置为公众号后台的消息 URL。 + +[测试 /WxOpen](https://sdk.weixin.senparc.com/WxOpen) + +更多 Controller 方式请参考:[《了解 MessageHandler》](https://www.cnblogs.com/szw/p/3414862.html)(推荐使用全套异步方法,基本用法和公众号相同) diff --git "a/docs/zh/guide/WxOpen/\345\205\266\344\273\226.md" "b/docs/zh/guide/WxOpen/\345\205\266\344\273\226.md" new file mode 100644 index 0000000000..237821abd0 --- /dev/null +++ "b/docs/zh/guide/WxOpen/\345\205\266\344\273\226.md" @@ -0,0 +1,19 @@ +# 其他 + +更多接口用法,可参考【获取手机号】中的方法,参考客户端(.wxml、.js)以及后端(WxController.cs)文件,用法几乎都是一致的。 + +> 后端本项目参考文件: +> +> /Controllers/**_WxOpenController.cs_** +> +> 客户端参考文件: +> +> Senparc.Weixin.WxOpen.AppDemo/**_app.js_** - 全局方法 +> +> Senparc.Weixin.WxOpen.AppDemo/**_pages/index_** - 首页文件 +> +> Senparc.Weixin.WxOpen.AppDemo**_/pages/Login_** - 登录页文件 +> +> Senparc.Weixin.WxOpen.AppDemo/**_pages/QrCode_** - 获取二维码文件 +> +> Senparc.Weixin.WxOpen.AppDemo/**_pages/websocket_signalr_** - WebSocket 文件(进阶) diff --git "a/docs/zh/guide/WxOpen/\345\246\202\344\275\225\345\256\211\350\243\205.md" "b/docs/zh/guide/WxOpen/\345\246\202\344\275\225\345\256\211\350\243\205.md" new file mode 100644 index 0000000000..c6eb6815f0 --- /dev/null +++ "b/docs/zh/guide/WxOpen/\345\246\202\344\275\225\345\256\211\350\243\205.md" @@ -0,0 +1,69 @@ +# 如何安装? + +您可以直接引用 Senparc.Weixin 的源码进行开发,也可以引用已经打包完成的 dll(通过 Nuget 包,推荐),以方便随时获取官方的更新。注意:直接引用源码和引用 Nuget 包只能二选一。 + +## 引用源码 + +您可以打开 **../All/net6-mvc/** 前解决方案(全量进阶示例),在 **Libraries** 目录下,将所需要引用的程序集引用(复制)到您开发环境的解决方案中,请注意需要同时引用被依赖的项目,如 `Senparc.Weixin` 项目是所有项目都需要依赖的。 + +当前示例项目默认就使用了直接引用源码的方式,可从 .csproj 文件中看到引用方式: + +```cs + + + +``` + +## 引用程序集(推荐) + +您可以通过 `Visual Studio`、`Visual Studio Code`、`dotnet 命令行` 等多种方式自动安装 Nuget 包。 + +### Visual Studio + +在开发项目【解决方案资源管理器】中,对需要添加 Senparc.Weixin.WxOpen 的模块点击右键,点击【管理 Nuget 程序包】,在【浏览】标签中输入 **Senparc.Weixin.TenPay**,点击右侧【安装】按钮。如下图所示: + +![通过 Visual Studio 安装](https://sdk.weixin.senparc.com/Docs/WxOpen/images/home-install-01.png) + +### Visual Studio Code + +首先,确认已经安装好 [VS Code](https://code.visualstudio.com/) 以及 dotnet 命令行(安装 [.NET SDK](https://dotnet.microsoft.com/en-us/download) 后会自动安装)。 + +然后,打开解决方案或项目所在目录,按 Ctrl+~,打开终端面板: + +![通过 VS Code 安装](https://sdk.weixin.senparc.com/Docs/WxOpen/images/home-install-03.png "打开 VS Code 终端面板") + +进入需要添加 Senparc.Weixin.WxOpen 的模块的项目的目录,输入: + +> ```cs +> dotnet add package Senparc.Weixin.WxOpen +> ``` + +![通过 VS Code 安装](https://sdk.weixin.senparc.com/Docs/WxOpen/images/home-install-04.png "安装 Senparc.Weixin.WxOpen 模块") + +安装完成后,可查看对应 .csproj 文件,被添加引用,如: + +```cs + + + +``` + +### dotnet 命令行 + +首先,确认已经安装好 dotnet 命令行(安装 [.NET SDK](https://dotnet.microsoft.com/en-us/download) 后会自动安装)。 + +进入需要添加 Senparc.Weixin.WxOpen 的模块的项目的目录,输入: + +> ```cs +> dotnet add package Senparc.Weixin.WxOpen +> ``` + +![通过 dotnet CLI 安装](https://sdk.weixin.senparc.com/Docs/WxOpen/images/home-install-02.png "通过 dotnet CLI 安装") + +安装完成后,可查看对应 .csproj 文件,被添加引用,如: + +```cs + + + +``` diff --git "a/docs/zh/guide/WxOpen/\345\256\242\346\210\267\347\253\257\345\274\200\345\217\221.md" "b/docs/zh/guide/WxOpen/\345\256\242\346\210\267\347\253\257\345\274\200\345\217\221.md" new file mode 100644 index 0000000000..bfe847333e --- /dev/null +++ "b/docs/zh/guide/WxOpen/\345\256\242\346\210\267\347\253\257\345\274\200\345\217\221.md" @@ -0,0 +1,13 @@ +# 客户端开发 + +## 准备开发 + +开发小程序客户端(手机微信内展示的小程序界面),需要使用 [微信开发者工具](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html)。 + +> 微信小程序示例项目参考文件: +> +> Senparc.Weixin SDK 源文件根目录/**_Samples/WxOpen/Senparc.Weixin.WxOpen.AppDemo/_** + +上述示例项目打开后如下图所示: + +![小程序客户端](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-client-01.png) diff --git "a/docs/zh/guide/WxOpen/\345\260\217\347\250\213\345\272\217\346\234\215\345\212\241\350\257\267\346\261\202.md" "b/docs/zh/guide/WxOpen/\345\260\217\347\250\213\345\272\217\346\234\215\345\212\241\350\257\267\346\261\202.md" new file mode 100644 index 0000000000..7798952fb4 --- /dev/null +++ "b/docs/zh/guide/WxOpen/\345\260\217\347\250\213\345\272\217\346\234\215\345\212\241\350\257\267\346\261\202.md" @@ -0,0 +1,108 @@ +# 小程序请求服务 + +小程序客户端可以使用类似 Ajax 的功能对服务器端发送请求,并且获取响应信息(一般为 JSON)。 + +## 放置触发请求的按钮 + +在完成【客户端开发】的基本准备工作后,在页面上(如 **/pages/index/index.wxml**),创建一个按钮,用于触发请求: + +```xml + +``` + +上述代码中,`type`、`class`、`hover-class` 分别设置了按钮的类型、常规样式、点击样式,`bindtap="doRequest"` 指定了点击之后,由 `doRequest()` 方法(function)进行处理。 + +> 本项目参考文件: +> +> Senparc.Weixin.WxOpen.AppDemo/**_pages/index/index.wxml_** + +## 请求服务器方法 + +`doRequest() `方法写在 **index.js** 文件中: + +```js +//处理wx.request请求 +doRequest:function(){ + var that = this; + wx.request({ + url: wx.getStorageSync('domainName') + '/WxOpen/RequestData', + data: { nickName : that.data.userInfo.nickName}, + method: 'POST', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT + header: { 'content-type':'application/x-www-form-urlencoded'}, + success: function(res){ + // success + var json = res.data; + //模组对话框 + wx.showModal({ + title: '收到消息', + content: json.msg, + showCancel:false, + success: function(res) { + if (res.confirm) { + console.log('用户点击确定') + } + } + }); + }, + fail: function() { + // fail + }, + complete: function() { + // complete + } + }) +}, +``` + +上述代码中: + +1. `wx.request(...)` 方法用于向服务器端发起请求,类似其他 JS 框架中的 **axios.get() / .post()** 或 **$.ajax()** 等。 +2. `url` 用于指定需要发送到的 API 地址。其中,`wx.getStorageSync('domainName')` 用于灵活指定开发环境或生产环境的域名(见本目录 **app.js** 文件。 +3. `data` 用于存放需要提交的数据,此处我们从本地数据中心取 `userInfo.nickName`,当用户登陆后,即可取到**微信昵称**,否则为 **undefined**。 +4. `method` 为请求的方法名称,当前使用 POST 方式提交。 +5. `header` 用于指定当前请求 Header 中的参数,通常也可以在 JWT 模式中提供用于用户身份验证的 Token。 +6. `success` 为当前请求成功响应(200)后的回调,示例中的代码展示了当收到成功信息后,弹出一个模组对话框,显示返回的内容,并在点击【确定】按钮后,在控制台输出相关日志。 +7. `fail` 和 `complete` 方法分别用于处理失败的请求,以及整个请求完成后的统一操作。 + +> 本项目参考文件: +> +> Senparc.Weixin.WxOpen.AppDemo/**_pages/index/index.js_** + +## 服务器端接口 + +服务器端可以使用各类能够接受请求的方式,如页面、MVC 中的 Action、Web Api、中间件(Middleware),甚至 aspx、ashx 等。 + +上述请求地址在本地环境下为:**https://localhost:44367/WxOpen/RequestData**,我们在 WxOpenController 下面创建一个 RequestData 的 Action 用于接收请求: + +```cs +[HttpPost] +public ActionResult RequestData(string nickName) +{ + var data = new + { + msg = string.Format("服务器时间:{0},昵称:{1}", SystemTime.Now.LocalDateTime, nickName) + }; + return Json(data); +} +``` + +> 本项目参考文件: +> +> /Controllers/**_WxOpenController.cs_** + +## 测试 + +点击【获取数据】按钮: + +![发送请求](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-request-01.png) + +由于当前没有登录,所以昵称无法获取到,登陆后即可显示昵称。 + +> 提示:登录操作请见【登录】标签。 + +点击【确定】按钮: + +![点击确定按钮](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-request-02.png) diff --git "a/docs/zh/guide/WxOpen/\346\263\250\345\206\214.md" "b/docs/zh/guide/WxOpen/\346\263\250\345\206\214.md" new file mode 100644 index 0000000000..5963d9c563 --- /dev/null +++ "b/docs/zh/guide/WxOpen/\346\263\250\345\206\214.md" @@ -0,0 +1,57 @@ +# 注册 + +## 全局注册 + +所有的 Senparc.Weixin SDK 注册过程都是类似的。 + +首先,完成所有 Senparc.Weixin SDK 的整体注册代码。在 Program.cs 中加入以下代码: + +![注册 Senparc.Weixin](https://sdk.weixin.senparc.com/Docs/WxOpen/images/home-dev-register-01.png) + +说明: + +1. `builder.Services.AddMemoryCache()` Senparc.Weixin 支持本机缓存、Redis、Memcached 等多种缓存策略,默认使用本机缓存,此时需要激活本地缓存。 +2. `builder.Services.AddSenparcWeixinServices(builder.Configuration)` 用于完成 Senparc.Weixin 的注册。 +3. `app.UseSenparcWeixin()` 方法用于配置和启用 Senparc.Weixin。 + +以上代码对于所有的 Senparc.Weixin 下级模块都是相同的,只需要 3 句代码。 + +> 本项目参考文件: +> +> /**_Program.cs_** + +## 公众号注册 + +在上述代码中的第 17 行委托方法中插入代码,即可完成默认公众号的注册: + +```cs +register.RegisterWxOpenAccount(weixinSetting, "【盛派网络小助手】小程序"); +``` + +![注册微信公众号](https://sdk.weixin.senparc.com/Docs/WxOpen/images/home-dev-register-02.png) + +其中,`weixinSetting` 的值默认来自于 `appsettings.json`: + +```json + "SenparcWeixinSetting": { + "IsDebug": true, + + //小程序 + "WxOpenAppId": "#{WxOpenAppId}#", + "WxOpenAppSecret": "#{WxOpenAppSecret}#", + "WxOpenToken": "#{WxOpenToken}#", + "WxOpenEncodingAESKey": "#{WxOpenEncodingAESKey}#" + } +``` + +![配置参数](https://sdk.weixin.senparc.com/Docs/WxOpen/images/home-dev-register-03.png) + +其中,`WxOpenToken`、`WxOpenEncodingAESKey`、`WxOpenAppId` 和 `WxOpenAppSecret` 对应了微信公众号后台的配置参数。 + +> 本项目参考文件: +> +> /**_appsettings.json_** + +配置完成。 + +> 提示:自动注册的信息可通过 `Senparc.Weixin.Config.SenparcWeixinSetting` 获取。 diff --git "a/docs/zh/guide/WxOpen/\346\272\220\347\240\201.md" "b/docs/zh/guide/WxOpen/\346\272\220\347\240\201.md" new file mode 100644 index 0000000000..da6e48ed5e --- /dev/null +++ "b/docs/zh/guide/WxOpen/\346\272\220\347\240\201.md" @@ -0,0 +1,15 @@ +# 源码 + +## Senparc.Weixin SDK 源码 + +GitHub:[https://github.com/JeffreySu/WeiXinMPSDK](https://github.com/JeffreySu/WeiXinMPSDK)(更新更快) + +Gitee:[https://gitee.com/JeffreySu/WeiXinMPSDK](https://gitee.com/JeffreySu/WeiXinMPSDK) (从 GitHub 同步) + +## 打包代码 + +Nuget 包地址:[https://www.nuget.org/packages/Senparc.Weixin.WxOpen](https://www.nuget.org/packages/Senparc.Weixin.WxOpen) + +## 本地源码文件 + +Senparc.Weixin.WxOpen 源码位置:[/src/Senparc.Weixin.WxOpen](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/src/Senparc.Weixin.WxOpen) diff --git "a/docs/zh/guide/WxOpen/\347\231\273\345\275\225.md" "b/docs/zh/guide/WxOpen/\347\231\273\345\275\225.md" new file mode 100644 index 0000000000..00257b19e8 --- /dev/null +++ "b/docs/zh/guide/WxOpen/\347\231\273\345\275\225.md" @@ -0,0 +1,319 @@ +# 登录 + +## 简介 + +大部分的小程序都需要识别用的身份信息(OpenId)以及获取用户的头像、昵称等信息为用户提供身份识别、个性化信息展示的服务。此时就需要使用到小程序登录接口。 + +## 客户端 - 进入登录页 + +用户的登录是在小程序端发起的,一般而言可以做一个独立的页面用于放置说明及登录按钮。首先,在入口网页放置一个入口按钮: + +```HTML + +``` + +点击按钮后,触发 .js 文件中的 `getUserInfo()` 方法: + +```JS + getUserInfo: function(){ + wx.navigateTo({ + url: '../Login/Login', + }) + } +``` + +此按钮将引导页面跳转到独立的 Login 页面。 + +![跳转到登录页](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-login-01.png)跳转到登录页 + +> 本项目参考文件: Senparc.Weixin.WxOpen.AppDemo/**_pages/index/index.wxml_** Senparc.Weixin.WxOpen.AppDemo/**_pages/index/index.js_** + +## 客户端 - 登录页 + +登录页包含系统登录展示、隐私协议等内容,并包含一个触发最终小程序客户端登录事件的按钮: + +```XML + + + 您好,, + 当前小程序为 Senparc.Weixin SDK 的功能体验小程序,包括了订阅消息、获取用户授权信息、手机号、WebSocket、客服消息等演示内容,大部分内容需要授权后进行,点击【获取头像昵称】按钮进行授权,才能进入测试页面。 + 如果您不希望授权,请直接关闭此页面。 + + +``` + +![登录页面](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-login-02.png) + +> 本项目参考文件: +> +> Senparc.Weixin.WxOpen.AppDemo/**_pages/Login/Login.wxml_** + +【获取头像昵称】按钮绑定了方法 `getUserInfo()`,在 **Login.js** 中添加: + +```JS +var app = getApp() +getUserInfo: function (e) { + var that = this; + app.getUserInfo(e, function(userInfo){ + app.globalData.userInfo = userInfo + that.setData({ + userInfo: userInfo, + hasUserInfo: true + }); + wx.navigateTo({ + url: '../index/index', + }) + }); + } +``` + +> 本项目参考文件: +> +> Senparc.Weixin.WxOpen.AppDemo/**_pages/Login/Login.js_** + +上述代码中,使用 `var app = getApp()` 引入了全局方法(代码在根目录 **app.js**中),其中,`app.getUserInfo()` 方法代码如下(为了更加贴近实际使用场景,我们将 **登录** + **获取用户信息** 放在连贯的代码中展示): + +```JS +getUserInfo:function(cb,callback){ + var that = this + if(this.globalData.userInfo){ + typeof cb == "function" && cb(this.globalData.userInfo) + }else{ + //获取userInfo并校验 + console.log('准备调用 wx.getUserProfile'); + wx.getUserProfile({ + desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写 + success: function (userInfoRes) { + console.log('get getUserProfile', userInfoRes); + that.globalData.userInfo = userInfoRes.userInfo + typeof cb == "function" && cb(that.globalData.userInfo) + typeof callback == "function" && callback(userInfoRes.userInfo) + + //调用登录接口 + wx.login({ + success: function (res) { + //换取openid & session_key + wx.request({ + url: wx.getStorageSync('domainName') + '/WxOpen/OnLogin', + method: 'POST', + header: { 'content-type': 'application/x-www-form-urlencoded' }, + data: { + code: res.code + }, + success:function(json){ + console.log('wx.login - request-/WxOpen/OnLogin Result:', json); + var result = json.data; + if(result.success) + { + wx.setStorageSync('sessionId', result.sessionId); + //校验 + wx.request({ + url: wx.getStorageSync('domainName') + '/WxOpen/CheckWxOpenSignature', + method: 'POST', + header: { 'content-type': 'application/x-www-form-urlencoded' }, + data: { + sessionId: result.sessionId,//wx.getStorageSync('sessionId'), + rawData:userInfoRes.rawData, + signature:userInfoRes.signature + }, + success:function(json){ + console.log(json.data); + if(!json.data.success){ + alert(json.data.msg); + } + } + }); + + //解密数据(建议放到校验success回调函数中,此处仅为演示) + wx.request({ + url: wx.getStorageSync('domainName') + '/WxOpen/DecodeEncryptedData', + method: 'POST', + header: { 'content-type': 'application/x-www-form-urlencoded' }, + data: { + 'type':"userInfo", + sessionId: result.sessionId,//wx.getStorageSync('sessionId'), + encryptedData: userInfoRes.encryptedData, + iv: userInfoRes.iv + }, + success:function(json){ + console.log('数据解密:', json.data); + } + }); + }else{ + console.log('储存session失败!',json); + } + } + }) + } + }) + } + }); + } + } +``` + +> 上述代码是整个微信登录客户端的核心代码。 + +其中: + +1. `wx.getUserProfile` 用于调起获取用户信息的接口,此接口本身和登录行为本身无直接联系,但是为了保证用户信息的正确性,后续需要在登录成功后的回调中使用到其中的加密信息来获取真实的用户信息,因此需要首先触发。 + +2. `wx.login` 是小程序客户端的登录接口,其中 `success` 为登录自后的回调函数。在回调函数中,我们使用 `wx.request` 向服务器端 **/WxOpen/OnLogin** 地址发送一条请求,带上 `success` 回调的参数 `res.code`,其中将使用 `code` 利用服务器端的 API 换取 `session_key`,并储存在服务器端,同时生成临时的用户身份标记 `SessionId` 并返回给客户端。 + 成功回调后,再使用 `wx.setStorageSync('sessionId', result.sessionId);` 将收到的 `SessionId` 储存在本地缓存中。 + +3. 虽然`userInfoRes.rawData` 已经提供了明文的用户信息,但并不能确保其是安全(未经篡改或完整)的,因此需要向服务器发送请求,验证其真实性。 + + 继续使用`wx.request`方法请求**/WxOpen/CheckWxOpenSignature**地址,发送`sessionId`以及第 1 步中获取到的`userInfoRes.rawData`以及`userInfoRes.signature`,校验信息的真实性。验证通过后,可以在客户端直接使用`rawData`。 + + > 注意:有的开发者会把经过验证后的 `rawData` 发送给服务器保存,认为此信息是有效的,**这是具有风险的做法,应当抛弃**,正确的做法是使用上述代码中后续的方式(**/WxOpen/DecodeEncryptedData**)发送 `userInfoRes.encryptedData` 给服务器解密。因为:第一,`rawData` 从被验证成功到明文发送给服务器的过程中无法确保是否被篡改;第二,明文传输用户的敏感信息容易被监听和窃取,这种做法本身不应该出现在整个项目的任何地方。 + +4. 真实性(签名)验证通过后,继续使用 `wx.request` 请求服务器 **/WxOpen/DecodeEncryptedData** 地址,发送 `sessionId`以及第 1 步中获取到的 `userInfoRes.encryptedData` 以及 `userInfoRes.iv`,服务器端将解密 `encryptedData` 获得用户信息,并储存。 + +> 本项目参考文件: +> +> Senparc.Weixin.**_WxOpen.AppDemo/app.js_** + +## 服务器端 - OnLogin + +服务器端 **/WxOpen/OnLogin** 代码如下: + +```cs +[HttpPost] +public ActionResult OnLogin(string code) +{ + try + { + var jsonResult = SnsApi.JsCode2Json(WxOpenAppId, WxOpenAppSecret, code); + if (jsonResult.errcode == ReturnCode.请求成功) + { + //Session["WxOpenUser"] = jsonResult;//使用Session保存登陆信息(不推荐) + //使用SessionContainer管理登录信息(推荐) + var unionId = ""; + var sessionBag = SessionContainer.UpdateSession(null, jsonResult.openid, jsonResult.session_key, unionId); + + //注意:生产环境下SessionKey属于敏感信息,不能进行传输! + return Json(new { success = true, msg = "OK", sessionId = sessionBag.Key, sessionKey = sessionBag.SessionKey/* 此参数千万不能暴露给客户端!处仅作演示! */ }); + } + else + { + return Json(new { success = false, msg = jsonResult.errmsg }); + } + } + catch (Exception ex) + { + return Json(new { success = false, msg = ex.Message }); + } +} +``` + +> 特别注意:`SessionKey` 是非常敏感的信息,上述代码只是做演示,向客户端证明已经生成,实际开发过程中不可传递到客户端! + +> 本项目参考文件: +> +> /Controllers/**_WxOpenController.cs_** + +## 服务器端 - CheckWxOpenSignature + +服务器端 **/WxOpen/CheckWxOpenSignature** 代码如下: + +```cs +[HttpPost] +public ActionResult CheckWxOpenSignature(string sessionId, string rawData, string signature) +{ + try + { + var checkSuccess = Senparc.Weixin.WxOpen.Helpers.EncryptHelper.CheckSignature(sessionId, rawData, signature); + return Json(new { success = checkSuccess, msg = checkSuccess ? "签名校验成功" : "签名校验失败" }); + } + catch (Exception ex) + { + return Json(new { success = false, msg = ex.Message }); + } +} +``` + +> 本项目参考文件: +> +> /Controllers/**_WxOpenController.cs_** + +## 服务器端 - DecodeEncryptedData + +服务器端 **/WxOpen/DecodeEncryptedData** 代码如下: + +```cs +public async Task DecodeEncryptedData(string type, string sessionId, string encryptedData, string iv) +{ + DecodeEntityBase decodedEntity = null; + + try + { + switch (type.ToUpper()) + { + case "USERINFO"://wx.getUserInfo() + decodedEntity = EncryptHelper.DecodeUserInfoBySessionId( + sessionId, + encryptedData, iv); + break; + default: + break; + } + } + catch (Exception ex) + { + WeixinTrace.SendCustomLog("EncryptHelper.DecodeUserInfoBySessionId 方法出错", + $@"sessionId: {sessionId} +encryptedData: {encryptedData} +iv: {iv} +sessionKey: { (await SessionContainer.CheckRegisteredAsync(sessionId) + ? (await SessionContainer.GetSessionAsync(sessionId)).SessionKey + : "未保存sessionId")} + +异常信息: +{ex.ToString()} +"); + } + + //检验水印 + var checkWatermark = false; + if (decodedEntity != null) + { + checkWatermark = decodedEntity.CheckWatermark(WxOpenAppId); + + //保存用户信息(可选) + if (checkWatermark && decodedEntity is DecodedUserInfo decodedUserInfo) + { + var sessionBag = await SessionContainer.GetSessionAsync(sessionId); + if (sessionBag != null) + { + await SessionContainer.AddDecodedUserInfoAsync(sessionBag, decodedUserInfo); + } + } + } + + //注意:此处仅为演示,敏感信息请勿传递到客户端! + return Json(new + { + success = checkWatermark, + //decodedEntity = decodedEntity, + msg = $"水印验证:{(checkWatermark ? "通过" : "不通过")}" + }); +} +``` + +> 本项目参考文件: +> +> /Controllers/**_WxOpenController.cs_** + +## 完成 + +完成代码后,运行服务器端程序和小程序客户端,在客户端中点击【获取头像昵称】按钮,进入登录页面,点击【获取头像昵称】按钮,即可看到弹出系统确认授权对话窗口: + +![授权界面](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-login-03.png) + +点击【允许】按钮,即可自动完成整个自动登录、用户信息抓取过程: + +![完成登录和用户信息获取](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-login-04.png) + +此时,再点击【获取数据】按钮,即可看到已经获取到的用户信息: + +![用户信息](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-login-05.png) diff --git "a/docs/zh/guide/WxOpen/\350\216\267\345\217\226\346\211\213\346\234\272\345\217\267.md" "b/docs/zh/guide/WxOpen/\350\216\267\345\217\226\346\211\213\346\234\272\345\217\267.md" new file mode 100644 index 0000000000..9d0e90d990 --- /dev/null +++ "b/docs/zh/guide/WxOpen/\350\216\267\345\217\226\346\211\213\346\234\272\345\217\267.md" @@ -0,0 +1,89 @@ +# 获取手机号 + +> 注意:小程序获取手机号的接口,进行过一次升级,先前在客户端直接获取手机号的方式已经被淘汰(示例中左侧【获取手机号】按钮),目前最新的接口是使用 code 到服务器端后台获取手机号(示例中右侧【获取手机号(Code)】按钮。 +> +> ![入口页面](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-phone-01.png)入口页面 +> +> 当用户点击后,系统进行授权提示: +> +> ![授权手机号](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-phone-02.png)授权手机号 +> +> 点击【允许】按钮,通过访问后端接口,获取到手机号: +> +> ![授权手机号](https://sdk.weixin.senparc.com/Docs/WxOpen/images/use-phone-03.png)授权手机号 + +## 客户端 + +在 Index.wxml 文件中放置按钮: + +```XML + +``` + +> 本项目参考文件: +> +> Senparc.Weixin.WxOpen.AppDemo/**_pages/index/index.wxml_** + +上述代码中,`open-type="getPhoneNumber"` 指定了当前按钮获取手机号的用途,`bindgetphonenumber="getUserPhoneNumber"` 指定了处理方法为 `getUserPhoneNumber`(对应于 .js 文件中): + +```JS +getUserPhoneNumber:function(e){ + wx.request({ + url: wx.getStorageSync('domainName') + '/WxOpen/GetUserPhoneNumber?code=' + e.detail.code, + success: function (res) { + // success + var json = res.data; + + if(!json.success){ + wx.showModal({ + title: '解密过程发生异常', + content: json.msg, + showCancel: false + }); + return; + } + + //模组对话框 + var phoneNumberData = json.phoneInfo; + var msg = '手机号:' + phoneNumberData.phoneNumber+ + '\r\n手机号(不带区号):' + phoneNumberData.purePhoneNumber+ + '\r\n区号(国别号)' + phoneNumberData.countryCode+ + '\r\n水印信息:' + JSON.stringify(phoneNumberData.watermark); + + wx.showModal({ + title: '收到服务器端通过 code 获取的手机号信息', + content: msg, + showCancel: false + }); + } + }) + } +``` + +当用户点击按钮,并授权手机号后,就会触发上述方法,通过 `e` 参数提供的 `e.code`,将其提交给服务器后台 **/WxOpen/GetUserPhoneNumber** 地址,后台将使用 `code` 换取用户的手机号,然后进行储存或返回给前端。上述代码的模组对话框只是演示作用,实际项目中一般不需要再次弹出信息。 + +> 本项目参考文件: +> +> Senparc.Weixin.WxOpen.AppDemo/**_/pages/index/index.js_** + +## 后端代码 - GetUserPhoneNumber + +```cs +public async Task GetUserPhoneNumber(string code) +{ + try + { + var result = await BusinessApi.GetUserPhoneNumberAsync(WxOpenAppId, code); + return Json(new { success = true, phoneInfo = result.phone_info }); + } + catch (Exception ex) + { + return Json(new { success = false, msg = ex.Message }); + } +} +``` + +> 本项目参考文件: +> +> /Controllers/**_WxOpenController.cs_** diff --git "a/docs/zh/guide/WxOpen/\350\277\233\351\230\266.md" "b/docs/zh/guide/WxOpen/\350\277\233\351\230\266.md" new file mode 100644 index 0000000000..1b32c519b3 --- /dev/null +++ "b/docs/zh/guide/WxOpen/\350\277\233\351\230\266.md" @@ -0,0 +1,11 @@ +# 进阶 + +当前示例展示了最基本和常用的功能,如果您需要了解更多高级玩法,并且有扎实的编程功底,请参考完整示例。 + +> 完整示例解决方案文件: +> +> Senparc.Weixin SDK 源文件根目录[/Samples/All/net7-mvc/Senparc.Weixin.Sample.Net7.sln](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/Samples/All/net7-mvc) + +> 务必阅读 readme 文件: +> +> Senparc.Weixin SDK 源文件根目录[/Samples/All/net7-mvc/readme.md](https://github.com/JeffreySu/WeiXinMPSDK/blob/master/Samples/All/net7-mvc/readme.md) diff --git "a/docs/zh/guide/WxOpen/\351\253\230\347\272\247\346\216\245\345\217\243.md" "b/docs/zh/guide/WxOpen/\351\253\230\347\272\247\346\216\245\345\217\243.md" new file mode 100644 index 0000000000..84933e46d1 --- /dev/null +++ "b/docs/zh/guide/WxOpen/\351\253\230\347\272\247\346\216\245\345\217\243.md" @@ -0,0 +1,35 @@ +# 高级接口 + +完成 `Program.cs` 文件中的常规注册后,即可在程序的任意地方使用高级接口。 + +> 注意: +> 1、高级接口的配置和 `MessageHandler` 没有关联,两者可以独立或配合使用。 +> 2、SDK 内几乎所有高级接口的第一个参数同时支持传入 AppId 或 AccessToken,通常名称为 `appIdOrAccessToken`,SDK 会根据参数特征自动识别输入的是 AppId 还是 AccessToken,并做区分处理。 + +## 使用 AppId 调用接口(推荐) + +例如,我们可以在任意一个方法中调用一个高级接口: + +```cs +using Senparc.Weixin.WxOpen.AdvancedAPIs; + +var appId = Senparc.Weixin.Config.SenparcWeixinSetting.WxOpenAppId; +var openId = "xxx"; +var content = "这是一条客服消息"; +var result = await CustomApi.SendTextAsync(appId, openId, content);//发送客服消息 +``` + +> appId 参数,必须是已经经过注册的,这样即使 AccessToken 过期,SDK 也会全自动处理。如果是未经过注册的 appId,则需要先获取 AccessToken,然后调用接口。 + +## 使用 AccessToken 调用接口(不推荐) + +```cs +var accessToken = Senparc.Weixin.MP.CommonApi.GetTokenAsync(appId, appSecret);//获取 AccessToken +var openId = "xxx"; +var content = "这是一条客服消息"; +var result = await CustomApi.SendTextAsync(accessToken, openId, content);//发送客服消息 +``` + +> 注意: +> 1、使用 AccessToken 方式调用接口,无法保证当前 AccessToken 的有效性,因此建议使用前进行有效性校验,并使用 `try-catch` 方式捕获 AccessToken 不可用的异常,然后进行重试。因此直接使用 AccessToken 调用接口的方式并不推荐在常规情况下使用。 +> 2、小程序和公众号使用相同的 AccessToken 获取接口,因此,此处调用了 `Senparc.Weixin.MP` 类库中公众号的相同方法。因为 `Senparc.Weixin.WxOpen` 模块默认已经依赖了 `Senparc.Weixin.MP`,所以不必再手动安装 MP 模块。 diff --git a/docs/zh/guide/release/log.md b/docs/zh/guide/release/log.md new file mode 100644 index 0000000000..d737ff79da --- /dev/null +++ b/docs/zh/guide/release/log.md @@ -0,0 +1,5 @@ +# 日志 + +## 2023-08-12更新 + + 1.添加Docs文档使用说明 diff --git a/docs/zh/guide/release/new_function.md b/docs/zh/guide/release/new_function.md new file mode 100644 index 0000000000..140069ba06 --- /dev/null +++ b/docs/zh/guide/release/new_function.md @@ -0,0 +1 @@ +# 文档模块使用事例 diff --git "a/docs/zh/guide/\345\272\223\345\222\214\347\273\204\344\273\266.md" "b/docs/zh/guide/\345\272\223\345\222\214\347\273\204\344\273\266.md" new file mode 100644 index 0000000000..40d4f4fa25 --- /dev/null +++ "b/docs/zh/guide/\345\272\223\345\222\214\347\273\204\344\273\266.md" @@ -0,0 +1,71 @@ +# 库和组件 + +## Senparc.Weixin SDK + +对应于每一个微信平台的基础 SDK,包含了目前微信平台的绝大部分 API,进行微信开发重点是对这些库的使用。 + +| # | 功能模块 | Nuget 包名称 | Nuget 版本     | 当前站点运行版本 | .NET 4.6. 2   | .NET Core 2.x / 3.x | .NET 6.0 / 7.0 | +| --- | ----------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | +| 1 | SDK 公共基础库 | [Senparc.Weixin](https://www.nuget.org/packages/Senparc.Weixin) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin) | [v6.16.3](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 2 | 公众号 JSSDK 摇一摇周边 | [Senparc.Weixin.MP](https://www.nuget.org/packages/Senparc.Weixin.MP) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.MP.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.MP) | [v16.19.2](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 3 | 公众号 MvcExtension | [Senparc.Weixin.MP.Mvc](https://www.nuget.org/packages/Senparc.Weixin.MP.Mvc) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.MP.Mvc.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.MP.Mvc) | [v7.12.12](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 4 | 小程序 | [Senparc.Weixin.WxOpen](https://www.nuget.org/packages/Senparc.Weixin.WxOpen) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.WxOpen.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.WxOpen) | [v3.16.2](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 5 | 微信支付 | [Senparc.Weixin.TenPay](https://www.nuget.org/packages/Senparc.Weixin.TenPay) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.TenPay.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.TenPay) | [v1.12.13](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 6 | 微信支付 V3(新) | [Senparc.Weixin.TenPayV3](https://www.nuget.org/packages/Senparc.Weixin.TenPayV3) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.TenPayV3.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.TenPayV3) | [v0.7.10](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-N-lightgrey.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 7 | 开放平台 | [Senparc.Weixin.Open](https://www.nuget.org/packages/Senparc.Weixin.Open) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.Open.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.Open) | [v4.14.25](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 8 | 企业微信 | [Senparc.Weixin.Work](https://www.nuget.org/packages/Senparc.Weixin.Work) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.Work.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.Work) | [v3.16.2](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | + +## Senparc.Weixin SDK 的 ASP.NET 运行时基础库 + +这些库基于 ASP.NET 运行时,依赖 ASP.NET 一些特性完成一系列基于 ASP.NET 及 ASP.NET Core 的操作。 +分离出这些库的另外一个原因,是为了使 Senparc.Weixin SDK 核心库可以不依赖于 ASP.NET 运行时, +以便部署在轻量级的容器(如 Docker)、命令行(Console)、桌面(Desktop / WinForm / WPF / Blazor / MAUI / UWP),甚至手机应用(App)等特殊环境中。 + +| # | 功能模块 | Nuget 包名称 | Nuget 版本 | 当前站点运行版本 | .NET 4.6.2 | .NET Core 2.x / 3.x | .NET 6.0 / 7.0 | +| --- | -------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | +| 1 | ASP.NET 运行时基础库 | [Senparc.Weixin.AspNet](https://www.nuget.org/packages/Senparc.Weixin.AspNet) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.AspNet.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.AspNet) | [v1.0.4](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 2 | 公众号消息中间件 | [Senparc.Weixin.MP.Middleware](https://www.nuget.org/packages/Senparc.Weixin.MP.Middleware) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.MP.Middleware.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.MP.Middleware) | [v1.0.5](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 3 | 小程序消息中间件 | [Senparc.Weixin.WxOpen.Middleware](https://www.nuget.org/packages/Senparc.Weixin.WxOpen.Middleware) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.WxOpen.Middleware.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.WxOpen.Middleware) | [v1.0.5](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 4 | 企业微信消息中间件 | [Senparc.Weixin.Work.Middleware](https://www.nuget.org/packages/Senparc.Weixin.Work.Middleware) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.Work.Middleware.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.Work.Middleware) | [v1.0.5](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | + +## Senparc.Weixin SDK 扩展组件 + +Senparc.Weixin SDK 扩展组件用于提供缓存、WebSocket 等一系列扩展模块, +这些模块是盛派官方的一个实现,几乎所有的扩展模块都是严格面向接口开发的, +因此,您也可以自行扩展,并对接到微信 SDK 或其他系统中。 + +| # | 功能模块 | Nuget 包名称 | Nuget 版本 | 当前站点运行版本 | .NET 4.6.2 | .NET Core 2.x / 3.x | .NET 6.0 / 7.0 | +| --- | ---------------------------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | +| 1 | Redis 缓存 (StackExchange.Redis) | [Senparc.Weixin.Cache.Redis](https://www.nuget.org/packages/Senparc.Weixin.Cache.Redis) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.Cache.Redis.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.Cache.Redis) | [v2.15.12](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 2 | Redis 缓存 (CsRedis) | [Senparc.Weixin.Cache.CsRedis](https://www.nuget.org/packages/Senparc.Weixin.Cache.CsRedis) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.Cache.CsRedis.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.Cache.CsRedis) | [v0.8.12](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 3 | Memcached 缓存 | [Senparc.Weixin.Cache.Memcached](https://www.nuget.org/packages/Senparc.Weixin.Cache.Memcached) | [![img](https://img.shields.io/nuget/v/Senparc.Weixin.Cache.Memcached.svg?style=flat)](https://www.nuget.org/packages/Senparc.Weixin.Cache.Memcached) | [v2.13.12](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 4 | WebSocket 模块 | [Senparc.WebSocket](https://www.nuget.org/packages/Senparc.WebSocket) | [![img](https://img.shields.io/nuget/v/Senparc.WebSocket.svg?style=flat)](https://www.nuget.org/packages/Senparc.WebSocket) | [v0.17.12](https://github.com/JeffreySu/WeiXinMPSDK) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | + +## 跨平台支持库:Senparc.NeuChar + +NeuChar 是盛派提供的一套跨平台服务的标准(例如跨微信公众号、微信小程序、钉钉、QQ 小程序、百度小程序,等等), +使用一套代码,同时服务多平台。目前 Senparc.Weixin SDK 就是基于 NeuChar 标准在微信领域内的一个实现分支, +您也可以使用 NeuChar 扩展到更多的平台。 +[https://www.neuchar.com](https://www.neuchar.com/) 是盛派官方提供的一个基于 NeuChar 标准实现的可视化跨平台配置操作平台。 + +| # | 功能模块 | Nuget 包名称 | Nuget 版本 | 当前站点运行版本 | .NET 4.6.2 | .NET Core 2.x / 3.x | .NET 6.0 / 7.0 | +| --- | ------------------------------------------ | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | +| 1 | NeuChar 跨平台支持库 | [Senparc.NeuChar](https://www.nuget.org/packages/Senparc.NeuChar) | [![img](https://img.shields.io/nuget/v/Senparc.NeuChar.svg?style=flat)](https://www.nuget.org/packages/Senparc.NeuChar) | [v2.3.1](https://github.com/Senparc/NeuChar) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 2 | NeuChar APP 以及 NeuChar Ending 的对接 SDK | [Senparc.NeuChar.App](https://www.nuget.org/packages/Senparc.NeuChar.App) | [![img](https://img.shields.io/nuget/v/Senparc.NeuChar.App.svg?style=flat)](https://www.nuget.org/packages/Senparc.NeuChar.App) | [v1.3.1](https://github.com/Senparc/NeuChar) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 3 | NeuChar 的 ASP.NET 运行时支持库 | [Senparc.NeuChar.AspNet](https://www.nuget.org/packages/Senparc.NeuChar.AspNet) | [![img](https://img.shields.io/nuget/v/Senparc.NeuChar.AspNet.svg?style=flat)](https://www.nuget.org/packages/Senparc.NeuChar.AspNet) | [v1.3.2](https://github.com/Senparc/NeuChar) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | + +## 底层公共基础库:Senparc.CO2NET + +Senparc.CO2NET 是一个支持 .NET Framework 和 .NET Core 的公共基础扩展库,包含常规开发所需要的基础帮助类。 +开发者可以直接使用 CO2NET 为项目提供公共基础方法,免去重复准备和维护公共代码的痛苦。 +您可以在几乎任何项目中使用 CO2NET。[查看源码](https://github.com/Senparc/Senparc.CO2NET) + +| # | 功能模块 | Nuget 包名称 | Nuget 版本 | 当前站点运行版本 | .NET 4.6.2 | .NET Core 2.x / 3.x | .NET 6.0 / 7.0 | +| --- | -------------------------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | +| 1 | CO2NET 基础库 | [Senparc.CO2NET](https://www.nuget.org/packages/Senparc.CO2NET) | [![img](https://img.shields.io/nuget/v/Senparc.CO2NET.svg?style=flat)](https://www.nuget.org/packages/Senparc.CO2NET) | [v2.2.1](https://github.com/Senparc/Senparc.CO2NET) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 2 | APM 库 | [Senparc.CO2NET.APM](https://www.nuget.org/packages/Senparc.CO2NET.APM) | [![img](https://img.shields.io/nuget/v/Senparc.CO2NET.APM.svg?style=flat)](https://www.nuget.org/packages/Senparc.CO2NET.APM) | [v1.2.5](https://github.com/Senparc/Senparc.CO2NET) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 3 | Redis 库 (StackExchange.Redis) | [Senparc.CO2NET.Cache.Redis](https://www.nuget.org/packages/Senparc.CO2NET.Cache.Redis) | [![img](https://img.shields.io/nuget/v/Senparc.CO2NET.Cache.Redis.svg?style=flat)](https://www.nuget.org/packages/Senparc.CO2NET.Cache.Redis) | [v4.1.4](https://github.com/Senparc/Senparc.CO2NET) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 4 | Redis 库 (CSRedis) | [Senparc.CO2NET.Cache.CsRedis](https://www.nuget.org/packages/Senparc.CO2NET.Cache.CsRedis) | [![img](https://img.shields.io/nuget/v/Senparc.CO2NET.Cache.CsRedis.svg?style=flat)](https://www.nuget.org/packages/Senparc.CO2NET.Cache.CsRedis) | [v1.1.5](https://github.com/Senparc/Senparc.CO2NET) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 5 | Memcached 库 | [Senparc.CO2NET.Cache.Memcached](https://www.nuget.org/packages/Senparc.CO2NET.Cache.Memcached) | [![img](https://img.shields.io/nuget/v/Senparc.CO2NET.Cache.Memcached.svg?style=flat)](https://www.nuget.org/packages/Senparc.CO2NET.Cache.Memcached) | [v4.1.4](https://github.com/Senparc/Senparc.CO2NET) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 6 | CO2NET 的 ASP.NET 运行时支持库 | [Senparc.CO2NET.AspNet](https://www.nuget.org/packages/Senparc.CO2NET.AspNet) | [![img](https://img.shields.io/nuget/v/Senparc.CO2NET.AspNet.svg?style=flat)](https://www.nuget.org/packages/Senparc.CO2NET.AspNet) | [v1.1.5](https://github.com/Senparc/Senparc.CO2NET) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-Y-brightgreen.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | +| 7 | WebApi 引擎库(新) | [Senparc.CO2NET.WebApi](https://www.nuget.org/packages/Senparc.CO2NET.WebApi) | [![img](https://img.shields.io/nuget/v/Senparc.CO2NET.WebApi.svg?style=flat)](https://www.nuget.org/packages/Senparc.CO2NET.WebApi) | [v1.4.2](https://github.com/Senparc/Senparc.CO2NET) | ![.NET 4.6.2](https://img.shields.io/badge/4.6.2-N-lightgrey.svg) | ![.NET Core 2.x / 3.x](https://img.shields.io/badge/netcore3.1-Y-brightgreen.svg) | ![.NET 5.0 / 6.0](https://img.shields.io/badge/net7.0-Y-brightgreen.svg) | diff --git a/docs/zh/release/log.md b/docs/zh/release/log.md new file mode 100644 index 0000000000..90d89bf248 --- /dev/null +++ b/docs/zh/release/log.md @@ -0,0 +1,5 @@ +# 日志 + +## 2023-08-12 更新 + +1.添加Docs文档功能 diff --git a/docs/zh/release/new_function.md b/docs/zh/release/new_function.md new file mode 100644 index 0000000000..140069ba06 --- /dev/null +++ b/docs/zh/release/new_function.md @@ -0,0 +1 @@ +# 文档模块使用事例 diff --git a/package.json b/package.json new file mode 100644 index 0000000000..a4b9c1fbf3 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "WeiXinMPSDK", + "version": "1.0.0", + "description": "WeiXinMPSDK", + "main": "index.js", + "repository": "https://github.com/JeffreySu/WeiXinMPSDK.git", + "author": "Senparc", + "license": "Apache License Version 2.0", + "devDependencies": { + "@vuepress/plugin-back-to-top": "^1.9.9", + "vuepress": "^1.9.9" + }, + "scripts": { + "docs:dev": "vuepress dev docs", + "docs:build": "vuepress build docs" + } +} diff --git a/readme.md b/readme.md index 3df5663eac..21f673c136 100644 --- a/readme.md +++ b/readme.md @@ -29,6 +29,35 @@ Senparc.Weixin SDK 是目前使用率最高的微信 .NET SDK,也是国内最 +## 如何使用文档 + +::: warning 前提条件 +文档需要 [Node.js](https://nodejs.org/en/) >= 8.6 +::: + +**相关阅读:** 可使用NVM管理Node版本,下载[NVM](https://github.com/coreybutler/nvm-windows/releases)。 + + +1. 通过Node安装yarn + + ``` bash + npm install -g yarn + ``` + +2. 安装项目依赖运行 + + ``` bash + yarn install + ``` + +3. 运行文档项目 + + ``` bash + yarn docs:dev + ``` + + + ## 🌟 Start:分模块独立文档 模块 | 地址 diff --git a/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3/TenPayHttpClient/Signer/SM3WithSM2Signer.cs b/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3/TenPayHttpClient/Signer/SM3WithSM2Signer.cs index 57b6ea212f..2f9a330052 100644 --- a/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3/TenPayHttpClient/Signer/SM3WithSM2Signer.cs +++ b/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3/TenPayHttpClient/Signer/SM3WithSM2Signer.cs @@ -7,7 +7,7 @@ public class SM3WithSM2Signer : ISigner { public string GetAlgorithm() { - return "SM3-SM2"; + return "SM2-WITH-SM3"; } public string Sign(string message, string privateKey = null) diff --git a/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/AdvancedAPIs/Template/TemplateApi.cs b/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/AdvancedAPIs/Template/TemplateApi.cs index c9c6560201..dd9ab0e8b1 100644 --- a/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/AdvancedAPIs/Template/TemplateApi.cs +++ b/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/AdvancedAPIs/Template/TemplateApi.cs @@ -136,6 +136,7 @@ public static WxJsonResult SendTemplateMessage(string accessTokenOrAppId, string /// /// /// + [Obsolete("微信已于2023 年 9 月 20 日收回下发统一消息接口,详情见:https://developers.weixin.qq.com/community/develop/doc/000ae8d6348af08e7030bc2546bc01")] public static WxJsonResult UniformSend(string accessTokenOrAppId, UniformSendData msgData, int timeOut = Config.TIME_OUT) { //文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/uniform-message/uniformMessage.send.html @@ -298,6 +299,7 @@ public static async Task SendTemplateMessageAsync(string accessTok /// /// /// + [Obsolete("微信已于2023 年 9 月 20 日收回下发统一消息接口,详情见:https://developers.weixin.qq.com/community/develop/doc/000ae8d6348af08e7030bc2546bc01")] public static async Task UniformSendAsync(string accessTokenOrAppId, UniformSendData msgData, int timeOut = Config.TIME_OUT) { //文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/uniform-message/uniformMessage.send.html diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000000..b4c0658c5f --- /dev/null +++ b/yarn.lock @@ -0,0 +1,8721 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.10.tgz#1c20e612b768fefa75f6e90d6ecb86329247f0a3" + integrity sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA== + dependencies: + "@babel/highlight" "^7.22.10" + chalk "^2.4.2" + +"@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== + +"@babel/core@^7.11.0", "@babel/core@^7.8.4": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.10.tgz#aad442c7bcd1582252cb4576747ace35bc122f35" + integrity sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.10" + "@babel/generator" "^7.22.10" + "@babel/helper-compilation-targets" "^7.22.10" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helpers" "^7.22.10" + "@babel/parser" "^7.22.10" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.10" + "@babel/types" "^7.22.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.1" + +"@babel/generator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" + integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== + dependencies: + "@babel/types" "^7.22.10" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz#573e735937e99ea75ea30788b57eb52fab7468c9" + integrity sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ== + dependencies: + "@babel/types" "^7.22.10" + +"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.9.6": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" + integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.5" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.10", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz#dd2612d59eac45588021ac3d6fa976d08f4e95a3" + integrity sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" + integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" + integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" + integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.22.5", "@babel/helper-module-imports@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" + integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.5" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" + integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.9" + +"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" + integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helper-wrap-function@^7.22.9": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz#d845e043880ed0b8c18bd194a12005cb16d2f614" + integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.10" + +"@babel/helpers@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.10.tgz#ae6005c539dfbcb5cd71fb51bfc8a52ba63bc37a" + integrity sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.10" + "@babel/types" "^7.22.10" + +"@babel/highlight@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.10.tgz#02a3f6d8c1cb4521b2fd0ab0da8f4739936137d7" + integrity sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.18.4", "@babel/parser@^7.22.10", "@babel/parser@^7.22.5": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.10.tgz#e37634f9a12a1716136c44624ef54283cabd3f55" + integrity sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" + integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca" + integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" + +"@babel/plugin-proposal-class-properties@^7.8.3": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-decorators@^7.8.3": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.10.tgz#d6a8c3a9018e1b13e6647f869c5ea56ff2b585d4" + integrity sha512-KxN6TqZzcFi4uD3UifqXElBTBNLAEH1l3vzMQj6JwJZbL2sZlThxSViOKCYY+4Ah4V4JhQ95IVB7s/Y6SJSlMQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.10" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/plugin-syntax-decorators" "^7.22.10" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz#7d83ea04d893c442b78ebf4c3cbac59a7211deff" + integrity sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.2.0", "@babel/plugin-syntax-jsx@^7.22.5", "@babel/plugin-syntax-jsx@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz#45946cd17f915b10e65c29b8ed18a0a50fc648c8" + integrity sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz#88a1dccc3383899eb5e660534a76a22ecee64faa" + integrity sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz#3e40c46f048403472d6f4183116d5e46b1bff5ba" + integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" + integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" + +"@babel/plugin-transform-destructuring@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz#38e2273814a58c810b6c34ea293be4973c4eb5e2" + integrity sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz#d6908a8916a810468c4edff73b5b75bda6ad393e" + integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz#57c41cb1d0613d22f548fddd8b288eedb9973a5b" + integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" + integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== + dependencies: + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz#14b64352fdf7e1f737eed68de1a1468bd2a77ec0" + integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz#66ae5f068fd5a9a5dc570df16f56c2a8462a9d6c" + integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" + integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz#18c31410b5e579a0092638f95c896c2a98a5d496" + integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz#f8872c65776e0b552e0849d7596cddd416c3e381" + integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz#57226a2ed9e512b9b446517ab6fa2d17abb83f58" + integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz#9686dc3447df4753b0b2a2fae7e8bc33cdc1f2e1" + integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.5" + +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + +"@babel/plugin-transform-optional-catch-binding@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz#842080be3076703be0eaf32ead6ac8174edee333" + integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.10", "@babel/plugin-transform-optional-chaining@^7.22.5": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz#076d28a7e074392e840d4ae587d83445bac0372a" + integrity sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" + integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz#07a77f28cbb251546a43d175a1dda4cf3ef83e32" + integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" + integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-runtime@^7.11.0": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.10.tgz#89eda6daf1d3af6f36fb368766553054c8d7cd46" + integrity sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" + integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.11.0": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.10.tgz#3263b9fe2c8823d191d28e61eac60a79f9ce8a0f" + integrity sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.10" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.10" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.10" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.5" + "@babel/plugin-transform-classes" "^7.22.6" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.10" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.5" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.5" + "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.5" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.5" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" + "@babel/plugin-transform-numeric-separator" "^7.22.5" + "@babel/plugin-transform-object-rest-spread" "^7.22.5" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.10" + "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.5" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.10" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.10" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "0.1.6-no-external-plugins" + "@babel/types" "^7.22.10" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.11.0", "@babel/runtime@^7.8.4": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682" + integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.22.10", "@babel/traverse@^7.22.5": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.10.tgz#20252acb240e746d27c2e82b4484f199cf8141aa" + integrity sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig== + dependencies: + "@babel/code-frame" "^7.22.10" + "@babel/generator" "^7.22.10" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.10" + "@babel/types" "^7.22.10" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.22.10", "@babel/types@^7.22.5", "@babel/types@^7.4.4": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.10.tgz#4a9e76446048f2c66982d1a989dd12b8a2d2dc03" + integrity sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect-history-api-fallback@*": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#9fd20b3974bdc2bcd4ac6567e2e0f6885cb2cf41" + integrity sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.35" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" + integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*": + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/highlight.js@^9.7.0": + version "9.12.4" + resolved "https://registry.yarnpkg.com/@types/highlight.js/-/highlight.js-9.12.4.tgz#8c3496bd1b50cc04aeefd691140aa571d4dbfa34" + integrity sha512-t2szdkwmg2JJyuCM20e8kR2X59WCE5Zkl4bzm1u1Oukjm79zpbiAv+QjnwLnuuV0WHEcX2NgUItu0pAMKuOPww== + +"@types/http-errors@*": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" + integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + +"@types/http-proxy@^1.17.5": + version "1.17.11" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.11.tgz#0ca21949a5588d55ac2b659b69035c84bd5da293" + integrity sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA== + dependencies: + "@types/node" "*" + +"@types/json-schema@^7.0.5": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + +"@types/linkify-it@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.2.tgz#fd2cd2edbaa7eaac7e7f3c1748b52a19143846c9" + integrity sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA== + +"@types/markdown-it@^10.0.0": + version "10.0.3" + resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-10.0.3.tgz#a9800d14b112c17f1de76ec33eff864a4815eec7" + integrity sha512-daHJk22isOUvNssVGF2zDnnSyxHhFYhtjeX4oQaKD6QzL3ZR1QSgiD1g+Q6/WSWYVogNXYDXODtbgW/WiFCtyw== + dependencies: + "@types/highlight.js" "^9.7.0" + "@types/linkify-it" "*" + "@types/mdurl" "*" + highlight.js "^9.7.0" + +"@types/mdurl@*": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" + integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== + +"@types/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/node@*": + version "20.4.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.9.tgz#c7164e0f8d3f12dfae336af0b1f7fdec8c6b204f" + integrity sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ== + +"@types/q@^1.5.1": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/send@*": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" + integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.2.tgz#3e5419ecd1e40e7405d34093f10befb43f63381a" + integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + +"@types/tapable@^1": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" + integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== + +"@types/uglify-js@*": + version "3.17.1" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.1.tgz#e0ffcef756476410e5bce2cb01384ed878a195b5" + integrity sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g== + dependencies: + source-map "^0.6.1" + +"@types/webpack-dev-server@^3": + version "3.11.6" + resolved "https://registry.yarnpkg.com/@types/webpack-dev-server/-/webpack-dev-server-3.11.6.tgz#d8888cfd2f0630203e13d3ed7833a4d11b8a34dc" + integrity sha512-XCph0RiiqFGetukCTC3KVnY1jwLcZ84illFRMbyFzCcWl90B/76ew0tSqF46oBhnLC4obNDG7dMO0JfTN0MgMQ== + dependencies: + "@types/connect-history-api-fallback" "*" + "@types/express" "*" + "@types/serve-static" "*" + "@types/webpack" "^4" + http-proxy-middleware "^1.0.0" + +"@types/webpack-sources@*": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" + integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.7.3" + +"@types/webpack@^4": + version "4.41.33" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.33.tgz#16164845a5be6a306bcbe554a8e67f9cac215ffc" + integrity sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g== + dependencies: + "@types/node" "*" + "@types/tapable" "^1" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + anymatch "^3.0.0" + source-map "^0.6.0" + +"@vue/babel-helper-vue-jsx-merge-props@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz#8d53a1e21347db8edbe54d339902583176de09f2" + integrity sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA== + +"@vue/babel-helper-vue-transform-on@^1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz#a976486b21e108e545524fe41ffe3fc9bbc28c7f" + integrity sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w== + +"@vue/babel-plugin-jsx@^1.0.3": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz#5088bae7dbb83531d94df3742ff650c12fd54973" + integrity sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + "@vue/babel-helper-vue-transform-on" "^1.1.5" + camelcase "^6.3.0" + html-tags "^3.3.1" + svg-tags "^1.0.0" + +"@vue/babel-plugin-transform-vue-jsx@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz#4d4b3d46a39ea62b7467dd6e26ce47f7ceafb2fe" + integrity sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" + html-tags "^2.0.0" + lodash.kebabcase "^4.1.1" + svg-tags "^1.0.0" + +"@vue/babel-preset-app@^4.1.2": + version "4.5.19" + resolved "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-4.5.19.tgz#baee457da0065c016f74fac4149f7c97631ba5a7" + integrity sha512-VCNRiAt2P/bLo09rYt3DLe6xXUMlhJwrvU18Ddd/lYJgC7s8+wvhgYs+MTx4OiAXdu58drGwSBO9SPx7C6J82Q== + dependencies: + "@babel/core" "^7.11.0" + "@babel/helper-compilation-targets" "^7.9.6" + "@babel/helper-module-imports" "^7.8.3" + "@babel/plugin-proposal-class-properties" "^7.8.3" + "@babel/plugin-proposal-decorators" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.11.0" + "@babel/preset-env" "^7.11.0" + "@babel/runtime" "^7.11.0" + "@vue/babel-plugin-jsx" "^1.0.3" + "@vue/babel-preset-jsx" "^1.2.4" + babel-plugin-dynamic-import-node "^2.3.3" + core-js "^3.6.5" + core-js-compat "^3.6.5" + semver "^6.1.0" + +"@vue/babel-preset-jsx@^1.2.4": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz#f4914ba314235ab097bc4372ed67473c0780bfcc" + integrity sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA== + dependencies: + "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" + "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" + "@vue/babel-sugar-composition-api-inject-h" "^1.4.0" + "@vue/babel-sugar-composition-api-render-instance" "^1.4.0" + "@vue/babel-sugar-functional-vue" "^1.4.0" + "@vue/babel-sugar-inject-h" "^1.4.0" + "@vue/babel-sugar-v-model" "^1.4.0" + "@vue/babel-sugar-v-on" "^1.4.0" + +"@vue/babel-sugar-composition-api-inject-h@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz#187e1389f8871d89ece743bb50aed713be9d6c85" + integrity sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g== + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-composition-api-render-instance@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz#2c1607ae6dffdab47e785bc01fa45ba756e992c1" + integrity sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q== + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-functional-vue@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz#60da31068567082287c7337c66ef4df04e0a1029" + integrity sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw== + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-inject-h@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz#bf39aa6631fb1d0399b1c49b4c59e1c8899b4363" + integrity sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA== + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-v-model@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz#a51d986609f430c4f70ada3a93cc560a2970f720" + integrity sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ== + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" + "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" + camelcase "^5.0.0" + html-tags "^2.0.0" + svg-tags "^1.0.0" + +"@vue/babel-sugar-v-on@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz#43b7106a9672d8cbeefc0eb8afe1d376edc6166e" + integrity sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA== + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" + camelcase "^5.0.0" + +"@vue/compiler-sfc@2.7.14": + version "2.7.14" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz#3446fd2fbb670d709277fc3ffa88efc5e10284fd" + integrity sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA== + dependencies: + "@babel/parser" "^7.18.4" + postcss "^8.4.14" + source-map "^0.6.1" + +"@vue/component-compiler-utils@^3.1.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz#f9f5fb53464b0c37b2c8d2f3fbfe44df60f61dc9" + integrity sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ== + dependencies: + consolidate "^0.15.1" + hash-sum "^1.0.2" + lru-cache "^4.1.2" + merge-source-map "^1.1.0" + postcss "^7.0.36" + postcss-selector-parser "^6.0.2" + source-map "~0.6.1" + vue-template-es2015-compiler "^1.9.0" + optionalDependencies: + prettier "^1.18.2 || ^2.0.0" + +"@vuepress/core@1.9.9": + version "1.9.9" + resolved "https://registry.yarnpkg.com/@vuepress/core/-/core-1.9.9.tgz#aa8bc4497fcbb6aab9c1e290944d422edeb20495" + integrity sha512-Ekgu409ZSgvAV9n14F3DaEWtgkwrEicg1nWs0gbxGgUCdREeX/7rwxSfKwWwBjCwfCUKR2L3+6pXGjzxex0t+g== + dependencies: + "@babel/core" "^7.8.4" + "@vue/babel-preset-app" "^4.1.2" + "@vuepress/markdown" "1.9.9" + "@vuepress/markdown-loader" "1.9.9" + "@vuepress/plugin-last-updated" "1.9.9" + "@vuepress/plugin-register-components" "1.9.9" + "@vuepress/shared-utils" "1.9.9" + "@vuepress/types" "1.9.9" + autoprefixer "^9.5.1" + babel-loader "^8.0.4" + bundle-require "2.1.8" + cache-loader "^3.0.0" + chokidar "^2.0.3" + connect-history-api-fallback "^1.5.0" + copy-webpack-plugin "^5.0.2" + core-js "^3.6.4" + cross-spawn "^6.0.5" + css-loader "^2.1.1" + esbuild "0.14.7" + file-loader "^3.0.1" + js-yaml "^3.13.1" + lru-cache "^5.1.1" + mini-css-extract-plugin "0.6.0" + optimize-css-assets-webpack-plugin "^5.0.1" + portfinder "^1.0.13" + postcss-loader "^3.0.0" + postcss-safe-parser "^4.0.1" + toml "^3.0.0" + url-loader "^1.0.1" + vue "^2.6.10" + vue-loader "^15.7.1" + vue-router "^3.4.5" + vue-server-renderer "^2.6.10" + vue-template-compiler "^2.6.10" + vuepress-html-webpack-plugin "^3.2.0" + vuepress-plugin-container "^2.0.2" + webpack "^4.8.1" + webpack-chain "^6.0.0" + webpack-dev-server "^3.5.1" + webpack-merge "^4.1.2" + webpackbar "3.2.0" + +"@vuepress/markdown-loader@1.9.9": + version "1.9.9" + resolved "https://registry.yarnpkg.com/@vuepress/markdown-loader/-/markdown-loader-1.9.9.tgz#b44e446a04808b9aef503d32fdcbc1e7fb7afef4" + integrity sha512-nyY+sytuQaDLEIk6Yj9JFUfSQpe9/sz30xQFkGCYqi0lQTRGQM6IcRDgfcTS7b25A0qRlwpDGBfKQiGGMZKSfg== + dependencies: + "@vuepress/markdown" "1.9.9" + loader-utils "^1.1.0" + lru-cache "^5.1.1" + +"@vuepress/markdown@1.9.9": + version "1.9.9" + resolved "https://registry.yarnpkg.com/@vuepress/markdown/-/markdown-1.9.9.tgz#1f582e6302e91a09491ca7bd0c8bcf9683140e03" + integrity sha512-JzFdBdGe5aoiKSaEgF+h3JLDXNVfWPI5DJWXrIt7rhhkMJesF6HowIznPLdXqukzHfXHcPvo9oQ4o6eT0YmVGA== + dependencies: + "@vuepress/shared-utils" "1.9.9" + markdown-it "^8.4.1" + markdown-it-anchor "^5.0.2" + markdown-it-chain "^1.3.0" + markdown-it-emoji "^1.4.0" + markdown-it-table-of-contents "^0.4.0" + prismjs "^1.13.0" + +"@vuepress/plugin-active-header-links@1.9.9": + version "1.9.9" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.9.9.tgz#fad96c550bea0b204fe16266cff1405e8636c1e1" + integrity sha512-lTnIhbuALjOjFts33jJD8r4ScNBxnZ6MtmePKEwvYlC3J9uvngs1Htpb1JzLEX9QCydt+bhLmZ92bTXn/PdTpg== + dependencies: + "@vuepress/types" "1.9.9" + lodash.debounce "^4.0.8" + +"@vuepress/plugin-back-to-top@^1.9.9": + version "1.9.9" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-back-to-top/-/plugin-back-to-top-1.9.9.tgz#eedd5b08e11790cd994636b458188fd40205e967" + integrity sha512-8bNsdZ0Dr96OdcoJ67dxCx1ysXpeTHma8w+YSsqBJoWGEOucBr0nW9oaDH85yoOtpiriWBlhUO32/Q0ojJtMfA== + dependencies: + "@vuepress/types" "1.9.9" + lodash.debounce "^4.0.8" + +"@vuepress/plugin-last-updated@1.9.9": + version "1.9.9" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-last-updated/-/plugin-last-updated-1.9.9.tgz#a7cb5f39b2793c8d113de08a514c316c26cc38c1" + integrity sha512-MV4csmM0/lye83VtkOc+b8fs0roi7mvE7BmCCOE39Z6t8nv/ZmEPOwKeHD0+hXPT+ZfoATYvDcsYU7uxbdw0Pw== + dependencies: + "@vuepress/types" "1.9.9" + cross-spawn "^6.0.5" + +"@vuepress/plugin-nprogress@1.9.9": + version "1.9.9" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-nprogress/-/plugin-nprogress-1.9.9.tgz#4fee4818ddc8ddc6a1778b7f2b74ab784c90915d" + integrity sha512-+3fLxjwTLH8MeU54E7i1ovRu9KzBom2lvSeUsu9B8PuLyrETAqW7Pe1H66awEEALEe0ZnnEU4d7SeVe9ljsLAQ== + dependencies: + "@vuepress/types" "1.9.9" + nprogress "^0.2.0" + +"@vuepress/plugin-register-components@1.9.9": + version "1.9.9" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-register-components/-/plugin-register-components-1.9.9.tgz#95be133d6ef33c03f410caae8eb1fabdf27a7999" + integrity sha512-tddnAiSmJsIWWPzE7TcbGU8xzndXf4a8i4BfIev2QzSUnIOQFZDGXUAsCkw4/f9N9UFxQSObjFPzTeUUxb7EvA== + dependencies: + "@vuepress/shared-utils" "1.9.9" + "@vuepress/types" "1.9.9" + +"@vuepress/plugin-search@1.9.9": + version "1.9.9" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-search/-/plugin-search-1.9.9.tgz#d30804b86f9b7f54b3db0b987a288433be3cfd7b" + integrity sha512-W/FE+YHoXDD4qk2wu5yRMkti271TA4y+7UBMrmCavvVAGrLIRnaZfswRUgIiDlEthBc+Pn8/As/Dy1jFTLBa9A== + dependencies: + "@vuepress/types" "1.9.9" + +"@vuepress/shared-utils@1.9.9", "@vuepress/shared-utils@^1.2.0": + version "1.9.9" + resolved "https://registry.yarnpkg.com/@vuepress/shared-utils/-/shared-utils-1.9.9.tgz#f6561ec2264d54e4e459d17678766ffe09f4bfc6" + integrity sha512-qhk/7QF5LgMEXhEB1hlqreGFgkz4p2pmaBBNFxnAnYmSwmyO+u/oFOpZLI16QRx9Wg6ekR2ENmByQLxV7y4lJg== + dependencies: + chalk "^2.3.2" + escape-html "^1.0.3" + fs-extra "^7.0.1" + globby "^9.2.0" + gray-matter "^4.0.1" + hash-sum "^1.0.2" + semver "^6.0.0" + toml "^3.0.0" + upath "^1.1.0" + +"@vuepress/theme-default@1.9.9": + version "1.9.9" + resolved "https://registry.yarnpkg.com/@vuepress/theme-default/-/theme-default-1.9.9.tgz#26f1965e1204445fa617308d3b06f134baab4936" + integrity sha512-de0FiOwM/h3rFTBSZK0NNBB117lA/e3IHusU7Xm2XeZRiZ/EE3yvbWclZnbbRNt3YjDMmrWXEW/kBTBxfiMuWQ== + dependencies: + "@vuepress/plugin-active-header-links" "1.9.9" + "@vuepress/plugin-nprogress" "1.9.9" + "@vuepress/plugin-search" "1.9.9" + "@vuepress/types" "1.9.9" + docsearch.js "^2.5.2" + lodash "^4.17.15" + stylus "^0.54.8" + stylus-loader "^3.0.2" + vuepress-plugin-container "^2.0.2" + vuepress-plugin-smooth-scroll "^0.0.3" + +"@vuepress/types@1.9.9": + version "1.9.9" + resolved "https://registry.yarnpkg.com/@vuepress/types/-/types-1.9.9.tgz#7c21e4c91c13e58e2ff303ded9ad7425805cb07d" + integrity sha512-ukGW49ILzLhIc7CltHMr+BeIjWKloJNN1mrvbDz3beycp9b9kgH+DXNdRIK9QCKr4fJsy7x08vNMwZr9Nq/PTQ== + dependencies: + "@types/markdown-it" "^10.0.0" + "@types/webpack-dev-server" "^3" + webpack-chain "^6.0.0" + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +agentkeepalive@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-2.2.0.tgz#c5d1bd4b129008f1163f236f86e5faea2026e2ef" + integrity sha512-TnB6ziK363p7lR8QpeLC8aMr8EGYBKZTpgzQLfqTs3bR0Oo5VbKdwKf8h0dSzsYrB7lSCgfJnMZKqShvlq5Oyg== + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + 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" + +algoliasearch@^3.24.5: + version "3.35.1" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-3.35.1.tgz#297d15f534a3507cab2f5dfb996019cac7568f0c" + integrity sha512-K4yKVhaHkXfJ/xcUnil04xiSrB8B8yHZoFEhWNpXg23eiCnqvTZw1tn/SqvdsANlYHLJlKl0qi3I/Q2Sqo7LwQ== + dependencies: + agentkeepalive "^2.2.0" + debug "^2.6.9" + envify "^4.0.0" + es6-promise "^4.1.0" + events "^1.1.0" + foreach "^2.0.5" + global "^4.3.2" + inherits "^2.0.1" + isarray "^2.0.1" + load-script "^1.0.0" + object-keys "^1.0.11" + querystring-es3 "^0.2.1" + reduce "^1.0.1" + semver "^5.1.0" + tunnel-agent "^0.6.0" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ== + +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-escapes@^4.1.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-html-community@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@^3.0.0, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^1.0.1, array-union@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== + +array.prototype.reduce@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" + integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + +async-each@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.6.tgz#52f1d9403818c179b7561e11a5d1b77eb2160e77" + integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autocomplete.js@0.36.0: + version "0.36.0" + resolved "https://registry.yarnpkg.com/autocomplete.js/-/autocomplete.js-0.36.0.tgz#94fe775fe64b6cd42e622d076dc7fd26bedd837b" + integrity sha512-jEwUXnVMeCHHutUt10i/8ZiRaCb0Wo+ZyKxeGsYwBDtw6EJHqEeDrq4UwZRD8YBSvp3g6klP678il2eeiVXN2Q== + dependencies: + immediate "^3.2.3" + +autoprefixer@^9.5.1: + version "9.8.8" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" + integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + picocolors "^0.2.1" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + +babel-loader@^8.0.4: + version "8.3.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" + integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-polyfill-corejs2@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" + integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.2" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" + integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.2" + core-js-compat "^3.31.0" + +babel-plugin-polyfill-regenerator@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" + integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.2" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.1.1, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg== + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +boxen@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" + integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^5.3.1" + chalk "^3.0.0" + cli-boxes "^2.2.0" + string-width "^4.1.0" + term-size "^2.1.0" + type-fest "^0.8.1" + widest-line "^3.1.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.21.9: + version "4.21.10" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" + integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== + dependencies: + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" + node-releases "^2.0.13" + update-browserslist-db "^1.0.11" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-json@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/buffer-json/-/buffer-json-2.0.0.tgz#f73e13b1e42f196fe2fd67d001c7d7107edd7c23" + integrity sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== + +bundle-require@2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-2.1.8.tgz#28f6de9d4468a6b7b76fb5c9bf52e70f5091245d" + integrity sha512-oOEg3A0hy/YzvNWNowtKD0pmhZKseOFweCbgyMqTIih4gRY1nJWsvrOCT27L9NbIyL5jMjTFrAUpGxxpW68Puw== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cac@^6.5.6: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + +cacache@^12.0.2, cacache@^12.0.3: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cache-loader@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-3.0.1.tgz#cee6cf4b3cdc7c610905b26bad6c2fc439c821af" + integrity sha512-HzJIvGiGqYsFUrMjAJNDbVZoG7qQA+vy9AIoKs7s9DscNfki0I589mf2w6/tW+kkFH3zyiknoWV5Jdynu6b/zw== + dependencies: + buffer-json "^2.0.0" + find-cache-dir "^2.1.0" + loader-utils "^1.2.3" + mkdirp "^0.5.1" + neo-async "^2.6.1" + schema-utils "^1.0.0" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +call-me-maybe@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" + integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== + +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w== + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase@^5.0.0, camelcase@^5.2.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001517: + version "1.0.30001519" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz#3e7b8b8a7077e78b0eb054d69e6edf5c7df35601" + integrity sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + 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" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^2.0.3, chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.4.1: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.1.1: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-css@4.2.x: + version "4.2.4" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178" + integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== + dependencies: + source-map "~0.6.0" + +cli-boxes@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@2.17.x: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@~2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +connect-history-api-fallback@^1.5.0, connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +consola@^2.6.0: + version "2.15.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +consolidate@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" + integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw== + dependencies: + bluebird "^3.1.1" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + +copy-webpack-plugin@^5.0.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz#8a889e1dcafa6c91c6cd4be1ad158f1d3823bae2" + integrity sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ== + dependencies: + cacache "^12.0.3" + find-cache-dir "^2.1.0" + glob-parent "^3.1.0" + globby "^7.1.1" + is-glob "^4.0.1" + loader-utils "^1.2.3" + minimatch "^3.0.4" + normalize-path "^3.0.0" + p-limit "^2.2.1" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + webpack-log "^2.0.0" + +core-js-compat@^3.31.0, core-js-compat@^3.6.5: + version "3.32.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.0.tgz#f41574b6893ab15ddb0ac1693681bd56c8550a90" + integrity sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw== + dependencies: + browserslist "^4.21.9" + +core-js@^3.6.4, core-js@^3.6.5: + version "3.32.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.32.0.tgz#7643d353d899747ab1f8b03d2803b0312a0fb3b6" + integrity sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q== + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-loader@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-2.1.1.tgz#d8254f72e412bb2238bb44dd674ffbef497333ea" + integrity sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w== + dependencies: + camelcase "^5.2.0" + icss-utils "^4.1.0" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.14" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^2.0.6" + postcss-modules-scope "^2.1.0" + postcss-modules-values "^2.0.0" + postcss-value-parser "^3.3.0" + schema-utils "^1.0.0" + +css-parse@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" + integrity sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA== + dependencies: + css "^2.0.0" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +css@^2.0.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" + integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.3" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw== + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw== + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.11" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" + integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.8" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +csstype@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +cyclist@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.2.tgz#673b5f233bf34d8e602b949429f8171d9121bea3" + integrity sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== + dependencies: + mimic-response "^1.0.0" + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deepmerge@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" + integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ== + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +des.js@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^2.0.0, dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ== + dependencies: + buffer-indexof "^1.0.0" + +docsearch.js@^2.5.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/docsearch.js/-/docsearch.js-2.6.3.tgz#57cb4600d3b6553c677e7cbbe6a734593e38625d" + integrity sha512-GN+MBozuyz664ycpZY0ecdQE0ND/LSgJKhTLA0/v3arIS3S1Rpf2OJz6A35ReMsm91V5apcmzr5/kM84cvUg+A== + dependencies: + algoliasearch "^3.24.5" + autocomplete.js "0.36.0" + hogan.js "^3.0.2" + request "^2.87.0" + stack-utils "^1.0.1" + to-factory "^1.0.0" + zepto "^1.2.0" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +duplexer3@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.477: + version "1.4.490" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz#d99286f6e915667fa18ea4554def1aa60eb4d5f1" + integrity sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A== + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +envify@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/envify/-/envify-4.1.0.tgz#f39ad3db9d6801b4e6b478b61028d3f0b6819f7e" + integrity sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw== + dependencies: + esprima "^4.0.0" + through "~2.3.4" + +envinfo@^7.2.0: + version "7.10.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" + integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.1" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.10" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-promise@^4.1.0: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +esbuild-android-arm64@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.7.tgz#8c78cbb617f9f216abfb5a84cca453b51421a1b6" + integrity sha512-9/Q1NC4JErvsXzJKti0NHt+vzKjZOgPIjX/e6kkuCzgfT/GcO3FVBcGIv4HeJG7oMznE6KyKhvLrFgt7CdU2/w== + +esbuild-darwin-64@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.7.tgz#7424bdb64c104556d36b7429af79ab51415ab8f4" + integrity sha512-Z9X+3TT/Xj+JiZTVlwHj2P+8GoiSmUnGVz0YZTSt8WTbW3UKw5Pw2ucuJ8VzbD2FPy0jbIKJkko/6CMTQchShQ== + +esbuild-darwin-arm64@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.7.tgz#6a243dc0132aeb11c1991f968a6a9e393f43c6bc" + integrity sha512-68e7COhmwIiLXBEyxUxZSSU0akgv8t3e50e2QOtKdBUE0F6KIRISzFntLe2rYlNqSsjGWsIO6CCc9tQxijjSkw== + +esbuild-freebsd-64@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.7.tgz#e7281e50522e724c4da502504dcd75be0db46c94" + integrity sha512-76zy5jAjPiXX/S3UvRgG85Bb0wy0zv/J2lel3KtHi4V7GUTBfhNUPt0E5bpSXJ6yMT7iThhnA5rOn+IJiUcslQ== + +esbuild-freebsd-arm64@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.7.tgz#31e513098efd181d76a3ba3ea285836d37f018a3" + integrity sha512-lSlYNLiqyzd7qCN5CEOmLxn7MhnGHPcu5KuUYOG1i+t5A6q7LgBmfYC9ZHJBoYyow3u4CNu79AWHbvVLpE/VQQ== + +esbuild-linux-32@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.7.tgz#82cf96accbf55d3007c3338dc3b3144efa9ae108" + integrity sha512-Vk28u409wVOXqTaT6ek0TnfQG4Ty1aWWfiysIaIRERkNLhzLhUf4i+qJBN8mMuGTYOkE40F0Wkbp6m+IidOp2A== + +esbuild-linux-64@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.7.tgz#67bdfe23a6ca918a0bb8e9558a3ee0fdf98c0bc0" + integrity sha512-+Lvz6x+8OkRk3K2RtZwO+0a92jy9si9cUea5Zoru4yJ/6EQm9ENX5seZE0X9DTwk1dxJbjmLsJsd3IoowyzgVg== + +esbuild-linux-arm64@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.7.tgz#f79c69ff0c176559c418de8e59aa3cf388fff992" + integrity sha512-kJd5beWSqteSAW086qzCEsH6uwpi7QRIpzYWHzEYwKKu9DiG1TwIBegQJmLpPsLp4v5RAFjea0JAmAtpGtRpqg== + +esbuild-linux-arm@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.7.tgz#3d665b35e1c27dbe1c9deb8bf956d7d1f191a21b" + integrity sha512-OzpXEBogbYdcBqE4uKynuSn5YSetCvK03Qv1HcOY1VN6HmReuatjJ21dCH+YPHSpMEF0afVCnNfffvsGEkxGJQ== + +esbuild-linux-mips64le@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.7.tgz#226114a0cc6649ba0ffd3428118a8f622872f16d" + integrity sha512-mFWpnDhZJmj/h7pxqn1GGDsKwRfqtV7fx6kTF5pr4PfXe8pIaTERpwcKkoCwZUkWAOmUEjMIUAvFM72A6hMZnA== + +esbuild-linux-ppc64le@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.7.tgz#5c67ae56517f2644d567b2ca5ecb97f9520cfc49" + integrity sha512-wM7f4M0bsQXfDL4JbbYD0wsr8cC8KaQ3RPWc/fV27KdErPW7YsqshZZSjDV0kbhzwpNNdhLItfbaRT8OE8OaKA== + +esbuild-netbsd-64@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.7.tgz#69dc0469ea089013956d8c6aa71c9e7fc25fc567" + integrity sha512-J/afS7woKyzGgAL5FlgvMyqgt5wQ597lgsT+xc2yJ9/7BIyezeXutXqfh05vszy2k3kSvhLesugsxIA71WsqBw== + +esbuild-openbsd-64@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.7.tgz#3a9d04ecf820708e2e5b7d26fa7332e3f19f6b6c" + integrity sha512-7CcxgdlCD+zAPyveKoznbgr3i0Wnh0L8BDGRCjE/5UGkm5P/NQko51tuIDaYof8zbmXjjl0OIt9lSo4W7I8mrw== + +esbuild-sunos-64@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.7.tgz#7c33a682f0fd9565cae7df165d0e8736b7b62623" + integrity sha512-GKCafP2j/KUljVC3nesw1wLFSZktb2FGCmoT1+730zIF5O6hNroo0bSEofm6ZK5mNPnLiSaiLyRB9YFgtkd5Xg== + +esbuild-windows-32@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.7.tgz#24ec706a5f25b4499048f56146bcff0ed3839dce" + integrity sha512-5I1GeL/gZoUUdTPA0ws54bpYdtyeA2t6MNISalsHpY269zK8Jia/AXB3ta/KcDHv2SvNwabpImeIPXC/k0YW6A== + +esbuild-windows-64@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.7.tgz#dd6d5b5bace93cd7a9174d31fbd727ba21885abf" + integrity sha512-CIGKCFpQOSlYsLMbxt8JjxxvVw9MlF1Rz2ABLVfFyHUF5OeqHD5fPhGrCVNaVrhO8Xrm+yFmtjcZudUGr5/WYQ== + +esbuild-windows-arm64@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.7.tgz#ecfd9ac289606f26760c4f737caaeeadfff3cfe3" + integrity sha512-eOs1eSivOqN7cFiRIukEruWhaCf75V0N8P0zP7dh44LIhLl8y6/z++vv9qQVbkBm5/D7M7LfCfCTmt1f1wHOCw== + +esbuild@0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.7.tgz#e85cead55b0e1001abf1b2ce4a11c1d4d709d13c" + integrity sha512-+u/msd6iu+HvfysUPkZ9VHm83LImmSNnecYPfFI01pQ7TTcsFR+V0BkybZX7mPtIaI7LCrse6YRj+v3eraJSgw== + optionalDependencies: + esbuild-android-arm64 "0.14.7" + esbuild-darwin-64 "0.14.7" + esbuild-darwin-arm64 "0.14.7" + esbuild-freebsd-64 "0.14.7" + esbuild-freebsd-arm64 "0.14.7" + esbuild-linux-32 "0.14.7" + esbuild-linux-64 "0.14.7" + esbuild-linux-arm "0.14.7" + esbuild-linux-arm64 "0.14.7" + esbuild-linux-mips64le "0.14.7" + esbuild-linux-ppc64le "0.14.7" + esbuild-netbsd-64 "0.14.7" + esbuild-openbsd-64 "0.14.7" + esbuild-sunos-64 "0.14.7" + esbuild-windows-32 "0.14.7" + esbuild-windows-64 "0.14.7" + esbuild-windows-arm64 "0.14.7" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw== + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +eventsource@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508" + integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + 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" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +express@^4.17.1: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +faye-websocket@^0.11.3, faye-websocket@^0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-loader@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa" + integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw== + dependencies: + loader-utils "^1.0.2" + schema-utils "^1.0.0" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +foreach@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.6.tgz#87bcc8a1a0e74000ff2bf9802110708cfb02eb6e" + integrity sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg== + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA== + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2, functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-stream@^4.0.0, get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig== + +glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.1.0.tgz#e9046a49c806ff04d6c1825e196c8f0091e8df4d" + integrity sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ== + dependencies: + ini "1.3.7" + +global@^4.3.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" + integrity sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g== + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globby@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +gray-matter@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== + dependencies: + js-yaml "^3.13.1" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash-sum@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" + integrity sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA== + +hash-sum@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" + integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.2.x, he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +highlight.js@^9.7.0: + version "9.18.5" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825" + integrity sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hogan.js@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/hogan.js/-/hogan.js-3.0.2.tgz#4cd9e1abd4294146e7679e41d7898732b02c7bfd" + integrity sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg== + dependencies: + mkdirp "0.3.0" + nopt "1.0.10" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A== + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA== + +html-entities@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== + +html-minifier@^3.2.3: + version "3.5.21" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c" + integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA== + dependencies: + camel-case "3.0.x" + clean-css "4.2.x" + commander "2.17.x" + he "1.2.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.4.x" + +html-tags@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b" + integrity sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g== + +html-tags@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" + integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +http-cache-semantics@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy-middleware@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz#43700d6d9eecb7419bf086a128d0f7205d9eb665" + integrity sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg== + dependencies: + "@types/http-proxy" "^1.17.5" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.17.0, http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg== + +icss-utils@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA== + +ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +ignore@^4.0.3: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +immediate@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg== + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w== + dependencies: + resolve-from "^3.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA== + +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" + integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw== + +ip@^1.1.0, ip@^1.1.5: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" + integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg== + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA== + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-core-module@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" + integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== + dependencies: + global-dirs "^2.0.1" + is-path-inside "^3.0.1" + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-npm@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" + integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-path-inside@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.0.4, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +is-typedarray@^1.0.0, is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isarray@^2.0.1, isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +javascript-stringify@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-1.6.0.tgz#142d111f3a6e3dae8f4a9afd77d45855b5a9cce3" + integrity sha512-fnjC0up+0SjEJtgmmG+teeel68kutkvzfctO/KxE3qJlbunkJYAshgH3boU++gSBHP8z5/r0ts0qRIrHf0RTQQ== + +javascript-stringify@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" + integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw== + +json5@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +latest-version@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +linkify-it@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" + integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== + dependencies: + uc.micro "^1.0.1" + +load-script@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/load-script/-/load-script-1.0.0.tgz#0491939e0bee5643ee494a7e3da3d2bac70c6ca4" + integrity sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA== + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@^0.2.16: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + integrity sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug== + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA== + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.kebabcase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.5: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loglevel@^1.6.8: + version "1.8.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4" + integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA== + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^4.1.2: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== + dependencies: + object-visit "^1.0.0" + +markdown-it-anchor@^5.0.2: + version "5.3.0" + resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz#d549acd64856a8ecd1bea58365ef385effbac744" + integrity sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA== + +markdown-it-chain@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/markdown-it-chain/-/markdown-it-chain-1.3.0.tgz#ccf6fe86c10266bafb4e547380dfd7f277cc17bc" + integrity sha512-XClV8I1TKy8L2qsT9iX3qiV+50ZtcInGXI80CA+DP62sMs7hXlyV/RM3hfwy5O3Ad0sJm9xIwQELgANfESo8mQ== + dependencies: + webpack-chain "^4.9.0" + +markdown-it-container@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-it-container/-/markdown-it-container-2.0.0.tgz#0019b43fd02eefece2f1960a2895fba81a404695" + integrity sha512-IxPOaq2LzrGuFGyYq80zaorXReh2ZHGFOB1/Hen429EJL1XkPI3FJTpx9TsJeua+j2qTru4h3W1TiCRdeivMmA== + +markdown-it-emoji@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz#9bee0e9a990a963ba96df6980c4fddb05dfb4dcc" + integrity sha512-QCz3Hkd+r5gDYtS2xsFXmBYrgw6KuWcJZLCEkdfAuwzZbShCmCfta+hwAMq4NX/4xPzkSHduMKgMkkPUJxSXNg== + +markdown-it-table-of-contents@^0.4.0: + version "0.4.4" + resolved "https://registry.yarnpkg.com/markdown-it-table-of-contents/-/markdown-it-table-of-contents-0.4.4.tgz#3dc7ce8b8fc17e5981c77cc398d1782319f37fbc" + integrity sha512-TAIHTHPwa9+ltKvKPWulm/beozQU41Ab+FIefRaQV1NRnpzwcV9QOe6wXQS5WLivm5Q/nlo0rl6laGkMDZE7Gw== + +markdown-it@^8.4.1: + version "8.4.2" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" + 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" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== + dependencies: + source-map "^0.6.1" + +merge2@^1.2.3: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.0.3, mime@^2.4.4: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== + dependencies: + dom-walk "^0.1.0" + +mini-css-extract-plugin@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.6.0.tgz#a3f13372d6fcde912f3ee4cd039665704801e3b9" + integrity sha512-79q5P7YGI6rdnVyIAV4NXpBQJFWdkzJxCim3Kog4078fM0piAaFlwocqbejdWtLW1cEzCexPrh6EdyFsPgVdAw== + dependencies: + loader-utils "^1.1.0" + normalize-url "^2.0.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + integrity sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew== + +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.6, mkdirp@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ== + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ== + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +nan@^2.12.1: + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +nopt@1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== + dependencies: + abbrev "1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" + integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== + dependencies: + prepend-http "^2.0.0" + query-string "^5.0.1" + sort-keys "^2.0.0" + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.11, object-keys@^1.1.0, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: + version "2.1.6" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz#5e5c384dd209fa4efffead39e3a0512770ccc312" + integrity sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ== + dependencies: + array.prototype.reduce "^1.0.5" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.21.2" + safe-array-concat "^1.0.0" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +opencollective-postinstall@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" + integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optimize-css-assets-webpack-plugin@^5.0.1: + version "5.0.8" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.8.tgz#cbccdcf5a6ef61d4f8cc78cf083a67446e5f402a" + integrity sha512-mgFS1JdOtEGzD8l+EuISqL57cKO+We9GcoiQEmdCWRqqck+FGNmYJtx9qfAPzEz+lRrlThWMuGDaRkI/yWNx/Q== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w== + dependencies: + no-case "^2.2.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +portfinder@^1.0.13, portfinder@^1.0.26: + version "1.0.32" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" + integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== + dependencies: + async "^2.6.4" + debug "^3.2.7" + mkdirp "^0.5.6" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== + +postcss-calc@^7.0.1: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-load-config@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== + dependencies: + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" + +postcss-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz#dd9953f6dd476b5fd1ef2d8830c8929760b56e63" + integrity sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + postcss-value-parser "^3.3.1" + +postcss-modules-scope@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz#479b46dc0c5ca3dc7fa5270851836b9ec7152f64" + integrity sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w== + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^7.0.6" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-safe-parser@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96" + integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g== + dependencies: + postcss "^7.0.26" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" + integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^8.4.14: + version "8.4.27" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.27.tgz#234d7e4b72e34ba5a92c29636734349e0d9c3057" + integrity sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== + +"prettier@^1.18.2 || ^2.0.0": + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +pretty-error@^2.0.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" + integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== + dependencies: + lodash "^4.17.20" + renderkid "^2.0.4" + +pretty-time@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== + +prismjs@^1.13.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + +psl@^1.1.28: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +pupa@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +qs@^6.11.0: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0, querystring-es3@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@1.2.8, rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reduce@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/reduce/-/reduce-1.0.2.tgz#0cd680ad3ffe0b060e57a5c68bdfce37168d361b" + integrity sha512-xX7Fxke/oHO5IfZSk77lvPa/7bjMh9BuCk4OOoX5XTXrM7s0Z+MkPfSDfz0q7r91BhhGSs8gii/VEN/7zhCPpQ== + dependencies: + object-keys "^1.1.0" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +registry-auth-token@^4.0.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" + integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== + dependencies: + rc "1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== + +renderkid@^2.0.4: + version "2.0.7" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" + integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^3.0.1" + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +request@^2.87.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + 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.3" + 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.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg== + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + +resolve@^1.14.2, resolve@^1.22.0: + version "1.22.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" + integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== + dependencies: + lowercase-keys "^1.0.0" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w== + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg== + +rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg== + dependencies: + aproba "^1.1.1" + +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^1.10.8: + version "1.10.14" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.14.tgz#ee51d84d9dcecc61e07e4aba34f229ab525c1574" + integrity sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA== + dependencies: + node-forge "^0.10.0" + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver@^5.1.0, semver@^5.5.0, semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.0.0, semver@^6.1.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg== + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +smoothscroll-polyfill@^0.4.3: + version "0.4.4" + resolved "https://registry.yarnpkg.com/smoothscroll-polyfill/-/smoothscroll-polyfill-0.4.4.tgz#3a259131dc6930e6ca80003e1cb03b603b69abf8" + integrity sha512-TK5ZA9U5RqCwMpfoMq/l1mrH0JAR7y7KRvOBx0n2869aLxch+gT9GhN3yUfjiw+d/DiF1mKo14+hd62JyMmoBg== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs-client@^1.5.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.6.1.tgz#350b8eda42d6d52ddc030c39943364c11dcad806" + integrity sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw== + dependencies: + debug "^3.2.7" + eventsource "^2.0.2" + faye-websocket "^0.11.4" + inherits "^2.0.4" + url-parse "^1.5.10" + +sockjs@^0.3.21: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@~0.5.12: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + 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" + +ssri@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== + dependencies: + figgy-pudding "^3.5.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" + integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== + dependencies: + escape-string-regexp "^2.0.0" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +std-env@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-2.3.1.tgz#d42271908819c243f8defc77a140fc1fcee336a1" + integrity sha512-eOsoKTWnr6C8aWrqJJ2KAReXoa7Vn5Ywyw6uCXgA/xDhxPoaIsBa5aNJmISY04dLwXPBnDHW4diGM7Sn5K4R/g== + dependencies: + ci-info "^3.1.1" + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.0.0, string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + 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" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +stylus-loader@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-3.0.2.tgz#27a706420b05a38e038e7cacb153578d450513c6" + integrity sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA== + dependencies: + loader-utils "^1.0.2" + lodash.clonedeep "^4.5.0" + when "~3.6.x" + +stylus@^0.54.8: + version "0.54.8" + resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.8.tgz#3da3e65966bc567a7b044bfe0eece653e099d147" + integrity sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg== + dependencies: + css-parse "~2.0.0" + debug "~3.1.0" + glob "^7.1.6" + mkdirp "~1.0.4" + safer-buffer "^2.1.2" + sax "~1.2.4" + semver "^6.3.0" + source-map "^0.7.3" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== + +svgo@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +term-size@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" + integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== + +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.8.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f" + integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@~2.3.4: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A== + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== + +to-factory@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-factory/-/to-factory-1.0.0.tgz#8738af8bd97120ad1d4047972ada5563bf9479b1" + integrity sha512-JVYrY42wMG7ddf+wBUQR/uHGbjUHZbLisJ8N62AMm0iTZ0p8YTcZLzdtomU0+H+wa99VbkyvQGB3zxB7NDzgIQ== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== + dependencies: + kind-of "^3.0.2" + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +toml@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" + integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== + +toposort@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" + integrity sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg== + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + +uglify-js@3.4.x: + version "3.4.10" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" + integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw== + dependencies: + commander "~2.19.0" + source-map "~0.6.1" + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA== + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ== + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.0, upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +update-notifier@^4.0.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz#be86ee13e8ce48fb50043ff72057b5bd598e1ea3" + integrity sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A== + dependencies: + boxen "^4.2.0" + chalk "^3.0.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.3.1" + is-npm "^4.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.0.0" + pupa "^2.0.1" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + +url-loader@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.2.tgz#b971d191b83af693c5e3fea4064be9e1f2d7f8d8" + integrity sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg== + dependencies: + loader-utils "^1.1.0" + mime "^2.0.3" + schema-utils "^1.0.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== + dependencies: + prepend-http "^2.0.0" + +url-parse@^1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.1.tgz#26f90f615427eca1b9f4d6a28288c147e2302a32" + integrity sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA== + dependencies: + punycode "^1.4.1" + qs "^6.11.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util.promisify@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ== + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +vue-hot-reload-api@^2.3.0: + version "2.3.4" + resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" + integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog== + +vue-loader@^15.7.1: + version "15.10.1" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.10.1.tgz#c451c4cd05a911aae7b5dbbbc09fb913fb3cca18" + integrity sha512-SaPHK1A01VrNthlix6h1hq4uJu7S/z0kdLUb6klubo738NeQoLbS6V9/d8Pv19tU0XdQKju3D1HSKuI8wJ5wMA== + dependencies: + "@vue/component-compiler-utils" "^3.1.0" + hash-sum "^1.0.2" + loader-utils "^1.1.0" + vue-hot-reload-api "^2.3.0" + vue-style-loader "^4.1.0" + +vue-router@^3.4.5: + version "3.6.5" + resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.6.5.tgz#95847d52b9a7e3f1361cb605c8e6441f202afad8" + integrity sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ== + +vue-server-renderer@^2.6.10: + version "2.7.14" + resolved "https://registry.yarnpkg.com/vue-server-renderer/-/vue-server-renderer-2.7.14.tgz#986f3fdca63fbb38bb6834698f11e0d6a81f182f" + integrity sha512-NlGFn24tnUrj7Sqb8njhIhWREuCJcM3140aMunLNcx951BHG8j3XOrPP7psSCaFA8z6L4IWEjudztdwTp1CBVw== + dependencies: + chalk "^4.1.2" + hash-sum "^2.0.0" + he "^1.2.0" + lodash.template "^4.5.0" + lodash.uniq "^4.5.0" + resolve "^1.22.0" + serialize-javascript "^6.0.0" + source-map "0.5.6" + +vue-style-loader@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz#6d55863a51fa757ab24e89d9371465072aa7bc35" + integrity sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg== + dependencies: + hash-sum "^1.0.2" + loader-utils "^1.0.2" + +vue-template-compiler@^2.6.10: + version "2.7.14" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz#4545b7dfb88090744c1577ae5ac3f964e61634b1" + integrity sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ== + dependencies: + de-indent "^1.0.2" + he "^1.2.0" + +vue-template-es2015-compiler@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" + integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== + +vue@^2.6.10: + version "2.7.14" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.7.14.tgz#3743dcd248fd3a34d421ae456b864a0246bafb17" + integrity sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ== + dependencies: + "@vue/compiler-sfc" "2.7.14" + csstype "^3.1.0" + +vuepress-html-webpack-plugin@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vuepress-html-webpack-plugin/-/vuepress-html-webpack-plugin-3.2.0.tgz#219be272ad510faa8750d2d4e70fd028bfd1c16e" + integrity sha512-BebAEl1BmWlro3+VyDhIOCY6Gef2MCBllEVAP3NUAtMguiyOwo/dClbwJ167WYmcxHJKLl7b0Chr9H7fpn1d0A== + dependencies: + html-minifier "^3.2.3" + loader-utils "^0.2.16" + lodash "^4.17.3" + pretty-error "^2.0.2" + tapable "^1.0.0" + toposort "^1.0.0" + util.promisify "1.0.0" + +vuepress-plugin-container@^2.0.2: + version "2.1.5" + resolved "https://registry.yarnpkg.com/vuepress-plugin-container/-/vuepress-plugin-container-2.1.5.tgz#37fff05662fedbd63ffd3a5463b2592c7a7f3133" + integrity sha512-TQrDX/v+WHOihj3jpilVnjXu9RcTm6m8tzljNJwYhxnJUW0WWQ0hFLcDTqTBwgKIFdEiSxVOmYE+bJX/sq46MA== + dependencies: + "@vuepress/shared-utils" "^1.2.0" + markdown-it-container "^2.0.0" + +vuepress-plugin-smooth-scroll@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/vuepress-plugin-smooth-scroll/-/vuepress-plugin-smooth-scroll-0.0.3.tgz#6eff2d4c186cca917cc9f7df2b0af7de7c8c6438" + integrity sha512-qsQkDftLVFLe8BiviIHaLV0Ea38YLZKKonDGsNQy1IE0wllFpFIEldWD8frWZtDFdx6b/O3KDMgVQ0qp5NjJCg== + dependencies: + smoothscroll-polyfill "^0.4.3" + +vuepress@^1.9.9: + version "1.9.9" + resolved "https://registry.yarnpkg.com/vuepress/-/vuepress-1.9.9.tgz#75b313f48a21b2eeb435cad52333f26b3b8a7404" + integrity sha512-CU94W3EdWaCavGx2VSvQJMI/hyv+m/YMdrvJJw67EVfmmJJDb1iTGrilDgLd0qsyrXzBy0Ru9Qi6rkf4IwcOTg== + dependencies: + "@vuepress/core" "1.9.9" + "@vuepress/theme-default" "1.9.9" + "@vuepress/types" "1.9.9" + cac "^6.5.6" + envinfo "^7.2.0" + opencollective-postinstall "^2.0.2" + update-notifier "^4.0.0" + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +webpack-chain@^4.9.0: + version "4.12.1" + resolved "https://registry.yarnpkg.com/webpack-chain/-/webpack-chain-4.12.1.tgz#6c8439bbb2ab550952d60e1ea9319141906c02a6" + integrity sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ== + dependencies: + deepmerge "^1.5.2" + javascript-stringify "^1.6.0" + +webpack-chain@^6.0.0: + version "6.5.1" + resolved "https://registry.yarnpkg.com/webpack-chain/-/webpack-chain-6.5.1.tgz#4f27284cbbb637e3c8fbdef43eef588d4d861206" + integrity sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA== + dependencies: + deepmerge "^1.5.2" + javascript-stringify "^2.0.1" + +webpack-dev-middleware@^3.7.2: + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@^3.5.1: + version "3.11.3" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz#8c86b9d2812bf135d3c9bce6f07b718e30f7c3d3" + integrity sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA== + dependencies: + ansi-html-community "0.0.8" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.3.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.8" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.26" + schema-utils "^1.0.0" + selfsigned "^1.10.8" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "^0.3.21" + sockjs-client "^1.5.0" + spdy "^4.0.2" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "^13.3.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-merge@^4.1.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== + dependencies: + lodash "^4.17.15" + +webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.8.1: + version "4.46.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" + integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.5.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + +webpackbar@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-3.2.0.tgz#bdaad103fad11a4e612500e72aaae98b08ba493f" + integrity sha512-PC4o+1c8gWWileUfwabe0gqptlXUDJd5E0zbpr2xHP1VSOVlZVPBZ8j6NCR8zM5zbKdxPhctHXahgpNK1qFDPw== + dependencies: + ansi-escapes "^4.1.0" + chalk "^2.4.1" + consola "^2.6.0" + figures "^3.0.0" + pretty-time "^1.1.0" + std-env "^2.2.1" + text-table "^0.2.0" + wrap-ansi "^5.1.0" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +when@~3.6.x: + version "3.6.4" + resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" + integrity sha512-d1VUP9F96w664lKINMGeElWdhhb5sC+thXM+ydZGU3ZnaE09Wv6FaS+mpM9570kcDs/xMfcXJBTLsMdHEFYY9Q== + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +which-typed-array@^1.1.10, which-typed-array@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^6.2.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.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 "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +zepto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/zepto/-/zepto-1.2.0.tgz#e127bd9e66fd846be5eab48c1394882f7c0e4f98" + integrity sha512-C1x6lfvBICFTQIMgbt3JqMOno3VOtkWat/xEakLTOurskYIHPmzJrzd1e8BnmtdDVJlGuk5D+FxyCA8MPmkIyA==