aboutsummaryrefslogtreecommitdiff
path: root/dokka-subprojects/plugin-base/src/main/resources/dokka/scripts
diff options
context:
space:
mode:
authorIgnat Beresnev <ignat.beresnev@jetbrains.com>2023-11-10 11:46:54 +0100
committerGitHub <noreply@github.com>2023-11-10 11:46:54 +0100
commit8e5c63d035ef44a269b8c43430f43f5c8eebfb63 (patch)
tree1b915207b2b9f61951ddbf0ff2e687efd053d555 /dokka-subprojects/plugin-base/src/main/resources/dokka/scripts
parenta44efd4ba0c2e4ab921ff75e0f53fc9335aa79db (diff)
downloaddokka-8e5c63d035ef44a269b8c43430f43f5c8eebfb63.tar.gz
dokka-8e5c63d035ef44a269b8c43430f43f5c8eebfb63.tar.bz2
dokka-8e5c63d035ef44a269b8c43430f43f5c8eebfb63.zip
Restructure the project to utilize included builds (#3174)
* Refactor and simplify artifact publishing * Update Gradle to 8.4 * Refactor and simplify convention plugins and build scripts Fixes #3132 --------- Co-authored-by: Adam <897017+aSemy@users.noreply.github.com> Co-authored-by: Oleg Yukhnevich <whyoleg@gmail.com>
Diffstat (limited to 'dokka-subprojects/plugin-base/src/main/resources/dokka/scripts')
-rw-r--r--dokka-subprojects/plugin-base/src/main/resources/dokka/scripts/clipboard.js56
-rw-r--r--dokka-subprojects/plugin-base/src/main/resources/dokka/scripts/navigation-loader.js95
-rw-r--r--dokka-subprojects/plugin-base/src/main/resources/dokka/scripts/platform-content-handler.js400
-rw-r--r--dokka-subprojects/plugin-base/src/main/resources/dokka/scripts/prism.js22
-rw-r--r--dokka-subprojects/plugin-base/src/main/resources/dokka/scripts/symbol-parameters-wrapper_deferred.js64
5 files changed, 637 insertions, 0 deletions
diff --git a/dokka-subprojects/plugin-base/src/main/resources/dokka/scripts/clipboard.js b/dokka-subprojects/plugin-base/src/main/resources/dokka/scripts/clipboard.js
new file mode 100644
index 00000000..7a4f33c5
--- /dev/null
+++ b/dokka-subprojects/plugin-base/src/main/resources/dokka/scripts/clipboard.js
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+window.addEventListener('load', () => {
+ document.querySelectorAll('span.copy-icon').forEach(element => {
+ element.addEventListener('click', (el) => copyElementsContentToClipboard(element));
+ })
+
+ document.querySelectorAll('span.anchor-icon').forEach(element => {
+ element.addEventListener('click', (el) => {
+ if(element.hasAttribute('pointing-to')){
+ const location = hrefWithoutCurrentlyUsedAnchor() + '#' + element.getAttribute('pointing-to')
+ copyTextToClipboard(element, location)
+ }
+ });
+ })
+})
+
+const copyElementsContentToClipboard = (element) => {
+ const selection = window.getSelection();
+ const range = document.createRange();
+ range.selectNodeContents(element.parentNode.parentNode);
+ selection.removeAllRanges();
+ selection.addRange(range);
+
+ copyAndShowPopup(element, () => selection.removeAllRanges())
+}
+
+const copyTextToClipboard = (element, text) => {
+ var textarea = document.createElement("textarea");
+ textarea.textContent = text;
+ textarea.style.position = "fixed";
+ document.body.appendChild(textarea);
+ textarea.select();
+
+ copyAndShowPopup(element, () => document.body.removeChild(textarea))
+}
+
+const copyAndShowPopup = (element, after) => {
+ try {
+ document.execCommand('copy');
+ element.nextElementSibling.classList.add('active-popup');
+ setTimeout(() => {
+ element.nextElementSibling.classList.remove('active-popup');
+ }, 1200);
+ } catch (e) {
+ console.error('Failed to write to clipboard:', e)
+ }
+ finally {
+ if(after) after()
+ }
+}
+
+const hrefWithoutCurrentlyUsedAnchor = () => window.location.href.split('#')[0]
+
diff --git a/dokka-subprojects/plugin-base/src/main/resources/dokka/scripts/navigation-loader.js b/dokka-subprojects/plugin-base/src/main/resources/dokka/scripts/navigation-loader.js
new file mode 100644
index 00000000..3df7ac8c
--- /dev/null
+++ b/dokka-subprojects/plugin-base/src/main/resources/dokka/scripts/navigation-loader.js
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+navigationPageText = fetch(pathToRoot + "navigation.html").then(response => response.text())
+
+displayNavigationFromPage = () => {
+ navigationPageText.then(data => {
+ document.getElementById("sideMenu").innerHTML = data;
+ }).then(() => {
+ document.querySelectorAll(".overview > a").forEach(link => {
+ link.setAttribute("href", pathToRoot + link.getAttribute("href"));
+ })
+ }).then(() => {
+ document.querySelectorAll(".sideMenuPart").forEach(nav => {
+ if (!nav.classList.contains("hidden"))
+ nav.classList.add("hidden")
+ })
+ }).then(() => {
+ revealNavigationForCurrentPage()
+ }).then(() => {
+ scrollNavigationToSelectedElement()
+ })
+ document.querySelectorAll('.footer a[href^="#"]').forEach(anchor => {
+ anchor.addEventListener('click', function (e) {
+ e.preventDefault();
+ document.querySelector(this.getAttribute('href')).scrollIntoView({
+ behavior: 'smooth'
+ });
+ });
+ });
+}
+
+revealNavigationForCurrentPage = () => {
+ let pageId = document.getElementById("content").attributes["pageIds"].value.toString();
+ let parts = document.querySelectorAll(".sideMenuPart");
+ let found = 0;
+ do {
+ parts.forEach(part => {
+ if (part.attributes['pageId'].value.indexOf(pageId) !== -1 && found === 0) {
+ found = 1;
+ if (part.classList.contains("hidden")) {
+ part.classList.remove("hidden");
+ part.setAttribute('data-active', "");
+ }
+ revealParents(part)
+ }
+ });
+ pageId = pageId.substring(0, pageId.lastIndexOf("/"))
+ } while (pageId.indexOf("/") !== -1 && found === 0)
+};
+revealParents = (part) => {
+ if (part.classList.contains("sideMenuPart")) {
+ if (part.classList.contains("hidden"))
+ part.classList.remove("hidden");
+ revealParents(part.parentNode)
+ }
+};
+
+scrollNavigationToSelectedElement = () => {
+ let selectedElement = document.querySelector('div.sideMenuPart[data-active]')
+ if (selectedElement == null) { // nothing selected, probably just the main page opened
+ return
+ }
+
+ let hasIcon = selectedElement.querySelectorAll(":scope > div.overview span.nav-icon").length > 0
+
+ // for instance enums also have children and are expandable, but are not package/module elements
+ let isPackageElement = selectedElement.children.length > 1 && !hasIcon
+ if (isPackageElement) {
+ // if package is selected or linked, it makes sense to align it to top
+ // so that you can see all the members it contains
+ selectedElement.scrollIntoView(true)
+ } else {
+ // if a member within a package is linked, it makes sense to center it since it,
+ // this should make it easier to look at surrounding members
+ selectedElement.scrollIntoView({
+ behavior: 'auto',
+ block: 'center',
+ inline: 'center'
+ })
+ }
+}
+
+/*
+ This is a work-around for safari being IE of our times.
+ It doesn't fire a DOMContentLoaded, presumabely because eventListener is added after it wants to do it
+*/
+if (document.readyState == 'loading') {
+ window.addEventListener('DOMContentLoaded', () => {
+ displayNavigationFromPage()
+ })
+} else {
+ displayNavigationFromPage()
+}
diff --git a/dokka-subprojects/plugin-base/src/main/resources/dokka/scripts/platform-content-handler.js b/dokka-subprojects/plugin-base/src/main/resources/dokka/scripts/platform-content-handler.js
new file mode 100644
index 00000000..811c4788
--- /dev/null
+++ b/dokka-subprojects/plugin-base/src/main/resources/dokka/scripts/platform-content-handler.js
@@ -0,0 +1,400 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+filteringContext = {
+ dependencies: {},
+ restrictedDependencies: [],
+ activeFilters: []
+}
+let highlightedAnchor;
+let topNavbarOffset;
+let instances = [];
+let sourcesetNotification;
+
+const samplesDarkThemeName = 'darcula'
+const samplesLightThemeName = 'idea'
+
+window.addEventListener('load', () => {
+ document.querySelectorAll("div[data-platform-hinted]")
+ .forEach(elem => elem.addEventListener('click', (event) => togglePlatformDependent(event, elem)))
+ const filterSection = document.getElementById('filter-section')
+ if (filterSection) {
+ filterSection.addEventListener('click', (event) => filterButtonHandler(event))
+ initializeFiltering()
+ }
+ initTabs()
+ handleAnchor()
+ initHidingLeftNavigation()
+ topNavbarOffset = document.getElementById('navigation-wrapper')
+ darkModeSwitch()
+})
+
+const darkModeSwitch = () => {
+ const localStorageKey = "dokka-dark-mode"
+ const storage = localStorage.getItem(localStorageKey)
+ const osDarkSchemePreferred = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
+ const darkModeEnabled = storage ? JSON.parse(storage) : osDarkSchemePreferred
+ const element = document.getElementById("theme-toggle-button")
+ initPlayground(darkModeEnabled ? samplesDarkThemeName : samplesLightThemeName)
+
+ element.addEventListener('click', () => {
+ const enabledClasses = document.getElementsByTagName("html")[0].classList
+ enabledClasses.toggle("theme-dark")
+
+ //if previously we had saved dark theme then we set it to light as this is what we save in local storage
+ const darkModeEnabled = enabledClasses.contains("theme-dark")
+ if (darkModeEnabled) {
+ initPlayground(samplesDarkThemeName)
+ } else {
+ initPlayground(samplesLightThemeName)
+ }
+ localStorage.setItem(localStorageKey, JSON.stringify(darkModeEnabled))
+ })
+}
+
+const initPlayground = (theme) => {
+ if (!samplesAreEnabled()) return
+ instances.forEach(instance => instance.destroy())
+ instances = []
+
+ // Manually tag code fragments as not processed by playground since we also manually destroy all of its instances
+ document.querySelectorAll('code.runnablesample').forEach(node => {
+ node.removeAttribute("data-kotlin-playground-initialized");
+ })
+
+ KotlinPlayground('code.runnablesample', {
+ getInstance: playgroundInstance => {
+ instances.push(playgroundInstance)
+ },
+ theme: theme
+ });
+}
+
+// We check if type is accessible from the current scope to determine if samples script is present
+// As an alternative we could extract this samples-specific script to new js file but then we would handle dark mode in 2 separate files which is not ideal
+const samplesAreEnabled = () => {
+ try {
+ KotlinPlayground
+ return true
+ } catch (e) {
+ return false
+ }
+}
+
+
+const initHidingLeftNavigation = () => {
+ document.getElementById("menu-toggle").onclick = function (event) {
+ //Events need to be prevented from bubbling since they will trigger next handler
+ event.preventDefault();
+ event.stopPropagation();
+ event.stopImmediatePropagation();
+ document.getElementById("leftColumn").classList.toggle("open");
+ }
+
+ document.getElementById("main").onclick = () => {
+ document.getElementById("leftColumn").classList.remove("open");
+ }
+}
+
+// Hash change is needed in order to allow for linking inside the same page with anchors
+// If this is not present user is forced to refresh the site in order to use an anchor
+window.onhashchange = handleAnchor
+
+function scrollToElementInContent(element) {
+ const scrollToElement = () => document.getElementById('main').scrollTo({
+ top: element.offsetTop - topNavbarOffset.offsetHeight,
+ behavior: "smooth"
+ })
+
+ const waitAndScroll = () => {
+ setTimeout(() => {
+ if (topNavbarOffset) {
+ scrollToElement()
+ } else {
+ waitForScroll()
+ }
+ }, 50)
+ }
+
+ if (topNavbarOffset) {
+ scrollToElement()
+ } else {
+ waitAndScroll()
+ }
+}
+
+
+function handleAnchor() {
+ if (highlightedAnchor) {
+ highlightedAnchor.classList.remove('anchor-highlight')
+ highlightedAnchor = null;
+ }
+
+ let searchForContentTarget = function (element) {
+ if (element && element.hasAttribute) {
+ if (element.hasAttribute("data-togglable")) return element.getAttribute("data-togglable");
+ else return searchForContentTarget(element.parentNode)
+ } else return null
+ }
+
+ let findAnyTab = function (target) {
+ let result = null
+ document.querySelectorAll('div[tabs-section] > button[data-togglable]')
+ .forEach(node => {
+ if(node.getAttribute("data-togglable").split(",").includes(target)) {
+ result = node
+ }
+ })
+ return result
+ }
+
+ let anchor = window.location.hash
+ if (anchor != "") {
+ anchor = anchor.substring(1)
+ let element = document.querySelector('a[data-name="' + anchor + '"]')
+
+ if (element) {
+ const content = element.nextElementSibling
+ const contentStyle = window.getComputedStyle(content)
+ if(contentStyle.display == 'none') {
+ let tab = findAnyTab(searchForContentTarget(content))
+ if (tab) {
+ toggleSections(tab)
+ }
+ }
+
+ if (content) {
+ content.classList.add('anchor-highlight')
+ highlightedAnchor = content
+ }
+
+ scrollToElementInContent(element)
+ }
+ }
+}
+
+function initTabs() {
+ // we could have only a single type of data - classlike or package
+ const mainContent = document.querySelector('.main-content');
+ const type = mainContent ? mainContent.getAttribute("data-page-type") : null;
+ const localStorageKey = "active-tab-" + type;
+ document.querySelectorAll('div[tabs-section]').forEach(element => {
+ showCorrespondingTabBody(element);
+ element.addEventListener('click', ({target}) => {
+ const togglable = target ? target.getAttribute("data-togglable") : null;
+ if (!togglable) return;
+
+ localStorage.setItem(localStorageKey, JSON.stringify(togglable));
+ toggleSections(target);
+ });
+ });
+
+ const cached = localStorage.getItem(localStorageKey);
+ if (!cached) return;
+
+ const tab = document.querySelector(
+ 'div[tabs-section] > button[data-togglable="' + JSON.parse(cached) + '"]'
+ );
+ if (!tab) return;
+
+ toggleSections(tab);
+}
+
+function showCorrespondingTabBody(element) {
+ const buttonWithKey = element.querySelector("button[data-active]")
+ if (buttonWithKey) {
+ toggleSections(buttonWithKey)
+ }
+}
+
+function filterButtonHandler(event) {
+ if (event.target.tagName == "BUTTON" && event.target.hasAttribute("data-filter")) {
+ let sourceset = event.target.getAttribute("data-filter")
+ if (filteringContext.activeFilters.indexOf(sourceset) != -1) {
+ filterSourceset(sourceset)
+ } else {
+ unfilterSourceset(sourceset)
+ }
+ }
+}
+
+function initializeFiltering() {
+ filteringContext.dependencies = JSON.parse(sourceset_dependencies)
+ document.querySelectorAll("#filter-section > button")
+ .forEach(p => filteringContext.restrictedDependencies.push(p.getAttribute("data-filter")))
+ Object.keys(filteringContext.dependencies).forEach(p => {
+ filteringContext.dependencies[p] = filteringContext.dependencies[p]
+ .filter(q => -1 !== filteringContext.restrictedDependencies.indexOf(q))
+ })
+ let cached = window.localStorage.getItem('inactive-filters')
+ if (cached) {
+ let parsed = JSON.parse(cached)
+ filteringContext.activeFilters = filteringContext.restrictedDependencies
+ .filter(q => parsed.indexOf(q) == -1)
+ } else {
+ filteringContext.activeFilters = filteringContext.restrictedDependencies
+ }
+ refreshFiltering()
+}
+
+function filterSourceset(sourceset) {
+ filteringContext.activeFilters = filteringContext.activeFilters.filter(p => p != sourceset)
+ refreshFiltering()
+ addSourcesetFilterToCache(sourceset)
+}
+
+function unfilterSourceset(sourceset) {
+ if (filteringContext.activeFilters.length == 0) {
+ filteringContext.activeFilters = filteringContext.dependencies[sourceset].concat([sourceset])
+ refreshFiltering()
+ filteringContext.dependencies[sourceset].concat([sourceset]).forEach(p => removeSourcesetFilterFromCache(p))
+ } else {
+ filteringContext.activeFilters.push(sourceset)
+ refreshFiltering()
+ removeSourcesetFilterFromCache(sourceset)
+ }
+
+}
+
+function addSourcesetFilterToCache(sourceset) {
+ let cached = localStorage.getItem('inactive-filters')
+ if (cached) {
+ let parsed = JSON.parse(cached)
+ localStorage.setItem('inactive-filters', JSON.stringify(parsed.concat([sourceset])))
+ } else {
+ localStorage.setItem('inactive-filters', JSON.stringify([sourceset]))
+ }
+}
+
+function removeSourcesetFilterFromCache(sourceset) {
+ let cached = localStorage.getItem('inactive-filters')
+ if (cached) {
+ let parsed = JSON.parse(cached)
+ localStorage.setItem('inactive-filters', JSON.stringify(parsed.filter(p => p != sourceset)))
+ }
+}
+
+function toggleSections(target) {
+ const activateTabs = (containerClass) => {
+ for (const element of document.getElementsByClassName(containerClass)) {
+ for (const child of element.children) {
+ if (child.getAttribute("data-togglable") === target.getAttribute("data-togglable")) {
+ child.setAttribute("data-active", "")
+ } else {
+ child.removeAttribute("data-active")
+ }
+ }
+ }
+ }
+ const toggleTargets = target.getAttribute("data-togglable").split(",")
+ const activateTabsBody = (containerClass) => {
+ document.querySelectorAll("." + containerClass + " *[data-togglable]")
+ .forEach(child => {
+ if (toggleTargets.includes(child.getAttribute("data-togglable"))) {
+ child.setAttribute("data-active", "")
+ } else if(!child.classList.contains("sourceset-dependent-content")) { // data-togglable is used to switch source set as well, ignore it
+ child.removeAttribute("data-active")
+ }
+ })
+ }
+ activateTabs("tabs-section")
+ activateTabsBody("tabs-section-body")
+}
+
+function togglePlatformDependent(e, container) {
+ let target = e.target
+ if (target.tagName != 'BUTTON') return;
+ let index = target.getAttribute('data-toggle')
+
+ for (let child of container.children) {
+ if (child.hasAttribute('data-toggle-list')) {
+ for (let bm of child.children) {
+ if (bm == target) {
+ bm.setAttribute('data-active', "")
+ } else if (bm != target) {
+ bm.removeAttribute('data-active')
+ }
+ }
+ } else if (child.getAttribute('data-togglable') == index) {
+ child.setAttribute('data-active', "")
+ } else {
+ child.removeAttribute('data-active')
+ }
+ }
+}
+
+function refreshFiltering() {
+ let sourcesetList = filteringContext.activeFilters
+ document.querySelectorAll("[data-filterable-set]")
+ .forEach(
+ elem => {
+ let platformList = elem.getAttribute("data-filterable-set").split(',').filter(v => -1 !== sourcesetList.indexOf(v))
+ elem.setAttribute("data-filterable-current", platformList.join(','))
+ }
+ )
+ refreshFilterButtons()
+ refreshPlatformTabs()
+ refreshNoContentNotification()
+ refreshPlaygroundSamples()
+}
+
+function refreshPlaygroundSamples() {
+ document.querySelectorAll('code.runnablesample').forEach(node => {
+ const playground = node.KotlinPlayground;
+ /* Some samples may be hidden by filter, they have 0px height for visible code area
+ * after rendering. Call this method for re-calculate code area height */
+ playground && playground.view.codemirror.refresh();
+ });
+}
+
+function refreshNoContentNotification() {
+ const element = document.getElementsByClassName("main-content")[0]
+ if(filteringContext.activeFilters.length === 0){
+ element.style.display = "none";
+
+ const appended = document.createElement("div")
+ appended.className = "filtered-message"
+ appended.innerText = "All documentation is filtered, please adjust your source set filters in top-right corner of the screen"
+ sourcesetNotification = appended
+ element.parentNode.prepend(appended)
+ } else {
+ if(sourcesetNotification) sourcesetNotification.remove()
+ element.style.display = "block"
+ }
+}
+
+function refreshPlatformTabs() {
+ document.querySelectorAll(".platform-hinted > .platform-bookmarks-row").forEach(
+ p => {
+ let active = false;
+ let firstAvailable = null
+ p.childNodes.forEach(
+ element => {
+ if (element.getAttribute("data-filterable-current") != '') {
+ if (firstAvailable == null) {
+ firstAvailable = element
+ }
+ if (element.hasAttribute("data-active")) {
+ active = true;
+ }
+ }
+ }
+ )
+ if (active == false && firstAvailable) {
+ firstAvailable.click()
+ }
+ }
+ )
+}
+
+function refreshFilterButtons() {
+ document.querySelectorAll("#filter-section > button")
+ .forEach(f => {
+ if (filteringContext.activeFilters.indexOf(f.getAttribute("data-filter")) != -1) {
+ f.setAttribute("data-active", "")
+ } else {
+ f.removeAttribute("data-active")
+ }
+ })
+}
diff --git a/dokka-subprojects/plugin-base/src/main/resources/dokka/scripts/prism.js b/dokka-subprojects/plugin-base/src/main/resources/dokka/scripts/prism.js
new file mode 100644
index 00000000..07423626
--- /dev/null
+++ b/dokka-subprojects/plugin-base/src/main/resources/dokka/scripts/prism.js
@@ -0,0 +1,22 @@
+/* PrismJS 1.29.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+java+javadoc+javadoclike+kotlin&plugins=keep-markup */
+var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(n,t){var r,i;switch(t=t||{},a.util.type(n)){case"Object":if(i=a.util.objId(n),t[i])return t[i];for(var l in r={},t[i]=r,n)n.hasOwnProperty(l)&&(r[l]=e(n[l],t));return r;case"Array":return i=a.util.objId(n),t[i]?t[i]:(r=[],t[i]=r,n.forEach((function(n,a){r[a]=e(n,t)})),r);default:return n}},getLanguage:function(e){for(;e;){var t=n.exec(e.className);if(t)return t[1].toLowerCase();e=e.parentElement}return"none"},setLanguage:function(e,t){e.className=e.className.replace(RegExp(n,"gi"),""),e.classList.add("language-"+t)},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(r){var e=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(r.stack)||[])[1];if(e){var n=document.getElementsByTagName("script");for(var t in n)if(n[t].src==e)return n[t]}return null}},isActive:function(e,n,t){for(var r="no-"+n;e;){var a=e.classList;if(a.contains(n))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!t}},languages:{plain:r,plaintext:r,text:r,txt:r,extend:function(e,n){var t=a.util.clone(a.languages[e]);for(var r in n)t[r]=n[r];return t},insertBefore:function(e,n,t,r){var i=(r=r||a.languages)[e],l={};for(var o in i)if(i.hasOwnProperty(o)){if(o==n)for(var s in t)t.hasOwnProperty(s)&&(l[s]=t[s]);t.hasOwnProperty(o)||(l[o]=i[o])}var u=r[e];return r[e]=l,a.languages.DFS(a.languages,(function(n,t){t===u&&n!=e&&(this[n]=l)})),l},DFS:function e(n,t,r,i){i=i||{};var l=a.util.objId;for(var o in n)if(n.hasOwnProperty(o)){t.call(n,o,n[o],r||o);var s=n[o],u=a.util.type(s);"Object"!==u||i[l(s)]?"Array"!==u||i[l(s)]||(i[l(s)]=!0,e(s,t,o,i)):(i[l(s)]=!0,e(s,t,null,i))}}},plugins:{},highlightAll:function(e,n){a.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var r={callback:t,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};a.hooks.run("before-highlightall",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),a.hooks.run("before-all-elements-highlight",r);for(var i,l=0;i=r.elements[l++];)a.highlightElement(i,!0===n,r.callback)},highlightElement:function(n,t,r){var i=a.util.getLanguage(n),l=a.languages[i];a.util.setLanguage(n,i);var o=n.parentElement;o&&"pre"===o.nodeName.toLowerCase()&&a.util.setLanguage(o,i);var s={element:n,language:i,grammar:l,code:n.textContent};function u(e){s.highlightedCode=e,a.hooks.run("before-insert",s),s.element.innerHTML=s.highlightedCode,a.hooks.run("after-highlight",s),a.hooks.run("complete",s),r&&r.call(s.element)}if(a.hooks.run("before-sanity-check",s),(o=s.element.parentElement)&&"pre"===o.nodeName.toLowerCase()&&!o.hasAttribute("tabindex")&&o.setAttribute("tabindex","0"),!s.code)return a.hooks.run("complete",s),void(r&&r.call(s.element));if(a.hooks.run("before-highlight",s),s.grammar)if(t&&e.Worker){var c=new Worker(a.filename);c.onmessage=function(e){u(e.data)},c.postMessage(JSON.stringify({language:s.language,code:s.code,immediateClose:!0}))}else u(a.highlight(s.code,s.grammar,s.language));else u(a.util.encode(s.code))},highlight:function(e,n,t){var r={code:e,grammar:n,language:t};if(a.hooks.run("before-tokenize",r),!r.grammar)throw new Error('The language "'+r.language+'" has no grammar.');return r.tokens=a.tokenize(r.code,r.grammar),a.hooks.run("after-tokenize",r),i.stringify(a.util.encode(r.tokens),r.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var r in t)n[r]=t[r];delete n.rest}var a=new s;return u(a,a.head,e),o(e,a,n,a.head,0),function(e){for(var n=[],t=e.head.next;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=a.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=a.hooks.all[e];if(t&&t.length)for(var r,i=0;r=t[i++];)r(n)}},Token:i};function i(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function l(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function o(e,n,t,r,s,g){for(var f in t)if(t.hasOwnProperty(f)&&t[f]){var h=t[f];h=Array.isArray(h)?h:[h];for(var d=0;d<h.length;++d){if(g&&g.cause==f+","+d)return;var v=h[d],p=v.inside,m=!!v.lookbehind,y=!!v.greedy,k=v.alias;if(y&&!v.pattern.global){var x=v.pattern.toString().match(/[imsuy]*$/)[0];v.pattern=RegExp(v.pattern.source,x+"g")}for(var b=v.pattern||v,w=r.next,A=s;w!==n.tail&&!(g&&A>=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(j<O||"string"==typeof C.value);C=C.next)L++,j+=C.value.length;L--,E=e.slice(A,j),P.index-=A}else if(!(P=l(b,0,E,m)))continue;S=P.index;var N=P[0],_=E.slice(0,S),M=E.slice(S+N.length),W=A+E.length;g&&W>g.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a<t&&r!==e.tail;a++)r=r.next;n.next=r,r.prev=n,e.length-=a}if(e.Prism=a,i.stringify=function e(n,t){if("string"==typeof n)return n;if(Array.isArray(n)){var r="";return n.forEach((function(n){r+=e(n,t)})),r}var i={type:n.type,content:e(n.content,t),tag:"span",classes:["token",n.type],attributes:{},language:t},l=n.alias;l&&(Array.isArray(l)?Array.prototype.push.apply(i.classes,l):i.classes.push(l)),a.hooks.run("wrap",i);var o="";for(var s in i.attributes)o+=" "+s+'="'+(i.attributes[s]||"").replace(/"/g,"&quot;")+'"';return"<"+i.tag+' class="'+i.classes.join(" ")+'"'+o+">"+i.content+"</"+i.tag+">"},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
+Prism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&amp;/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var t={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[^])*?(?=</__>)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
+!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:[^;{\\s\"']|\\s+(?!\\s)|"+e.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism);
+Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
+Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;
+!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]