You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2021/12/27 12:45:26 UTC
[skywalking-website] branch master updated: Homepage for Website overhaul (#352)
This is an automated email from the ASF dual-hosted git repository.
wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking-website.git
The following commit(s) were added to refs/heads/master by this push:
new 9fe176f Homepage for Website overhaul (#352)
9fe176f is described below
commit 9fe176f7e3e26f398a4f14d0687a20329062e659
Author: Juntao Zhang <71...@qq.com>
AuthorDate: Mon Dec 27 20:45:20 2021 +0800
Homepage for Website overhaul (#352)
Design is here https://github.com/apache/skywalking/discussions/7722.
---
.gitignore | 1 +
assets/scss/_custom_home.scss | 546 ++++++++++
assets/scss/_variables_project.scss | 21 +-
content/_index.html | 468 +++++---
content/images/home/alarm.png | Bin 0 -> 84221 bytes
content/images/home/apm_alarms.png | Bin 0 -> 6632 bytes
content/images/home/apm_etcd.png | Bin 0 -> 11615 bytes
content/images/home/apm_kubernetes.png | Bin 0 -> 10504 bytes
content/images/home/apm_perf.png | Bin 0 -> 5223 bytes
content/images/home/apm_perf_contrast_graph_1k.png | Bin 0 -> 6798 bytes
content/images/home/apm_perf_contrast_graph_4k.png | Bin 0 -> 7250 bytes
content/images/home/apm_perf_contrast_graph_5k.png | Bin 0 -> 6549 bytes
content/images/home/apm_pluggable.png | Bin 0 -> 5531 bytes
content/images/home/apm_pluggable_es.png | Bin 0 -> 10222 bytes
content/images/home/apm_pluggable_h2.png | Bin 0 -> 10557 bytes
content/images/home/apm_pluggable_mysql.png | Bin 0 -> 10372 bytes
content/images/home/apm_pluggable_postgresql.png | Bin 0 -> 10708 bytes
content/images/home/apm_visul.png | Bin 0 -> 5306 bytes
content/images/home/apm_vs.png | Bin 0 -> 30250 bytes
content/images/home/apm_zookeeper.png | Bin 0 -> 23476 bytes
content/images/home/architecture_2160x720.png | Bin 0 -> 59949 bytes
content/images/home/arrow.png | Bin 0 -> 321 bytes
content/images/home/bg.png | Bin 0 -> 99681 bytes
content/images/home/contributors.png | Bin 0 -> 3721 bytes
content/images/home/contributors2.png | Bin 0 -> 21830 bytes
content/images/home/dashboard.png | Bin 0 -> 100271 bytes
content/images/home/event.png | Bin 0 -> 55477 bytes
content/images/home/log.png | Bin 0 -> 135866 bytes
content/images/home/mouse.png | Bin 0 -> 344 bytes
content/images/home/profile.png | Bin 0 -> 69993 bytes
content/images/home/pt.png | Bin 0 -> 4045 bytes
content/images/home/topo.png | Bin 0 -> 41931 bytes
content/images/home/trace.png | Bin 0 -> 112631 bytes
content/images/home/tuned_q.png | Bin 0 -> 1989 bytes
content/images/home/tuned_release.png | Bin 0 -> 1251 bytes
content/images/home/tuned_slack.png | Bin 0 -> 4214 bytes
content/images/home/tuned_twitter.png | Bin 0 -> 877 bytes
content/team/_index.md | 2 +-
layouts/shortcodes/events.html | 12 +
scripts/team.js | 106 +-
static/images/logo.svg | 18 +
themes/docsy/assets/js/lightbox.js | 4 +-
themes/docsy/assets/js/slider.js | 2 +-
themes/docsy/assets/scss/_custom_slider.scss | 9 +-
themes/docsy/assets/scss/_event-popup.scss | 4 +-
themes/docsy/assets/scss/_nav.scss | 80 +-
themes/docsy/assets/scss/_styles_project.scss | 10 +-
themes/docsy/assets/scss/main.scss | 7 +-
.../assets/vendor/bootstrap/scss/_navbar.scss | 8 +-
themes/docsy/i18n/en.toml | 2 +-
themes/docsy/layouts/partials/footer.html | 8 +-
themes/docsy/layouts/partials/navbar.html | 35 +-
themes/docsy/layouts/partials/scripts-home.html | 126 ++-
.../docsy/layouts/partials/sidebar-skywalking.html | 2 +-
themes/docsy/static/css/highlight-default.min.css | 9 +
themes/docsy/static/js/echarts.min.js | 45 +
themes/docsy/static/js/highlight.min.js | 1149 ++++++++++++++++++++
57 files changed, 2383 insertions(+), 291 deletions(-)
diff --git a/.gitignore b/.gitignore
index 8c13ab1..97ea3db 100755
--- a/.gitignore
+++ b/.gitignore
@@ -29,6 +29,7 @@
/tmp
/data/docSidebar/*
/data/team.yml
+/themes/docsy/static/js/mergedData.js
!.gitkeep
/content/docs/*
!_index.md
diff --git a/assets/scss/_custom_home.scss b/assets/scss/_custom_home.scss
new file mode 100644
index 0000000..2208002
--- /dev/null
+++ b/assets/scss/_custom_home.scss
@@ -0,0 +1,546 @@
+.sky-btn {
+ padding: 10px 23px;
+ height: 46px;
+ font-size: 16px;
+ color: #1F1F20;
+ border-radius: 6px;
+ background: #FFFFFF;
+ border: 1px solid #DADDE0;
+ box-sizing: border-box;
+ cursor: pointer;
+
+ &.primary {
+ color: #fff;
+ background: linear-gradient(180deg, #479EEB 0%, #3788D0 100%);
+ box-shadow: 0px 2px 6px #ABD1F2;
+ border: none;
+ }
+
+ &.small {
+ border-radius: 4px;
+ height: 30px;
+ padding: 6px 12px;
+ font-size: 12px;
+ }
+}
+
+.td-home {
+ main {
+ li {
+ list-style: none;
+ }
+
+ ul {
+ padding: 0;
+ }
+
+ img {
+ &:hover {
+ cursor: auto;
+ }
+
+ &:not([data-nolightbox="true"]) {
+ &:hover {
+ cursor: pointer;
+ }
+ }
+ }
+
+ .title {
+ font-weight: 600;
+ font-size: 32px;
+ line-height: 38px;
+ text-align: center;
+ color: #1F1F20;
+ border: none;
+ padding-top: 2.3rem;
+ margin-bottom: 3rem;
+ }
+ }
+
+ .pt-64 {
+ padding-top: 64px;
+ }
+
+ .center {
+ text-align: center;
+ }
+
+
+ .community-box {
+ color: #909094;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ padding: 8px 16px 8px 8px;
+ max-width: 534px;
+ margin: 60px auto 0;
+ border: 1px solid #DADDE0;
+ border-radius: 12px;
+ font-size: 16px;
+
+ .community {
+ color: #fff;
+ padding: 0 6px;
+ height: 24px;
+ line-height: 24px;
+ background: linear-gradient(101.75deg, #E7136C 0.73%, #FF9900 100.73%);
+ border-radius: 8px;
+ }
+
+ .mr-16 {
+ margin-right: 16px;
+ }
+ }
+
+ .introduction {
+ text-align: center;
+
+ .title-skywalking {
+ font-size: 50px;
+ }
+
+ .desc {
+ padding-bottom: 40px;
+ }
+
+ .btn-github {
+ .pull-right::before {
+ color: #888;
+ }
+ }
+ }
+
+ // ui banner
+ .ui-wrapper {
+ background-image: url("/images/home/bg.png");
+ background-position: top;
+ background-size: contain;
+ background-repeat: no-repeat;
+ min-height: 200px;
+ padding-top: 7%;
+ margin-top: -2%;
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+
+ .hover-box {
+ height: 55px;
+ margin-left: 21%;
+ margin-bottom: 10px;
+ position: relative;
+ padding-left: 2%;
+
+ .arrow {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 18px;
+ height: 35px;
+ }
+
+ .text-box {
+ position: absolute;
+ left: 3%;
+ top: 0;
+ }
+
+ .text {
+ margin-left: 10px;
+ color: #3987CD;
+ }
+
+ .bg {
+ position: absolute;
+ left: 32px;
+ top: 0;
+ width: 312px;
+ height: 22px;
+ background: rgba(57, 135, 205, 0.1);
+ transform: rotate(-1.0deg);
+ z-index: -1;
+ }
+
+ }
+
+
+ .ui-content {
+
+ img {
+ border-radius: 6px;
+ }
+
+ .swiper-container {
+ box-shadow: 0px 10px 40px #E3E4E4;
+ border-radius: 6px;
+
+ .swiper-button-prev, .swiper-button-next {
+ display: none;
+ }
+
+ .swiper-container-horizontal > .swiper-pagination-bullets {
+ //top: 0;
+ text-align: left;
+ }
+
+ .swiper-pagination {
+ top: 0;
+ text-align: left;
+
+ .swiper-pagination-bullet {
+ border-radius: 0;
+ width: 7%;
+ height: 22px;
+ background: transparent;
+ opacity: 0;
+ margin: 1% 1px 0;
+ z-index: 99;
+
+ &:first-child {
+ margin-left: 12%;
+ }
+ }
+ }
+
+ }
+ }
+
+
+ .try-wrapper {
+ .demo {
+ li {
+ color: #909094;
+ display: inline-block;
+ padding: 0 12px;
+ line-height: 32px;
+
+ &:nth-child(2) {
+ margin-right: 12px;
+ }
+
+
+ &:nth-child(odd) {
+ padding: 0 8px;
+ }
+
+ &:nth-child(even) {
+ background: #F8F9FA;
+ border-radius: 4px;
+ }
+ }
+ }
+ }
+
+ .solution-wrapper {
+ .solution-content {
+ display: flex;
+ justify-content: space-between;
+
+ li {
+ width: 32%;
+ text-align: center;
+
+ }
+ }
+ }
+
+ .feature-wrapper {
+ background: radial-gradient(19.06% 49.81% at 50% 51.68%, rgba(62, 162, 255, 0.3) 0%, rgba(0, 117, 255, 0) 100%), radial-gradient(23.2% 22.47% at 38.96% 38.47%, rgba(255, 245, 0, 0.2) 0%, rgba(20, 255, 0, 0) 100%), radial-gradient(20.52% 46.35% at 50% 50%, rgba(120, 190, 255, 0.2) 0%, rgba(135, 212, 255, 0) 100%), radial-gradient(31.08% 29.74% at 63.15% 58.96%, rgba(232, 78, 161, 0.2) 0%, rgba(239, 177, 255, 0) 100%);
+
+ .feature-content {
+ display: flex;
+ justify-content: space-between;
+ flex-wrap: wrap;
+
+ li {
+ position: relative;
+ background: #FFFFFF;
+ width: 32.4%;
+ margin-bottom: 1.25%;
+ padding: 0 23px 23px;
+ text-align: center;
+ box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.3);
+ border-radius: 6px;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+
+ .img-box {
+ border: 1px solid #DADDE0;
+ border-radius: 4px;
+ padding: 10px 8px 25px 0;
+ overflow: hidden;
+ position: relative;
+ }
+
+ .text {
+ position: absolute;
+ text-align: center;
+ width: 100%;
+ bottom: 0;
+ left: 0;
+ color: #666;
+ font-size: 12px;
+ font-weight: 600;
+ }
+ }
+
+ .img-vs {
+ padding-bottom: 5%;
+ }
+
+ .keywords-wrapper {
+ min-height: 180px;
+
+ span {
+ color: #DADDE0;
+ font-weight: 600;
+ font-size: 20px;
+ margin: 6px 12px;
+ display: inline-block;
+ }
+ }
+
+ .plugin-swiper-container {
+ .swiper-slide {
+ overflow: hidden;
+ border: 1px solid #DADDE0;
+ padding: 10px 10px 30px 0;
+ border-radius: 4px;
+
+ img {
+ width: auto;
+ }
+ }
+ }
+
+ .perf-swiper-container {
+ .swiper-slide {
+ padding-bottom: 20px;
+ }
+ }
+
+ .swiper-wrapper {
+ width: 100%;
+
+ .swiper-slide {
+ border: 1px solid #DADDE0;
+ box-sizing: border-box;
+ padding: 10px 10px 25px 10px;
+ border-radius: 4px;
+ }
+ }
+
+ .swiper-button-prev, .swiper-button-next {
+ &::after {
+ font-size: 13px;
+ }
+ }
+ }
+ }
+
+ .community-wrapper {
+ .community-content {
+ display: flex;
+ justify-content: space-between;
+
+ li {
+ width: 32.5%;
+ padding: 24px;
+ box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.3);
+ border-radius: 6px;
+
+ &:last-child {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ color: #fff;
+ padding: 30px;
+ text-align: center;
+ background: linear-gradient(180deg, #479EEB 0%, #3788D0 100%);
+ }
+ }
+ }
+ .graph-wrapper {
+ width: 100%;
+ padding-top: 61.43%;
+ position: relative;
+ }
+ #mergedGraph {
+ position: absolute;
+ width: 100%;
+ height:100%;
+ top: 0;
+ left: 0;
+ }
+ }
+
+ .run-wrapper {
+ position: relative;
+
+ .run-content {
+ position: relative;
+ color: #fff;
+ height: 350px;
+ background-image: url("/images/home/bg.png");
+ background-position: 0 150px;
+ background-size: cover;
+ background-repeat: no-repeat;
+ border-radius: 8px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .releases {
+ color: #fff;
+ display: inline-block;
+ text-decoration: underline;
+ }
+
+ .content-box {
+ position: relative;
+ z-index: 2;
+ }
+
+ .mask {
+ border-radius: 8px;
+ height: 100%;
+ width: 100%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+ filter: invert(52%) sepia(35%) saturate(1455%) hue-rotate(184deg) brightness(90%) contrast(85%);
+ background: linear-gradient(180deg, #479EEB 0%, #3788D0 100%);
+ mix-blend-mode: multiply;
+ box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.3);
+ }
+ }
+ }
+
+ .tuned-content {
+ display: flex;
+ justify-content: space-between;
+ flex-wrap: wrap;
+ word-break: break-word;
+
+ li {
+ width: 24.5%;
+ padding: 0 20px 20px;
+
+ box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.3);
+ border-radius: 6px;
+
+ &.twitter-wrapper {
+ p {
+ min-height: 72px;
+ }
+ }
+
+ img {
+ border-radius: 8px;
+ }
+ }
+ }
+}
+
+@media (max-width: 576px) {
+ .td-home {
+ main {
+ .title {
+ font-size: 30px;
+ }
+
+ .solution-title {
+ margin-bottom: 1.2rem;
+ }
+ }
+
+ .ui-wrapper {
+ .hover-box {
+ display: none;
+ }
+
+ .ui-content {
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-top: 50px;
+ }
+ }
+
+
+ .swiper-button-next {
+ text-align: right;
+ }
+
+ .try-wrapper {
+ .demo {
+ li {
+ font-size: 14px;
+ margin-bottom: 2px;
+
+ &:nth-child(odd) {
+ padding: 0;
+ }
+
+ &:nth-child(even) {
+ padding: 0 3px;
+ }
+ }
+ }
+ }
+
+ .tuned-content {
+ li.twitter-wrapper {
+ p {
+ min-height: inherit;
+ }
+ }
+ }
+ .feature-wrapper {
+ .img-vs {
+ padding-bottom: 0!important;
+ }
+ }
+
+ .solution-content, .feature-content, .community-content, .tuned-content {
+ flex-wrap: wrap;
+
+ li {
+ width: 100% !important;
+ margin-bottom: 12px !important;
+ }
+ }
+ }
+
+}
+
+@media (max-width: 768px) {
+ .td-home {
+ .swiper-button-prev, .swiper-button-next {
+ display: block !important;
+ }
+ }
+}
+
+@media (min-width: 768px) {
+ .td-home {
+ .community-wrapper .community-content li:last-child {
+ padding: 10px;
+ }
+ }
+}
+
+@media (min-width: 1660px) {
+ .td-home {
+ .feature-wrapper {
+ .feature-content {
+ li {
+ width: 32.5%;
+ }
+ }
+ }
+ }
+}
+
diff --git a/assets/scss/_variables_project.scss b/assets/scss/_variables_project.scss
index de91f80..4224665 100644
--- a/assets/scss/_variables_project.scss
+++ b/assets/scss/_variables_project.scss
@@ -4,24 +4,15 @@ Add styles or override variables from the theme here.
*/
-$primary: #151f35;
+$primary: #3788D0;
$secondary: #4f191de0;
$enable-gradients: true;
$enable-rounded: true;
$enable-shadows: true;
+$fontColor: #909094;
-#overview, #community {
- padding: 3em 1.5em 3em 1.5em;
- text-align: center;
- margin: 0; }
- #overview p, #community p {
- font-size: 1.125em;}
-
-#overview {
- //border-bottom: 2px solid #b6d0ff;
-}
-
-#community {
- border-top: 2px solid #b6d0ff;
+@media (min-width: 1660px){
+ .container {
+ max-width: 1440px!important;
+ }
}
-
diff --git a/content/_index.html b/content/_index.html
index 9a0276a..5ee836e 100644
--- a/content/_index.html
+++ b/content/_index.html
@@ -3,213 +3,337 @@ title = "Apache SkyWalking"
linkTitle = "Apache SkyWalking"
+++
-{{< blocks/cover title="Apache SkyWalking" image_anchor="top" height="full" color="dark" >}}
-<div class="mx-auto">
- <a class="btn btn-lg btn-primary mr-3 mb-4" href="/docs/skywalking-showcase/latest/readme/">
- Quick Start<i class="fas fa-arrow-alt-circle-right ml-2"></i>
+<div class="container pt-64">
+ <a class="community-box" href="/blog/2021-07-12-500-contributors-mark/">
+ <span class="community mr-16">COMMUNITY</span>
+ <span class="mr-16">SkyWalking achieved 500 contributors milestone</span>
+ <i class="fa fa-angle-right pull-right"></i>
</a>
- <a class="btn btn-lg btn-secondary mb-4" href="https://github.com/apache/skywalking">
- GitHub<i class="fab fa-github ml-2 "></i>
- </a>
- <p class="lead mt-5">
- Application performance monitor tool for distributed systems, especially designed for microservices, cloud native and container-based (Docker, Kubernetes, Mesos) architectures.
- </p>
+ <div class="introduction mt-5">
+ <h1 class="title-skywalking">Apache SkyWalking</h1>
+ <div class="desc">Application performance monitor tool for distributed systems, especially designed for
+ microservices, cloud native and container-based (Kubernetes) architectures.
+ </div>
+ <a href="/docs/skywalking-showcase/latest/readme/">
+ <button class="sky-btn primary mr-2">Quick start</button>
+ </a>
+ <a href="https://github.com/apache/skywalking" target="_blank">
+ <button class="sky-btn btn-github">
+ GitHub
+ <i class="fa fa-angle-right pull-right"></i>
+ </button>
+ </a>
+ </div>
</div>
-{{< /blocks/cover >}}
-<div id="arch">
- <div class="bg-box wrapper">
- <div class="contain" id="introduction">
- <h1 class="section-head">What is SkyWalking?</h1>
- <p>
- SkyWalking is an Observability Analysis Platform and Application Performance Management system.
- </p>
- <p>Tracing, Metrics and Logging all-in-one solution.</p>
- <p>Java, .Net Core, PHP, NodeJS, Golang, LUA, C++, Python agents supported</p>
- <p>Istio + Envoy Service Mesh supported</p>
-
- <div class="swiper-container arch-swiper-container">
- <div class="swiper-wrapper">
- <div class="swiper-slide">
- <img src="/images/SkyWalking_Architecture_20210424.png" alt="SkyWalking Architecture" title="SkyWalking Architecture">
- </div>
- <div class="swiper-slide">
- <img src="/screenshots/8.4.0/dashboard_01.jpg" width="" alt="dashboard" title="dashboard">
- </div>
- <div class="swiper-slide">
- <img src="/screenshots/8.4.0/dashboard_02.jpg" width="" alt="dashboard" title="dashboard">
- </div>
- <div class="swiper-slide">
- <img src="/screenshots/8.4.0/dashboard_03.jpg" width="" alt="dashboard" title="dashboard">
- </div>
- <div class="swiper-slide">
- <img src="/screenshots/8.4.0/topology.jpg" width="" alt="topology" title="topology">
- </div>
- <div class="swiper-slide">
- <img src="/screenshots/8.4.0/trace.jpg" width="" alt="trace" title="trace">
- </div>
- <div class="swiper-slide">
- <img src="/screenshots/8.4.0/log.jpg" width="" alt="log" title="log">
- </div>
- <div class="swiper-slide">
- <img src="/screenshots/8.4.0/alarm.jpg" width="" alt="alarm" title="alarm">
- </div>
+<div class="ui-wrapper">
+ <div class="container">
+ <div class="hover-box">
+ <img class="arrow" src="images/home/arrow.png" data-nolightbox="true" alt="">
+ <div class="text-box">
+ <img class="mouse" src="images/home/mouse.png" data-nolightbox="true" alt="">
+ <span class="bg"></span>
+ <span class="text">Visualize your system with topology maps</span>
+ </div>
+ </div>
+ </div>
+ <div class="container ui-content">
+ <div class="swiper-container ui-swiper-container">
+ <div class="swiper-wrapper">
+ <div class="swiper-slide">
+ <img src="images/home/dashboard.png" alt="dashboard">
+ </div>
+ <div class="swiper-slide">
+ <img src="images/home/topo.png" alt="topo">
+ </div>
+ <div class="swiper-slide">
+ <img src="images/home/trace.png" alt="trace">
+ </div>
+ <div class="swiper-slide">
+ <img src="images/home/profile.png" alt="profile">
+ </div>
+ <div class="swiper-slide">
+ <img src="images/home/log.png" alt="log">
+ </div>
+ <div class="swiper-slide">
+ <img src="images/home/alarm.png" alt="alarm">
+ </div>
+ <div class="swiper-slide">
+ <img src="images/home/event.png" alt="event">
</div>
- <div class="arch-swiper-pagination swiper-pagination"></div>
- <div class="arch-swiper-button-prev swiper-button-prev"></div>
- <div class="arch-swiper-button-next swiper-button-next"></div>
+ </div>
+ <div class="ui-swiper-pagination swiper-pagination"></div>
+ <div class="ui-swiper-button-prev swiper-button-prev"></div>
+ <div class="ui-swiper-button-next swiper-button-next"></div>
+ </div>
+ </div>
+
+ <div id="demo" class="pt-5 mt-3">
+ <div class="container try-wrapper center mt-5">
+ <div class="center">
+ <a href="http://demo.skywalking.apache.org/" target="_blank">
+ <button class="sky-btn primary">
+ Try live demo
+ <i class="fa fa-angle-right pull-right"></i>
+ </button>
+ </a>
</div>
+ <ul class="demo mt-4">
+ <li>Username</li>
+ <li>skywalking</li>
+ <li>Password</li>
+ <li>skywalking</li>
+ </ul>
</div>
+
</div>
</div>
-<div id="demo">
- <div class="live-demo-wrapper wrapper">
- <div class="contain">
- <h1 class="section-head">Live Demo</h1>
- <p class="mt-4 mb-4">
- <span>User: skywalking</span>
-
- <span>Password: skywalking</span>
+<div class="container solution-wrapper pt-3 mt-5">
+ <h2 class="title solution-title">
+ All-in-one APM solution
+ </h2>
+ <ul class="solution-content">
+ <li>
+ <h4>Tracing, metrics and logging</h4>
+ <p>
+ SkyWalking is built for consistent observability. Monitor everything happening to your application in
+ browser.
</p>
-
+ </li>
+ <li>
+ <h4>Agents for your stack</h4>
<p>
- <a class="btn btn-lg mb-5 btn-primary demo-link" rel="noopener noreferrer" target="_blank" href="http://demo.skywalking.apache.org/">
- Go
- </a>
+ Java, .Net Core, PHP, NodeJS, Golang, LUA, Rust, and C++ agents with active development and maintainance.
</p>
- </div>
- <div class="demo-line"></div>
+ </li>
+ <li>
+ <h4>Service mesh ready</h4>
+ <p>
+ Service mesh observability built-in. Collect and analyze data from Istio + ENvoy service mesh.
+ </p>
+ </li>
+ </ul>
+ <div id="arch">
+ <img src="images/home/architecture_2160x720.png" alt="architecture">
</div>
-
</div>
-
-<!--Feature List-->
-<div id="feature">
- <div class="feature-wrapper wrapper">
- <div class="contain feature">
- <h1 class="section-head">Feature List</h1>
-
- <div class="container flex-wrapper">
- <div class="home-li">
- <img src="/images/search.svg" alt="Observability" width="60" height="60" class="pic" data-nolightbox="true">
- <h6 class="desc">Consistent Observability</h6>
- <span class="line"></span>
- <div class="box">
- <p>Tracing </p>
- <p>Metrics</p>
- <p>Logging</p>
- <p>Browser monitoring</p>
- </div>
- </div>
-
-
- <div class="home-li">
- <img src="/images/more.svg" alt="Multiple Language Agents" width="60" height="60" class="pic" data-nolightbox="true">
- <h6 class="desc">Multiple Language Agents</h6>
- <span class="line"></span>
- <div class="box">
- <p>Java </p>
- <p>Golang</p>
- <p>.Net Core</p>
- <p>Python</p>
- <p>NodeJS</p>
- <p>C++</p>
- <p>PHP</p>
- <p>Lua</p>
+<div id="feature" class="container feature-wrapper mt-5">
+ <h2 class="title">Everything your team expects from an APM for distributed system</h2>
+ <ul class="feature-content">
+ <li>
+ <div>
+ <h4>Light weight and modular</h4>
+ <p>No big data stack. Adopt to different scale by configuring which modules to include.</p>
+ </div>
+ <div class="swiper-wrapper">
+ <div class="swiper-container cluster-swiper-container">
+ <div class="swiper-wrapper">
+ <div class="swiper-slide">
+ <img src="images/home/apm_zookeeper.png" data-nolightbox="true" alt="">
+ <div class="text">zookeeper</div>
+ </div>
+ <div class="swiper-slide">
+ <img src="images/home/apm_etcd.png" data-nolightbox="true" alt="">
+ <div class="text">etcd</div>
+ </div>
+ <div class="swiper-slide">
+ <img src="images/home/apm_kubernetes.png" data-nolightbox="true" alt="">
+ <div class="text">kubernetes</div>
+ </div>
</div>
+ <div class="cluster-swiper-button-prev swiper-button-prev"></div>
+ <div class="cluster-swiper-button-next swiper-button-next"></div>
</div>
-
-
- <div class="home-li">
- <img src="/images/light.svg" alt="Lightweight" width="60" height="60" class="pic" data-nolightbox="true">
- <h6 class="desc">Lightweight</h6>
- <span class="line"></span>
- <div class="box">
- <p>No big data stack </p>
- <p>Adopt different scale</p>
+ </div>
+ </li>
+ <li>
+ <div>
+ <h4>Alarms support</h4>
+ <p>
+ Built-in webhooks support for automatically sending out event notifications via HTTP, gRPC, Slack,
+ and more.
+ </p>
+ </div>
+ <div class="img-box">
+ <img src="images/home/apm_alarms.png" data-nolightbox="true" alt="">
+ <div class="text">rules</div>
+ </div>
+ </li>
+ <li>
+ <div>
+ <h4>Visualization that speaks</h4>
+ <p>
+ Built-in data visualization that gets your team started. Your can further
+ <a href="/docs/main/latest/en/ui/readme/#custom-dashboard">
+ customize it or integrate your own.
+ </a>
+ </p>
+ </div>
+ <img src="images/home/apm_visul.png" data-nolightbox="true" alt="">
+ </li>
+ <li>
+ <div>
+ <h4>Pluggable storage</h4>
+ <p>SkyWalking supports a wide range of backend storage solutions, and they are pluggable.</p>
+ </div>
+ <div class="swiper-wrapper">
+ <div class="swiper-container plugin-swiper-container">
+ <div class="swiper-wrapper">
+ <div class="swiper-slide">
+ <img src="images/home/apm_pluggable_h2.png" data-nolightbox="true" alt="">
+ <div class="text">h2</div>
+ </div>
+ <div class="swiper-slide">
+ <img src="images/home/apm_pluggable_es.png" data-nolightbox="true" alt="">
+ <div class="text">ElasticSearch</div>
+ </div>
+ <div class="swiper-slide">
+ <img src="images/home/apm_pluggable_mysql.png" data-nolightbox="true" alt="">
+ <div class="text">MySQL</div>
+ </div>
+ <div class="swiper-slide">
+ <img src="images/home/apm_pluggable_postgresql.png" data-nolightbox="true" alt="">
+ <div class="text">PostgreSQL</div>
+ </div>
</div>
+ <div class="plugin-swiper-button-prev swiper-button-prev"></div>
+ <div class="plugin-swiper-button-next swiper-button-next"></div>
</div>
- <div class="home-li">
- <img src="/images/list.svg" alt="Modular" width="60" height="60" class="pic" data-nolightbox="true">
- <h6 class="desc">Modular</h6>
- <span class="line"></span>
- <div class="box">
- <p>Storage pluggable </p>
- <p>Cluster coordinator pluggable</p>
- <p>Support pull/push transportation</p>
+ </div>
+ </li>
+ <li>
+ <div>
+ <h4>Performance</h4>
+ <p>
+ SkyWalking agents provide little extra load for target services.
+ </p>
+ </div>
+ <div class="swiper-wrapper">
+ <div class="swiper-container perf-swiper-container">
+ <div class="swiper-wrapper">
+ <div class="swiper-slide">
+ <img src="images/home/apm_perf_contrast_graph_1k.png" alt="">
+ <div class="text">1k requests/s</div>
+ </div>
+ <div class="swiper-slide">
+ <img src="images/home/apm_perf_contrast_graph_4k.png" alt="">
+ <div class="text">4k requests/s</div>
+ </div>
+ <div class="swiper-slide">
+ <img src="images/home/apm_perf_contrast_graph_5k.png" alt="">
+ <div class="text">5k requests/s</div>
+ </div>
</div>
+ <div class="perf-swiper-button-prev swiper-button-prev"></div>
+ <div class="perf-swiper-button-next swiper-button-next"></div>
</div>
+ </div>
+ </li>
+ <li>
+ <div>
+ <h4>All Stacks Monitoring</h4>
+ <p>SkyWalking provides native agents and works with global observability tools to support all stacks monitoring.</p>
+ </div>
+ <img src="images/home/apm_vs.png" class="img-vs" data-nolightbox="true" alt="">
+ </li>
+ </ul>
+</div>
-
- <div class="home-li">
- <img src="/images/alarm.svg" alt="Alarm Supported" width="60" height="60" class="pic" data-nolightbox="true">
- <h6 class="desc">Alarm Supported</h6>
- <span class="line"></span>
- <div class="box">
- <p>Alarm HTTP/gRPC forwarder </p>
- <p>Slack notification</p>
- <p>Dingding notification</p>
- <p>WeChat notification</p>
- <p>Raw metrics data exporter</p>
- </div>
- </div>
- <div class="home-li">
- <img src="/images/ui.svg" alt="Fancy Visualization" width="60" height="60" class="pic" data-nolightbox="true">
- <h6 class="desc">Fancy Visualization</h6>
- <span class="line"></span>
- <div class="box">
- <p>Customizable dashboard</p>
- <p>Topology map</p>
- <p>Trace and profile explorer</p>
- <p>CLI dashboard</p>
- <p>IntelliJ IDE plugin, metrics side by side with codes</p>
- </div>
- </div>
+<div class="container community-wrapper center mt-5">
+ <h2 class="title">The vibrant community that makes all happen</h2>
+ <ul class="community-content">
+ <li>
+ <h4>Thousands of contributions every year</h4>
+ <p>In the past years, SkyWalking accepts thousands of contributions from hundreds of people globally, and
+ continuous.</p>
+ <div class="graph-wrapper">
+ <div id="mergedGraph"></div>
</div>
- </div>
- </div>
+ </li>
+ <li>
+ <h4>500 contributors milestone</h4>
+ <p>SkyWalking has over 500 contributors based on GitHub repository statistics. This is a remarkable
+ achievement for the whole diverse community.</p>
+ <img src="https://contributor-graph-api.apiseven.com/contributors-svg?repo=apache/skywalking&merge=true"
+ alt="contributors">
+ </li>
+ <li>
+ <div>
+ <h4>Contributions welcome</h4>
+ <p>We have a well-maintained Pull Request contribution workflow on GitHub. New users are always
+ welcome!</p>
+ <a href="/team">
+ <button class="sky-btn">
+ More about our team
+ <i class="fa fa-angle-right pull-right"></i>
+ </button>
+ </a>
+ </div>
+ </li>
+ </ul>
</div>
-<!--event-->
-<div id="events">
- <div class="bg-box event wrapper">
- <div class="contain">
- <h1 class="section-head">Events & News</h1>
+<div class="container run-wrapper center mt-5">
+ <h2 class="title">Ready to get started?</h2>
+ <div class="run-content">
+ <div class="mask"></div>
+ <div class="content-box">
+ <h4>Run SkyWalking in a snap</h4>
+ <p>Try this demo music application to showcase features of Apache SkyWalking in action.</p>
+ <div>
+ <a href="/docs/skywalking-showcase/latest/readme/">
+ <button class="sky-btn">
+ Quick start
+ <i class="fa fa-angle-right pull-right"></i>
+ </button>
+ </a>
- <div class="container flex-wrapper">
- {{< blocks/events >}}
- {{< /blocks/events >}}
</div>
+ <a class="releases mt-4" href="/downloads/">All releases</a>
</div>
+
</div>
</div>
+<div class="container tuned-wrapper mt-5 mb-5">
+ <h2 class="title">
+ Stay tuned with SkyWalking
+ </h2>
+ <ul class="tuned-content center">
+ <li>
+ <h4>Questions/bugs?</h4>
+ <p>Features requests, questions or report bugs? Feel free to
+ <a href="https://github.com/apache/skywalking/discussions">open a discussion</a>
+ or <a href="https://github.com/apache/skywalking/issues">file an issue</a>.</p>
+ <img src="images/home/tuned_q.png" data-nolightbox="true" alt="questions">
+ </li>
+ <li>
+ <h4>Join our slack workspace!</h4>
+ <p>Send "Request to join SkyWalking slack" mail to
+ <a href="mailto:dev@skywalking.apache.org">dev@skywalking.apache.org</a>.
+ We will invite you in.</p>
+ <img src="images/home/tuned_slack.png" data-nolightbox="true" alt="slack">
+ </li>
+ <li class="twitter-wrapper">
+ <h4>Follow us on Twitter</h4>
+ <p>For announcement of latest features etc, stay tuned with
+ <a href="https://twitter.com/asfskywalking">@ASFSkyWalking</a>.
+ </p>
+ <img src="images/home/tuned_twitter.png" data-nolightbox="true" alt="twitter">
+ </li>
+ <li>
+ {{< events >}}
+ {{< /events >}}
+ <img src="images/home/tuned_release.png" data-nolightbox="true" alt="release">
+ </li>
+ </ul>
+</div>
-{{< blocks/section >}}
-{{% blocks/feature icon="fa-question" title="Any questions?" %}}
-Features request, ask questions or report bugs? Feel free to <a href="https://github.com/apache/skywalking/discussions">open a discussion</a> or <a href="https://github.com/apache/skywalking/issues/">file a issue</a>.
-{{% /blocks/feature %}}
-
-{{% blocks/feature icon="fab fa-slack" title="Join our slack workspace!" %}}
-Send 'Request to join SkyWalking slack' mail to the mail list <a href="mailto:dev@skywalking.apache.org">dev@skywalking.apache.org</a>, we will invite you in.
-{{% /blocks/feature %}}
-
-{{% blocks/feature icon="fab fa-github" title="Contributions welcome!" %}}
-We do a [Pull Request](https://github.com/apache/skywalking/pulls) contributions workflow on **GitHub**. New users are always welcome!
-{{% /blocks/feature %}}
-
-
-{{% blocks/feature icon="fab fa-twitter" title="Follow us on Twitter!" %}}
-For announcement of latest features etc on <a href="https://twitter.com/asfskywalking">@ASFSkyWalking</a>.
-{{% /blocks/feature %}}
-
-
-{{< /blocks/section >}}
diff --git a/content/images/home/alarm.png b/content/images/home/alarm.png
new file mode 100644
index 0000000..a9b2e70
Binary files /dev/null and b/content/images/home/alarm.png differ
diff --git a/content/images/home/apm_alarms.png b/content/images/home/apm_alarms.png
new file mode 100644
index 0000000..b06dfa5
Binary files /dev/null and b/content/images/home/apm_alarms.png differ
diff --git a/content/images/home/apm_etcd.png b/content/images/home/apm_etcd.png
new file mode 100644
index 0000000..a6e6a37
Binary files /dev/null and b/content/images/home/apm_etcd.png differ
diff --git a/content/images/home/apm_kubernetes.png b/content/images/home/apm_kubernetes.png
new file mode 100644
index 0000000..cdfc6d0
Binary files /dev/null and b/content/images/home/apm_kubernetes.png differ
diff --git a/content/images/home/apm_perf.png b/content/images/home/apm_perf.png
new file mode 100644
index 0000000..b75f7bb
Binary files /dev/null and b/content/images/home/apm_perf.png differ
diff --git a/content/images/home/apm_perf_contrast_graph_1k.png b/content/images/home/apm_perf_contrast_graph_1k.png
new file mode 100644
index 0000000..eb23984
Binary files /dev/null and b/content/images/home/apm_perf_contrast_graph_1k.png differ
diff --git a/content/images/home/apm_perf_contrast_graph_4k.png b/content/images/home/apm_perf_contrast_graph_4k.png
new file mode 100644
index 0000000..e6dfb26
Binary files /dev/null and b/content/images/home/apm_perf_contrast_graph_4k.png differ
diff --git a/content/images/home/apm_perf_contrast_graph_5k.png b/content/images/home/apm_perf_contrast_graph_5k.png
new file mode 100644
index 0000000..058a92a
Binary files /dev/null and b/content/images/home/apm_perf_contrast_graph_5k.png differ
diff --git a/content/images/home/apm_pluggable.png b/content/images/home/apm_pluggable.png
new file mode 100644
index 0000000..130e662
Binary files /dev/null and b/content/images/home/apm_pluggable.png differ
diff --git a/content/images/home/apm_pluggable_es.png b/content/images/home/apm_pluggable_es.png
new file mode 100644
index 0000000..454041a
Binary files /dev/null and b/content/images/home/apm_pluggable_es.png differ
diff --git a/content/images/home/apm_pluggable_h2.png b/content/images/home/apm_pluggable_h2.png
new file mode 100644
index 0000000..15d496d
Binary files /dev/null and b/content/images/home/apm_pluggable_h2.png differ
diff --git a/content/images/home/apm_pluggable_mysql.png b/content/images/home/apm_pluggable_mysql.png
new file mode 100644
index 0000000..fae73e3
Binary files /dev/null and b/content/images/home/apm_pluggable_mysql.png differ
diff --git a/content/images/home/apm_pluggable_postgresql.png b/content/images/home/apm_pluggable_postgresql.png
new file mode 100644
index 0000000..a736d26
Binary files /dev/null and b/content/images/home/apm_pluggable_postgresql.png differ
diff --git a/content/images/home/apm_visul.png b/content/images/home/apm_visul.png
new file mode 100644
index 0000000..0de129c
Binary files /dev/null and b/content/images/home/apm_visul.png differ
diff --git a/content/images/home/apm_vs.png b/content/images/home/apm_vs.png
new file mode 100644
index 0000000..3354b80
Binary files /dev/null and b/content/images/home/apm_vs.png differ
diff --git a/content/images/home/apm_zookeeper.png b/content/images/home/apm_zookeeper.png
new file mode 100644
index 0000000..4bddba7
Binary files /dev/null and b/content/images/home/apm_zookeeper.png differ
diff --git a/content/images/home/architecture_2160x720.png b/content/images/home/architecture_2160x720.png
new file mode 100644
index 0000000..a6895bb
Binary files /dev/null and b/content/images/home/architecture_2160x720.png differ
diff --git a/content/images/home/arrow.png b/content/images/home/arrow.png
new file mode 100644
index 0000000..ce4101d
Binary files /dev/null and b/content/images/home/arrow.png differ
diff --git a/content/images/home/bg.png b/content/images/home/bg.png
new file mode 100644
index 0000000..be620cb
Binary files /dev/null and b/content/images/home/bg.png differ
diff --git a/content/images/home/contributors.png b/content/images/home/contributors.png
new file mode 100644
index 0000000..f4a3406
Binary files /dev/null and b/content/images/home/contributors.png differ
diff --git a/content/images/home/contributors2.png b/content/images/home/contributors2.png
new file mode 100644
index 0000000..fc67311
Binary files /dev/null and b/content/images/home/contributors2.png differ
diff --git a/content/images/home/dashboard.png b/content/images/home/dashboard.png
new file mode 100644
index 0000000..712d3f4
Binary files /dev/null and b/content/images/home/dashboard.png differ
diff --git a/content/images/home/event.png b/content/images/home/event.png
new file mode 100644
index 0000000..6dd1011
Binary files /dev/null and b/content/images/home/event.png differ
diff --git a/content/images/home/log.png b/content/images/home/log.png
new file mode 100644
index 0000000..37494a9
Binary files /dev/null and b/content/images/home/log.png differ
diff --git a/content/images/home/mouse.png b/content/images/home/mouse.png
new file mode 100644
index 0000000..f3c19b1
Binary files /dev/null and b/content/images/home/mouse.png differ
diff --git a/content/images/home/profile.png b/content/images/home/profile.png
new file mode 100644
index 0000000..9326acb
Binary files /dev/null and b/content/images/home/profile.png differ
diff --git a/content/images/home/pt.png b/content/images/home/pt.png
new file mode 100644
index 0000000..d171195
Binary files /dev/null and b/content/images/home/pt.png differ
diff --git a/content/images/home/topo.png b/content/images/home/topo.png
new file mode 100644
index 0000000..9fea343
Binary files /dev/null and b/content/images/home/topo.png differ
diff --git a/content/images/home/trace.png b/content/images/home/trace.png
new file mode 100644
index 0000000..3710d25
Binary files /dev/null and b/content/images/home/trace.png differ
diff --git a/content/images/home/tuned_q.png b/content/images/home/tuned_q.png
new file mode 100644
index 0000000..6fa6a21
Binary files /dev/null and b/content/images/home/tuned_q.png differ
diff --git a/content/images/home/tuned_release.png b/content/images/home/tuned_release.png
new file mode 100644
index 0000000..02a9576
Binary files /dev/null and b/content/images/home/tuned_release.png differ
diff --git a/content/images/home/tuned_slack.png b/content/images/home/tuned_slack.png
new file mode 100644
index 0000000..390d724
Binary files /dev/null and b/content/images/home/tuned_slack.png differ
diff --git a/content/images/home/tuned_twitter.png b/content/images/home/tuned_twitter.png
new file mode 100644
index 0000000..81c99ea
Binary files /dev/null and b/content/images/home/tuned_twitter.png differ
diff --git a/content/team/_index.md b/content/team/_index.md
index d891a29..d90e542 100644
--- a/content/team/_index.md
+++ b/content/team/_index.md
@@ -79,7 +79,7 @@ Members include Project Management Committee members and committers. The list is
## Contributor over time
-<div><img style="width:100%;max-width:unset" src="https://contributor-graph-api.apiseven.com/contributors-svg?repo=apache/skywalking&merge=true"/></div>
+<div><img style="max-width:100%" src="https://contributor-graph-api.apiseven.com/contributors-svg?repo=apache/skywalking&merge=true"/></div>
## Becoming a Committer
diff --git a/layouts/shortcodes/events.html b/layouts/shortcodes/events.html
new file mode 100644
index 0000000..f579f49
--- /dev/null
+++ b/layouts/shortcodes/events.html
@@ -0,0 +1,12 @@
+{{ .Inner | markdownify}}
+
+{{ range first 1 (where .Site.Pages "Section" "events") }}
+
+ <div class="home-event-li">
+ <h4>{{ .LinkTitle }}</h4>
+ <p><a href="{{ .RelPermalink }}">{{ .Plain | safeHTML | truncate 76 }}</a></p>
+ </div>
+
+{{ end }}
+
+
diff --git a/scripts/team.js b/scripts/team.js
index 3bc373f..6830736 100644
--- a/scripts/team.js
+++ b/scripts/team.js
@@ -1,47 +1,120 @@
-const process = require("process");
-const path = require("path");
+const process = require('process');
+const path = require('path');
+const fs = require('fs');
const YAML = require('yamljs');
const axios = require('axios');
-const fs = require("fs");
+
const {promises} = fs;
const docsFile = path.join(__dirname, '../data/docs.yml')
const teamFile = path.join(__dirname, '../data/team.yml')
+const mergedDataFile = path.join(__dirname, '../themes/docsy/static/js/mergedData.js')
class GenerateTeamYaml {
constructor(docsFile, teamFile) {
this.docsFile = docsFile;
this.teamFile = teamFile;
+ this.mergedDataFile = mergedDataFile;
this.nativeObject = [];
this.logins = {};
+ this.mergedData = [];
}
async init() {
- try{
+ try {
console.log('start...');
this.nativeObject = await this.loadYaml(docsFile);
- await this.getAllRepoContributors()
+ await this.getAllRepoData()
await this.writeFile()
- }catch (err){
+ } catch (err) {
console.log(err);
process.exit(1)
}
}
- async getAllRepoContributors() {
+ async getAllRepoData() {
const promiseList = [];
+ const mergedPromiseList = [];
for (const k of this.nativeObject) {
for (const item of k.list) {
- const {user, repo} = item
- const list = []
- if(user && repo){
- promiseList.push(this.getRepoContributors({user, repo, list, item}))
+ const {user, repo} = item;
+ const list = [];
+ if (user && repo) {
+ promiseList.push(this.getRepoContributors({user, repo, list, item}));
+ mergedPromiseList.push(this.getMergedData({user, repo}));
}
-
}
-
}
await Promise.all(promiseList)
+ await Promise.all(mergedPromiseList)
+ }
+ async getMergedData({user, repo}) {
+ try {
+ const res = await axios.get(`https://github.com/${user}/${repo}/graphs/contributors-data`, {
+ headers: {
+ 'accept': 'application/json',
+ 'User-Agent': '',
+ },
+ });
+ const source = res && res.data || [];
+ source.repo = repo;
+ this.mergedData.push(source);
+ } catch (e) {
+ throw Error(e)
+ }
+ }
+
+ buildMergedData(sources) {
+ const maxSource = this.getMaxData(sources);
+ const maxWeekLen = maxSource[0].weeks.length;
+ const data = [];
+ const date = [];
+
+ const x = new Date();
+ const timepoint = x.setFullYear(2021,7,25);
+
+ for (let i = 0; i < maxWeekLen; i++) {
+ let num = 0;
+ const {w: week} = maxSource[0].weeks[i];
+
+ const now = new Date(+(week + '000'));
+ date.push([now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'));
+
+ sources.forEach((source = []) => {
+ if (!source[0] || !source[0].weeks) {
+ return;
+ }
+ const len = source[0].weeks.length;
+
+ for (let k = 0; k < len; k++) {
+ const usersCount = source.length;
+ const curWeek = source[0].weeks[k] && source[0].weeks[k].w;
+ if (curWeek === week) {
+ for (let j = 0; j < usersCount; j++) {
+ const {c} = source[j] && source[j].weeks[k];
+ if (source.repo !== 'skywalking-java' || now > timepoint) {
+ num += c
+ }
+ }
+ }
+ }
+ })
+
+ data.push(num)
+ }
+ return {data, date}
+ }
+
+ getMaxData(sources) {
+ let maxWeekLen = 0;
+ let maxSource;
+ sources.forEach(item => {
+ if (item.length > maxWeekLen) {
+ maxWeekLen = item.length
+ maxSource = item
+ }
+ })
+ return maxSource
}
async writeFile() {
@@ -51,7 +124,10 @@ class GenerateTeamYaml {
}
const yamlString = YAML.stringify(data);
await promises.writeFile(this.teamFile, yamlString, 'utf8');
- console.log('team.yml success!');
+
+ const mergedGraphData = this.buildMergedData(this.mergedData)
+ await promises.writeFile(this.mergedDataFile, `var mergedData = ${JSON.stringify(mergedGraphData)}`, 'utf8');
+ console.log('team.yml & mergedData.js success!');
}
async loadYaml() {
@@ -67,7 +143,7 @@ class GenerateTeamYaml {
return data
.filter((item) => item.type !== 'Bot')
.map((item) => {
- const { type, email } = item;
+ const {type, email} = item;
if (type === 'Anonymous') {
item.login = email.replace(/(.+)@.+/, '$1**');
}
diff --git a/static/images/logo.svg b/static/images/logo.svg
new file mode 100644
index 0000000..f6e2694
--- /dev/null
+++ b/static/images/logo.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="160px" height="46px" viewBox="0 0 3584 848" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 51.3 (57544) - http://www.bohemiancoding.com/sketch -->
+ <title>Group</title>
+ <desc>Created with Sketch.</desc>
+ <defs></defs>
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Group" transform="translate(0.000000, -16.000000)">
+ <g id="Group-2" transform="translate(0.000000, 157.599119)" fill="#0068AF">
+ <path d="M1440.61949,224.405286 L1440.61949,226.338106 L1381.99064,522.703744 C1374.25936,561.360132 1363.95099,576.822687 1324.65033,576.822687 L1307.25496,576.822687 C1272.46421,576.822687 1254.42456,560.071586 1246.04901,526.569383 L1195.15143,329.421806 C1194.50716,326.844714 1194.50716,326.200441 1193.21861,326.200441 C1191.93007,326.200441 1191.93007,326.844714 1191.28579,329.421806 L1140.38822,526.569383 C1132.01267,560.071586 1113.97302,576.822687 1079.18227,576.8 [...]
+ <path d="M309.821035,361.139868 C309.821035,426.211454 269.231828,495.792952 140.377203,495.792952 C92.0567181,495.792952 57.2659692,491.28304 26.340859,484.196035 C19.8981278,482.907489 14.0996696,478.397577 14.0996696,471.310573 L14.0996696,424.922907 C14.0996696,417.835903 19.8981278,412.681718 26.340859,412.681718 L27.6294053,412.681718 C53.4003304,415.903084 117.827643,419.124449 141.665749,419.124449 C199.006057,419.124449 216.401432,398.507709 216.401432,361.139868 [...]
+ </g>
+ <g id="moon-o" transform="translate(3304.973950, 323.548473) rotate(-183.000000) translate(-3304.973950, -323.548473) translate(3026.449721, 14.297372)" fill="#D8D8D8" fill-rule="nonzero">
+ <path d="M556.201759,503.069627 C538.560505,506.036844 520.385618,507.520453 502.242121,507.520453 C320.273523,507.520453 172.645729,359.064881 172.645729,176.075948 C172.645729,113.448719 190.789226,52.2735334 223.654695,0 C93.1973036,38.9526209 0,159.314326 0,302.340521 C0,476.459368 140.753354,618.001955 313.901326,618.001955 C408.573966,618.001955 497.345261,574.598507 556.201759,503.069627 Z" id="Shape"></path>
+ </g>
+ </g>
+ </g>
+</svg>
\ No newline at end of file
diff --git a/themes/docsy/assets/js/lightbox.js b/themes/docsy/assets/js/lightbox.js
index a352485..747c069 100644
--- a/themes/docsy/assets/js/lightbox.js
+++ b/themes/docsy/assets/js/lightbox.js
@@ -28,10 +28,10 @@ $(function () {
showBig(target.src);
});
$popup.on('click', function () {
- $(this).hide()
+ $(this).fadeOut()
});
function showBig(src) {
$popup.find('img').attr('src', src);
- $popup.show()
+ $popup.fadeIn()
}
})
diff --git a/themes/docsy/assets/js/slider.js b/themes/docsy/assets/js/slider.js
index fcc3e85..63214d1 100644
--- a/themes/docsy/assets/js/slider.js
+++ b/themes/docsy/assets/js/slider.js
@@ -19,7 +19,7 @@ $(function () {
$(this).next('.nav-dropdown').toggle()
})
$('.sidebar-button').on('click', function () {
- $('.sidebar').toggle()
+ $('.sidebar').toggleClass('show')
$('.sidebar-mask').toggle()
})
$('.sidebar-mask').on('click', function () {
diff --git a/themes/docsy/assets/scss/_custom_slider.scss b/themes/docsy/assets/scss/_custom_slider.scss
index 8fac0e6..b133cc2 100644
--- a/themes/docsy/assets/scss/_custom_slider.scss
+++ b/themes/docsy/assets/scss/_custom_slider.scss
@@ -13,18 +13,21 @@
.sidebar {
font-size: 15px;
- background-color: #fff;
+ background: #fff;
width: 20rem;
position: fixed;
z-index: 9999;
margin: 0;
top: 3.6rem;
- left: 0;
+ left: -100%;
bottom: 0;
box-sizing: border-box;
border-right: 1px solid #eaecef;
overflow-y: auto;
- display: none;
+ transition: left 0.2s;
+ &.show {
+ left: 0;
+ }
}
diff --git a/themes/docsy/assets/scss/_event-popup.scss b/themes/docsy/assets/scss/_event-popup.scss
index 822c77a..4a61ded 100644
--- a/themes/docsy/assets/scss/_event-popup.scss
+++ b/themes/docsy/assets/scss/_event-popup.scss
@@ -28,6 +28,7 @@
outline: 0;
width: 440px;
max-width: 100%;
+ border-radius: 6px;
.sky-pop-modal {
width: 100%;
@@ -38,6 +39,7 @@
-moz-box-sizing: border-box;
box-sizing: border-box;
background-color: #fff;
+ background-color: rgba(255, 255, 255, 0.97);
display: flex;
.fa-window-close {
@@ -152,4 +154,4 @@
);
}
}
-}
\ No newline at end of file
+}
diff --git a/themes/docsy/assets/scss/_nav.scss b/themes/docsy/assets/scss/_nav.scss
index 92710e6..a405ad7 100644
--- a/themes/docsy/assets/scss/_nav.scss
+++ b/themes/docsy/assets/scss/_nav.scss
@@ -1,29 +1,39 @@
//
// Main navbar
//
+$primary: #fff;
.td-navbar-cover {
background: $primary;
- @include media-breakpoint-up(md) {
- background: transparent !important;
- .nav-link {
- text-shadow: 1px 1px 2px $dark;
- }
- }
&.navbar-bg-onscroll .nav-link {
text-shadow: none;
}
}
-.navbar-bg-onscroll {
- background: $primary !important;
- opacity: inherit;
-}
-
.td-navbar {
background: $primary;
min-height: 4rem;
margin: 0;
z-index: 10000;
+ display: flex;
+ justify-content: space-between;
+ .navbar-nav-wrapper{
+ .nav-item {
+ &:last-child{
+ .nav-link{
+ &::before{
+ content:'CN';
+ background: #F8F9FA;
+ border-radius: 8px;
+ display: inline-block;
+ padding: 1px 3px;
+ margin-right: 4px;
+ }
+ }
+
+ }
+ }
+ }
+
@include media-breakpoint-up(md) {
position: fixed;
top: 0;
@@ -31,7 +41,6 @@
}
.navbar-brand {
text-transform: none;
- text-align: middle;
.nav-link {
display: inline-block;
margin-right: -30px;
@@ -39,18 +48,17 @@
svg {
display: inline-block;
margin: 0 10px;
- height: 30px;
}
img {
display: inline-block;
margin: 0 10px;
- height: 30px;
}
}
.nav-link {
text-transform: none;
font-weight: $font-weight-bold;
+ color: $fontColor;
}
.td-search-input {
border: none;
@@ -58,6 +66,34 @@
color: $navbar-dark-color;
}
}
+ .search-input-box{
+ width: 300px;
+ .algolia-autocomplete{
+ float: right;
+ }
+ #algolia-search-input {
+ width: 128px;
+ box-shadow: 0px 0px 1px #ccc inset;
+ transition: width 0.2s;
+
+ &::placeholder {
+ color: $fontColor;
+ }
+ &:focus {
+ width: 228px;
+ }
+ }
+ .link{
+ height: 36px;
+ line-height: 36px;
+ padding-left: 10px;
+ float: right;
+ .link-name {
+ color: #909094;
+ }
+ }
+ }
+
.dropdown {
&:hover {
.dropdown-menu {
@@ -70,7 +106,8 @@
box-shadow: 0px 3px 9px 0px rgba(0, 0, 0, 0.12);
padding: 15px;
border: 0;
- left: -25px;
+ left: -225px;
+ top: 36px;
border-radius: 0;
display: block;
visibility: hidden;
@@ -93,19 +130,24 @@
.td-navbar-nav-scroll {
max-width: 100%;
height: 2.5rem;
- //margin-top: .25rem;
- //overflow: hidden;
+ line-height: 2.5rem;
font-size: .875rem;
.nav-link {
padding-right: .25rem;
padding-left: 0;
}
.navbar-nav {
- padding-bottom: 2rem;
- //overflow-x: auto;
white-space: nowrap;
-webkit-overflow-scrolling: touch;
}
}
}
}
+
+@supports (backdrop-filter:none) or (-webkit-backdrop-filter:none) {
+ .td-navbar {
+ -webkit-backdrop-filter: blur(10px);
+ backdrop-filter: blur(15px);
+ background: hsla(0, 0%, 100%, .8);
+ }
+}
diff --git a/themes/docsy/assets/scss/_styles_project.scss b/themes/docsy/assets/scss/_styles_project.scss
index 57c53a2..84db8d9 100644
--- a/themes/docsy/assets/scss/_styles_project.scss
+++ b/themes/docsy/assets/scss/_styles_project.scss
@@ -45,11 +45,6 @@ img {
margin-right: -15px;
margin-left: -15px;
}
-@media (min-width: 990px) {
- img {
- max-width: 920px;
- }
-}
.container {
padding-right: 0px;
@@ -84,7 +79,6 @@ img {
code {
font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace;
- //color: #fff;
padding: 0;
background-color: transparent;
border-radius: 0;
@@ -169,7 +163,7 @@ table {
}
}
-@media (max-width: 1238px) {
+@media (max-width: 1230px) {
.search-input-box {
display: none !important;
}
@@ -186,4 +180,4 @@ table {
background-color: #bebebe !important;
border-radius: 2px;
}
-}
\ No newline at end of file
+}
diff --git a/themes/docsy/assets/scss/main.scss b/themes/docsy/assets/scss/main.scss
index bbd1a55..3cb4404 100644
--- a/themes/docsy/assets/scss/main.scss
+++ b/themes/docsy/assets/scss/main.scss
@@ -32,11 +32,10 @@
}
footer {
- //min-height: 150px;
z-index: 999;
-
- @include media-breakpoint-down(md) {
- //min-height: 200px;
+ background: #F4F8FA;
+ .text-color{
+ color: $fontColor;
}
}
diff --git a/themes/docsy/assets/vendor/bootstrap/scss/_navbar.scss b/themes/docsy/assets/vendor/bootstrap/scss/_navbar.scss
index 52de505..a32d0d2 100644
--- a/themes/docsy/assets/vendor/bootstrap/scss/_navbar.scss
+++ b/themes/docsy/assets/vendor/bootstrap/scss/_navbar.scss
@@ -76,11 +76,6 @@
}
}
-
-// Navbar text
-//
-//
-
.navbar-text {
display: inline-block;
padding-top: $nav-link-padding-y;
@@ -160,6 +155,9 @@
.dropdown-menu {
position: absolute;
+ .dropdown-item{
+ color: #909094;
+ }
}
.nav-link {
diff --git a/themes/docsy/i18n/en.toml b/themes/docsy/i18n/en.toml
index 4a0ad5b..c4831db 100644
--- a/themes/docsy/i18n/en.toml
+++ b/themes/docsy/i18n/en.toml
@@ -12,7 +12,7 @@ other = "Next"
other = "Read more"
[ui_search]
-other = "Search this site…"
+other = "Search…"
# Used in sentences such as "Posted in News"
[ui_in]
diff --git a/themes/docsy/layouts/partials/footer.html b/themes/docsy/layouts/partials/footer.html
index 0954752..20ba30e 100644
--- a/themes/docsy/layouts/partials/footer.html
+++ b/themes/docsy/layouts/partials/footer.html
@@ -1,5 +1,5 @@
{{ $links := .Site.Params.links }}
-<footer class="bg-dark py-5 sky-row">
+<footer class="py-5 sky-row">
<div class="container-fluid text-center">
<div class="">
{{ with $links }}
@@ -10,14 +10,14 @@
</div>
<div class="">
- {{ with .Site.Params.copyright }}<small class="text-white">© 2017 - {{ now.Year}} {{ .}} {{ T "footer_all_rights_reserved" }}</small>{{ end }}
+ {{ with .Site.Params.copyright }}<small class="text-color">© 2017 - {{ now.Year}} {{ .}} {{ T "footer_all_rights_reserved" }}</small>{{ end }}
{{ with .Site.Params.privacy_policy }}<small class="ml-1"><a href="{{ . }}" target="_blank">{{ T "footer_privacy_policy" }}</a></small>{{ end }}
{{ if not .Site.Params.ui.footer_about_disable }}
{{ with .Site.GetPage "about" }}<p class="mt-2"><a href="{{ .RelPermalink }}">{{ .Title }}</a></p>{{ end }}
{{ end }}
</div>
<div class="">
- <small class="text-white mt-4">Apache SkyWalking, SkyWalking, Apache, the Apache feather logo, and the Apache SkyWalking project logo are either registered trademarks or trademarks of the Apache Software Foundation.</small>
+ <small class="text-color mt-4">Apache SkyWalking, SkyWalking, Apache, the Apache feather logo, and the Apache SkyWalking project logo are either registered trademarks or trademarks of the Apache Software Foundation.</small>
</div>
</div>
</footer>
@@ -25,7 +25,7 @@
<ul class="list-inline mb-0">
{{ range . }}
<li class="list-inline-item mx-2 h3" data-toggle="tooltip" data-placement="top" title="{{ .name }}" aria-label="{{ .name }}">
- <a class="text-white" target="_blank" href="{{ .url }}">
+ <a class="text-color" target="_blank" href="{{ .url }}">
<i class="{{ .icon }}"></i>
</a>
</li>
diff --git a/themes/docsy/layouts/partials/navbar.html b/themes/docsy/layouts/partials/navbar.html
index dfc3401..0c04074 100644
--- a/themes/docsy/layouts/partials/navbar.html
+++ b/themes/docsy/layouts/partials/navbar.html
@@ -1,22 +1,14 @@
{{ $cover := .HasShortcode "blocks/cover" }}
-<nav class="js-navbar-scroll navbar navbar-expand navbar-dark {{ if $cover}} td-navbar-cover {{ end }}flex-column flex-md-row td-navbar">
+<nav class="js-navbar-scroll navbar navbar-expand {{ if $cover}} td-navbar-cover {{ end }}flex-column flex-md-row td-navbar">
<div class="sidebar-button"><svg width="40" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 1 [...]
<a class="navbar-brand" href="{{ .Site.Home.RelPermalink }}">
- <span class="navbar-logo">{{ if .Site.Params.ui.navbar_logo }}<img width="126" height="30" src="/images/logo.png" alt="SkyWalking"></span> {{ else }}
+ <span class="navbar-logo">{{ if .Site.Params.ui.navbar_logo }}<img width="130" src="/images/logo.svg" alt="SkyWalking"></span> {{ else }}
<span class="text-uppercase font-weight-bold">{{ .Site.Title }}</span> {{ end }}
</a>
- <div class="td-navbar-nav-scroll ml-md-auto" id="navigation">
+ <div class="td-navbar-nav-scroll navbar-nav-wrapper" id="navigation">
<ul class="navbar-nav mt-lg-0">
- {{ $p := . }} {{ range .Site.Menus.main }} {{ if .HasChildren }}
- <li class="nav-item dropdown">
- <a class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
- {{ .Name }}
- </a>
- <div class="dropdown-menu">
- {{ range .Children }}
- <a class="dropdown-item" href="{{ .URL | relLangURL }}">{{ .Name }}</a> {{ end }}
- </div>
- </li>
+ {{ $p := . }} {{ range .Site.Menus.main }}
+ {{ if .HasChildren }}
{{ else }}
<!--
<li class="nav-item">
@@ -45,5 +37,20 @@
{{ end }}
</ul>
</div>
- <div class="navbar-nav d-none d-lg-block search-input-box">{{ partial "search-input.html" . }}</div>
+ <div class="navbar-nav d-none d-lg-block search-input-box">
+ {{ $p := . }} {{ range .Site.Menus.main }}
+ {{ if .HasChildren }}
+ <span class="link dropdown">
+ <a class="link-name dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+ {{ .Name }}
+ </a>
+ <div class="dropdown-menu">
+ {{ range .Children }}
+ <a class="dropdown-item" href="{{ .URL | relLangURL }}">{{ .Name }}</a> {{ end }}
+ </div>
+ </span>
+ {{ end }}
+ {{ end }}
+ {{ partial "search-input.html" . }}
+ </div>
</nav>
diff --git a/themes/docsy/layouts/partials/scripts-home.html b/themes/docsy/layouts/partials/scripts-home.html
index 25758b5..ead9ffb 100644
--- a/themes/docsy/layouts/partials/scripts-home.html
+++ b/themes/docsy/layouts/partials/scripts-home.html
@@ -1,36 +1,112 @@
+<script src="/js/echarts.min.js"></script>
+<script src="/js/mergedData.js"></script>
<script>
- $(function () {
- arrowClick();
- initArch();
+ initUISwiper();
+ initMergedGraph();
+ $('.swiper-pagination-bullet').hover(function () {
+ $(this).trigger("click");
+ });
- function arrowClick() {
- $('.icon-arrow').click(function () {
- $('html,body').animate({scrollTop: $("#introduction").offset().top - 100}, 400)
- });
+ // cluster
+ createSwiper({
+ container: '.cluster-swiper-container',
+ nextEl: '.cluster-swiper-button-next',
+ prevEl: '.cluster-swiper-button-prev',
+ })
+ // plugin
+ createSwiper({
+ container: '.plugin-swiper-container',
+ nextEl: '.plugin-swiper-button-next',
+ prevEl: '.plugin-swiper-button-prev',
+ })
+ // Perf
+ createSwiper({
+ container:'.perf-swiper-container',
+ nextEl:'.perf-swiper-button-next',
+ prevEl:'.perf-swiper-button-prev',
+ })
+
+ function initUISwiper() {
+ new Swiper('.ui-swiper-container', {
+ loop: true,
+ effect: 'fade',
+ autoplay: {
+ delay: 4000,
+ },
+ pagination: {
+ el: '.ui-swiper-pagination',
+ clickable: true,
+ },
+
+ navigation: {
+ nextEl: '.ui-swiper-button-next',
+ prevEl: '.ui-swiper-button-prev',
+ },
+ });
+ }
+ function createSwiper({container, nextEl, prevEl}){
+ new Swiper(container, {
+ loop: true,
+ autoplay: {
+ delay: 3000,
+ },
+ navigation: {
+ nextEl: nextEl,
+ prevEl: prevEl,
+ },
+ });
}
- function initArch() {
- new Swiper('.arch-swiper-container', {
- loop: true,
- effect: 'fade',
- fadeEffect: {
- crossFade: true,
+ function initMergedGraph() {
+ var chartDom = document.getElementById('mergedGraph');
+ var myChart = echarts.init(chartDom);
+
+ var option = {
+ title: {
+ left: 'center',
},
- autoplay: {
- delay: 5000,
+ xAxis: {
+ type: 'category',
+ boundaryGap: false,
+ data: mergedData.date
},
- pagination: {
- el: '.arch-swiper-pagination',
- dynamicBullets: true,
+ yAxis: {
},
-
- navigation: {
- nextEl: '.arch-swiper-button-next',
- prevEl: '.arch-swiper-button-prev',
+ grid: {
+ x: 40,
+ y: 25,
+ x2: 30,
+ y2: 35
},
+ series: [
+ {
+ lineStyle: {
+ width: 1
+ },
+ name: 'Merged Data',
+ type: 'line',
+ symbol: 'none',
+ sampling: 'lttb',
+ itemStyle: {
+ color: 'rgb(105,183,112)'
+ },
+ areaStyle: {
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: 'rgb(138,197,138)'
+ },
+ {
+ offset: 1,
+ color: 'rgb(237,243,237)'
+ }
+ ])
+ },
+ data: mergedData.data
+ }
+ ]
+ };
- });
+ option && myChart.setOption(option);
}
-
- })
</script>
diff --git a/themes/docsy/layouts/partials/sidebar-skywalking.html b/themes/docsy/layouts/partials/sidebar-skywalking.html
index a1c0f7a..fbda52e 100644
--- a/themes/docsy/layouts/partials/sidebar-skywalking.html
+++ b/themes/docsy/layouts/partials/sidebar-skywalking.html
@@ -10,7 +10,7 @@
<div class="nav-item"><a href="/users/" class="nav-link">Users</a></div>
<div class="nav-item"><a href="/zh/" class="nav-link">中文博客</a></div>
<div class="nav-item">
- <div class="dropdown-wrapper open"><a class="dropdown-title"><span class="title">Links</span> <span
+ <div class="dropdown-wrapper open"><a class="dropdown-title"><span>Links</span> <span
class="arrow down"></span></a>
<ul class="nav-dropdown" style="">
<li class="dropdown-item">
diff --git a/themes/docsy/static/css/highlight-default.min.css b/themes/docsy/static/css/highlight-default.min.css
new file mode 100644
index 0000000..96e1842
--- /dev/null
+++ b/themes/docsy/static/css/highlight-default.min.css
@@ -0,0 +1,9 @@
+/*!
+ Theme: Default
+ Description: Original highlight.js style
+ Author: (c) Ivan Sagalaev <ma...@softwaremaniacs.org>
+ Maintainer: @highlightjs/core-team
+ Website: https://highlightjs.org/
+ License: see project LICENSE
+ Touched: 2021
+*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#f0f0f0;color:#444}.hljs-comment{color:#888}.hljs-punctuation,.hljs-tag{color:#444a}.hljs-tag .hljs-attr,.hljs-tag .hljs-name{color:#444}.hljs-attribute,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-name,.hljs-selector-tag{font-weight:700}.hljs-deletion,.hljs-number,.hljs-quote,.hljs-selector-class,.hljs-selector-id,.hljs-string,.hljs-template-tag,.hljs-type{color:#800}.hljs-s [...]
\ No newline at end of file
diff --git a/themes/docsy/static/js/echarts.min.js b/themes/docsy/static/js/echarts.min.js
new file mode 100644
index 0000000..016dd56
--- /dev/null
+++ b/themes/docsy/static/js/echarts.min.js
@@ -0,0 +1,45 @@
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).echarts={})}(this,(function(t){"use strict";
+/*! *****************************************************************************
+ Copyright (c) Microsoft Corporation.
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ PERFORMANCE OF THIS SOFTWARE.
+ ***************************************************************************** */var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(t,n)};function n(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}var i=function(){return(i=Object.assign||function(t){for(var e,n=1,i=argument [...]
+/*!
+ * ZRender, a high performance 2d drawing library.
+ *
+ * Copyright (c) 2013, Baidu Inc.
+ * All rights reserved.
+ *
+ * LICENSE
+ * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt
+ */
+var Vi=!a.canvasSupported,Bi={},Fi={};var Gi=function(){function t(t,e,n){var i=this;this._sleepAfterStill=10,this._stillFrameAccum=0,this._needsRefresh=!0,this._needsRefreshHover=!0,this._darkMode=!1,n=n||{},this.dom=e,this.id=t;var r=new Se,o=n.renderer||"canvas";if(Vi)throw new Error("IE8 support has been dropped since 5.0");if(Bi[o]||(o=E(Bi)[0]),!Bi[o])throw new Error("Renderer '"+o+"' is not imported. Please import it first.");n.useDirtyRect=null!=n.useDirtyRect&&n.useDirtyRect;var [...]
diff --git a/themes/docsy/static/js/highlight.min.js b/themes/docsy/static/js/highlight.min.js
new file mode 100644
index 0000000..2344106
--- /dev/null
+++ b/themes/docsy/static/js/highlight.min.js
@@ -0,0 +1,1149 @@
+/*!
+ Highlight.js v11.3.1 (git: 2a972d8658)
+ (c) 2006-2021 Ivan Sagalaev and other contributors
+ License: BSD-3-Clause
+ */
+var hljs=function(){"use strict";var e={exports:{}};function n(e){
+return e instanceof Map?e.clear=e.delete=e.set=()=>{
+throw Error("map is read-only")}:e instanceof Set&&(e.add=e.clear=e.delete=()=>{
+throw Error("set is read-only")
+}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach((t=>{var a=e[t]
+;"object"!=typeof a||Object.isFrozen(a)||n(a)})),e}
+e.exports=n,e.exports.default=n;var t=e.exports;class a{constructor(e){
+void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1}
+ignoreMatch(){this.isMatchIgnored=!0}}function i(e){
+return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")
+}function r(e,...n){const t=Object.create(null);for(const n in e)t[n]=e[n]
+;return n.forEach((e=>{for(const n in e)t[n]=e[n]})),t}const s=e=>!!e.kind
+;class o{constructor(e,n){
+this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){
+this.buffer+=i(e)}openNode(e){if(!s(e))return;let n=e.kind
+;n=e.sublanguage?"language-"+n:((e,{prefix:n})=>{if(e.includes(".")){
+const t=e.split(".")
+;return[`${n}${t.shift()}`,...t.map(((e,n)=>`${e}${"_".repeat(n+1)}`))].join(" ")
+}return`${n}${e}`})(n,{prefix:this.classPrefix}),this.span(n)}closeNode(e){
+s(e)&&(this.buffer+="</span>")}value(){return this.buffer}span(e){
+this.buffer+=`<span class="${e}">`}}class l{constructor(){this.rootNode={
+children:[]},this.stack=[this.rootNode]}get top(){
+return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){
+this.top.children.push(e)}openNode(e){const n={kind:e,children:[]}
+;this.add(n),this.stack.push(n)}closeNode(){
+if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){
+for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}
+walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){
+return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),
+n.children.forEach((n=>this._walk(e,n))),e.closeNode(n)),e}static _collapse(e){
+"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{
+l._collapse(e)})))}}class c extends l{constructor(e){super(),this.options=e}
+addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}
+addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root
+;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){
+return new o(this,this.options).value()}finalize(){return!0}}function d(e){
+return e?"string"==typeof e?e:e.source:null}function g(e){return m("(?=",e,")")}
+function u(e){return m("(?:",e,")*")}function b(e){return m("(?:",e,")?")}
+function m(...e){return e.map((e=>d(e))).join("")}function p(...e){const n=(e=>{
+const n=e[e.length-1]
+;return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{}
+})(e);return"("+(n.capture?"":"?:")+e.map((e=>d(e))).join("|")+")"}
+function _(e){return RegExp(e.toString()+"|").exec("").length-1}
+const h=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./
+;function f(e,{joinWith:n}){let t=0;return e.map((e=>{t+=1;const n=t
+;let a=d(e),i="";for(;a.length>0;){const e=h.exec(a);if(!e){i+=a;break}
+i+=a.substring(0,e.index),
+a=a.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?i+="\\"+(Number(e[1])+n):(i+=e[0],
+"("===e[0]&&t++)}return i})).map((e=>`(${e})`)).join(n)}
+const E="[a-zA-Z]\\w*",y="[a-zA-Z_]\\w*",N="\\b\\d+(\\.\\d+)?",w="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",v="\\b(0b[01]+)",O={
+begin:"\\\\[\\s\\S]",relevance:0},x={scope:"string",begin:"'",end:"'",
+illegal:"\\n",contains:[O]},M={scope:"string",begin:'"',end:'"',illegal:"\\n",
+contains:[O]},k=(e,n,t={})=>{const a=r({scope:"comment",begin:e,end:n,
+contains:[]},t);a.contains.push({scope:"doctag",
+begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",
+end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0})
+;const i=p("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/)
+;return a.contains.push({begin:m(/[ ]+/,"(",i,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),a
+},S=k("//","$"),A=k("/\\*","\\*/"),C=k("#","$");var T=Object.freeze({
+__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:E,UNDERSCORE_IDENT_RE:y,
+NUMBER_RE:N,C_NUMBER_RE:w,BINARY_NUMBER_RE:v,
+RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",
+SHEBANG:(e={})=>{const n=/^#![ ]*\//
+;return e.binary&&(e.begin=m(n,/.*\b/,e.binary,/\b.*/)),r({scope:"meta",begin:n,
+end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},
+BACKSLASH_ESCAPE:O,APOS_STRING_MODE:x,QUOTE_STRING_MODE:M,PHRASAL_WORDS_MODE:{
+begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/
+},COMMENT:k,C_LINE_COMMENT_MODE:S,C_BLOCK_COMMENT_MODE:A,HASH_COMMENT_MODE:C,
+NUMBER_MODE:{scope:"number",begin:N,relevance:0},C_NUMBER_MODE:{scope:"number",
+begin:w,relevance:0},BINARY_NUMBER_MODE:{scope:"number",begin:v,relevance:0},
+REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//,
+end:/\/[gimuy]*/,illegal:/\n/,contains:[O,{begin:/\[/,end:/\]/,relevance:0,
+contains:[O]}]}]},TITLE_MODE:{scope:"title",begin:E,relevance:0},
+UNDERSCORE_TITLE_MODE:{scope:"title",begin:y,relevance:0},METHOD_GUARD:{
+begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{
+"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{
+n.data._beginMatch!==e[1]&&n.ignoreMatch()}})});function R(e,n){
+"."===e.input[e.index-1]&&n.ignoreMatch()}function D(e,n){
+void 0!==e.className&&(e.scope=e.className,delete e.className)}function I(e,n){
+n&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",
+e.__beforeBegin=R,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords,
+void 0===e.relevance&&(e.relevance=0))}function L(e,n){
+Array.isArray(e.illegal)&&(e.illegal=p(...e.illegal))}function B(e,n){
+if(e.match){
+if(e.begin||e.end)throw Error("begin & end are not supported with match")
+;e.begin=e.match,delete e.match}}function $(e,n){
+void 0===e.relevance&&(e.relevance=1)}const F=(e,n)=>{if(!e.beforeMatch)return
+;if(e.starts)throw Error("beforeMatch cannot be used with starts")
+;const t=Object.assign({},e);Object.keys(e).forEach((n=>{delete e[n]
+})),e.keywords=t.keywords,e.begin=m(t.beforeMatch,g(t.begin)),e.starts={
+relevance:0,contains:[Object.assign(t,{endsParent:!0})]
+},e.relevance=0,delete t.beforeMatch
+},z=["of","and","for","in","not","or","if","then","parent","list","value"]
+;function U(e,n,t="keyword"){const a=Object.create(null)
+;return"string"==typeof e?i(t,e.split(" ")):Array.isArray(e)?i(t,e):Object.keys(e).forEach((t=>{
+Object.assign(a,U(e[t],n,t))})),a;function i(e,t){
+n&&(t=t.map((e=>e.toLowerCase()))),t.forEach((n=>{const t=n.split("|")
+;a[t[0]]=[e,j(t[0],t[1])]}))}}function j(e,n){
+return n?Number(n):(e=>z.includes(e.toLowerCase()))(e)?0:1}const P={},K=e=>{
+console.error(e)},q=(e,...n)=>{console.log("WARN: "+e,...n)},H=(e,n)=>{
+P[`${e}/${n}`]||(console.log(`Deprecated as of ${e}. ${n}`),P[`${e}/${n}`]=!0)
+},Z=Error();function G(e,n,{key:t}){let a=0;const i=e[t],r={},s={}
+;for(let e=1;e<=n.length;e++)s[e+a]=i[e],r[e+a]=!0,a+=_(n[e-1])
+;e[t]=s,e[t]._emit=r,e[t]._multi=!0}function W(e){(e=>{
+e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope,
+delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={
+_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope
+}),(e=>{if(Array.isArray(e.begin)){
+if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),
+Z
+;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"),
+Z;G(e,e.begin,{key:"beginScope"}),e.begin=f(e.begin,{joinWith:""})}})(e),(e=>{
+if(Array.isArray(e.end)){
+if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"),
+Z
+;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"),
+Z;G(e,e.end,{key:"endScope"}),e.end=f(e.end,{joinWith:""})}})(e)}function Q(e){
+function n(n,t){
+return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(t?"g":""))
+}class t{constructor(){
+this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}
+addRule(e,n){
+n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),
+this.matchAt+=_(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null)
+;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(f(e,{joinWith:"|"
+}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex
+;const n=this.matcherRe.exec(e);if(!n)return null
+;const t=n.findIndex(((e,n)=>n>0&&void 0!==e)),a=this.matchIndexes[t]
+;return n.splice(0,t),Object.assign(n,a)}}class a{constructor(){
+this.rules=[],this.multiRegexes=[],
+this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){
+if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t
+;return this.rules.slice(e).forEach((([e,t])=>n.addRule(e,t))),
+n.compile(),this.multiRegexes[e]=n,n}resumingScanAtSamePosition(){
+return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,n){
+this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){
+const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex
+;let t=n.exec(e)
+;if(this.resumingScanAtSamePosition())if(t&&t.index===this.lastIndex);else{
+const n=this.getMatcher(0);n.lastIndex=this.lastIndex+1,t=n.exec(e)}
+return t&&(this.regexIndex+=t.position+1,
+this.regexIndex===this.count&&this.considerAll()),t}}
+if(e.compilerExtensions||(e.compilerExtensions=[]),
+e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.")
+;return e.classNameAliases=r(e.classNameAliases||{}),function t(i,s){const o=i
+;if(i.isCompiled)return o
+;[D,B,W,F].forEach((e=>e(i,s))),e.compilerExtensions.forEach((e=>e(i,s))),
+i.__beforeBegin=null,[I,L,$].forEach((e=>e(i,s))),i.isCompiled=!0;let l=null
+;return"object"==typeof i.keywords&&i.keywords.$pattern&&(i.keywords=Object.assign({},i.keywords),
+l=i.keywords.$pattern,
+delete i.keywords.$pattern),l=l||/\w+/,i.keywords&&(i.keywords=U(i.keywords,e.case_insensitive)),
+o.keywordPatternRe=n(l,!0),
+s&&(i.begin||(i.begin=/\B|\b/),o.beginRe=n(o.begin),i.end||i.endsWithParent||(i.end=/\B|\b/),
+i.end&&(o.endRe=n(o.end)),
+o.terminatorEnd=d(o.end)||"",i.endsWithParent&&s.terminatorEnd&&(o.terminatorEnd+=(i.end?"|":"")+s.terminatorEnd)),
+i.illegal&&(o.illegalRe=n(i.illegal)),
+i.contains||(i.contains=[]),i.contains=[].concat(...i.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((n=>r(e,{
+variants:null},n)))),e.cachedVariants?e.cachedVariants:X(e)?r(e,{
+starts:e.starts?r(e.starts):null
+}):Object.isFrozen(e)?r(e):e))("self"===e?i:e)))),i.contains.forEach((e=>{t(e,o)
+})),i.starts&&t(i.starts,s),o.matcher=(e=>{const n=new a
+;return e.contains.forEach((e=>n.addRule(e.begin,{rule:e,type:"begin"
+}))),e.terminatorEnd&&n.addRule(e.terminatorEnd,{type:"end"
+}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n})(o),o}(e)}function X(e){
+return!!e&&(e.endsWithParent||X(e.starts))}class V extends Error{
+constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}}
+const J=i,Y=r,ee=Symbol("nomatch");var ne=(e=>{
+const n=Object.create(null),i=Object.create(null),r=[];let s=!0
+;const o="Could not find the language '{}', did you forget to load/include a language module?",l={
+disableAutodetect:!0,name:"Plain text",contains:[]};let d={
+ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,
+languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",
+cssSelector:"pre code",languages:null,__emitter:c};function _(e){
+return d.noHighlightRe.test(e)}function h(e,n,t){let a="",i=""
+;"object"==typeof n?(a=e,
+t=n.ignoreIllegals,i=n.language):(H("10.7.0","highlight(lang, code, ...args) has been deprecated."),
+H("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),
+i=e,a=n),void 0===t&&(t=!0);const r={code:a,language:i};M("before:highlight",r)
+;const s=r.result?r.result:f(r.language,r.code,t)
+;return s.code=r.code,M("after:highlight",s),s}function f(e,t,i,r){
+const l=Object.create(null);function c(){if(!x.keywords)return void k.addText(S)
+;let e=0;x.keywordPatternRe.lastIndex=0;let n=x.keywordPatternRe.exec(S),t=""
+;for(;n;){t+=S.substring(e,n.index)
+;const i=N.case_insensitive?n[0].toLowerCase():n[0],r=(a=i,x.keywords[a]);if(r){
+const[e,a]=r
+;if(k.addText(t),t="",l[i]=(l[i]||0)+1,l[i]<=7&&(A+=a),e.startsWith("_"))t+=n[0];else{
+const t=N.classNameAliases[e]||e;k.addKeyword(n[0],t)}}else t+=n[0]
+;e=x.keywordPatternRe.lastIndex,n=x.keywordPatternRe.exec(S)}var a
+;t+=S.substr(e),k.addText(t)}function g(){null!=x.subLanguage?(()=>{
+if(""===S)return;let e=null;if("string"==typeof x.subLanguage){
+if(!n[x.subLanguage])return void k.addText(S)
+;e=f(x.subLanguage,S,!0,M[x.subLanguage]),M[x.subLanguage]=e._top
+}else e=E(S,x.subLanguage.length?x.subLanguage:null)
+;x.relevance>0&&(A+=e.relevance),k.addSublanguage(e._emitter,e.language)
+})():c(),S=""}function u(e,n){let t=1;for(;void 0!==n[t];){if(!e._emit[t]){t++
+;continue}const a=N.classNameAliases[e[t]]||e[t],i=n[t]
+;a?k.addKeyword(i,a):(S=i,c(),S=""),t++}}function b(e,n){
+return e.scope&&"string"==typeof e.scope&&k.openNode(N.classNameAliases[e.scope]||e.scope),
+e.beginScope&&(e.beginScope._wrap?(k.addKeyword(S,N.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap),
+S=""):e.beginScope._multi&&(u(e.beginScope,n),S="")),x=Object.create(e,{parent:{
+value:x}}),x}function m(e,n,t){let i=((e,n)=>{const t=e&&e.exec(n)
+;return t&&0===t.index})(e.endRe,t);if(i){if(e["on:end"]){const t=new a(e)
+;e["on:end"](n,t),t.isMatchIgnored&&(i=!1)}if(i){
+for(;e.endsParent&&e.parent;)e=e.parent;return e}}
+if(e.endsWithParent)return m(e.parent,n,t)}function p(e){
+return 0===x.matcher.regexIndex?(S+=e[0],1):(R=!0,0)}function _(e){
+const n=e[0],a=t.substr(e.index),i=m(x,e,a);if(!i)return ee;const r=x
+;x.endScope&&x.endScope._wrap?(g(),
+k.addKeyword(n,x.endScope._wrap)):x.endScope&&x.endScope._multi?(g(),
+u(x.endScope,e)):r.skip?S+=n:(r.returnEnd||r.excludeEnd||(S+=n),
+g(),r.excludeEnd&&(S=n));do{
+x.scope&&k.closeNode(),x.skip||x.subLanguage||(A+=x.relevance),x=x.parent
+}while(x!==i.parent);return i.starts&&b(i.starts,e),r.returnEnd?0:n.length}
+let h={};function y(n,r){const o=r&&r[0];if(S+=n,null==o)return g(),0
+;if("begin"===h.type&&"end"===r.type&&h.index===r.index&&""===o){
+if(S+=t.slice(r.index,r.index+1),!s){const n=Error(`0 width match regex (${e})`)
+;throw n.languageName=e,n.badRule=h.rule,n}return 1}
+if(h=r,"begin"===r.type)return(e=>{
+const n=e[0],t=e.rule,i=new a(t),r=[t.__beforeBegin,t["on:begin"]]
+;for(const t of r)if(t&&(t(e,i),i.isMatchIgnored))return p(n)
+;return t.skip?S+=n:(t.excludeBegin&&(S+=n),
+g(),t.returnBegin||t.excludeBegin||(S=n)),b(t,e),t.returnBegin?0:n.length})(r)
+;if("illegal"===r.type&&!i){
+const e=Error('Illegal lexeme "'+o+'" for mode "'+(x.scope||"<unnamed>")+'"')
+;throw e.mode=x,e}if("end"===r.type){const e=_(r);if(e!==ee)return e}
+if("illegal"===r.type&&""===o)return 1
+;if(T>1e5&&T>3*r.index)throw Error("potential infinite loop, way more iterations than matches")
+;return S+=o,o.length}const N=v(e)
+;if(!N)throw K(o.replace("{}",e)),Error('Unknown language: "'+e+'"')
+;const w=Q(N);let O="",x=r||w;const M={},k=new d.__emitter(d);(()=>{const e=[]
+;for(let n=x;n!==N;n=n.parent)n.scope&&e.unshift(n.scope)
+;e.forEach((e=>k.openNode(e)))})();let S="",A=0,C=0,T=0,R=!1;try{
+for(x.matcher.considerAll();;){
+T++,R?R=!1:x.matcher.considerAll(),x.matcher.lastIndex=C
+;const e=x.matcher.exec(t);if(!e)break;const n=y(t.substring(C,e.index),e)
+;C=e.index+n}return y(t.substr(C)),k.closeAllNodes(),k.finalize(),O=k.toHTML(),{
+language:e,value:O,relevance:A,illegal:!1,_emitter:k,_top:x}}catch(n){
+if(n.message&&n.message.includes("Illegal"))return{language:e,value:J(t),
+illegal:!0,relevance:0,_illegalBy:{message:n.message,index:C,
+context:t.slice(C-100,C+100),mode:n.mode,resultSoFar:O},_emitter:k};if(s)return{
+language:e,value:J(t),illegal:!1,relevance:0,errorRaised:n,_emitter:k,_top:x}
+;throw n}}function E(e,t){t=t||d.languages||Object.keys(n);const a=(e=>{
+const n={value:J(e),illegal:!1,relevance:0,_top:l,_emitter:new d.__emitter(d)}
+;return n._emitter.addText(e),n})(e),i=t.filter(v).filter(x).map((n=>f(n,e,!1)))
+;i.unshift(a);const r=i.sort(((e,n)=>{
+if(e.relevance!==n.relevance)return n.relevance-e.relevance
+;if(e.language&&n.language){if(v(e.language).supersetOf===n.language)return 1
+;if(v(n.language).supersetOf===e.language)return-1}return 0})),[s,o]=r,c=s
+;return c.secondBest=o,c}function y(e){let n=null;const t=(e=>{
+let n=e.className+" ";n+=e.parentNode?e.parentNode.className:""
+;const t=d.languageDetectRe.exec(n);if(t){const n=v(t[1])
+;return n||(q(o.replace("{}",t[1])),
+q("Falling back to no-highlight mode for this block.",e)),n?t[1]:"no-highlight"}
+return n.split(/\s+/).find((e=>_(e)||v(e)))})(e);if(_(t))return
+;if(M("before:highlightElement",{el:e,language:t
+}),e.children.length>0&&(d.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),
+console.warn("https://github.com/highlightjs/highlight.js/issues/2886"),
+console.warn(e)),
+d.throwUnescapedHTML))throw new V("One of your code blocks includes unescaped HTML.",e.innerHTML)
+;n=e;const a=n.textContent,r=t?h(a,{language:t,ignoreIllegals:!0}):E(a)
+;e.innerHTML=r.value,((e,n,t)=>{const a=n&&i[n]||t
+;e.classList.add("hljs"),e.classList.add("language-"+a)
+})(e,t,r.language),e.result={language:r.language,re:r.relevance,
+relevance:r.relevance},r.secondBest&&(e.secondBest={
+language:r.secondBest.language,relevance:r.secondBest.relevance
+}),M("after:highlightElement",{el:e,result:r,text:a})}let N=!1;function w(){
+"loading"!==document.readyState?document.querySelectorAll(d.cssSelector).forEach(y):N=!0
+}function v(e){return e=(e||"").toLowerCase(),n[e]||n[i[e]]}
+function O(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach((e=>{
+i[e.toLowerCase()]=n}))}function x(e){const n=v(e)
+;return n&&!n.disableAutodetect}function M(e,n){const t=e;r.forEach((e=>{
+e[t]&&e[t](n)}))}
+"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{
+N&&w()}),!1),Object.assign(e,{highlight:h,highlightAuto:E,highlightAll:w,
+highlightElement:y,
+highlightBlock:e=>(H("10.7.0","highlightBlock will be removed entirely in v12.0"),
+H("10.7.0","Please use highlightElement now."),y(e)),configure:e=>{d=Y(d,e)},
+initHighlighting:()=>{
+w(),H("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")},
+initHighlightingOnLoad:()=>{
+w(),H("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")
+},registerLanguage:(t,a)=>{let i=null;try{i=a(e)}catch(e){
+if(K("Language definition for '{}' could not be registered.".replace("{}",t)),
+!s)throw e;K(e),i=l}
+i.name||(i.name=t),n[t]=i,i.rawDefinition=a.bind(null,e),i.aliases&&O(i.aliases,{
+languageName:t})},unregisterLanguage:e=>{delete n[e]
+;for(const n of Object.keys(i))i[n]===e&&delete i[n]},
+listLanguages:()=>Object.keys(n),getLanguage:v,registerAliases:O,
+autoDetection:x,inherit:Y,addPlugin:e=>{(e=>{
+e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=n=>{
+e["before:highlightBlock"](Object.assign({block:n.el},n))
+}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=n=>{
+e["after:highlightBlock"](Object.assign({block:n.el},n))})})(e),r.push(e)}
+}),e.debugMode=()=>{s=!1},e.safeMode=()=>{s=!0
+},e.versionString="11.3.1",e.regex={concat:m,lookahead:g,either:p,optional:b,
+anyNumberOfTimes:u};for(const e in T)"object"==typeof T[e]&&t(T[e])
+;return Object.assign(e,T),e})({});const te=e=>({IMPORTANT:{scope:"meta",
+begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{
+scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},
+FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},
+ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",
+contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{
+scope:"number",
+begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",
+relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z][A-Za-z0-9_-]*/}
+}),ae=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead", [...]
+;var ce="\\.([0-9](_*[0-9])*)",de="[0-9a-fA-F](_*[0-9a-fA-F])*",ge={
+className:"number",variants:[{
+begin:`(\\b([0-9](_*[0-9])*)((${ce})|\\.)?|(${ce}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b`
+},{begin:`\\b([0-9](_*[0-9])*)((${ce})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{
+begin:`(${ce})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{
+begin:`\\b0[xX]((${de})\\.?|(${de})?\\.(${de}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b`
+},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${de})[lL]?\\b`},{
+begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}],
+relevance:0};function ue(e,n,t){return-1===t?"":e.replace(n,(a=>ue(e,n,t-1)))}
+const be="[A-Za-z$_][0-9A-Za-z$_]*",me=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],pe=["true","false","null","undefined","NaN","Infinity"],_e=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp"," [...]
+;function Ne(e){const n=e.regex,t=be,a={begin:/<[A-Za-z0-9\\._:-]+/,
+end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{
+const t=e[0].length+e.index,a=e.input[t]
+;if("<"===a||","===a)return void n.ignoreMatch();let i
+;">"===a&&(((e,{after:n})=>{const t="</"+e[0].slice(1)
+;return-1!==e.input.indexOf(t,n)})(e,{after:t
+})||n.ignoreMatch()),(i=e.input.substr(t).match(/^\s+extends\s+/))&&0===i.index&&n.ignoreMatch()
+}},i={$pattern:be,keyword:me,literal:pe,built_in:ye,"variable.language":Ee
+},r="\\.([0-9](_?[0-9])*)",s="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",o={
+className:"number",variants:[{
+begin:`(\\b(${s})((${r})|\\.)?|(${r}))[eE][+-]?([0-9](_?[0-9])*)\\b`},{
+begin:`\\b(${s})\\b((${r})\\b|\\.)?|(${r})\\b`},{
+begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{
+begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{
+begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{
+begin:"\\b0[0-7]+n?\\b"}],relevance:0},l={className:"subst",begin:"\\$\\{",
+end:"\\}",keywords:i,contains:[]},c={begin:"html`",end:"",starts:{end:"`",
+returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,l],subLanguage:"xml"}},d={
+begin:"css`",end:"",starts:{end:"`",returnEnd:!1,
+contains:[e.BACKSLASH_ESCAPE,l],subLanguage:"css"}},g={className:"string",
+begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,l]},u={className:"comment",
+variants:[e.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{
+begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",
+begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,
+excludeBegin:!0,relevance:0},{className:"variable",begin:t+"(?=\\s*(-)|$)",
+endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]
+}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]
+},b=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,c,d,g,o];l.contains=b.concat({
+begin:/\{/,end:/\}/,keywords:i,contains:["self"].concat(b)})
+;const m=[].concat(u,l.contains),p=m.concat([{begin:/\(/,end:/\)/,keywords:i,
+contains:["self"].concat(m)}]),_={className:"params",begin:/\(/,end:/\)/,
+excludeBegin:!0,excludeEnd:!0,keywords:i,contains:p},h={variants:[{
+match:[/class/,/\s+/,t,/\s+/,/extends/,/\s+/,n.concat(t,"(",n.concat(/\./,t),")*")],
+scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{
+match:[/class/,/\s+/,t],scope:{1:"keyword",3:"title.class"}}]},f={relevance:0,
+match:n.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]+|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+/),
+className:"title.class",keywords:{_:[..._e,...he]}},E={variants:[{
+match:[/function/,/\s+/,t,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],
+className:{1:"keyword",3:"title.function"},label:"func.def",contains:[_],
+illegal:/%/},y={
+match:n.concat(/\b/,(N=[...fe,"super"],n.concat("(?!",N.join("|"),")")),t,n.lookahead(/\(/)),
+className:"title.function",relevance:0};var N;const w={
+begin:n.concat(/\./,n.lookahead(n.concat(t,/(?![0-9A-Za-z$_(])/))),end:t,
+excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},v={
+match:[/get|set/,/\s+/,t,/(?=\()/],className:{1:"keyword",3:"title.function"},
+contains:[{begin:/\(\)/},_]
+},O="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+e.UNDERSCORE_IDENT_RE+")\\s*=>",x={
+match:[/const|var|let/,/\s+/,t,/\s*/,/=\s*/,n.lookahead(O)],className:{
+1:"keyword",3:"title.function"},contains:[_]};return{name:"Javascript",
+aliases:["js","jsx","mjs","cjs"],keywords:i,exports:{PARAMS_CONTAINS:p,
+CLASS_REFERENCE:f},illegal:/#(?![$_A-z])/,contains:[e.SHEBANG({label:"shebang",
+binary:"node",relevance:5}),{label:"use_strict",className:"meta",relevance:10,
+begin:/^\s*['"]use (strict|asm)['"]/
+},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,c,d,g,u,o,f,{className:"attr",
+begin:t+n.lookahead(":"),relevance:0},x,{
+begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",
+keywords:"return throw case",relevance:0,contains:[u,e.REGEXP_MODE,{
+className:"function",begin:O,returnBegin:!0,end:"\\s*=>",contains:[{
+className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{
+className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,
+excludeEnd:!0,keywords:i,contains:p}]}]},{begin:/,/,relevance:0},{match:/\s+/,
+relevance:0},{variants:[{begin:"<>",end:"</>"},{
+match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:a.begin,
+"on:begin":a.isTrulyOpeningTag,end:a.end}],subLanguage:"xml",contains:[{
+begin:a.begin,end:a.end,skip:!0,contains:["self"]}]}]},E,{
+beginKeywords:"while if switch catch for"},{
+begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",
+returnBegin:!0,label:"func.def",contains:[_,e.inherit(e.TITLE_MODE,{begin:t,
+className:"title.function"})]},{match:/\.\.\./,relevance:0},w,{match:"\\$"+t,
+relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},
+contains:[_]},y,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,
+className:"variable.constant"},h,v,{match:/\$[(.]/}]}}
+const we=e=>m(/\b/,e,/\w$/.test(e)?/\b/:/\B/),ve=["Protocol","Type"].map(we),Oe=["init","self"].map(we),xe=["Any","Self"],Me=["actor","associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in [...]
+;var Ue=Object.freeze({__proto__:null,grmr_bash:e=>{const n=e.regex,t={},a={
+begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]}
+;Object.assign(t,{className:"variable",variants:[{
+begin:n.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},a]});const i={
+className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},r={
+begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,
+end:/(\w+)/,className:"string"})]}},s={className:"string",begin:/"/,end:/"/,
+contains:[e.BACKSLASH_ESCAPE,t,i]};i.contains.push(s);const o={begin:/\$\(\(/,
+end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t]
+},l=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10
+}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,
+contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{
+name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z._-]+\b/,
+keyword:["if","then","else","elif","fi","for","while","in","do","done","case","esac","function"],
+literal:["true","false"],
+built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote" [...]
+},contains:[l,e.SHEBANG(),c,o,e.HASH_COMMENT_MODE,r,{match:/(\/[a-z._-]+)+/},s,{
+className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},t]}},
+grmr_c:e=>{const n=e.regex,t=e.COMMENT("//","$",{contains:[{begin:/\\\n/}]
+}),a="[a-zA-Z_]\\w*::",i="(decltype\\(auto\\)|"+n.optional(a)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",r={
+className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{
+match:/\batomic_[a-z]{3,6}\b/}]},s={className:"string",variants:[{
+begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{
+begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",
+end:"'",illegal:"."},e.END_SAME_AS_BEGIN({
+begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={
+className:"number",variants:[{begin:"\\b(0b[01']+)"},{
+begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)"
+},{
+begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"
+}],relevance:0},l={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{
+keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"
+},contains:[{begin:/\\\n/,relevance:0},e.inherit(s,{className:"string"}),{
+className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},c={
+className:"title",begin:n.optional(a)+e.IDENT_RE,relevance:0
+},d=n.optional(a)+e.IDENT_RE+"\\s*\\(",g={
+keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"],
+type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal128","const","static","complex","bool","imaginary"],
+literal:"true false NULL",
+built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace [...]
+},u=[l,r,t,e.C_BLOCK_COMMENT_MODE,o,s],b={variants:[{begin:/=/,end:/;/},{
+begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],
+keywords:g,contains:u.concat([{begin:/\(/,end:/\)/,keywords:g,
+contains:u.concat(["self"]),relevance:0}]),relevance:0},m={
+begin:"("+i+"[\\*&\\s]+)+"+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,
+keywords:g,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:"decltype\\(auto\\)",
+keywords:g,relevance:0},{begin:d,returnBegin:!0,contains:[e.inherit(c,{
+className:"title.function"})],relevance:0},{relevance:0,match:/,/},{
+className:"params",begin:/\(/,end:/\)/,keywords:g,relevance:0,
+contains:[t,e.C_BLOCK_COMMENT_MODE,s,o,r,{begin:/\(/,end:/\)/,keywords:g,
+relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,s,o,r]}]
+},r,t,e.C_BLOCK_COMMENT_MODE,l]};return{name:"C",aliases:["h"],keywords:g,
+disableAutodetect:!0,illegal:"</",contains:[].concat(b,m,u,[l,{
+begin:e.IDENT_RE+"::",keywords:g},{className:"class",
+beginKeywords:"enum class struct union",end:/[{;:<>=]/,contains:[{
+beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:l,
+strings:s,keywords:g}}},grmr_cpp:e=>{const n=e.regex,t=e.COMMENT("//","$",{
+contains:[{begin:/\\\n/}]
+}),a="[a-zA-Z_]\\w*::",i="(?!struct)(decltype\\(auto\\)|"+n.optional(a)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",r={
+className:"type",begin:"\\b[a-z\\d_]*_t\\b"},s={className:"string",variants:[{
+begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{
+begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",
+end:"'",illegal:"."},e.END_SAME_AS_BEGIN({
+begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={
+className:"number",variants:[{begin:"\\b(0b[01']+)"},{
+begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)"
+},{
+begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"
+}],relevance:0},l={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{
+keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"
+},contains:[{begin:/\\\n/,relevance:0},e.inherit(s,{className:"string"}),{
+className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},c={
+className:"title",begin:n.optional(a)+e.IDENT_RE,relevance:0
+},d=n.optional(a)+e.IDENT_RE+"\\s*\\(",g={
+type:["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"],
+keyword:["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","n [...]
+literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"],
+_type_hints:["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mut [...]
+},u={className:"function.dispatch",relevance:0,keywords:{
+_hint:["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","ma [...]
+},
+begin:n.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,n.lookahead(/(<[^<>]+>|)\s*\(/))
+},b=[u,l,r,t,e.C_BLOCK_COMMENT_MODE,o,s],m={variants:[{begin:/=/,end:/;/},{
+begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],
+keywords:g,contains:b.concat([{begin:/\(/,end:/\)/,keywords:g,
+contains:b.concat(["self"]),relevance:0}]),relevance:0},p={className:"function",
+begin:"("+i+"[\\*&\\s]+)+"+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,
+keywords:g,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:"decltype\\(auto\\)",
+keywords:g,relevance:0},{begin:d,returnBegin:!0,contains:[c],relevance:0},{
+begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[s,o]},{
+relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:g,
+relevance:0,contains:[t,e.C_BLOCK_COMMENT_MODE,s,o,r,{begin:/\(/,end:/\)/,
+keywords:g,relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,s,o,r]}]
+},r,t,e.C_BLOCK_COMMENT_MODE,l]};return{name:"C++",
+aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:g,illegal:"</",
+classNameAliases:{"function.dispatch":"built_in"},
+contains:[].concat(m,p,u,b,[l,{
+begin:"\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array|tuple|optional|variant|function)\\s*<",
+end:">",keywords:g,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:g},{
+match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],
+className:{1:"keyword",3:"title.class"}}])}},grmr_csharp:e=>{const n={
+keyword:["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while" [...]
+built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"],
+literal:["default","false","null","true"]},t=e.inherit(e.TITLE_MODE,{
+begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{
+begin:"\\b(0b[01']+)"},{
+begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{
+begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"
+}],relevance:0},i={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]
+},r=e.inherit(i,{illegal:/\n/}),s={className:"subst",begin:/\{/,end:/\}/,
+keywords:n},o=e.inherit(s,{illegal:/\n/}),l={className:"string",begin:/\$"/,
+end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/
+},e.BACKSLASH_ESCAPE,o]},c={className:"string",begin:/\$@"/,end:'"',contains:[{
+begin:/\{\{/},{begin:/\}\}/},{begin:'""'},s]},d=e.inherit(c,{illegal:/\n/,
+contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},o]})
+;s.contains=[c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],
+o.contains=[d,l,r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{
+illegal:/\n/})];const g={variants:[c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]
+},u={begin:"<",end:">",contains:[{beginKeywords:"in out"},t]
+},b=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",m={
+begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],
+keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,
+contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{
+begin:"\x3c!--|--\x3e"},{begin:"</?",end:">"}]}]
+}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",
+end:"$",keywords:{
+keyword:"if else elif endif define undef warning error line region endregion pragma checksum"
+}},g,a,{beginKeywords:"class interface",relevance:0,end:/[{;=]/,
+illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"
+},t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",
+relevance:0,end:/[{;=]/,illegal:/[^\s:]/,
+contains:[t,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{
+beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,
+contains:[t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",
+begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{
+className:"string",begin:/"/,end:/"/}]},{
+beginKeywords:"new return throw await else",relevance:0},{className:"function",
+begin:"("+b+"\\s+)+"+e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,
+end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{
+beginKeywords:"public private protected static internal protected abstract async extern override unsafe virtual new sealed partial",
+relevance:0},{begin:e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,
+contains:[e.TITLE_MODE,u],relevance:0},{match:/\(\)/},{className:"params",
+begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,
+contains:[g,a,e.C_BLOCK_COMMENT_MODE]
+},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},m]}},grmr_css:e=>{
+const n=e.regex,t=te(e),a=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{
+name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{
+keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"},
+contains:[t.BLOCK_COMMENT,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/
+},t.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0
+},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0
+},t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{
+begin:":("+re.join("|")+")"},{begin:":(:)?("+se.join("|")+")"}]
+},t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+oe.join("|")+")\\b"},{
+begin:/:/,end:/[;}{]/,
+contains:[t.BLOCK_COMMENT,t.HEXCOLOR,t.IMPORTANT,t.CSS_NUMBER_MODE,...a,{
+begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"
+},contains:[{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}]
+},t.FUNCTION_DISPATCH]},{begin:n.lookahead(/@/),end:"[{;]",relevance:0,
+illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/},{
+begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{
+$pattern:/[a-z-]+/,keyword:"and or not only",attribute:ie.join(" ")},contains:[{
+begin:/[a-z-]+(?=:)/,className:"attribute"},...a,t.CSS_NUMBER_MODE]}]},{
+className:"selector-tag",begin:"\\b("+ae.join("|")+")\\b"}]}},grmr_diff:e=>{
+const n=e.regex;return{name:"Diff",aliases:["patch"],contains:[{
+className:"meta",relevance:10,
+match:n.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/)
+},{className:"comment",variants:[{
+begin:n.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/),
+end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{
+className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/,
+end:/$/}]}},grmr_go:e=>{const n={
+keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"],
+type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"],
+literal:["true","false","iota","nil"],
+built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"]
+};return{name:"Go",aliases:["golang"],keywords:n,illegal:"</",
+contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"string",
+variants:[e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{begin:"`",end:"`"}]},{
+className:"number",variants:[{begin:e.C_NUMBER_RE+"[i]",relevance:1
+},e.C_NUMBER_MODE]},{begin:/:=/},{className:"function",beginKeywords:"func",
+end:"\\s*(\\{|$)",excludeEnd:!0,contains:[e.TITLE_MODE,{className:"params",
+begin:/\(/,end:/\)/,endsParent:!0,keywords:n,illegal:/["']/}]}]}},grmr_ini:e=>{
+const n=e.regex,t={className:"number",relevance:0,variants:[{
+begin:/([+-]+)?[\d]+_[\d_]+/},{begin:e.NUMBER_RE}]},a=e.COMMENT();a.variants=[{
+begin:/;/,end:/$/},{begin:/#/,end:/$/}];const i={className:"variable",
+variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)\}/}]},r={
+className:"literal",begin:/\bon|off|true|false|yes|no\b/},s={className:"string",
+contains:[e.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{
+begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]
+},o={begin:/\[/,end:/\]/,contains:[a,r,i,s,t,"self"],relevance:0
+},l=n.either(/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/);return{
+name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,
+contains:[a,{className:"section",begin:/\[+/,end:/\]+/},{
+begin:n.concat(l,"(\\s*\\.\\s*",l,")*",n.lookahead(/\s*=\s*[^#\s]/)),
+className:"attr",starts:{end:/$/,contains:[a,o,r,i,s,t]}}]}},grmr_java:e=>{
+e.regex
+;const n="[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",t=n+ue("(?:<"+n+"~~~(?:\\s*,\\s*"+n+"~~~)*>)?",/~~~/g,2),a={
+keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do"],
+literal:["false","true","null"],
+type:["char","boolean","long","float","int","byte","short","double"],
+built_in:["super","this"]},i={className:"meta",begin:"@"+n,contains:[{
+begin:/\(/,end:/\)/,contains:["self"]}]},r={className:"params",begin:/\(/,
+end:/\)/,keywords:a,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0}
+;return{name:"Java",aliases:["jsp"],keywords:a,illegal:/<\/|#/,
+contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,
+relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{
+begin:/import java\.[a-z]+\./,keywords:"import",relevance:2
+},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/,
+className:"string",contains:[e.BACKSLASH_ESCAPE]
+},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{
+match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,n],className:{
+1:"keyword",3:"title.class"}},{begin:[n,/\s+/,n,/\s+/,/=/],className:{1:"type",
+3:"variable",5:"operator"}},{begin:[/record/,/\s+/,n],className:{1:"keyword",
+3:"title.class"},contains:[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{
+beginKeywords:"new throw return else",relevance:0},{
+begin:["(?:"+t+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{
+2:"title.function"},keywords:a,contains:[{className:"params",begin:/\(/,
+end:/\)/,keywords:a,relevance:0,
+contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,ge,e.C_BLOCK_COMMENT_MODE]
+},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},ge,i]}},grmr_javascript:Ne,
+grmr_json:e=>({name:"JSON",contains:[{className:"attr",
+begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{match:/[{}[\],:]/,
+className:"punctuation",relevance:0},e.QUOTE_STRING_MODE,{
+beginKeywords:"true false null"
+},e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],illegal:"\\S"}),
+grmr_kotlin:e=>{const n={
+keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual",
+built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",
+literal:"true false null"},t={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"
+},a={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},i={
+className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string",
+variants:[{begin:'"""',end:'"""(?=[^"])',contains:[i,a]},{begin:"'",end:"'",
+illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,
+contains:[e.BACKSLASH_ESCAPE,i,a]}]};a.contains.push(r);const s={
+className:"meta",
+begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"
+},o={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,
+end:/\)/,contains:[e.inherit(r,{className:"string"})]}]
+},l=ge,c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),d={
+variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,
+contains:[]}]},g=d;return g.variants[1].contains=[d],d.variants[1].contains=[g],
+{name:"Kotlin",aliases:["kt","kts"],keywords:n,
+contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",
+begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",
+begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",
+begin:/@\w+/}]}},t,s,o,{className:"function",beginKeywords:"fun",end:"[(]|$",
+returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{
+begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,
+contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin:/</,end:/>/,
+keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,
+endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,
+endsWithParent:!0,contains:[d,e.C_LINE_COMMENT_MODE,c],relevance:0
+},e.C_LINE_COMMENT_MODE,c,s,o,r,e.C_NUMBER_MODE]},c]},{className:"class",
+beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,
+illegal:"extends implements",contains:[{
+beginKeywords:"public protected internal private constructor"
+},e.UNDERSCORE_TITLE_MODE,{className:"type",begin:/</,end:/>/,excludeBegin:!0,
+excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,
+excludeBegin:!0,returnEnd:!0},s,o]},r,{className:"meta",begin:"^#!/usr/bin/env",
+end:"$",illegal:"\n"},l]}},grmr_less:e=>{
+const n=te(e),t=le,a="([\\w-]+|@\\{[\\w-]+\\})",i=[],r=[],s=e=>({
+className:"string",begin:"~?"+e+".*?"+e}),o=(e,n,t)=>({className:e,begin:n,
+relevance:t}),l={$pattern:/[a-z-]+/,keyword:"and or not only",
+attribute:ie.join(" ")},c={begin:"\\(",end:"\\)",contains:r,keywords:l,
+relevance:0}
+;r.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s("'"),s('"'),n.CSS_NUMBER_MODE,{
+begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",
+excludeEnd:!0}
+},n.HEXCOLOR,c,o("variable","@@?[\\w-]+",10),o("variable","@\\{[\\w-]+\\}"),o("built_in","~?`[^`]*?`"),{
+className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0
+},n.IMPORTANT);const d=r.concat({begin:/\{/,end:/\}/,contains:i}),g={
+beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"
+}].concat(r)},u={begin:a+"\\s*:",returnBegin:!0,end:/[;}]/,relevance:0,
+contains:[{begin:/-(webkit|moz|ms|o)-/},n.CSS_VARIABLE,{className:"attribute",
+begin:"\\b("+oe.join("|")+")\\b",end:/(?=:)/,starts:{endsWithParent:!0,
+illegal:"[<=$]",relevance:0,contains:r}}]},b={className:"keyword",
+begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",
+starts:{end:"[;{}]",keywords:l,returnEnd:!0,contains:r,relevance:0}},m={
+className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{
+begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:d}},p={variants:[{
+begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:a,end:/\{/}],returnBegin:!0,
+returnEnd:!0,illegal:"[<='$\"]",relevance:0,
+contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,o("keyword","all\\b"),o("variable","@\\{[\\w-]+\\}"),{
+begin:"\\b("+ae.join("|")+")\\b",className:"selector-tag"
+},n.CSS_NUMBER_MODE,o("selector-tag",a,0),o("selector-id","#"+a),o("selector-class","\\."+a,0),o("selector-tag","&",0),n.ATTRIBUTE_SELECTOR_MODE,{
+className:"selector-pseudo",begin:":("+re.join("|")+")"},{
+className:"selector-pseudo",begin:":(:)?("+se.join("|")+")"},{begin:/\(/,
+end:/\)/,relevance:0,contains:d},{begin:"!important"},n.FUNCTION_DISPATCH]},_={
+begin:`[\\w-]+:(:)?(${t.join("|")})`,returnBegin:!0,contains:[p]}
+;return i.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,b,m,_,u,p),{
+name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:i}},grmr_lua:e=>{
+const n="\\[=*\\[",t="\\]=*\\]",a={begin:n,end:t,contains:["self"]
+},i=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[",t,{contains:[a],
+relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,
+literal:"true false nil",
+keyword:"and break do else elseif end for goto if in local not or repeat return then until while",
+built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmeta [...]
+},contains:i.concat([{className:"function",beginKeywords:"function",end:"\\)",
+contains:[e.inherit(e.TITLE_MODE,{
+begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",
+begin:"\\(",endsWithParent:!0,contains:i}].concat(i)
+},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",
+begin:n,end:t,contains:[a],relevance:5}])}},grmr_makefile:e=>{const n={
+className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",
+contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%<?\^\+\*]/}]},t={className:"string",
+begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,n]},a={className:"variable",
+begin:/\$\([\w-]+\s/,end:/\)/,keywords:{
+built_in:"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value"
+},contains:[n]},i={begin:"^"+e.UNDERSCORE_IDENT_RE+"\\s*(?=[:+?]?=)"},r={
+className:"section",begin:/^[^\s]+:/,end:/$/,contains:[n]};return{
+name:"Makefile",aliases:["mk","mak","make"],keywords:{$pattern:/[\w-]+/,
+keyword:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath"
+},contains:[e.HASH_COMMENT_MODE,n,t,a,i,{className:"meta",begin:/^\.PHONY:/,
+end:/$/,keywords:{$pattern:/[\.\w]+/,keyword:".PHONY"}},r]}},grmr_xml:e=>{
+const n=e.regex,t=n.concat(/[A-Z_]/,n.optional(/[A-Z0-9_.-]*:/),/[A-Z0-9_.-]*/),a={
+className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},i={begin:/\s/,
+contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]
+},r=e.inherit(i,{begin:/\(/,end:/\)/}),s=e.inherit(e.APOS_STRING_MODE,{
+className:"string"}),o=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),l={
+endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",
+begin:/[A-Za-z0-9._:-]+/,relevance:0},{begin:/=\s*/,relevance:0,contains:[{
+className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[a]},{
+begin:/'/,end:/'/,contains:[a]},{begin:/[^\s"'=<>`]+/}]}]}]};return{
+name:"HTML, XML",
+aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],
+case_insensitive:!0,contains:[{className:"meta",begin:/<![a-z]/,end:/>/,
+relevance:10,contains:[i,o,s,r,{begin:/\[/,end:/\]/,contains:[{className:"meta",
+begin:/<![a-z]/,end:/>/,contains:[i,r,o,s]}]}]},e.COMMENT(/<!--/,/-->/,{
+relevance:10}),{begin:/<!\[CDATA\[/,end:/\]\]>/,relevance:10},a,{
+className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",
+begin:/<style(?=\s|>)/,end:/>/,keywords:{name:"style"},contains:[l],starts:{
+end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",
+begin:/<script(?=\s|>)/,end:/>/,keywords:{name:"script"},contains:[l],starts:{
+end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{
+className:"tag",begin:/<>|<\/>/},{className:"tag",
+begin:n.concat(/</,n.lookahead(n.concat(t,n.either(/\/>/,/>/,/\s/)))),
+end:/\/?>/,contains:[{className:"name",begin:t,relevance:0,starts:l}]},{
+className:"tag",begin:n.concat(/<\//,n.lookahead(n.concat(t,/>/))),contains:[{
+className:"name",begin:t,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}
+},grmr_markdown:e=>{const n={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",
+relevance:0},t={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{
+begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,
+relevance:2},{
+begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/),
+relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{
+begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/
+},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,
+returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",
+excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",
+end:"\\]",excludeBegin:!0,excludeEnd:!0}]},a={className:"strong",contains:[],
+variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},i={
+className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{
+begin:/_(?!_)/,end:/_/,relevance:0}]};a.contains.push(i),i.contains.push(a)
+;let r=[n,t]
+;return a.contains=a.contains.concat(r),i.contains=i.contains.concat(r),
+r=r.concat(a,i),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{
+className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:r},{
+begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",
+contains:r}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",
+end:"\\s+",excludeEnd:!0},a,i,{className:"quote",begin:"^>\\s+",contains:r,
+end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{
+begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{
+begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",
+contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{
+begin:"^[-\\*]{3,}",end:"$"},t,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{
+className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{
+className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}},grmr_objectivec:e=>{
+const n=/[a-zA-Z@][a-zA-Z0-9_]*/,t={$pattern:n,
+keyword:["@interface","@class","@protocol","@implementation"]};return{
+name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"],
+keywords:{$pattern:n,
+keyword:["int","float","while","char","export","sizeof","typedef","const","struct","for","union","unsigned","long","volatile","static","bool","mutable","if","do","return","goto","void","enum","else","break","extern","asm","case","short","default","double","register","explicit","signed","typename","this","switch","continue","wchar_t","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","super","unichar","IBOutlet","IBAction","strong","weak","copy","in" [...]
+literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"],
+built_in:["BOOL","dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"]
+},illegal:"</",contains:[{className:"built_in",
+begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"
+},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.C_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{
+className:"string",variants:[{begin:'@"',end:'"',illegal:"\\n",
+contains:[e.BACKSLASH_ESCAPE]}]},{className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,
+keywords:{
+keyword:"if else elif endif define undef warning error line pragma ifdef ifndef include"
+},contains:[{begin:/\\\n/,relevance:0},e.inherit(e.QUOTE_STRING_MODE,{
+className:"string"}),{className:"string",begin:/<.*?>/,end:/$/,illegal:"\\n"
+},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",
+begin:"("+t.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:t,
+contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,
+relevance:0}]}},grmr_perl:e=>{const n=e.regex,t=/[dualxmsipngr]{0,12}/,a={
+$pattern:/[\w.]+/,
+keyword:"abs accept alarm and atan2 bind binmode bless break caller chdir chmod chomp chop chown chr chroot close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eval exec exists exit exp fcntl fileno flock for foreach fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp ge [...]
+},i={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:a},r={begin:/->\{/,
+end:/\}/},s={variants:[{begin:/\$\d/},{
+begin:n.concat(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])")
+},{begin:/[$%@][^\s\w{]/,relevance:0}]
+},o=[e.BACKSLASH_ESCAPE,i,s],l=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],c=(e,a,i="\\1")=>{
+const r="\\1"===i?i:n.concat(i,a)
+;return n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,r,/(?:\\.|[^\\\/])*?/,i,t)
+},d=(e,a,i)=>n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,i,t),g=[s,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{
+endsWithParent:!0}),r,{className:"string",contains:o,variants:[{
+begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",
+end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{
+begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">",
+relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",
+contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",
+contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{
+begin:"-?\\w+\\s*=>",relevance:0}]},{className:"number",
+begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",
+relevance:0},{
+begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",
+keywords:"split return print reverse grep",relevance:0,
+contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{
+begin:c("s|tr|y",n.either(...l,{capture:!0}))},{begin:c("s|tr|y","\\(","\\)")},{
+begin:c("s|tr|y","\\[","\\]")},{begin:c("s|tr|y","\\{","\\}")}],relevance:2},{
+className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{
+begin:d("(?:m|qr)?",/\//,/\//)},{begin:d("m|qr",n.either(...l,{capture:!0
+}),/\1/)},{begin:d("m|qr",/\(/,/\)/)},{begin:d("m|qr",/\[/,/\]/)},{
+begin:d("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub",
+end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{
+begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",
+subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]
+}];return i.contains=g,r.contains=g,{name:"Perl",aliases:["pl","pm"],keywords:a,
+contains:g}},grmr_php:e=>{const n={className:"variable",
+begin:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?![A-Za-z0-9])(?![$])"},t={
+className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{
+begin:/\?>/}]},a={className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,
+end:/\}/}]},i=e.inherit(e.APOS_STRING_MODE,{illegal:null
+}),r=e.inherit(e.QUOTE_STRING_MODE,{illegal:null,
+contains:e.QUOTE_STRING_MODE.contains.concat(a)}),s=e.END_SAME_AS_BEGIN({
+begin:/<<<[ \t]*(\w+)\n/,end:/[ \t]*(\w+)\b/,
+contains:e.QUOTE_STRING_MODE.contains.concat(a)}),o={className:"string",
+contains:[e.BACKSLASH_ESCAPE,t],variants:[e.inherit(i,{begin:"b'",end:"'"
+}),e.inherit(r,{begin:'b"',end:'"'}),r,i,s]},l={className:"number",variants:[{
+begin:"\\b0b[01]+(?:_[01]+)*\\b"},{begin:"\\b0o[0-7]+(?:_[0-7]+)*\\b"},{
+begin:"\\b0x[\\da-f]+(?:_[\\da-f]+)*\\b"},{
+begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:e[+-]?\\d+)?"
+}],relevance:0},c={
+keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile enum eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list [...]
+literal:"false null true",
+built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIter [...]
+};return{case_insensitive:!0,keywords:c,
+contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]
+}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]
+}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,
+keywords:"__halt_compiler"}),t,{className:"keyword",begin:/\$this\b/},n,{
+begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",
+relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,
+illegal:"[$%\\[]",contains:[{beginKeywords:"use"},e.UNDERSCORE_TITLE_MODE,{
+begin:"=>",endsParent:!0},{className:"params",begin:"\\(",end:"\\)",
+excludeBegin:!0,excludeEnd:!0,keywords:c,
+contains:["self",n,e.C_BLOCK_COMMENT_MODE,o,l]}]},{className:"class",variants:[{
+beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait",
+illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{
+beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{
+beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/,
+contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",relevance:0,end:";",
+contains:[e.UNDERSCORE_TITLE_MODE]},o,l]}},grmr_php_template:e=>({
+name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,
+subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',
+end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},e.inherit(e.APOS_STRING_MODE,{
+illegal:null,className:null,contains:null,skip:!0
+}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,
+skip:!0})]}]}),grmr_plaintext:e=>({name:"Plain text",aliases:["text","txt"],
+disableAutodetect:!0}),grmr_python:e=>{
+const n=e.regex,t=/[\p{XID_Start}_]\p{XID_Continue}*/u,a={
+$pattern:/[A-Za-z]\w+|__\w+__/,
+keyword:["and","as","assert","async","await","break","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],
+built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round"," [...]
+literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],
+type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]
+},i={className:"meta",begin:/^(>>>|\.\.\.) /},r={className:"subst",begin:/\{/,
+end:/\}/,keywords:a,illegal:/#/},s={begin:/\{\{/,relevance:0},o={
+className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{
+begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,
+contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{
+begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,
+contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{
+begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,
+contains:[e.BACKSLASH_ESCAPE,i,s,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,
+end:/"""/,contains:[e.BACKSLASH_ESCAPE,i,s,r]},{begin:/([uU]|[rR])'/,end:/'/,
+relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{
+begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,
+end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,
+contains:[e.BACKSLASH_ESCAPE,s,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,
+contains:[e.BACKSLASH_ESCAPE,s,r]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]
+},l="[0-9](_?[0-9])*",c=`(\\b(${l}))?\\.(${l})|\\b(${l})\\.`,d={
+className:"number",relevance:0,variants:[{
+begin:`(\\b(${l})|(${c}))[eE][+-]?(${l})[jJ]?\\b`},{begin:`(${c})[jJ]?`},{
+begin:"\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?\\b"},{
+begin:"\\b0[bB](_?[01])+[lL]?\\b"},{begin:"\\b0[oO](_?[0-7])+[lL]?\\b"},{
+begin:"\\b0[xX](_?[0-9a-fA-F])+[lL]?\\b"},{begin:`\\b(${l})[jJ]\\b`}]},g={
+className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:a,contains:[{
+begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},u={
+className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,
+end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:a,
+contains:["self",i,d,o,e.HASH_COMMENT_MODE]}]};return r.contains=[o,d,i],{
+name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:a,
+illegal:/(<\/|->|\?)|=>/,contains:[i,d,{begin:/\bself\b/},{beginKeywords:"if",
+relevance:0},o,g,e.HASH_COMMENT_MODE,{match:[/def/,/\s+/,t],scope:{1:"keyword",
+3:"title.function"},contains:[u]},{variants:[{
+match:[/class/,/\s+/,t,/\s*/,/\(\s*/,t,/\s*\)/]},{match:[/class/,/\s+/,t]}],
+scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{
+className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[d,u,o]}]}},
+grmr_python_repl:e=>({aliases:["pycon"],contains:[{className:"meta",starts:{
+end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{
+begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}),grmr_r:e=>{
+const n=e.regex,t=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,a=n.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),i=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,r=n.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/)
+;return{name:"R",keywords:{$pattern:t,
+keyword:"function if in break next repeat else for while",
+literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10",
+built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.d [...]
+},contains:[e.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/,
+starts:{end:n.lookahead(n.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)),
+endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{
+scope:"variable",variants:[{match:t},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0
+}]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}]
+}),e.HASH_COMMENT_MODE,{scope:"string",contains:[e.BACKSLASH_ESCAPE],
+variants:[e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/
+}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/
+}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/
+}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/
+}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/
+}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"',
+relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{
+1:"operator",2:"number"},match:[i,a]},{scope:{1:"operator",2:"number"},
+match:[/%[^%]*%/,a]},{scope:{1:"punctuation",2:"number"},match:[r,a]},{scope:{
+2:"number"},match:[/[^a-zA-Z0-9._]|^/,a]}]},{scope:{3:"operator"},
+match:[t,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:i},{
+match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:r},{begin:"`",end:"`",
+contains:[{begin:/\\./}]}]}},grmr_ruby:e=>{
+const n=e.regex,t="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",a={
+keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor __FILE__",
+built_in:"proc lambda",literal:"true false nil"},i={className:"doctag",
+begin:"@[A-Za-z]+"},r={begin:"#<",end:">"},s=[e.COMMENT("#","$",{contains:[i]
+}),e.COMMENT("^=begin","^=end",{contains:[i],relevance:10
+}),e.COMMENT("^__END__","\\n$")],o={className:"subst",begin:/#\{/,end:/\}/,
+keywords:a},l={className:"string",contains:[e.BACKSLASH_ESCAPE,o],variants:[{
+begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/,
+end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{
+begin:/%[qQwWx]?</,end:/>/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/,
+end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{
+begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{
+begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{
+begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{
+begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{
+begin:n.concat(/<<[-~]?'?/,n.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)),
+contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,
+contains:[e.BACKSLASH_ESCAPE,o]})]}]},c="[0-9](_?[0-9])*",d={className:"number",
+relevance:0,variants:[{
+begin:`\\b([1-9](_?[0-9])*|0)(\\.(${c}))?([eE][+-]?(${c})|r)?i?\\b`},{
+begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b"
+},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{
+begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{
+begin:"\\b0(_?[0-7])+r?i?\\b"}]},g={className:"params",begin:"\\(",end:"\\)",
+endsParent:!0,keywords:a},u=[l,{className:"class",beginKeywords:"class module",
+end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{
+begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|!)?"}),{begin:"<\\s*",contains:[{
+begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE,relevance:0}]}].concat(s)},{
+className:"function",begin:n.concat(/def\s+/,n.lookahead(t+"\\s*(\\(|;|$)")),
+relevance:0,keywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:t
+}),g].concat(s)},{begin:e.IDENT_RE+"::"},{className:"symbol",
+begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol",
+begin:":(?!\\s)",contains:[l,{begin:t}],relevance:0},d,{className:"variable",
+begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{
+className:"params",begin:/\|/,end:/\|/,relevance:0,keywords:a},{
+begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{
+className:"regexp",contains:[e.BACKSLASH_ESCAPE,o],illegal:/\n/,variants:[{
+begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(",
+end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]
+}].concat(r,s),relevance:0}].concat(r,s);o.contains=u,g.contains=u;const b=[{
+begin:/^\s*=>/,starts:{end:"$",contains:u}},{className:"meta",
+begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])",
+starts:{end:"$",contains:u}}];return s.unshift(r),{name:"Ruby",
+aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,
+contains:[e.SHEBANG({binary:"ruby"})].concat(b).concat(s).concat(u)}},
+grmr_rust:e=>{const n=e.regex,t={className:"title.function.invoke",relevance:0,
+begin:n.concat(/\b/,/(?!let\b)/,e.IDENT_RE,n.lookahead(/\s*\(/))
+},a="([ui](8|16|32|64|128|size)|f(32|64))?",i=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","panic!","file!","format!","format_args!","in [...]
+;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",
+type:["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"],
+keyword:["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","unsafe","unsized","use","virtual","where","while","yield"],
+literal:["true","false","Some","None","Ok","Err"],built_in:i},illegal:"</",
+contains:[e.C_LINE_COMMENT_MODE,e.COMMENT("/\\*","\\*/",{contains:["self"]
+}),e.inherit(e.QUOTE_STRING_MODE,{begin:/b?"/,illegal:null}),{
+className:"string",variants:[{begin:/b?r(#*)"(.|\n)*?"\1(?!#)/},{
+begin:/b?'\\?(x\w{2}|u\w{4}|U\w{8}|.)'/}]},{className:"symbol",
+begin:/'[a-zA-Z_][a-zA-Z0-9_]*/},{className:"number",variants:[{
+begin:"\\b0b([01_]+)"+a},{begin:"\\b0o([0-7_]+)"+a},{
+begin:"\\b0x([A-Fa-f0-9_]+)"+a},{
+begin:"\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)"+a}],relevance:0},{
+begin:[/fn/,/\s+/,e.UNDERSCORE_IDENT_RE],className:{1:"keyword",
+3:"title.function"}},{className:"meta",begin:"#!?\\[",end:"\\]",contains:[{
+className:"string",begin:/"/,end:/"/}]},{
+begin:[/let/,/\s+/,/(?:mut\s+)?/,e.UNDERSCORE_IDENT_RE],className:{1:"keyword",
+3:"keyword",4:"variable"}},{
+begin:[/for/,/\s+/,e.UNDERSCORE_IDENT_RE,/\s+/,/in/],className:{1:"keyword",
+3:"variable",5:"keyword"}},{begin:[/type/,/\s+/,e.UNDERSCORE_IDENT_RE],
+className:{1:"keyword",3:"title.class"}},{
+begin:[/(?:trait|enum|struct|union|impl|for)/,/\s+/,e.UNDERSCORE_IDENT_RE],
+className:{1:"keyword",3:"title.class"}},{begin:e.IDENT_RE+"::",keywords:{
+keyword:"Self",built_in:i}},{className:"punctuation",begin:"->"},t]}},
+grmr_scss:e=>{const n=te(e),t=se,a=re,i="@[a-z-]+",r={className:"variable",
+begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"};return{name:"SCSS",case_insensitive:!0,
+illegal:"[=/|']",
+contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,n.CSS_NUMBER_MODE,{
+className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{
+className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0
+},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag",
+begin:"\\b("+ae.join("|")+")\\b",relevance:0},{className:"selector-pseudo",
+begin:":("+a.join("|")+")"},{className:"selector-pseudo",
+begin:":(:)?("+t.join("|")+")"},r,{begin:/\(/,end:/\)/,
+contains:[n.CSS_NUMBER_MODE]},n.CSS_VARIABLE,{className:"attribute",
+begin:"\\b("+oe.join("|")+")\\b"},{
+begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-r [...]
+},{begin:/:/,end:/[;}{]/,
+contains:[n.BLOCK_COMMENT,r,n.HEXCOLOR,n.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.IMPORTANT]
+},{begin:"@(page|font-face)",keywords:{$pattern:i,keyword:"@page @font-face"}},{
+begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/,
+keyword:"and or not only",attribute:ie.join(" ")},contains:[{begin:i,
+className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute"
+},r,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.HEXCOLOR,n.CSS_NUMBER_MODE]
+},n.FUNCTION_DISPATCH]}},grmr_shell:e=>({name:"Shell Session",
+aliases:["console","shellsession"],contains:[{className:"meta",
+begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,
+subLanguage:"bash"}}]}),grmr_sql:e=>{
+const n=e.regex,t=e.COMMENT("--","$"),a=["true","false","unknown"],i=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],r=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element", [...]
+begin:n.concat(/\b/,n.either(...o),/\s*\(/),relevance:0,keywords:{built_in:o}}
+;return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{
+$pattern:/\b[\w\.]+/,keyword:((e,{exceptions:n,when:t}={})=>{const a=t
+;return n=n||[],e.map((e=>e.match(/\|\d+$/)||n.includes(e)?e:a(e)?e+"|0":e))
+})(l,{when:e=>e.length<3}),literal:a,type:i,
+built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"]
+},contains:[{begin:n.either(...s),relevance:0,keywords:{$pattern:/[\w\.]+/,
+keyword:l.concat(s),literal:a,type:i}},{className:"type",
+begin:n.either("double precision","large object","with timezone","without timezone")
+},c,{className:"variable",begin:/@[a-z0-9]+/},{className:"string",variants:[{
+begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/,contains:[{
+begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,{className:"operator",
+begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}},
+grmr_swift:e=>{const n={match:/\s+/,relevance:0},t=e.COMMENT("/\\*","\\*/",{
+contains:["self"]}),a=[e.C_LINE_COMMENT_MODE,t],i={match:[/\./,p(...ve,...Oe)],
+className:{2:"keyword"}},r={match:m(/\./,p(...Me)),relevance:0
+},s=Me.filter((e=>"string"==typeof e)).concat(["_|0"]),o={variants:[{
+className:"keyword",
+match:p(...Me.filter((e=>"string"!=typeof e)).concat(xe).map(we),...Oe)}]},l={
+$pattern:p(/\b\w+/,/#\w+/),keyword:s.concat(Ae),literal:ke},c=[i,r,o],d=[{
+match:m(/\./,p(...Ce)),relevance:0},{className:"built_in",
+match:m(/\b/,p(...Ce),/(?=\()/)}],u={match:/->/,relevance:0},b=[u,{
+className:"operator",relevance:0,variants:[{match:De},{match:`\\.(\\.|${Re})+`}]
+}],_="([0-9a-fA-F]_*)+",h={className:"number",relevance:0,variants:[{
+match:"\\b(([0-9]_*)+)(\\.(([0-9]_*)+))?([eE][+-]?(([0-9]_*)+))?\\b"},{
+match:`\\b0x(${_})(\\.(${_}))?([pP][+-]?(([0-9]_*)+))?\\b`},{
+match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},f=(e="")=>({
+className:"subst",variants:[{match:m(/\\/,e,/[0\\tnr"']/)},{
+match:m(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}]}),E=(e="")=>({className:"subst",
+match:m(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/)}),y=(e="")=>({className:"subst",
+label:"interpol",begin:m(/\\/,e,/\(/),end:/\)/}),N=(e="")=>({begin:m(e,/"""/),
+end:m(/"""/,e),contains:[f(e),E(e),y(e)]}),w=(e="")=>({begin:m(e,/"/),
+end:m(/"/,e),contains:[f(e),y(e)]}),v={className:"string",
+variants:[N(),N("#"),N("##"),N("###"),w(),w("#"),w("##"),w("###")]},O={
+match:m(/`/,Be,/`/)},x=[O,{className:"variable",match:/\$\d+/},{
+className:"variable",match:`\\$${Le}+`}],M=[{match:/(@|#)available/,
+className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:ze,
+contains:[...b,h,v]}]}},{className:"keyword",match:m(/@/,p(...Fe))},{
+className:"meta",match:m(/@/,Be)}],k={match:g(/\b[A-Z]/),relevance:0,contains:[{
+className:"type",
+match:m(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,Le,"+")
+},{className:"type",match:$e,relevance:0},{match:/[?!]+/,relevance:0},{
+match:/\.\.\./,relevance:0},{match:m(/\s+&\s+/,g($e)),relevance:0}]},S={
+begin:/</,end:/>/,keywords:l,contains:[...a,...c,...M,u,k]};k.contains.push(S)
+;const A={begin:/\(/,end:/\)/,relevance:0,keywords:l,contains:["self",{
+match:m(Be,/\s*:/),keywords:"_|0",relevance:0
+},...a,...c,...d,...b,h,v,...x,...M,k]},C={begin:/</,end:/>/,contains:[...a,k]
+},T={begin:/\(/,end:/\)/,keywords:l,contains:[{
+begin:p(g(m(Be,/\s*:/)),g(m(Be,/\s+/,Be,/\s*:/))),end:/:/,relevance:0,
+contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:Be}]
+},...a,...c,...b,h,v,...M,k,A],endsParent:!0,illegal:/["']/},R={
+match:[/func/,/\s+/,p(O.match,Be,De)],className:{1:"keyword",3:"title.function"
+},contains:[C,T,n],illegal:[/\[/,/%/]},D={
+match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"},
+contains:[C,T,n],illegal:/\[|%/},I={match:[/operator/,/\s+/,De],className:{
+1:"keyword",3:"title"}},L={begin:[/precedencegroup/,/\s+/,$e],className:{
+1:"keyword",3:"title"},contains:[k],keywords:[...Se,...ke],end:/}/}
+;for(const e of v.variants){const n=e.contains.find((e=>"interpol"===e.label))
+;n.keywords=l;const t=[...c,...d,...b,h,v,...x];n.contains=[...t,{begin:/\(/,
+end:/\)/,contains:["self",...t]}]}return{name:"Swift",keywords:l,
+contains:[...a,R,D,{beginKeywords:"struct protocol class extension enum actor",
+end:"\\{",excludeEnd:!0,keywords:l,contains:[e.inherit(e.TITLE_MODE,{
+className:"title.class",begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...c]
+},I,L,{beginKeywords:"import",end:/$/,contains:[...a],relevance:0
+},...c,...d,...b,h,v,...x,...M,k,A]}},grmr_typescript:e=>{
+const n=Ne(e),t=["any","void","number","boolean","string","object","never","enum"],a={
+beginKeywords:"namespace",end:/\{/,excludeEnd:!0,
+contains:[n.exports.CLASS_REFERENCE]},i={beginKeywords:"interface",end:/\{/,
+excludeEnd:!0,keywords:{keyword:"interface extends",built_in:t},
+contains:[n.exports.CLASS_REFERENCE]},r={$pattern:be,
+keyword:me.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]),
+literal:pe,built_in:ye.concat(t),"variable.language":Ee},s={className:"meta",
+begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},o=(e,n,t)=>{
+const a=e.contains.findIndex((e=>e.label===n))
+;if(-1===a)throw Error("can not find mode to replace");e.contains.splice(a,1,t)}
+;return Object.assign(n.keywords,r),
+n.exports.PARAMS_CONTAINS.push(s),n.contains=n.contains.concat([s,a,i]),
+o(n,"shebang",e.SHEBANG()),o(n,"use_strict",{className:"meta",relevance:10,
+begin:/^\s*['"]use strict['"]/
+}),n.contains.find((e=>"func.def"===e.label)).relevance=0,Object.assign(n,{
+name:"TypeScript",aliases:["ts","tsx"]}),n},grmr_vbnet:e=>{
+const n=e.regex,t=/\d{1,2}\/\d{1,2}\/\d{4}/,a=/\d{4}-\d{1,2}-\d{1,2}/,i=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,r=/\d{1,2}(:\d{1,2}){1,2}/,s={
+className:"literal",variants:[{begin:n.concat(/# */,n.either(a,t),/ *#/)},{
+begin:n.concat(/# */,r,/ *#/)},{begin:n.concat(/# */,i,/ *#/)},{
+begin:n.concat(/# */,n.either(a,t),/ +/,n.either(i,r),/ *#/)}]
+},o=e.COMMENT(/'''/,/$/,{contains:[{className:"doctag",begin:/<\/?/,end:/>/}]
+}),l=e.COMMENT(null,/$/,{variants:[{begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]})
+;return{name:"Visual Basic .NET",aliases:["vb"],case_insensitive:!0,
+classNameAliases:{label:"symbol"},keywords:{
+keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notover [...]
+built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort",
+type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort",
+literal:"true false nothing"},
+illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[{
+className:"string",begin:/"(""|[^/n])"C\b/},{className:"string",begin:/"/,
+end:/"/,illegal:/\n/,contains:[{begin:/""/}]},s,{className:"number",relevance:0,
+variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/
+},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{
+begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},{
+className:"label",begin:/^\w+:/},o,l,{className:"meta",
+begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/,
+end:/$/,keywords:{
+keyword:"const disable else elseif enable end externalsource if region then"},
+contains:[l]}]}},grmr_yaml:e=>{
+const n="true false yes no null",t="[\\w#;/?:@&=+$,.~*'()[\\]]+",a={
+className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/
+},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",
+variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(a,{
+variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),r={
+end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},s={begin:/\{/,
+end:/\}/,contains:[r],illegal:"\\n",relevance:0},o={begin:"\\[",end:"\\]",
+contains:[r],illegal:"\\n",relevance:0},l=[{className:"attr",variants:[{
+begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{
+begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$",
+relevance:10},{className:"string",
+begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{
+begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,
+relevance:0},{className:"type",begin:"!\\w+!"+t},{className:"type",
+begin:"!<"+t+">"},{className:"type",begin:"!"+t},{className:"type",begin:"!!"+t
+},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",
+begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",
+relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{
+className:"number",
+begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"
+},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},s,o,a],c=[...l]
+;return c.pop(),c.push(i),r.contains=c,{name:"YAML",case_insensitive:!0,
+aliases:["yml"],contains:l}}});const je=ne;for(const e of Object.keys(Ue)){
+const n=e.replace("grmr_","").replace("_","-");je.registerLanguage(n,Ue[e])}
+return je}()
+;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);
\ No newline at end of file