diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml
index cc8fce8..f29575e 100644
--- a/.github/workflows/gh-pages.yml
+++ b/.github/workflows/gh-pages.yml
@@ -7,38 +7,37 @@ on:
jobs:
deploy:
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-22.04
+ defaults:
+ run:
+ working-directory: ./docs
steps:
- uses: actions/checkout@v2
with:
- submodules: recursive # Fetch the Docsy theme
- fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
+ submodules: true
+ fetch-depth: 0
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
- hugo-version: '0.79.1'
+ hugo-version: '0.162.1'
extended: true
- - name: Setup Node
- uses: actions/setup-node@v1
+ - uses: actions/setup-node@v4
with:
- node-version: '12.x'
+ node-version: '24'
+ cache: 'npm'
+ cache-dependency-path: '**/package-lock.json'
- - name: Cache dependencies
- uses: actions/cache@v1
- with:
- path: ~/.npm
- key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
- restore-keys: |
- ${{ runner.os }}-node-
-
- - run: npm ci
- - run: hugo --minify
+ - run: npm install
+ - run: hugo
+ env:
+ HUGO_ENV: production
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_branch: gh-pages
- cname: jvmperf.net
\ No newline at end of file
+ publish_dir: docs/public
+ cname: jvmperf.net
diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
new file mode 100644
index 0000000..ab4e47a
--- /dev/null
+++ b/.github/workflows/maven.yml
@@ -0,0 +1,24 @@
+# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
+# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
+
+name: Java CI with Maven
+
+on:
+ push:
+ branches: [ main ]
+ pull_request:
+ branches: [ main ]
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-java@v4
+ with:
+ distribution: 'adopt'
+ java-version: '21'
+ - name: Build with Maven
+ run: mvn -B verify --file pom.xml
diff --git a/.gitignore b/.gitignore
index 19eeaa9..9b2ff43 100644
--- a/.gitignore
+++ b/.gitignore
@@ -38,4 +38,5 @@ dumps/
# docs
docs/resources/
docs/public/
-docs/node_modules/
\ No newline at end of file
+docs/node_modules/
+docs/.hugo_build.lock
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 7d0d0d4..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "docs/themes/docsy"]
- path = docs/themes/docsy
- url = https://github.com/google/docsy.git
diff --git a/.tool-versions b/.tool-versions
new file mode 100644
index 0000000..7e23f8c
--- /dev/null
+++ b/.tool-versions
@@ -0,0 +1,2 @@
+java oracle-21
+maven 3.9.12
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..e0f15db
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "java.configuration.updateBuildConfiguration": "automatic"
+}
\ No newline at end of file
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
new file mode 100644
index 0000000..f35d701
--- /dev/null
+++ b/CONTRIBUTORS.md
@@ -0,0 +1,18 @@
+# Contributors
+
+Information for contributors
+
+## Site
+
+The site is built using [Hugo](https://gohugo.io/) and the [docsy](https://themes.gohugo.io/docsy/) theme.
+
+### Edit Site Locally
+
+To edit and preview the site locally, follow these steps:
+
+1. ensure you have `hugo` installed
+2. initialize the submodules
+```bash
+git submodule update --init --recursive --depth 1
+```
+3. Run `hugo server` in the `docs/` folder
\ No newline at end of file
diff --git a/README.md b/README.md
index ca31724..e60d408 100644
--- a/README.md
+++ b/README.md
@@ -1,131 +1,7 @@
## Java Performance Workshop
-A tutorial workshop that will dive in understanding "what's going on in your JVM".
-This workshop has the following components:
-
-* [Part 1](part_1/README.md): Basics with OS, processes, and thread
-* [Part 2](part_2/README.md): Java Mission Control and Flight Recorder
-* [Part 3](part_3/README.md): Advanced Flight Recorder
-* [Part 4](part_4/README.md): Java Heap Analysis
-* [Part 5](part_5/README.md): Garbage Collections
-
-This workshop is utilizing a basic web service that is included, which isn't exactly optimal
-in how it performs. The goal is to use this service as an interactive example and identify
-its poor performing elements. To learn more about this web service that is included, see
-the following notes.
-
-### Service
-
-The web service is a [simple dropwizard server](http://www.dropwizard.io/), which has a single API to search for talks
-from [kcdc.info](http://www.kcdc.info/), and returns results about these talks.
-
-
-#### Running
-
-**Prerequisites:**
-* [Maven 3.x](https://maven.apache.org/index.html)
-* [Java 8](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)
-
-Assemble the service:
-
-```bash
-mvn clean package
-```
-
-:bulb: If you have issues with building it locally due to your setup, you can download the
-server assembly [here](https://github.com/cchesser/java-perf-workshop/wiki/java-perf-workshop-server-1.0-SNAPSHOT.jar).
-
-Start the workshop service:
-
-```bash
-java -jar java-perf-workshop-server/target/java-perf-workshop-server-1.1.0-SNAPSHOT.jar server server.yml
-```
-
-#### Mocking Service Dependency
-
-To simulate responses of kcdc.info (as the service may change over time), we will first run a mock
-instance of this service using [WireMock](http://wiremock.org/). Go ahead and start another terminal
-session where we will run another service to mock a remote dependency of the workshop service. Navigate
-to the same directory where you cloned this repository, then execute the following commands:
-
-```bash
-mvn dependency:copy -Dartifact=com.github.tomakehurst:wiremock-standalone:2.24.1 -Dmdep.stripVersion=true -DoutputDirectory=.
-```
-
-Run the mock service, which will provide the essential end-points to support the service we will be
-testing:
-
-```bash
-java -jar wiremock-standalone.jar --port 9090 --root-dir java-perf-workshop-server/src/test/resources
-```
-
-Alternatively, you can run the `mockservice.sh` script which will do both commands, ie: `sh mockservice.sh`
-
-#### Configuration
-
-Example configuration of service:
-
-```
-server:
- applicationConnectors:
- - type: http
- port: 80
- adminConnectors:
- - type: http
- port: 8071
- requestLog:
- timeZone: UTC
- appenders:
- - type: file
- currentLogFilename: /var/log/java-perf-workshop-server-access.log
- threshold: ALL
- archive: true
- archivedLogFilenamePattern: /var/log/java-perf-workshop-server-access.%d.log.gz
- archivedFileCount: 5
-logging:
- level: INFO
- appenders:
- - type: file
- currentLogFilename: /var/log/java-perf-workshop-server.log
- threshold: ALL
- archive: true
- archivedLogFilenamePattern: /var/log/java-perf-workshop-server-%d.log
- archivedFileCount: 5
- timeZone: UTC
-```
-
-#### Testing
-
-The service will return back results from the KCDC website on sessions that are available which contain
-a substring in their title, abstract, or tags. Example:
-
-[http://localhost:8080/search?q=clojure](http://localhost:8080/search?q=clojure)
-
-Example results:
-
-```json
-{
- "results" : [ {
- "title" : "Concurrency Options on the JVM",
- "presenter" : "Jessica Kerr"
- }, {
- "title" : "Fast, Parallel, or Reliable: Pick 3, a tour of Elixir",
- "presenter" : "Jordan Day"
- } ]
-}
-```
-
-#### Troubleshooting
-
-If you get a `500` error message when trying to test the service, verify that the wiremock server is running.
-```
-{
- "code" : 500,
- "message" : "There was an error processing your request. It has been logged (ID d8998189f8d4ee8c)."
-}
-```
-
-
-
-### Reference
-* [KCDC 2015 workshop slides](https://github.com/cchesser/java-perf-workshop/wiki/slides/kcdc2015_whats_in_you_jvm.zip)
+A tutorial workshop that will dive in understanding "what's going on in your
+JVM". This workshop is utilizing a basic web service that is included, which
+isn't exactly optimal in how it performs. The goal is to use this service as an
+interactive example and identify its poor performing elements. To learn more
+about this web service that is included, see [the site](https://jvmperf.net/).
diff --git a/TODO.md b/TODO.md
new file mode 100644
index 0000000..2b5c815
--- /dev/null
+++ b/TODO.md
@@ -0,0 +1,44 @@
+# TODOs
+
+## Update the use of Gatling
+
+The current references to using gatling are pretty old. Need to update it so we can utilizes later versions.
+
+### Using gatling
+
+Alternatively, you can use [gatling](https://gatling.io/) (a performance library with a scala dsl ).
+
+This should launch the `WorkshopSimulation`.
+
+```bash
+ mvn -f java-perf-workshop-tester/ gatling:test
+```
+
+Sample output while running:
+```bash
+[~/java-perf-workshop/java-perf-workshop-tester]$ mvn gatling:test
+[INFO] Scanning for projects...
+[INFO]
+[INFO] ------------------------------------------------------------------------
+[INFO] Building java-perf-workshop-tester 1.1.0-SNAPSHOT
+[INFO] ------------------------------------------------------------------------
+[INFO]
+[INFO] --- gatling-maven-plugin:2.2.4:test (default-cli) @ java-perf-workshop-tester ---
+19:12:16,662 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
+19:12:16,663 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
+19:12:16,663 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/J:/Workspaces/java-perf-workshop/java-perf-workshop-tester/target/test-classes/logback.xml]
+19:12:16,663 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs multiple times on the classpath.
+19:12:16,663 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs at [file:/J:/Workspaces/java-perf-workshop/java-perf-workshop-tester/target/test-classes/logback.xml]
+19:12:16,663 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs at [jar:file:/C:/Users/JMonterrubio/.m2/repository/io/gatling/gatling-maven-plugin/2.2.4/gatling-maven-plugin-2.2.4.jar!/logback.xml]
+19:12:16,727 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
+19:12:16,731 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
+19:12:16,737 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [CONSOLE]
+19:12:16,742 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
+19:12:16,781 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to WARN
+19:12:16,782 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CONSOLE] to Logger[ROOT]
+19:12:16,782 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
+19:12:16,783 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@7a0ac6e3 - Registering current configuration as safe fallback point
+
+Simulation cchesser.javaperf.workshop.WorkshopSimulation started...
+```
+
diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 0000000..46a74ea
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,22 @@
+version: "3.9" # optional since v1.27.0
+services:
+ wiremock:
+ image: workshop-wiremock:latest
+ server:
+ image: workshop-server:latest
+ environment:
+ JAVA_OPTS: "
+ -Dcom.sun.management.jmxremote.port=8082
+ -Dcom.sun.management.jmxremote.rmi.port=8082
+ -Dcom.sun.management.jmxremote.registry.ssl=false
+ -Dcom.sun.management.jmxremote.authenticate=false
+ -Dcom.sun.management.jmxremote.ssl=false
+ -Dcom.sun.management.jmxremote.local.only=false
+ -Djava.rmi.server.hostname=127.0.0.1
+ "
+ ports:
+ - "8080:8080"
+ - "8081:8081"
+ - "8082:8082"
+ links:
+ - wiremock
diff --git a/docs/.tool-versions b/docs/.tool-versions
new file mode 100644
index 0000000..f73dda5
--- /dev/null
+++ b/docs/.tool-versions
@@ -0,0 +1,3 @@
+hugo extended_0.162.1
+golang 1.24.12
+nodejs 23.11.0
diff --git a/docs/assets/icons/logo.svg b/docs/assets/icons/logo.svg
new file mode 100644
index 0000000..87126d6
--- /dev/null
+++ b/docs/assets/icons/logo.svg
@@ -0,0 +1,18 @@
+
+
+
diff --git a/docs/assets/scss/_styles_project.scss b/docs/assets/scss/_styles_project.scss
new file mode 100644
index 0000000..87c22e6
--- /dev/null
+++ b/docs/assets/scss/_styles_project.scss
@@ -0,0 +1,14 @@
+.td-navbar {
+ .navbar-brand__logo svg {
+ transition: filter 0.15s ease-in-out;
+ }
+}
+
+[data-bs-theme='light'] .td-navbar .navbar-brand__logo svg {
+ filter: invert(1);
+}
+
+[data-bs-theme='dark'] .td-navbar .navbar-brand__logo svg,
+.td-navbar[data-bs-theme='dark'] .navbar-brand__logo svg {
+ filter: none;
+}
diff --git a/docs/assets/scss/_variables_project.scss b/docs/assets/scss/_variables_project.scss
index c99b97b..3927a91 100644
--- a/docs/assets/scss/_variables_project.scss
+++ b/docs/assets/scss/_variables_project.scss
@@ -1,36 +1,8 @@
-$primary: #27496d !default;
-$primary-light: lighten($primary, 75%) !default;
-$secondary: #142850 !default;
-$success: #00a8cc !default;
-$info: #00a8cc !default;
-$warning: #ff5722 !default;
-$danger: #ff5722 !default;
-$white: #fff !default;
-$light: #eeeeee !default;
+/*
-$dark: #403F4C !default;
-$blue: #0c7b93 !default;
-$orange: #BA5A31 !default;
-$gray-100: #f8f9fa !default;
-$gray-200: #eee !default;
-$gray-300: #dee2e6 !default;
-$gray-400: #ccc !default;
-$gray-500: #adb5bd !default;
-$gray-600: #888 !default;
-$gray-700: #495057 !default;
-$gray-800: #333 !default;
-$gray-900: #222 !default;
-$black: #000 !default;
+Add styles or override variables from the theme here.
-$code-color: darken($secondary, 20%) !default;
-
-// UI element colors
-
-$border-color: $gray-300 !default;
-$td-sidebar-bg-color: rgba($primary, 0.03) !default;
-$td-sidebar-border-color: $border-color !default;
-
-// Background colors for the sections on home page etc. It is a paint by number system, starting at 0, where the number is taken from the shortcode's ordinal
-// if not provided by the user.
-// These colors are all part of the theme palette, but the mix is fairly random to create variation. This can be overridden by the project if needed.
-$td-box-colors: $dark, $primary, $secondary, $info, $primary-light, $gray-600, $success, $warning, $dark, $danger, $primary, $secondary, $primary-light, $info !default;
+*/
+$primary: #01324f;
+$secondary: #005f93;
+;
diff --git a/docs/config.toml b/docs/config.toml
deleted file mode 100644
index f630db9..0000000
--- a/docs/config.toml
+++ /dev/null
@@ -1,118 +0,0 @@
-baseURL = "https://jvmperf.net"
-title = "Java Performance Workshop"
-
-enableRobotsTXT = true
-
-# Hugo allows theme composition (and inheritance). The precedence is from left to right.
-theme = ["docsy"]
-
-# Will give values to .Lastmod etc.
-enableGitInfo = true
-
-# Language settings
-contentDir = "content/"
-
-disableKinds = ["taxonomy", "taxonomyTerm"]
-
-# Highlighting config
-pygmentsCodeFences = true
-pygmentsUseClasses = false
-# Use the new Chroma Go highlighter in Hugo.
-pygmentsUseClassic = false
-#pygmentsOptions = "linenos=table"
-# See https://help.farbox.com/pygments.html
-pygmentsStyle = "tango"
-
-## Configuration for BlackFriday markdown parser: https://github.com/russross/blackfriday
-[blackfriday]
-plainIDAnchors = true
-hrefTargetBlank = true
-angledQuotes = false
-latexDashes = true
-
-# Image processing configuration.
-[imaging]
-resampleFilter = "CatmullRom"
-quality = 75
-anchor = "smart"
-
-[services]
-[services.googleAnalytics]
-# Comment out the next line to disable GA tracking. Also disables the feature described in [params.ui.feedback].
-#id = "UA-00000000-0"
-
-[markup]
- [markup.goldmark]
- [markup.goldmark.renderer]
- unsafe = true
- [markup.highlight]
- # See a complete list of available styles at https://xyproto.github.io/splash/docs/all.html
- style = "tango"
- # Uncomment if you want your chosen highlight style used for code blocks without a specified language
- # guessSyntax = "true"
-
-# Everything below this are Site Params
-
-# Comment out if you don't want the "print entire section" link enabled.
-[outputs]
-section = ["HTML", "print"]
-
-[params]
-copyright = "Carl Chesser"
-
-# Flag used in the "version-banner" partial to decide whether to display a
-# banner on every page indicating that this is an archived version of the docs.
-# Set this flag to "true" if you want to display the banner.
-archived_version = false
-
-# Repository configuration (URLs for in-page links to opening issues and suggesting changes)
-github_repo = "https://github.com/cchesser/java-perf-workshop"
-
-# Specify a value here if your content directory is not in your repo's root directory
-# github_subdir = ""
-
-# Enable Algolia DocSearch
-algolia_docsearch = false
-
-# Enable Lunr.js offline search
-offlineSearch = true
-
-# Enable syntax highlighting and copy buttons on code blocks with Prism
-prism_syntax_highlighting = true
-
-# User interface configuration
-[params.ui]
-# Enable to show the side bar menu in its compact state.
-sidebar_menu_compact = false
-# Set to true to disable breadcrumb navigation.
-breadcrumb_disable = false
-# Set to true to hide the sidebar search box (the top nav search box will still be displayed if search is enabled)
-sidebar_search_disable = false
-# Set to false if you don't want to display a logo (/assets/icons/logo.svg) in the top nav bar
-navbar_logo = false
-# Set to true to disable the About link in the site footer
-footer_about_disable = false
-
-# Adds a H2 section titled "Feedback" to the bottom of each doc. The responses are sent to Google Analytics as events.
-# This feature depends on [services.googleAnalytics] and will be disabled if "services.googleAnalytics.id" is not set.
-# If you want this feature, but occasionally need to remove the "Feedback" section from a single page,
-# add "hide_feedback: true" to the page's front matter.
-[params.ui.feedback]
-enable = true
-# The responses that the user sees after clicking "yes" (the page was helpful) or "no" (the page was not helpful).
-yes = 'Glad to hear it! Please tell us how we can improve.'
-no = 'Sorry to hear that. Please tell us how we can improve.'
-
-# Adds a reading time to the top of each doc.
-# If you want this feature, but occasionally need to remove the Reading time from a single page,
-# add "hide_readingtime: true" to the page's front matter
-[params.ui.readingtime]
-enable = false
-
-[params.links]
-# Developer relevant links. These will show up on right side of footer and in the community page if you have one.
-[[params.links.developer]]
- name = "GitHub"
- url = "https://github.com/cchesser/java-perf-workshop"
- icon = "fab fa-github"
- desc = "Development takes place here!"
diff --git a/docs/content/_index.html b/docs/content/_index.html
index 31a099f..7408a1c 100644
--- a/docs/content/_index.html
+++ b/docs/content/_index.html
@@ -1,9 +1,9 @@
---
-title: "Java Performance Workshop"
+title: "jvmperf"
linkTitle: "Java Performance Workshop"
---
-{{< blocks/cover title="Welcome to the Java Performance Workshop!" image_anchor="top" height="full" color="orange" >}}
+{{< blocks/cover title="Understand how your JVM works." image_anchor="top" height="full" >}}
Learn how your Java applications are performing with free available tooling for the JVM.
+
An open-source guide that steps through how to use open-source tooling to inspect and troubleshoot the performance of your Java applications.
{{< blocks/link-down color="info" >}}
{{< /blocks/cover >}}
@@ -20,17 +20,22 @@
This workshop focuses on taking an example Java web service, which performs suboptimally, and explores its behavior with open source tooling. This workshop is intended to empower developers with essential skills of measuring how the an application in the JVM performs. While this can become an advanced topic for tuning application, this workshop focuses on simple approaches with free available tooling.
{{% /blocks/lead %}}
-{{< blocks/section >}}
+{{< blocks/section type="row">}}
-{{% blocks/feature icon="fas fa-microchip" title="Basics with OS, processes, and thread" url="docs/intro" %}}
+{{% blocks/feature icon="fas fa-microchip" title="Basics with OS, processes, and threads" url="docs/intro" %}}
Start with basic knowledge of how to assess your Java application from the perspective of the operating system with processes, threads, and system calls.
{{% /blocks/feature %}}
-{{% blocks/feature icon="fas fa-search" title="Java Mission Control" url="docs/jmc" %}}
-Learn how to levarage Java Mission Control with Flight Recorder to get insight into your running application.
+{{% blocks/feature icon="fas fa-search" title="JDK Mission Control" url="docs/jmc" %}}
+Learn how to leverage JDK Mission Control with Flight Recorder to get insight into your running application.
{{% /blocks/feature %}}
-{{% blocks/feature icon="fas fa-memory" title="Memory Analysis" url="docs/jmc" %}}
+
+{{% blocks/feature icon="fas fa-memory" title="Memory Analysis" url="docs/memory" %}}
Learn how to explore the memory utilized in your Java application. This includes how to enable and explore the garbage collection logs.
{{% /blocks/feature %}}
+{{% blocks/feature icon="fab fa-docker" title="Containers" url="docs/containers" %}}
+Learn how to run our services in a container environment. This includes how to enable our tooling to monitor our services and what sort of new considerations are introduced from the container environment.
+{{% /blocks/feature %}}
+
{{< /blocks/section >}}
diff --git a/docs/content/contributors.md b/docs/content/contributors.md
new file mode 100644
index 0000000..adb182d
--- /dev/null
+++ b/docs/content/contributors.md
@@ -0,0 +1,21 @@
+---
+title: "Contributors"
+linkTitle: "Contributors"
+menu:
+ main:
+ weight: 30
+ pre: ""
+---
+
+
+
\ No newline at end of file
diff --git a/docs/content/docs/_index.md b/docs/content/docs/_index.md
index db363f7..d9e901c 100644
--- a/docs/content/docs/_index.md
+++ b/docs/content/docs/_index.md
@@ -1,8 +1,10 @@
---
-title: "Documentation"
-linkTitle: "Documentation"
+title: "Workshop"
+linkTitle: "Workshop"
weight: 10
+hide_readingtime: true
menu:
main:
weight: 10
+ pre: ""
---
diff --git a/docs/content/docs/containers/_index.md b/docs/content/docs/containers/_index.md
new file mode 100644
index 0000000..38ed6b6
--- /dev/null
+++ b/docs/content/docs/containers/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Containers"
+weight: 50
+description: Learn about monitoring/troubleshooting our services when they're ran in a container environment.
+simple_list: true
+hide_readingtime: true
+---
diff --git a/docs/content/docs/containers/_references.md b/docs/content/docs/containers/_references.md
new file mode 100644
index 0000000..1d34157
--- /dev/null
+++ b/docs/content/docs/containers/_references.md
@@ -0,0 +1,12 @@
+---
+title: "References"
+weight: 50
+description: >
+ Collection of useful references used to build this guide.
+---
+
+* [Docker Orientation and Setup](https://docs.docker.com/get-started/)
+* JMX
+ * [JMX with Docker](https://github.com/cstroe/java-jmx-in-docker-sample-app/blob/master/README.md#java-jmx-with-docker)
+ * [JMX over RMI](http://blog.bytecode.tech/my-notes/jmx-over-rmi/)
+ * [Monitoring Reference](https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html)
\ No newline at end of file
diff --git a/docs/content/docs/containers/docker_monitoring.md b/docs/content/docs/containers/docker_monitoring.md
new file mode 100644
index 0000000..c767386
--- /dev/null
+++ b/docs/content/docs/containers/docker_monitoring.md
@@ -0,0 +1,10 @@
+---
+title: "Docker Tooling"
+weight: 3
+description: >
+ Learn about Docker tooling to inspect our running containers
+---
+
+{{% nextSection %}}
+In the next section, X
+{{% /nextSection %}}
\ No newline at end of file
diff --git a/docs/content/docs/containers/hello-world/Dockerfile b/docs/content/docs/containers/hello-world/Dockerfile
new file mode 100644
index 0000000..e048b4c
--- /dev/null
+++ b/docs/content/docs/containers/hello-world/Dockerfile
@@ -0,0 +1,5 @@
+FROM eclipse-temurin:25-jdk
+WORKDIR /app
+COPY HelloWorld.java .
+RUN javac HelloWorld.java
+ENTRYPOINT ["java", "HelloWorld"]
diff --git a/docs/content/docs/containers/hello-world/HelloWorld.java b/docs/content/docs/containers/hello-world/HelloWorld.java
new file mode 100644
index 0000000..b996aef
--- /dev/null
+++ b/docs/content/docs/containers/hello-world/HelloWorld.java
@@ -0,0 +1,27 @@
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import com.sun.net.httpserver.HttpServer;
+import com.sun.net.httpserver.HttpHandler;
+import com.sun.net.httpserver.HttpExchange;
+
+public class HelloWorld {
+ public static void main(String[] args) throws IOException {
+ HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
+ server.createContext("/", new MyHandler());
+ server.setExecutor(null);
+ server.start();
+ System.out.println("Server started on port 8080");
+ }
+
+ static class MyHandler implements HttpHandler {
+ @Override
+ public void handle(HttpExchange t) throws IOException {
+ String response = "Hello, World from Kubernetes!";
+ t.sendResponseHeaders(200, response.length());
+ OutputStream os = t.getResponseBody();
+ os.write(response.getBytes());
+ os.close();
+ }
+ }
+}
diff --git a/docs/content/docs/containers/hello-world/_index.md b/docs/content/docs/containers/hello-world/_index.md
new file mode 100644
index 0000000..da09db5
--- /dev/null
+++ b/docs/content/docs/containers/hello-world/_index.md
@@ -0,0 +1,256 @@
+---
+title: "Hello World Example"
+toc_hide: true
+description: >
+ Simple Java Hello World example for a container application on Kubernetes.
+---
+
+Here is a tiny Java HTTP service used by the JVM memory in
+Kubernetes slides. The demo is intentionally small so the commands focus on the
+container, cgroup, heap, and native-memory signals rather than application code.
+
+* [HelloWorld.java](HelloWorld.java): Simple single Java file that is a HTTP server
+* [Dockerfile](Dockerfile): Dockerfile for the application
+* [k8s-deployment.yaml](k8s-deployment.yaml): Kubernetes deployment manifest
+
+The Kubernetes manifest enables a few JVM diagnostics through
+`JAVA_TOOL_OPTIONS`:
+
+```yaml
+env:
+- name: JAVA_TOOL_OPTIONS
+ value: >
+ -Xlog:os+container=debug
+ -XX:NativeMemoryTracking=summary
+ -XX:+UseG1GC
+ -XX:+FlightRecorder
+ -XX:StartFlightRecording=filename=/tmp/startup.jfr,dumponexit=true
+```
+
+It also exposes JMX on port `9091` for JDK Mission Control.
+
+## Build the Image
+
+Run these commands from this directory:
+
+```bash
+docker build -t jvmperf.net/java-hello-world:v1 .
+```
+
+If you are using a local Kubernetes runtime such as minikube, kind, or Docker
+Desktop, make sure the image is available to that cluster before deploying.
+
+## Deploy to Kubernetes
+
+Apply the deployment and service:
+
+```bash
+kubectl apply -f k8s-deployment.yaml
+```
+
+Wait for the pod to become ready:
+
+```bash
+kubectl rollout status deployment/java-hello-world
+kubectl get pods -l app=java-hello-world
+```
+
+For the commands below, capture the pod name once:
+
+```bash
+POD=$(kubectl get pod -l app=java-hello-world -o jsonpath='{.items[0].metadata.name}')
+echo "$POD"
+```
+
+## Verify the App
+
+The service is a `NodePort`, so Kubernetes assigns a local node port for the
+HTTP endpoint:
+
+```bash
+kubectl get svc java-hello-world-service
+```
+
+Use the returned `NODE-PORT` value with localhost:
+
+```bash
+NODE_PORT=$(kubectl get svc java-hello-world-service -o jsonpath='{.spec.ports[0].nodePort}')
+curl "http://localhost:${NODE_PORT}/"
+```
+
+Expected response:
+
+```text
+Hello, World from Kubernetes!
+```
+
+## Check the JVM's Container View
+
+Start with `-XshowSettings:system`. This is the quick check that the JVM sees the
+pod's cgroup limits rather than sizing itself from the whole node:
+
+```bash
+kubectl exec "$POD" -- java -XshowSettings:system -version
+```
+
+Look for output shaped like this:
+
+```text
+Operating System Metrics:
+ Provider: cgroupv2
+ Effective CPU Count: 1
+ CPU Quota: 100000us
+ CPU Period: 100000us
+ Memory Limit: 1.00G
+ Memory & Swap Limit: 1.00G
+```
+
+The important fields for the slides are:
+
+| Field | Why it matters |
+| --- | --- |
+| `Provider` | Shows whether the JVM is reading cgroup data. |
+| `Effective CPU Count` | Influences GC threads, JIT threads, and app parallelism. |
+| `Memory Limit` | The process budget for heap plus native memory. |
+| `CPU Quota` / `CPU Period` | Should line up with the deployment CPU limit. |
+
+## Inspect Native Memory
+
+Native Memory Tracking is enabled in the manifest with
+`-XX:NativeMemoryTracking=summary`, so you can ask the running JVM for its native
+memory map:
+
+```bash
+kubectl exec "$POD" -- jcmd 1 VM.native_memory summary
+```
+
+The top of the output gives total reserved and committed memory:
+
+```text
+Native Memory Tracking:
+
+Total: reserved=1677076KB, committed=43616KB
+ malloc: 3328KB #7179, peak=3201KB #7181
+ mmap: reserved=1673748KB, committed=40288KB
+```
+
+Then NMT breaks memory into JVM categories:
+
+```text
+- Java Heap (reserved=262144KB, committed=16384KB)
+- Class (reserved=1048664KB, committed=280KB)
+- Thread (reserved=30653KB, committed=1141KB)
+- Code (reserved=249735KB, committed=7735KB)
+- GC (reserved=860KB, committed=64KB)
+```
+
+Use this breakdown to explain where memory outside the Java heap can come from:
+thread stacks, class metadata, code cache, GC structures, direct buffers, native
+libraries, and JVM internals.
+
+## Compare Heap and NMT
+
+`GC.heap_info` explains the Java heap from the collector's point of view:
+
+```bash
+kubectl exec "$POD" -- jcmd 1 GC.heap_info
+```
+
+Example:
+
+```text
+garbage-first heap total reserved 262144K, committed 18432K, used 2925K
+```
+
+For the Java heap, `reserved` and `committed` should line up with the
+`Java Heap` row in NMT. `heap_info` adds `used`, which is the live heap occupancy
+inside the committed heap space.
+
+## Inspect VM and Cgroup Details
+
+`VM.info` gives a broader diagnostic snapshot, including the JVM's cgroup view:
+
+```bash
+kubectl exec "$POD" -- jcmd 1 VM.info
+```
+
+Useful segment:
+
+```text
+container (cgroup) information:
+container_type: cgroupv2
+active_processor_count: 1
+cpu_quota: 100000
+cpu_period: 100000
+memory_limit_in_bytes: 1048576 k
+memory_and_swap_limit_in_bytes: 1048576 k
+memory_usage_in_bytes: 118316 k
+rss_usage_in_bytes: 116428 k
+cache_usage_in_bytes: 64 k
+current number of tasks: 29
+```
+
+Capture this beside the pod spec, heap settings, and NMT output when you want to
+explain why a container is close to its limit.
+
+## Record Heap Behavior with JFR
+
+Java Flight Recorder is useful during load tests because it keeps the heap story
+tied to time. Use it to see heap usage, allocation pressure, and GC behavior
+across the same window where you are collecting NMT and cgroup data.
+
+The manifest starts a recording automatically:
+
+```yaml
+-XX:+FlightRecorder
+-XX:StartFlightRecording=filename=/tmp/startup.jfr,dumponexit=true
+```
+
+For a specific test window, start and stop a named recording with `jcmd`:
+
+```bash
+kubectl exec "$POD" -- jcmd 1 JFR.start name=load-test filename=/tmp/load-test.jfr settings=profile
+# run representative load
+kubectl exec "$POD" -- jcmd 1 JFR.dump name=load-test filename=/tmp/load-test.jfr
+kubectl exec "$POD" -- jcmd 1 JFR.stop name=load-test
+```
+
+Copy the recording locally:
+
+```bash
+kubectl cp "${POD}:/tmp/load-test.jfr" ./load-test.jfr
+```
+
+Open `load-test.jfr` in JDK Mission Control. For heap-focused analysis, start
+with heap usage, allocation, GC pause, and GC heap summary views.
+
+## Use JDK Mission Control
+
+The manifest opens JMX on container port `9091`. Port-forward it to your machine:
+
+```bash
+kubectl port-forward "$POD" 9091:9091
+```
+
+Then connect JDK Mission Control to:
+
+```text
+localhost:9091
+```
+
+This is useful when you want to show the memory story over time rather than only
+single command snapshots.
+
+## Cleanup
+
+Remove the demo resources when you are done:
+
+```bash
+kubectl delete -f k8s-deployment.yaml
+```
+
+## References
+
+- `java.lang.management.OperatingSystemMXBean`: https://docs.oracle.com/en/java/javase/11/docs/api/java.management/java/lang/management/OperatingSystemMXBean.html
+- `com.sun.management.OperatingSystemMXBean`: https://docs.oracle.com/en/java/javase/25/docs/api/jdk.management/com/sun/management/OperatingSystemMXBean.html
+- Native Memory Tracking: https://docs.oracle.com/en/java/javase/11/vm/native-memory-tracking.html
diff --git a/docs/content/docs/containers/hello-world/k8s-deployment.yaml b/docs/content/docs/containers/hello-world/k8s-deployment.yaml
new file mode 100644
index 0000000..cb1f4c9
--- /dev/null
+++ b/docs/content/docs/containers/hello-world/k8s-deployment.yaml
@@ -0,0 +1,54 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: java-hello-world
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: java-hello-world
+ template:
+ metadata:
+ labels:
+ app: java-hello-world
+ spec:
+ containers:
+ - name: java-app
+ image: jvmperf.net/java-hello-world:v1
+ env:
+ - name: JAVA_TOOL_OPTIONS
+ value: >
+ -Xlog:os+container=debug
+ -XX:NativeMemoryTracking=summary
+ -XX:+UseG1GC
+ -XX:+FlightRecorder
+ -XX:StartFlightRecording=filename=/tmp/startup.jfr,dumponexit=true
+ -Dcom.sun.management.jmxremote=true
+ -Dcom.sun.management.jmxremote.port=9091
+ -Dcom.sun.management.jmxremote.rmi.port=9091
+ -Dcom.sun.management.jmxremote.authenticate=false
+ -Dcom.sun.management.jmxremote.ssl=false
+ -Djava.rmi.server.hostname=127.0.0.1
+ resources:
+ requests:
+ memory: "256Mi"
+ cpu: "250m"
+ limits:
+ memory: "1Gi"
+ cpu: "1"
+ ports:
+ - containerPort: 8080
+ - containerPort: 9091
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: java-hello-world-service
+spec:
+ selector:
+ app: java-hello-world
+ ports:
+ - protocol: TCP
+ port: 80
+ targetPort: 8080
+ type: NodePort
diff --git a/docs/content/docs/containers/java_monitoring.md b/docs/content/docs/containers/java_monitoring.md
new file mode 100644
index 0000000..7db5d2c
--- /dev/null
+++ b/docs/content/docs/containers/java_monitoring.md
@@ -0,0 +1,97 @@
+---
+title: "Java Monitoring Tooling"
+weight: 2
+description: >
+ Instructions for enabling remote tooling on our JVM
+---
+
+In this section we're going to configure our container to enable remote tooling.
+
+{{% alert title="Note" color="info" %}}
+* Make sure you've gone through the [Prerequisites](/docs/prereqs).
+* Make sure your Docker daemon is running.
+* If this is the first time you're using docker, we recommend going through [Orientation and Setup](https://docs.docker.com/get-started/) to quickly learn a few concepts.
+{{% /alert %}}
+
+## Remote Monitoring
+
+In previous sections of the workshop, we ran all our tooling without any configuration. In previous versions of Java you would have had to configure things even for local monitoring, this is no longer the case with Java 6+:
+
+> Any application that is started on the Java SE 6 platform will support the Attach API, and so will automatically be made available for local monitoring and management when needed.
+
+Since the docker-compose network and containers are ran separate from our host (consider them a different machine), we need to enable [remote monitoring and management](https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html).
+
+
+
+### Properties
+
+We'll set the following properties as a `JAVA_OPTS` environment variable when we start our workshop server container:
+
+* The `JMX remote port` to `8082`: `-Dcom.sun.management.jmxremote.port=8082`
+* The RMI registry port also set to `8082`: `-Dcom.sun.management.jmxremote.rmi.port=8082`
+* Disabling for both the registry and jmx: `-Dcom.sun.management.jmxremote.registry.ssl=false` and `-Dcom.sun.management.jmxremote.ssl=false`
+* Accept connections not from localhost: `-Dcom.sun.management.jmxremote.local.only=false`
+ * Since the machine we are connecting from will not be in the container network, we need to allow non localhost connections.
+* The host name for the [RMI server](https://docs.oracle.com/javase/8/docs/technotes/guides/rmi/javarmiproperties.html) will be set to `127.0.0.1`. The default value for this will be the container's IP address, which we are overriding.
+
+Set these values as an `environment` property on your workshop container:
+
+```yaml
+...
+ server:
+ image: workshop-server:latest
+ environment:
+ JAVA_OPTS: "
+ -Dcom.sun.management.jmxremote.port=8082
+ -Dcom.sun.management.jmxremote.rmi.port=8082
+ -Dcom.sun.management.jmxremote.registry.ssl=false
+ -Dcom.sun.management.jmxremote.authenticate=false
+ -Dcom.sun.management.jmxremote.ssl=false
+ -Dcom.sun.management.jmxremote.local.only=false
+ -Djava.rmi.server.hostname=127.0.0.1
+ "
+...
+```
+
+## Test Our Setup
+
+Spin up your services again with `docker-compose up`. Once the services are started, use `docker ps` to check the open ports on the workshop server. Notice that `8082` is now mapped as well.
+```bash
+$ docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+44d4a1ebedef workshop-server:latest "/bin/sh -c 'java $Jā¦" 39 seconds ago Up 37 seconds 0.0.0.0:8080-8082->8080-8082/tcp java-perf-workshop_server_1
+```
+
+### JDK Mission Control
+
+We'll use JDK Mission Control to create a JMX Connection.
+
+Open JDK Mission Control. Notice that the JVM Browser no longer shows the two services (since they no longer are running on the local host):
+
+
+
+Create a new JMX Connection using `0.0.0.0` and `8082` as the host and port:
+
+
+
+With our setup, we can connect with other addresses as well:
+
+* `127.0.0.1`
+* `localhost` (since we are exposing port 8082 on the container as port 8082 on the local host)
+* Our wifi/ethernet IP address, which you can find under the `en0` interface using `ifconfig/ipconfig`:
+ ```bash
+ $ ifconfig
+ ...
+ en0: flags=8863 mtu 1500
+ ether 8c:85:90:ba:52:10
+ inet6 fe80::1862:95fe:55e7:284e%en0 prefixlen 64 secured scopeid 0x9
+ inet 192.168.1.189 netmask 0xffffff00 broadcast 192.168.1.255
+ ...
+ ```
+
+
+
+
+{{% nextSection %}}
+In the next section, we'll learn about some Docker tooling.
+{{% /nextSection %}}
diff --git a/docs/content/docs/containers/setup.md b/docs/content/docs/containers/setup.md
new file mode 100644
index 0000000..7057c11
--- /dev/null
+++ b/docs/content/docs/containers/setup.md
@@ -0,0 +1,76 @@
+---
+title: "Setup"
+weight: 1
+description: >
+ Instructions for setting up the workshop services through docker
+---
+
+In this section we're going to spin up the containers needed for the workshop.
+
+{{% alert title="Note" color="info" %}}
+* Make sure you've gone through the [Prerequisites](/docs/prereqs).
+* Make sure your Docker daemon is running.
+* If this is the first time you're using docker, we recommend going through [Orientation and Setup](https://docs.docker.com/get-started/) to quickly learn a few concepts.
+{{% /alert %}}
+
+## Building
+
+The maven project uses the [fabric8.io/docker-maven-plugin](https://dmp.fabric8.io/) to create two images:
+
+* `workshop-server` - the docker image for the workshop service
+* `workshop-wiremock` - the docker image for the wiremock service
+
+Run `mvn clean package -Pdocker` , the `docker` profile enables the docker-maven-plugin.
+
+You can view the generated images with `docker image ls | grep workshop`:
+
+```bash
+$ docker image ls | grep workshop
+workshop-wiremock 2.0-SNAPSHOT 2cc43b2348c8 2 minutes ago 657MB
+workshop-wiremock latest 2cc43b2348c8 2 minutes ago 657MB
+workshop-server 2.0-SNAPSHOT be7cfbd0735a 2 minutes ago 659MB
+workshop-server latest be7cfbd0735a 2 minutes ago 659MB
+```
+
+## Running
+
+Since our Workshop Service depends on the Wiremock Service, we're going to use [docker-compose](https://docs.docker.com/compose/) to create a docker environment with both our services ready to go:
+
+
+
+Within the `java-perf-workshop` directory, run `docker-compose up`:
+
+```bash
+$ docker-compose up
+Creating network "java-perf-workshop_default" with the default driver
+Creating java-perf-workshop_wiremock_1 ... done
+Creating java-perf-workshop_server_1 ... done
+Attaching to java-perf-workshop_wiremock_1, java-perf-workshop_server_1
+...
+wiremock_1 | port: 8080
+wiremock_1 | enable-browser-proxying: false
+wiremock_1 | disable-banner: false
+wiremock_1 | no-request-journal: false
+wiremock_1 | verbose: false
+wiremock_1 |
+...
+server_1 | INFO [2021-03-14 18:59:06,883] org.eclipse.jetty.server.AbstractConnector: Started application@4c777e7b{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
+server_1 | INFO [2021-03-14 18:59:06,892] org.eclipse.jetty.server.AbstractConnector: Started admin@5f038248{HTTP/1.1,[http/1.1]}{0.0.0.0:8081}
+server_1 | INFO [2021-03-14 18:59:06,892] org.eclipse.jetty.server.Server: Started @4358ms
+```
+
+In another terminal, you can check the status of the containers by running `docker ps`:
+```bash
+$ docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+c9aeb5375f79 workshop-server:latest "/bin/sh -c 'java -jā¦" 52 seconds ago Up 50 seconds 0.0.0.0:8080-8081->8080-8081/tcp java-perf-workshop_server_1
+6b1522e7acb9 workshop-wiremock:latest "/bin/sh -c 'java -jā¦" 52 seconds ago Up 51 seconds java-perf-workshop_wiremock_1
+```
+
+Our workshop service container is exposing port `8080` and mapping it into the container's `8080`. Verify that your setup is working by visiting: [http://localhost:8080/search?q=docker](http://localhost:8080/search?q=docker).
+
+
+
+{{% nextSection %}}
+In the next section, we'll learn how to enable Java Monitoring Tooling to work with containers.
+{{% /nextSection %}}
\ No newline at end of file
diff --git a/docs/content/docs/intro/_index.md b/docs/content/docs/intro/_index.md
index 2ce67a1..e61c05b 100644
--- a/docs/content/docs/intro/_index.md
+++ b/docs/content/docs/intro/_index.md
@@ -3,6 +3,7 @@ title: "Process and Threads"
weight: 10
description: >
Initial look at the JVM from its native perspective.
+hide_readingtime: true
---
This first part of the workshop, we will begin to learn about looking at the JVM from its native perspective, and begin obtaining JVM based information to correlate to it's native representation.
@@ -97,6 +98,44 @@ Example:
top -b -n3 -H -p 6730 > jvm_native_threads.log
```
+## Java Utilities
+
+There's a couple of java utilities that can also be used to find the PIDs of your running processes.
+
+### jps
+
+The [Java Virtual Machine Process Status Tool](https://docs.oracle.com/javase/7/docs/technotes/tools/share/jps.html) can be used to see Java processes.
+
+```bash
+ $ jps
+7241 Jps
+6059 java-perf-workshop-server-2.0-SNAPSHOT.jar
+6925 jar
+```
+
+You can get more insight by using some of its flags:
+
+```bash
+ $ jps -lvm
+6059 java-perf-workshop-server/target/java-perf-workshop-server-2.0-SNAPSHOT.jar server server.yml
+6925 wiremock-standalone.jar --port 9090 --root-dir java-perf-workshop-server/src/test/resources
+7582 sun.tools.jps.Jps -lvm -Dapplication.home=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home -Xms8m
+```
+
+### jcmd
+
+The [jcmd](https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html) utility is an attempt to consolidate other utilities into a single interface.
+
+Running the `jcmd` command should display some of the same information that `jps` showed us (similar to `jps -m`):
+
+```
+$ jcmd
+6059 java-perf-workshop-server/target/java-perf-workshop-server-2.0-SNAPSHOT.jar server server.yml
+6925 wiremock-standalone.jar --port 9090 --root-dir java-perf-workshop-server/src/test/resources
+7838 sun.tools.jcmd.JCmd
+```
+
+
## Thread Dump
To capture a thread dump of the JVM, there are many tools that can achieve this. You can do this over JMX remotely, sending an OS signal (`kill -3`), or just form the command line (`jstack` or `jcmd`). To keep it simple, we will just use `jcmd` as we will use it later for other diagnostic commands.
@@ -105,7 +144,7 @@ To capture a thread dump of the JVM, there are many tools that can achieve this.
jcmd Thread.print
```
-:bulb: You need to be the same OS user when invoking the command as the target JVM.
+š” You need to be the same OS user when invoking the command as the target JVM.
So, using our earlier example, this would be:
diff --git a/docs/content/docs/jmc/_index.md b/docs/content/docs/jmc/_index.md
index 4479296..3ccb0eb 100644
--- a/docs/content/docs/jmc/_index.md
+++ b/docs/content/docs/jmc/_index.md
@@ -1,9 +1,10 @@
---
-title: "Java Mission Control & Flight Recorder"
+title: "JDK Mission Control & Flight Recorder"
weight: 20
description: >
Initial look at the JVM from its native perspective.
simple_list: true
+hide_readingtime: true
---
-In this workshop, we will be getting more familiar with using Java Mission Control and the Flight Recorder. As we have been running our service, we want to gather more insight of the code in the service by running series of simple tests and measuring the service.
+In this workshop, we will be getting more familiar with using JDK Mission Control and the Flight Recorder. As we have been running our service, we want to gather more insight of the code in the service by running series of simple tests and measuring the service.
diff --git a/docs/content/docs/jmc/_intro.md b/docs/content/docs/jmc/_intro.md
deleted file mode 100644
index f5dd189..0000000
--- a/docs/content/docs/jmc/_intro.md
+++ /dev/null
@@ -1,217 +0,0 @@
----
-title: "Introduction"
-weight: 10
-description: >
- Introduction into Java Mission Control with Flight Recorder
----
-
-## Java Flight Recorder
-
-The Java Flight Recorder (JFR) is a very low overhead profiling and diagnostics tool. It was inherited from the JRockit JVM, and it is now offered as part of the HotSpot JVM. It is designed to be "black box" data recorder of the the run-time, which can be used in production environments, making it an attractive tool for profiling code since it has low overhead on the JVM.
-
-To enable the Flight Recorder on the JVM, the following options need to be included on the JVM:
-
-```bash
--XX:+UnlockCommercialFeatures -XX:+FlightRecorder
-```
-
-:heavy_exclamation_mark: Notice that you have to include `-XX:+UnlockCommercialFeatures` first in the options listing. This is because using Flight Recorder is a feature that requires additional licensing when used in production environments. One of the following licenses is required in order to utilize this in a production environment.
-
-* Oracle Java SE Advanced
-* Oracle Java SE Suite
-
-However, you may use this in non-production environments without additional licensing.
-
-
-### Higher Fidelity on Method Profiling
-
-To get better fidelity on method profiling, include the following options which will enable the compiler to include additional metadata on non-safe code points. This is helpful, as sometimes the metadata will not fully resolve to the correct line in the code.
-
-```bash
--XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints
-```
-
-## Java Mission Control
-We will be using Java Mission Control _(included in Oracle JDK 7u40)_ to monitor and evaluate the Java flight recordings. To start up Java Mission Control, simply executing the following in your console:
-
-```bash
-jmc
-```
-
-:bulb: In order to be able to invoke `jmc` (Java Mission Control) from your console, it assumes `$JAVA_HOME/bin` is on your `$PATH`. If it is not included, go ahead and update your profile to include this so you can easily invoke `jmc` from your terminal.
-
-## Start Service with JFR
-
-Let's start profiling our service. Start the service up by enabling JFR:
-
-### Start from the console
-
-```bash
-# Note, if you are running this server from a different folder, consider changing the SERVER_HOME
-SERVER_HOME=java-perf-workshop-server/target
-java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -jar $SERVER_HOME/java-perf-workshop-server-1.1.0-SNAPSHOT.jar server server.yml
-```
-
-:bulb: Starting with Java Mission Control 5.5 _(included in Oracle Java 8u40)_, you no longer have to enable JFR prior to capturing the recording (it will dynamically enable it, after prompting about it).
-
-
-## Start Flight Recording from JMC
-
-From Java Mission Control (JMC), you can start a flight recording by right-clicking the JVM from the __JVM Browser__ view and selecting __Start Flight Recording...__
-
-
-
-This will open a window where you apply some settings for the recording. First select that you want this to be a __Continuous recording__ and for Event settings, we will import a template to get some consistent settings for profiling. Within the __Template Manager__, select __Import Files...__ and import the `profile.jfc` included in this folder. It should appear as _Java Performance Workshop Profile_. Select this as the __Event Settings__ and then click on __Finish__.
-
-
-
-Once your flight recording is being captured in a _Continuous_ recording, it will show a ā.
-
-
-
-:bulb: You can see the JFR templates (continuous / profile) which are shipped as part of the JRE in: `$JAVA_HOME/jre/lib/jfr`. These become helpful if you are wanting to compare your settings to some of the standard ones.
-
-## Generate HTTP traffic on service
-
-We will want to generate some traffic on the service to measure some general characteristics of the service:
-* Throughput (requests per second)
-* Response time
-* Trend of response time over time
-
-By generating traffic on service, this gives us baseline activity in the JVM to start evaluating the flight recording. For the purpose of this workshop, we will utilize [Apache Benchmark](http://httpd.apache.org/docs/2.2/programs/ab.html) to generate traffic on the service.
-
-### Basic test
-
-This service under test, is a simple web service which provides results based on a search API. When interacting with the service, you can simply supply a HTTP GET on the _search_ resource with a query parameter ('q') with the term that you are searching for. It will then return KCDC's 2015 sessions that contain that term. Example:
-
-```bash
-curl "http://localhost:8080/search?q=jvm"
-{
- "results" : [ {
- "title" : "Concurrency Options on the JVM",
- "presenter" : "Jessica Kerr",
- "sessionType" : "Regular Session"
- }, {
- "title" : "Exploring the Actor Model with Akka.NET",
- "presenter" : "Robert Macdonald Smith",
- "sessionType" : "Regular Session"
- }, {
- "title" : "What's in your JVM?",
- "presenter" : "Carl Chesser",
- "sessionType" : "4-Hour Workshop"
- } ]
-}
-```
-
-### Using Apache Benchmark
-
-From the console, we will execute the following to generate traffic against our service. Note, we will use a very basic search of just "a", since this will generate more results.
-
-```bash
-ab -n 1000 -c 15 "http://localhost:8080/search?q=a"
-```
-
-### Using loadtest
-
-An alternative to Apache Benchmark, is [loadtest](https://github.com/alexfernandez/loadtest) (a node.js equivalent). To install:
-
-```bash
-sudo npm install -g loadtest
-```
-
-Then you can execute similarly:
-
-```bash
-loadtest -n 1000 -c 15 "http://localhost:8080/search?q=a"
-```
-
-### Using gatling
-
-Alternatively, you can use [gatling](https://gatling.io/) (a performance library with a scala dsl ).
-
-This should launch the `WorkshopSimulation`.
-
-```bash
- mvn -f java-perf-workshop-tester/ gatling:test
-```
-
-```bash
-mvn gatling:test
-```
-
-Sample output while running:
-```bash
-[~/java-perf-workshop/java-perf-workshop-tester]$ mvn gatling:test
-[INFO] Scanning for projects...
-[INFO]
-[INFO] ------------------------------------------------------------------------
-[INFO] Building java-perf-workshop-tester 1.1.0-SNAPSHOT
-[INFO] ------------------------------------------------------------------------
-[INFO]
-[INFO] --- gatling-maven-plugin:2.2.4:test (default-cli) @ java-perf-workshop-tester ---
-19:12:16,662 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
-19:12:16,663 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
-19:12:16,663 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/J:/Workspaces/java-perf-workshop/java-perf-workshop-tester/target/test-classes/logback.xml]
-19:12:16,663 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs multiple times on the classpath.
-19:12:16,663 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs at [file:/J:/Workspaces/java-perf-workshop/java-perf-workshop-tester/target/test-classes/logback.xml]
-19:12:16,663 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs at [jar:file:/C:/Users/JMonterrubio/.m2/repository/io/gatling/gatling-maven-plugin/2.2.4/gatling-maven-plugin-2.2.4.jar!/logback.xml]
-19:12:16,727 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
-19:12:16,731 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
-19:12:16,737 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [CONSOLE]
-19:12:16,742 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
-19:12:16,781 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to WARN
-19:12:16,782 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CONSOLE] to Logger[ROOT]
-19:12:16,782 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
-19:12:16,783 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@7a0ac6e3 - Registering current configuration as safe fallback point
-
-Simulation cchesser.javaperf.workshop.WorkshopSimulation started...
-```
-
-## Stop Flight Recorder
-
-After you have played traffic through the service, you can then stop your flight recording from JMC.
-
-
-
-Then dump the whole recording.
-
-
-
-## The Flight Recording
-
-From a Java Flight Recording, there are several categories of information you can view from JMC:
-
-* __Memory__: View memory utilization and garbage collection costs.
-* __Code__: View profiling of your code to identify _hot spots_ in your code base. Also, you can get additional insight to exceptions thrown, compilation costs, and class loading.
-* __Threads__: View series of thread dumps, _hot_ threads, latency events, and locking situations causing contention.
-* __I/O__: View general I/O (file / network) costs that were occurring within your code.
-* __System__: Get a general context of the run-time environment of the JVM.
-* __Events__: View a full detailed log of the events within the JVM.
-
-### Code
-
-Our first walkthrough of the Flight Recording will begin with the __Code__ view to give context of where we might be spending time with our code.
-
-When you first open the __Code__ tab, you will be brought to the __Overview__ sub tab. This will give you a breakdown of where you are spending your time by code package and classes.
-
-
-
-To go deeper into these details, go into the __Hot Methods__ sub tab. From here you can expand down to the method which is consuming most of your time.
-
-
-
-You can also zoom into the timeline to scope it to a spike of events. This can be done on most view in Java Mission Control. In this case, we will zoom into a 847 ms interval:
-
-
-
-Another helpful means of identify within a method is including the line number. This can be accomplished by right-clicking in the view and going to __Distinguish Frames By__, and then selecting __Line Number__.
-
-:bulb: Generally, you don't need this, as it can be quite apparent by the base method being invoked where the cost is at. Though, it may be helpful to include in some contexts.
-
-
-
-
-
-Walk around to look at other areas where you are spending time in your code. In many cases you find that there are very expensive areas of code that you cannot change (as you may not own it), but you can dictate whether or not it should be executed (or executed as frequently.
-
-We will go into more of the different areas of the flight recording in the next lab.
diff --git a/docs/content/docs/jmc/_references.md b/docs/content/docs/jmc/_references.md
new file mode 100644
index 0000000..34fdd68
--- /dev/null
+++ b/docs/content/docs/jmc/_references.md
@@ -0,0 +1,9 @@
+---
+title: "References"
+weight: 20
+description: >
+ Collection of useful references used to build this guide.
+---
+
+* [JDK Mission Control User Guide](https://docs.oracle.com/en/java/java-components/jdk-mission-control/9/user-guide/)
+* [Hunting down code hotspots with JFR](https://bell-sw.com/announcements/2020/07/22/Hunting-down-code-hotspots-with-JDK-Flight-Recorder/)
diff --git a/docs/content/docs/jmc/advanced.md b/docs/content/docs/jmc/advanced.md
deleted file mode 100644
index 4693140..0000000
--- a/docs/content/docs/jmc/advanced.md
+++ /dev/null
@@ -1,61 +0,0 @@
----
-title: "Advanced Flight Recorder"
-weight: 20
-description: Take the next step in learning more with Flight Recorder
----
-
-In this workshop we are going to expand what we profiled earlier to all the different areas of the JVM. The JFR has an extensive amount of data which it captures, we will not dive into each of these areas, but hit on a couple more common areas to inspect on your code base.
-
-## Exceptions
-
-Go into the __Code__ tab, and then navigate to the __Exceptions__ sub tab. Here you can get context of what exceptions are thrown, and when. Exceptions are not necessarily a cheap operation, as there are costs in producing the stack trace.
-
-Within this view, there are three sub tabs:
-* Overview: Get counts on exceptions/errors and related stack traces
-* Exceptions: Get individual instances of exceptions thrown based on the timeline. Includes string messages which may provide additional context.
-* Errors: Same content as the Exceptions view, but for Errors.
-
-Overview:
-
-
-
-Exceptions sub view (filtered down to a specific time interval):
-
-
-
-### Follow-ups
-
-* What are the exceptions that are getting generated the most?
-* What stack traces are the contributor?
-* Select different intervals of time to filter the listing of what is being presented. Can you see where
-
-## Threads
-
-In the __Threads__ tab, you can get context to compute and latency events tied to threads. For this we will look a couple of things:
-* Hot Threads
-* Latencies
-
-The __Hot Thread__ sub tab view, you can view threads and the related methods that are consuming the most time. As with other views, you can zoom in on spikes of events to see if there is a common effect. Many times this gives you a better context of related resources (by threads of the same pool) that could be getting heavily utilized by a request. This also helps in correlating other facts you may have (like native threads / thread dumps).
-
-
-
-The __Latencies__ sub tab can help show common areas of your code (organized by thread states) which can cause slowness in your code base that may not be directly tied to a heavy computation task (ex. waiting on a network call). Generally it helps to look at the large contributor (based on total time consumed) and see when and why it is getting invoked (and if that can be minimized).
-
-
-
-### Follow-ups
-
-* Where are we spending most of our time sleeping? What is causing this?
-
-## I/O
-
-The __I/O__ tab, can provide context of what external resources you are utilizing from you code base, and relate it to other latency events. For the purpose of our workshop service, we are doing network I/O, and therefore will look at the __Socket Read__ sub view. From this view you can gain context of what host you are calling, how many times you are calling it, and how much time it is taking.
-
-
-
-
-### Follow-ups
-
-* What remote services are we interacting with?
-* How long are we interacting with them and how many invocations?
-* How many times did we make calls and what threads were tied to those calls?
\ No newline at end of file
diff --git a/docs/content/docs/jmc/exceptions.md b/docs/content/docs/jmc/exceptions.md
new file mode 100644
index 0000000..75a1870
--- /dev/null
+++ b/docs/content/docs/jmc/exceptions.md
@@ -0,0 +1,38 @@
+---
+title: "Exceptions"
+weight: 12
+description: >
+ Find the exceptional cases in our application.
+---
+
+In this section we'll dive into the Exceptions page and find out what information we can learn from it. Start by selecting the __Exceptions__ page from the Outline.
+
+This page offers the following sections:
+
+* Overview: You can get Exceptions by Class and Count
+* Message: View the detail messages for all exceptions and errors.
+* Timeline/Event Log: View when a particular exception was thrown.
+* StackTrace: Identify where the exception was thrown from.
+
+.
+
+You can select an exception from the table to filter the information to that particular exception. You could also filter by a particular exception message.
+
+
+
+## Explore
+
+`NullPointerExceptions` are a familiar exception you deal with in Java, and often times indicate a programming error. Other exception types often point to a common symptom.
+
+### Follow Ups
+
+* What are the exceptions that are getting generated the most?
+ * What stack traces are the contributor?
+* Can you find any areas in our code where we may have made an incorrect assumption regarding nullability?
+ * Are there any other areas in our code where we might have made an incorrect assumption based on an exception's class?
+* Are there any exceptions that might indicate a problem with our dependencies?
+
+
+{{% nextSection %}}
+In the next section, we'll look at the Threads used by our application.
+{{% /nextSection %}}
diff --git a/docs/content/docs/jmc/intro-jmc9/img/jfr-dump.png b/docs/content/docs/jmc/intro-jmc9/img/jfr-dump.png
new file mode 100644
index 0000000..59f3762
Binary files /dev/null and b/docs/content/docs/jmc/intro-jmc9/img/jfr-dump.png differ
diff --git a/docs/content/docs/jmc/intro-jmc9/img/jfr-settings.png b/docs/content/docs/jmc/intro-jmc9/img/jfr-settings.png
new file mode 100644
index 0000000..af28c87
Binary files /dev/null and b/docs/content/docs/jmc/intro-jmc9/img/jfr-settings.png differ
diff --git a/docs/content/docs/jmc/intro-jmc9/img/jfr-start-wizard.png b/docs/content/docs/jmc/intro-jmc9/img/jfr-start-wizard.png
new file mode 100644
index 0000000..c658bb4
Binary files /dev/null and b/docs/content/docs/jmc/intro-jmc9/img/jfr-start-wizard.png differ
diff --git a/docs/content/docs/jmc/intro-jmc9/img/jfr-start.png b/docs/content/docs/jmc/intro-jmc9/img/jfr-start.png
new file mode 100644
index 0000000..1bcefd9
Binary files /dev/null and b/docs/content/docs/jmc/intro-jmc9/img/jfr-start.png differ
diff --git a/docs/content/docs/jmc/intro-jmc9/img/jfr-started.png b/docs/content/docs/jmc/intro-jmc9/img/jfr-started.png
new file mode 100644
index 0000000..6a1cd0a
Binary files /dev/null and b/docs/content/docs/jmc/intro-jmc9/img/jfr-started.png differ
diff --git a/docs/content/docs/jmc/intro-jmc9/img/jfr-stop.png b/docs/content/docs/jmc/intro-jmc9/img/jfr-stop.png
new file mode 100644
index 0000000..2137c57
Binary files /dev/null and b/docs/content/docs/jmc/intro-jmc9/img/jfr-stop.png differ
diff --git a/docs/content/docs/jmc/intro-jmc9/index.md b/docs/content/docs/jmc/intro-jmc9/index.md
new file mode 100644
index 0000000..a4df1a0
--- /dev/null
+++ b/docs/content/docs/jmc/intro-jmc9/index.md
@@ -0,0 +1,168 @@
+---
+title: "Introduction"
+weight: 10
+description: >
+ Introduction into JDK Mission Control with Flight Recorder
+resources:
+- src: "**/*.png"
+- src: "**/*.jfc"
+---
+
+## JDK Flight Recorder
+
+The JDK Flight Recorder (JFR) is a very low overhead profiling and diagnostics tool. It was inherited from the JRockit JVM, and originally was offered as part of the HotSpot JVM. It is designed to be "black box" data recorder of the the run-time, which can be used in production environments, making it an attractive tool for profiling code since it has low overhead on the JVM. In 2018, it was open-sourced and released as part of OpenJDK.
+
+JFR is enabled by default in Java 11 and later. In previous versions, it required enabling with JVM options (ex. `-XX:+FlightRecorder`)
+
+### Higher Fidelity on Method Profiling
+
+To get better fidelity on method profiling, include the following options which will enable the compiler to include additional metadata on non-safe code points. This is helpful, as sometimes the metadata will not fully resolve to the correct line in the code.
+
+```bash
+-XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints
+```
+
+## JDK Mission Control
+
+We will be using JDK Mission Control to monitor and evaluate the Java flight recordings. To utilizes JDK Mission Control, you will need to [download the build](https://jdk.java.net/jmc/9/). To start up JDK Mission Control, simply executing the following in your console:
+
+```bash
+jmc
+```
+
+š” In order to be able to invoke `jmc` (JDK Mission Control) from your console, it assumes `$JAVA_HOME/bin` is on your `$PATH`. If it is not included, go ahead and update your profile to include this so you can easily invoke `jmc` from your terminal. Also, JMC 9.1 [requires JDK 21](https://www.oracle.com/java/technologies/javase/jmc9-install.html).
+
+## Start Service with JFR
+
+Let's start profiling our service. Start the service up by enabling JFR:
+
+### Start from the console
+
+```bash
+# Note, if you are running this server from a different folder, consider changing the SERVER_HOME
+SERVER_HOME=java-perf-workshop-server/target
+java -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -jar $SERVER_HOME/java-perf-workshop-server-2.0-SNAPSHOT.jar server server.yml
+```
+
+## Start Flight Recording from JMC
+
+{{< figure src="img/jfr-start.png" alt="JFR Start" >}}
+
+This will open a window where you apply some settings for the recording. First select that you want this to be a __Continuous recording__ and for Event settings, we will import a template to get some consistent settings for profiling. Within the __Template Manager__, select __Import Files...__ and import the `open_jdk_9_.jfc` by [downloading it here](jfc/open_jdk_9+.jfc) folder. It should appear as _Java Performance Workshop JDK9+ Profile_. Select this as the __Event Settings__ and then click on __Finish__.
+
+For reference, these are the options for the template.
+
+{{< figure src="img/jfr-settings.png" alt="JFR Settings" >}}
+
+First select that you want this to be a __Continuous recording__ and for Event settings we will use __Profiling on Server__.
+
+{{< figure src="img/jfr-start-wizard.png" alt="JFR Configuration" >}}
+
+
+Once your flight recording is being captured in a _Continuous_ recording, it will show a ā.
+
+{{< figure src="img/jfr-started.png" alt="JFR Started" >}}
+
+
+š” You can see the JFR templates (continuous / profile) which are shipped as part of the JRE in: `$JAVA_HOME/jre/lib/jfr`. These become helpful if you are wanting to compare your settings to some of the standard ones.
+
+## Generate HTTP traffic on service
+
+We will want to generate some traffic on the service to measure some general characteristics of the service:
+* Throughput (requests per second)
+* Response time
+* Trend of response time over time
+
+
+
+By generating traffic on service, this gives us baseline activity in the JVM to start evaluating the flight recording.
+
+### Basic test
+
+This service under test, is a simple web service which provides results based on a search API. When interacting with the service, you can simply supply a HTTP GET on the _search_ resource with a query parameter ('q') with the term that you are searching for. It will then return KCDC's 2015 sessions that contain that term. Example:
+
+```bash
+curl "http://localhost:8080/search?q=jvm"
+{
+ "results" : [ {
+ "title" : "Concurrency Options on the JVM",
+ "presenter" : "Jessica Kerr",
+ "sessionType" : "Regular Session"
+ }, {
+ "title" : "Exploring the Actor Model with Akka.NET",
+ "presenter" : "Robert Macdonald Smith",
+ "sessionType" : "Regular Session"
+ }, {
+ "title" : "What's in your JVM?",
+ "presenter" : "Carl Chesser",
+ "sessionType" : "4-Hour Workshop"
+ } ]
+}
+```
+
+### Using Apache Benchmark
+
+We can utilize [Apache Benchmark](http://httpd.apache.org/docs/2.2/programs/ab.html) to generate traffic on the service From the console, we will execute the following to generate traffic against our service. Note, we will use a very basic search of just "a", since this will generate more results.
+
+```bash
+ab -n 1000 -c 15 "http://localhost:8080/search?q=a"
+```
+
+### Using loadtest
+
+An alternative to Apache Benchmark, is [loadtest](https://github.com/alexfernandez/loadtest) (a node.js equivalent). To install:
+
+```bash
+sudo npm install -g loadtest
+```
+
+Then you can execute similarly:
+
+```bash
+loadtest -n 1000 -c 15 "http://localhost:8080/search?q=a"
+```
+
+## Stop Flight Recorder
+
+After you have played traffic through the service, you can then stop your flight recording from JMC.
+
+{{< figure src="img/jfr-stop.png" alt="JFR Stop" >}}
+
+Then dump the whole recording.
+
+{{< figure src="img/jfr-dump.png" alt="JFR Dump" >}}
+
+## The Flight Recording
+
+From a Java Flight Recording, there are several categories of information (pages) you can view from JMC:
+
+* Code Information:
+ * __Method Profiling__: Provides information about specific method runs and how long each run took, identifying _hot spots_ in your code base.
+ * __Exceptions__: Displays Exceptions and Errors thrown and which methods threw them. Viewing exceptions requires editing the settings to also capture Exceptions.
+* Thread information:
+ * __Threads__: Provides a snapshot of all the threads that belong to the Java Application and the thread activity.
+ * __Lock Instances__: Provides further details on threads by specifying lock information, showing which threads request and which threads take a particular lock.
+ * __Thread Dump__: Provides period thread dump information.
+* Memory Information:
+ * __Memory__: Represents heap memory usage of the JVM.
+* IO Information:
+ * __File I/O__: Displays File costs and behaviors
+ * __Socket I/O__: Displays Network costs and behaviors
+* JVM Internals:
+ * __Garbage Collections__: Displays heap usage compared to pause times as well as GC events.
+ * __Compilations__: Provides details on code compilation.
+ * __TLAB Allocations__: Displays Thread Local Allocation Buffers.
+* System Information:
+ * __Processes__: See other processes on the system and what is competing for resources.
+ * __Environment__: Provides information about the environment in which the recording was made.
+ * __System Properties__: Show properties passed on to the JVM.
+* Events:
+ __Event Browser__: View detailed log of the events within the JVM. You can use this page to further filter down on events across all the pages in the recording.
+
+{{% alert title="Note" color="info" %}}
+Feel free to reference the additional [resources](/docs/jmc/_references/) as you navigate through the sections.
+{{% /alert %}}
+
+{{% nextSection %}}
+In the next section, we'll find out more about what our methods are doing.
+{{% /nextSection %}}
diff --git a/docs/content/docs/jmc/intro-jmc9/jfc/open_jdk_9+.jfc b/docs/content/docs/jmc/intro-jmc9/jfc/open_jdk_9+.jfc
new file mode 100644
index 0000000..585b1f1
--- /dev/null
+++ b/docs/content/docs/jmc/intro-jmc9/jfc/open_jdk_9+.jfc
@@ -0,0 +1,877 @@
+
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ 1000 ms
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ 1000 ms
+
+
+
+ true
+ 10 s
+
+
+
+ true
+ 10 s
+
+
+
+ true
+ 10 s
+
+
+
+ true
+ 10 s
+
+
+
+ true
+ 10 s
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ true
+ true
+ 0 ms
+
+
+
+ true
+ true
+ 0 ms
+
+
+
+ true
+ true
+ 0 ms
+
+
+
+ true
+ true
+
+
+
+ true
+ true
+ 0 ms
+
+
+
+ true
+ true
+
+
+
+ true
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ 10 ms
+
+
+
+ true
+ 20 ms
+
+
+
+ true
+ 0 ms
+
+
+
+ false
+ 0 ms
+
+
+
+ false
+ 0 ms
+
+
+
+ false
+ 0 ms
+
+
+
+ false
+ 0 ms
+
+
+
+ true
+ 0 ms
+
+
+
+ true
+ true
+
+
+
+ true
+ 10 s
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ false
+ everyChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ beginChunk
+
+
+
+ false
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+ true
+
+
+
+ true
+ true
+
+
+
+ true
+
+
+
+ true
+ 0 ms
+
+
+
+ true
+ 0 ms
+
+
+
+ true
+ 0 ms
+
+
+
+ true
+ 0 ms
+
+
+
+ true
+ 0 ms
+
+
+
+ true
+ 0 ms
+
+
+
+ true
+ 0 ms
+
+
+
+ true
+ 0 ms
+
+
+
+ false
+ 0 ms
+
+
+
+ false
+ 0 ms
+
+
+
+ false
+ 0 ms
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+ 0 ms
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ false
+ true
+
+
+
+ true
+
+
+
+ false
+ everyChunk
+
+
+
+ false
+
+
+
+ false
+ everyChunk
+
+
+
+ false
+
+
+
+ true
+ true
+ 0 ns
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ 1000 ms
+
+
+
+ true
+ 100 ms
+
+
+
+ true
+ 10 s
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ 100 ms
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ 10 s
+
+
+
+ true
+ 1000 ms
+
+
+
+ true
+ 10 s
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ endChunk
+
+
+
+ true
+ 5 s
+
+
+
+ true
+ beginChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ true
+
+
+
+ true
+ true
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ endChunk
+
+
+
+ true
+ endChunk
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ false
+ true
+
+
+
+ false
+ true
+
+
+
+ false
+ true
+
+
+
+ false
+ true
+
+
+
+ true
+ true
+
+
+
+ true
+ true
+
+
+
+ true
+ 1000 ms
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+ 10 ms
+
+
+
+ true
+ 0 ms
+
+
+
+ 10 ms
+ true
+
+
+
+ true
+ 10 ms
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 10 ms
+
+ 10 ms
+
+ 10 ms
+
+ true
+
+
+
+
diff --git a/docs/content/docs/jmc/intro-jmc9/jfc/oracle_jdk.jfc b/docs/content/docs/jmc/intro-jmc9/jfc/oracle_jdk.jfc
new file mode 100644
index 0000000..e52fc30
--- /dev/null
+++ b/docs/content/docs/jmc/intro-jmc9/jfc/oracle_jdk.jfc
@@ -0,0 +1,545 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 10 ms
+
+ 10 ms
+
+ 10 ms
+
+ true
+
+ true
+
+ true
+
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ 1000 ms
+
+
+
+ true
+ 1000 ms
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ true
+ true
+ 0 ms
+
+
+
+ true
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ 10 ms
+
+
+
+ false
+ 1 ms
+
+
+
+ true
+ 10 ms
+
+
+
+ true
+ 10 s
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ false
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+ true
+
+
+
+ true
+ true
+
+
+
+ true
+
+
+
+ true
+ 0 ms
+
+
+
+ true
+ 0 ms
+
+
+
+ true
+ 0 ms
+
+
+
+ true
+ 0 ms
+
+
+
+ true
+ 0 ms
+
+
+
+ true
+ 0 ms
+
+
+
+ true
+ 0 ms
+
+
+
+ true
+ 0 ms
+
+
+
+ false
+ 0 ms
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ 1000 ms
+
+
+
+ true
+ 100 ms
+
+
+
+ true
+ 10 s
+
+
+
+ true
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ 100 ms
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ 10 s
+
+
+
+ true
+ 1000 ms
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ everyChunk
+
+
+
+ true
+ true
+
+
+
+ true
+ true
+
+
+
+
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ true
+ true
+ 10 ms
+
+
+
+ true
+ true
+
+
+
+ true
+ true
+
+
+
+ true
+ 1000 ms
+
+
+
+
+
+
+
+ true
+
+
+
+ true
+
+
+
+
+
diff --git a/docs/content/docs/jmc/profile.jfc b/docs/content/docs/jmc/intro-jmc9/jfc/profile.jfc
similarity index 100%
rename from docs/content/docs/jmc/profile.jfc
rename to docs/content/docs/jmc/intro-jmc9/jfc/profile.jfc
diff --git a/docs/content/docs/jmc/io_operations.md b/docs/content/docs/jmc/io_operations.md
new file mode 100644
index 0000000..1aed9f9
--- /dev/null
+++ b/docs/content/docs/jmc/io_operations.md
@@ -0,0 +1,29 @@
+---
+title: "I/O Operations"
+weight: 15
+description: >
+ Find the interactions with external resources.
+---
+
+The I/O pages can provide context of what external resources you are utilizing from you code base, and relate it to other latency events.
+
+For the purpose of our workshop service, we are doing network I/O, and therefore will look at the __Socket I/O__ page.
+
+From this page, we can gain context of what host(s) we are calling, with what frequency, and the cost associated with those calls:
+
+
+
+We can then filter on a particular host and port and drill down into a particular piece of code responsible for that call:
+
+
+
+## Explore
+
+Filter through the total I/O time and explore a couple of events with high I/O.
+
+
+### Follow Ups
+
+* What remote services are we interacting with?
+* How long are we interacting with them and how many invocations?
+* How many times did we make calls and what threads were tied to those calls?
diff --git a/docs/content/docs/jmc/memory.md b/docs/content/docs/jmc/memory.md
new file mode 100644
index 0000000..8cb561d
--- /dev/null
+++ b/docs/content/docs/jmc/memory.md
@@ -0,0 +1,39 @@
+---
+title: "Memory"
+weight: 14
+description: >
+ Find the memory cost of events in our application.
+---
+
+The memory page shows us the overall memory usage and garbage collection events for our recording.
+
+
+
+The __Class Table__ lets us view the total memory allocation dedicated to particular instances of that class. Selecting a particular class will allow us to view what code paths are responsible for creating those objects.
+
+
+
+We can also filter this view to a particular range in time, for example a range where we went from low to high heap usage:
+
+
+
+We can then use this filtered view and drill down through the stack trace to find methods of interest:
+
+
+
+
+## Explore
+
+Narrow down through some periods of time where our heap rose quickly and then was collected. Look at the memory reclaimed after each collection.
+
+### Follow Ups
+
+* What are the most commonly allocated classes? Where do they come from?
+* Are there any classes we own that are also high on the allocation list?
+* Expand the memory usage chart and only chart the Used Heap, do you notice a pattern?
+ * What do you think caused the flat line at the end of the chart?
+
+
+{{% nextSection %}}
+In the next section, we'll look at the I/O used by our application.
+{{% /nextSection %}}
diff --git a/docs/content/docs/jmc/method_profiling.md b/docs/content/docs/jmc/method_profiling.md
new file mode 100644
index 0000000..2bb98dc
--- /dev/null
+++ b/docs/content/docs/jmc/method_profiling.md
@@ -0,0 +1,63 @@
+---
+title: "Method Profiling"
+weight: 11
+description: >
+ Gather context of where we spend time in our code
+---
+
+Our first look at the recording will start with finding out where we might be spending time with our code.
+
+### Method Profiling Page
+
+We'll start by taking a look at the detailed __Method Profiling Page__. This page displays how often a specific method is ran based on sampling.
+
+{{% alert title="Note" color="info" %}}
+This page is a little bit difficult to use in JMC7, planned improvements for the data visualization will come in JMC8, see [JMC#165](https://github.com/openjdk/jmc/pull/165)
+{{% /alert %}}
+
+
+
+By default, this view groups threads by method, but you can also include the line number for each method. This can be accomplished by selecting the __View Menu__ option and going to __Distinguish Frames By__ and selecting __Line Number__.
+
+
+
+š” Generally, you don't need this, as it can be quite apparent by the base method being invoked where the cost is at. Though, it may be helpful to include in some contexts.
+
+
+
+{{% alert title="Note" color="info" %}}
+Remember that this is just a sampling view, and does not mean that only a small amount of methods were hit. We'll be able to visualize more of this info in the following part.
+{{% /alert %}}
+
+## Java Application
+
+Navigate to the __Java Application__ page. This page provides an overview of the state of the JVM and collates information from a couple of the dedicated pages.
+
+
+
+Using the checkboxes on the right of the Graph, select only __Method Profiling__ to narrow down the set of events on the graph:
+
+
+
+The __Stack Trace__ view from this page can give you a better count of sampled methods (not just the ones from a specific Method Profiling event)
+
+
+
+This information is the equivalent of the __Hot Methods__ tab in JMC 5, see [forum discussion](https://community.oracle.com/tech/developers/discussion/4094447/difference-between-method-profiling-and-java-application-stack-traces).
+
+We can then use this information to correlate what is happening in our code:
+
+
+
+## Explore
+
+* Walk around to look at other areas where you are spending time in your code.
+ * In many cases you find that there are very expensive areas of code that you cannot change (as you may not own it), but you can dictate whether or not it should be executed (or executed as frequently).
+
+### Follow Ups
+
+* Is there any method that stands out to you that might be unnecessarily called?
+
+{{% nextSection %}}
+In the next section, we'll look at the Exceptions thrown by our application.
+{{% /nextSection %}}
diff --git a/docs/content/docs/jmc/threads.md b/docs/content/docs/jmc/threads.md
new file mode 100644
index 0000000..a9e9414
--- /dev/null
+++ b/docs/content/docs/jmc/threads.md
@@ -0,0 +1,56 @@
+---
+title: "Threads"
+weight: 13
+description: >
+ Find the computation and latency events in your application.
+---
+
+The __Threads__ page provides a snapshot of all threads in our application, and we can use it to acquire information about computation and latency events.
+
+
+
+### Thread Chart
+
+We can use the Thread Chart view to select a region of time and view the state of threads and the most common stack frames for that particular time slice:
+
+
+
+We can also edit the types of events shown by the chart. Right click on the chart, and select __Edit Thread Activity Lanes__
+
+
+
+We can then narrow down on specific events.
+
+For the purpose of this section filter on only the __Sleep__ events. Then, select a period of time and look at what has caused our threads to go to sleep for that particular period:
+
+
+
+
+
+Once you're done with the filtered view, right click on the __Thread__ page and Reset the page (to return to the default state).
+
+
+
+### By Thread
+
+We can select an individual thread from the __Thread Table__ to further filter the data just for that thread. From this filtered view, we can inspect what the commonly executed methods are for a particular thread.
+
+
+
+We can then use the stacktrace view to correlate what piece of code executed the most.
+
+
+
+## Explore
+
+There's a couple of threads specifically created by our application, these are the `wkshp-conf-loader` named threads. The `dw-*` named threads are threads created by DropWizard to handle specific requests (you might have noticed this based on the name containing a REST Resource). Explore the state of some of these threads while thinking about the follow up questions.
+
+### Follow Ups
+
+* Where are we spending most of our time sleeping? What is causing this?
+* Are there any unnecessary method invocations? Are any threads doing work that isn't visible?
+
+
+{{% nextSection %}}
+In the next section, we'll look at the Memory state of our application.
+{{% /nextSection %}}
diff --git a/docs/content/docs/memory/_index.md b/docs/content/docs/memory/_index.md
index a469272..79fc011 100644
--- a/docs/content/docs/memory/_index.md
+++ b/docs/content/docs/memory/_index.md
@@ -3,4 +3,5 @@ title: "Memory Analysis"
weight: 40
description: Analyzing the JVM heap with available tooling.
simple_list: true
+hide_readingtime: true
---
diff --git a/docs/content/docs/memory/capturing.md b/docs/content/docs/memory/capturing.md
new file mode 100644
index 0000000..d39beb0
--- /dev/null
+++ b/docs/content/docs/memory/capturing.md
@@ -0,0 +1,55 @@
+---
+title: "Capturing Heap Dumps"
+weight: 11
+description: Different ways to capture a heap dump.
+---
+
+You may be aware by now, there are many different ways of getting data from the JVM. Here are just a few ways to get heap dump of the JVM.
+
+## jcmd
+
+With `jcmd`, you have the ability to invoke the `GC.heap_dump` command. This requires that you
+are running as the same OS user as the target JVM process.
+
+```bash
+jcmd GC.heap_dump my_little_heap_dump.hprof
+```
+
+**Note:** If a full path is not specified, the heap_dump will be created relative to the location from where the process was started (when generated with jcmd)
+
+## jmap
+
+A more traditional approach is using `jmap` and invoking the command on the target process.
+
+```bash
+jmap -dump:format=b,file=my_little_heap_dump.hprof
+```
+
+## Core Dump
+
+You can also use `jmap` to extract a heap dump from a core dump on the process:
+
+```bash
+sudo gdb --pid=
+gcore /tmp/jvm.core
+detach
+quit
+jmap -dump:format=b,file=my_little_heap_dump.hprof /usr/bin/java /tmp/jvm.core
+```
+
+š” Capturing a heap dump from a core dump on Java 8, you may run into this issue:
+[JDK-8073606](http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8073606).
+
+### HotSpot Diagnostic MBean
+
+You can capture a heap dump by invoking a diagnostic MBean which is included in the Oracle JDK. You can do so by opening your favorite MBean browser (ex. `jconsole`, `jmc`) and invoke
+the `com.sun.management.HotSpotDiagnostic`. The arguments are:
+* Filename of the heap dump that will be created. š” Note, it will be created with file ownership of the hosting JVM process.
+* Indicator to dump all live object (true will dump __only live__ objects)
+
+
+
+
+{{% nextSection %}}
+In the next section, we'll start analyzing our heap dump with JOverflow.
+{{% /nextSection %}}
\ No newline at end of file
diff --git a/docs/content/docs/memory/challenge.md b/docs/content/docs/memory/challenge.md
new file mode 100644
index 0000000..b6d5f8d
--- /dev/null
+++ b/docs/content/docs/memory/challenge.md
@@ -0,0 +1,222 @@
+---
+title: "Memory Challenge"
+weight: 15
+description: Put all the pieces together with this challenge to test your skills
+---
+
+The provided WorkshopService has an intentional memory problem, use the previous sections as reference to try to pin point it.
+
+## Tips
+
+* With the Dominator Tree (Eclipse MAT) determine what object would free up the most memory (if we could get rid of it)
+* With the Histogram (Eclipse MAT) determine what type of object has the most instances
+ * Using the Incoming Objects view, find out what's pointing to them.
+
+Once you've found the large object, look through it's properties and determine why this object holds on to so many other objects.
+
+{{% alert title="Solution" color="warning" %}}
+This section contains a solution, make sure you've given things a shot before spoiling the fun.
+{{% /alert %}}
+
+{{% spoiler title="Show Solution" %}}
+## Dominator Tree
+
+A first glance at the dominator tree will point us to a `io.dropwizard.jetty.MutableServletContextHandler`, which is something controlled by the DropWizard framework. Let's dig through its references until we find some classes in the `cchesser` package.
+
+
+
+The first instance of a class we "own" is `cchesser.javaperf.workshop.resources.WorkshopResource`
+
+
+
+Let's look at it's properties a bit, and we'll find a `cchesser.javaperf.workshop.cache.CleverCache` reference with about 70% of the memory consumption.
+
+
+
+We'll look at its properties in a bit more detail in the following sections.
+
+## Histogram View
+
+A first glance at the Histogram View (sorted by retained heap), shows us about 2,000,000 instances of `cchesser.javaperf.workshop.data.Searcher$SearchResultElement`
+
+
+
+Looking through the references to an instance of this type, we end up being referenced by the `data` field in `cchesser.javaperf.workshop.cache.CleverCache$CacheEntry`
+
+
+
+We can further inspect the Incoming References for a particular entry, and see what is pointing to it, tracing it back to something we own:
+
+
+
+Once again, we've ended up at `cchesser.javaperf.workshop.resources.WorkshopResource`, specifically a field called `resultsByContext`.
+
+We'll take a closer look at this `cchesser.javaperf.workshop.cache.CleverCache` object.
+
+## Inspecting Clever Cache
+
+First, lets determine how many instances of `cchesser.javaperf.workshop.cache.CleverCache` we have. We've found a single instance that is about 70Mb (in our sample dump), so let's double check if there's more of these.
+
+We can do that in a couple of ways:
+
+1. Use the histogram view to filter on `CleverCache`
+
+
+
+2. Use OQL to find instances of that object:
+
+```sql
+select * from cchesser.javaperf.workshop.cache.CleverCache
+```
+
+
+
+### Fields/References
+
+We can find the fields and references for an instance using either Eclipse MAT or VisualVM.
+
+In Eclipse Mat, the fields for an instance display in an __Attributes__ tab
+
+
+
+
+In VisualVM, we can load the __Objects__ view and apply a filter on class name to then inspect the fields and references
+
+
+
+
+Looking at the properties, we find that there's a `cacheLimit` of `250`. Let's find out exactly how many entries are in the cache (the `innerCache` field).
+
+## Finding Sizes
+
+Let's write a query that will show us what the count of entries in the cache is.
+
+* For our query, we need to pull the `cacheLimit` and `size` of the `innerCache` map,
+
+We can do this a few ways:
+
+### Eclipse MAT / OQL
+
+ we can do that with the following query:
+```sql
+SELECT c.cacheLimit AS "max entries", c.innerCache.size AS entries FROM cchesser.javaperf.workshop.cache.CleverCache c
+```
+
+
+
+
+### Eclipse MAT / Calcite
+```sql
+select c.cacheLimit as "max entries", getSize(c.innerCache) as "entries"
+from cchesser.javaperf.workshop.cache.CleverCache c
+```
+
+
+
+
+### VisualVM / OQL
+
+```js
+var caches = heap.objects("cchesser.javaperf.workshop.cache.CleverCache")
+
+function report(cache) {
+ return { maxEntries: cache.cacheLimit, entries: cache.innerCache.size }
+}
+
+map(caches, report)
+```
+
+
+
+{{% pageinfo color="warning" %}}
+That doesn't seem right at all, we want at most 250 items but we have about 10,000. Let's find out why that is the case.
+{{% /pageinfo %}}
+
+
+## Memory Problem Explained
+
+The interaction between the `WorkshopResource` and `CleverCache` happens through the `/search` resource.
+
+_cchesser.javaperf.workshop.WorkshopResource_
+```java
+@GET
+@Path("/search")
+@Produces(MediaType.APPLICATION_JSON)
+@Timed
+public Searcher.SearchResult searchConference(@QueryParam("q") String term, @QueryParam("c") String context) {
+ return fetchResults(term, context);
+}
+
+private Searcher.SearchResult fetchResults(String term, String context) {
+
+ if (context != null && !context.isEmpty()) {
+ if (resultsByContext.exists(context)) {
+ return resultsByContext.fetch(context);
+ }
+ }
+
+// does not exist in cache, compute and store
+
+ SearchResult results = searcher.search(term);
+ resultsByContext.store(results.getResultsContext(), results);
+ return results;
+}
+```
+
+If a context is sent, the previously cached values for the search are returned, otherwise we cache those result values in case they need to be referenced again.
+
+_javaperf.workshop.cache.CleverCache_
+```java
+ /**
+ * Stores the given key value pair in the cache
+ *
+ * @param key the unique identifier associated with the given value
+ * @param value the value mapped to the given key
+ */
+ public void store(K key, V value) {
+ if (isFull()) {
+ K keyToRemove = getLFUKey();
+ CleverCache.CacheEntry removedEntry = innerCache.remove(keyToRemove);
+ }
+
+ CacheEntry newEntry = new CacheEntry();
+ newEntry.data = value;
+ newEntry.frequency = 0;
+
+ innerCache.put(key, newEntry);
+ }
+ // other methods
+ private boolean isFull() {
+ return innerCache.size() == cacheLimit;
+}
+```
+
+This interaction is **NOT** thread safe. Consider this scenario:
+
+* Thread 1 invokes `store` when the `innerCache.size()` is `249`
+ * `isFull()` evaluates to `false`
+ * Execution halts prior to `innerCache.put`
+* Thread 2 invokes `store` when the `innerCache.size()` is `249`
+ * `isFull()` evaluates to false
+ * Execution halts prior to `innerCache.put`
+* Thread 1 resumes and executes `innerCache.put`, `innerCache.size()` is now `250`
+* Thread 2 resumes and executes `innerCache.put`, `innerCache.size()` is now `251`
+* For the lifecycle of the jvm `isFull()` will no longer return `true`
+
+Fortunately, the DropWizard documentation calls out the need to consider thread safety:
+
+
+
+Since the `WorkshopResource` has a `resultsByContext` field that will get shared across threads, that type should be thread safe.
+
+### Potential Solutions
+
+* The naive solution would be to just change `isFull()` to consider `>=`, though that might lead to ConcurrentModificationExceptions
+* The proper solution would be to make the class Thread Safe
+
+{{% /spoiler %}}
+
+
+{{% nextSection %}}
+In the next section, we'll continue learn about Garbage Collection logs.
+{{% /nextSection %}}
diff --git a/docs/content/docs/memory/gc.md b/docs/content/docs/memory/gc.md
index 57f9929..41d2d68 100644
--- a/docs/content/docs/memory/gc.md
+++ b/docs/content/docs/memory/gc.md
@@ -4,22 +4,17 @@ weight: 20
description: Analyzing garbage collections of the JVM
---
-# Part 5: Garbage Collections
-
-In this workshop, we are going to do some analysis on the JVM in regards to it's garbage collection (GC)
+A key piece to understanding what is happening in terms of GC cycles within your service,
+is enabling GC logs. In this section, we are going to do some analysis on the JVM in regards to it's garbage collection (GC)
cycles.
-## Prerequisites
-
-* [R environment](https://www.r-project.org/) _(If you want to try parsing some of the logs)_
+{{% alert title="Prerequisite" color="info" %}}
+[R environment](https://www.r-project.org/) _(If you want to try parsing some of the logs)_
+{{% /alert %}}
-## Garbage Collection Logs
-
-A key piece to understanding what is happening in terms of GC cycles within your service,
-is enabling GC logs. In this section we will go over the JVM options you can enable on your
-service and how to interpret those logs.
+## GC JVM Options
-### JVM Options
+Here is a set of JVM options you can enable on your service and how to interpret those logs.
* `-XX:+PrintGCDetails`: Includes more details within your GC log
* `-XX:+PrintGCDateStamps`: Have a readable date/time string to correlate events in your log. Without
@@ -27,21 +22,21 @@ this option, your GC log will have elapsed time since the JVM was started. This
in seconds (with millisecond precision), is not easy for someone to quickly correlate when this event was
logged (as you have to infer the time based on when the JVM was started).
* `-Xloggc`: Specifies the log file for the garbage collection logs (otherwise will go to stdout).
-:bulb: Note: `-verbose:gc` is NOT necessary when you set `Xloggc` (it is implied).
+š” Note: `-verbose:gc` is NOT necessary when you set `Xloggc` (it is implied).
* `-XX:+UseGCLogFileRotation`: Support rotating your GC log file (you don't want to let this get too
big).
* `-XX:GCLogFileSize`: Size of the file for rotation (ex. `10M`).
-* `-XX:NumberOfGCLogFiles`: Number of GC log files to maintain (ex. `3`). :bulb: Note: if you are monitoring
+* `-XX:NumberOfGCLogFiles`: Number of GC log files to maintain (ex. `3`). š” Note: if you are monitoring
your log file with another solution (like [splunk](http://www.splunk.com/) or
[logstash](https://www.elastic.co/products/logstash)), you typically don't need to be keeping an inventory of
rolled files around, unless you are concerned about log forwarding failing and want to ensure a given amount
is still capable of being captured from a host.
-### GC Log formats
+## GC Log formats
With different garbage collectors in the JVM, you will get slightly different GC log formats.
-#### Parralel GC
+### Parallel GC
```
2015-09-30T10:57:20.215+0600: 0.847: [GC (Allocation Failure) [PSYoungGen: 65536K->10748K(76288K)] 65536K->12607K(251392K), 0.0118637 secs] [Times: user=0.03 sys=0.01, real=0.01 secs]
@@ -49,7 +44,7 @@ With different garbage collectors in the JVM, you will get slightly different GC
2015-09-30T10:57:20.564+0600: 1.196: [Full GC (Metadata GC Threshold) [PSYoungGen: 10748K->0K(141824K)] [ParOldGen: 2038K->10444K(116736K)] 12786K->10444K(258560K), [Metaspace: 20976K->20976K(1067008K)], 0.0286381 secs] [Times: user=0.14 sys=0.01, real=0.03 secs]
```
-#### CMS
+### Concurrent Mark Sweep
```
2015-09-30T11:11:35.994+0600: 0.838: [GC (Allocation Failure) 0.838: [ParNew: 69952K->8703K(78656K), 0.0128204 secs] 69952K->12781K(253440K), 0.0128848 secs] [Times: user=0.04 sys=0.01, real=0.01 secs]
@@ -67,7 +62,7 @@ With different garbage collectors in the JVM, you will get slightly different GC
2015-09-30T11:11:43.110+0600: 7.954: [CMS-concurrent-reset: 0.023/0.023 secs] [Times: user=0.01 sys=0.01, real=0.03 secs]
```
-#### G1
+### G1
```
015-09-30T11:13:03.870+0600: 0.395: [GC pause (G1 Evacuation Pause) (young), 0.0052206 secs]
@@ -155,7 +150,7 @@ With different garbage collectors in the JVM, you will get slightly different GC
[Times: user=0.01 sys=0.00, real=0.00 secs]
```
-#### Type of Collections
+## Type of Collections
A simple rule to watch for on your logs is the prefix of either:
@@ -177,16 +172,24 @@ the JVM to still have garbage collections, but it disables them from being trigg
> By default calls to System.gc() are enabled (-XX:-DisableExplicitGC). Use -XX:+DisableExplicitGC to disable calls to System.gc(). Note that the JVM still performs garbage collection when necessary.
-### Enabling GC logging
+## Gathering GC Logs
+
+### Enabling logs
With our service, let's go ahead and start it up with GC logging enabled:
```bash
# Navigate to the root directory of this project
java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log -XX:GCLogFileSize=5M -XX:NumberOfGCLogFiles=2 \
- -jar java-perf-workshop-server/target/java-perf-workshop-server-1.1.0-SNAPSHOT.jar server server.yml
+ -jar java-perf-workshop-server/target/java-perf-workshop-server-2.0-SNAPSHOT.jar server server.yml
```
+### Enabling while JVM is running
+
+In higher versions of the JDK (9+), you can enable GC logging without having to restart the JVM (reference: [Thomas Darimont](https://github.com/thomasdarimont)):
+
+{{< gist thomasdarimont f89fc79491241af7a064e1b3ca2757a9 >}}
+
### Parsing the log
For parsing the logs, we are just going to show a simple approach using [R](https://www.r-project.org/) to parse the
@@ -236,6 +239,8 @@ Notice that the `GCRealTime_Sec` should closely align with the `GCPauseTime_Sec`
`GCUserTime_Sec` is much larger than the `GCRealTime_Sec`, you can conclude that multiple threads are executing garbage collection,
as `GCUserTime_Sec` is just the sum time of all the threads.
-# GC Easy
+## External Tools
+
+### GC Easy
There's an existing tool [GC Easy](http://gceasy.io/) which will do GC log parsing and analysis as well.
diff --git a/docs/content/docs/memory/heap.md b/docs/content/docs/memory/heap.md
index 52f5360..e678596 100644
--- a/docs/content/docs/memory/heap.md
+++ b/docs/content/docs/memory/heap.md
@@ -4,270 +4,28 @@ weight: 10
description: Analyzing the heap of the JVM.
---
-In this workshop, we are going to do some analysis of the JVM's heap dump.
+In the following sections, we are going to do some analysis of the JVM's heap dump.
-## Prerequisites
+{{% alert title="Note" color="info" %}}
+Make sure you've gone through the [Prerequisites](/docs/prereqs)
+{{% /alert %}}
-* Java Mission Control (Oracle Java 7u40+)
-* [Eclipse Memory Analyzer](http://www.eclipse.org/mat/)
+First, we'll need to capture a heap dump:
-## Capture a Heap Dump
+* [Capturing a Heap Dump](/docs/memory/capturing/)
-You may be aware by now, there are many different ways of getting data from the JVM. Here are just a few ways to get heap dump of the JVM.
-
-### jcmd
-
-With `jcmd`, you have the ability to invoke the `GC.heap_dump` command. This requires that you
-are running as the same OS user as the target JVM process.
-
-```bash
-jcmd GC.heap_dump my_little_heap_dump.hprof
-```
-
-**Note:** If a full path is not specified, the heap_dump will be created relative to the location from where the process was started (when generated with jcmd)
-
-### jmap
-
-A more traditional approach is using `jmap` and invoking the command on the target process.
-
-```bash
-jmap -dump:format=b,file=my_little_heap_dump.hprof
-```
-
-### Core Dump
-
-You can also use `jmap` to extract a heap dump from a core dump on the process:
-
-```bash
-sudo gdb --pid=
-gcore /tmp/jvm.core
-detach
-quit
-jmap -dump:format=b,file=my_little_heap_dump.hprof /usr/bin/java /tmp/jvm.core
-
-```
-
-:bulb: Capturing a heap dump from a core dump on Java 8, you may run into this issue:
-[JDK-8073606](http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8073606).
-
-### HotSpot Diagnostic MBean
-
-You can capture a heap dump by invoking a diagnostic MBean which is included in the Oracle JDK. You can do so by opening your favorite MBean browser (ex. `jconsole`, `jmc`) and invoke
-the `com.sun.management.HotSpotDiagnostic`. The arguments are:
-* Filename of the heap dump that will be created. :bulb: Note, it will be created with file ownership of the hosting JVM process.
-* Indicator to dump all live object (true will dump __only live__ objects)
-
-
-
-## Analyze the Heap Dump
-
-As we had in capturing a heap dump, there are many different tools at looking at a heap dump.
-We will go through three common tools in which we can do some analysis of a heap dump. All of
+We will then go through three common tools in which we can do some analysis of a heap dump. All of
which are free. :smiley:
-### VisualVM
-
-[VisualVM](http://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/) is a tool which is part of Oracle's JDK (has been since Java 6). This tool was spawned from the [Netbeans Profiler](https://profiler.netbeans.org/), and it has some helpful tools to inspect a heap dump.
-
-To load the heap dump in VisualVM, you will just go to __File__ -> __Load...__ and specify the
-__File Format__ to be __Heap Dumps...__. Once it is loaded, a view will then be presented with
-the following sections:
-
-* Summary
-* Classes
-* Instances
-* OQL Console
-
-For the purpose of the workshop we are only going to utilize the __OQL Console__ to construct
-queries on the heap. There are other options in VisualVM which can give you context about your
-heap, but I feel there are other better tools we will touch on later. The attractive feature
-I like with VisualVM is that its __OQL Console__ allows you to write Javascript code to query
-objects, which you can then do other functions on that data.
-
-#### OQL Console
-
-From the __OQL Console__, we will issue queries and then allow you to further play around with the language.
-
-Query for Thread objects which are daemons (you can get context of Threads, since they
-are objects in your heap too):
-
-```js
-select t from java.lang.Thread t where t.daemon == true
-```
-
-These basic results which are returned, are essentially hyperlinks, that you can then click
-and begin diving into the instance state.
-
-Query for Thread objects (similar to last query), but return multiple attributes as JSON:
-
-```js
-select {name: t.name.toString(), thread_id: t.tid }
-from java.lang.Thread t
-where t.daemon == true
-```
-
-Query which includes a Javascript function to filter results by looking at all the ConferenceSession
-objects, and only report the ones which have _tags_.
-
-```js
-function hasTags(conf) {
- return conf.tags.size > 0
-}
-
-filter(heap.objects('cchesser.javaperf.workshop.data.ConferenceSession'), hasTags)
-```
-
-Take that previous query and further expand it to list it in JSON with the number of tags:
-
-```js
-function hasTags(conf) {
- return conf.tags.size > 0
-}
-
-map(filter(heap.objects('cchesser.javaperf.workshop.data.ConferenceSession'), hasTags),
- '{ conference: it, tags: it.tags.size }')
-```
-
-We can further expand this to sort the results, descending by number of tags, and list the tags in the results:
-
-```js
-function hasTags(conf) {
- return conf.tags.size > 0
-}
-
-sort(map(filter(heap.objects('cchesser.javaperf.workshop.data.ConferenceSession'), hasTags),
- '{ conference: it, tag_count: it.tags.size, tags: toArray(it.tags.elementData) }'), 'rhs.tag_count - lhs.tag_count')
-```
-
-Reference: [VisualVM OQL Help](https://htmlpreview.github.io/?https://raw.githubusercontent.com/visualvm/visualvm.java.net.backup/master/www/oqlhelp.html)
-
-:bulb: Note, the OQL which you use between this tool (and others), isn't necessarily _standard_, and therefore cannot be used between tooling without issues. VisualVM gives you
-the ability to leverage Javascript, which is unique to other tools supporting heap dump analysis.
-
-
-### Java Mission Control: JOverflow Plugin
-
-With [Java Mission Control](http://www.oracle.com/technetwork/java/javaseproducts/mission-control/java-mission-control-1998576.html), there is an ability to add plugins, one of which,
-is the JOverflow plugin. You can install it by going to __Help__ and select __Install New Software...__, and then select the __JOverflow Heap Analyzer__.
-
-
-
-Once this is installed, when you open a `.hprof` file, JOverflow will be loaded. Also, it
-add a context menu selection to __Dump Heap__ of JVMs from the JVM Browser.
-
-
-
-When you open a heap dump, an initial analysis is completed which lists a large range of anti-patterns and things that
-can be improved in relation to the memory you utilize.
-
-
-
-#### Anti-patterns
-
-Here is a listing of some the patterns that JOverflow identifies:
-
-* __Empty Unused Collections__: Empty collection, where modification `count == 0`.
-* __Empty Used Collections__: Empty collection, where modification `count != 0`.
-* __Small Sparse__: Only for array-based, where less than half the slots are occupied.
-Small is considered: size <= default (ex. 16 for HashMap).
-* __Large Sparse__: Only for array-based, where less than half the slots are occupied.
-Large is considered: Size > default.
-* __Boxed__: Contains boxed Numbers (ex. java.lang.Integer). Each of these boxed
-number has overhead as compared to their primitive counterpart due to object references.
-* __Small Collections__: Collections with 1 to 4 elements. There are fixed costs of collections, which may lend this
-set of data better hosted in an array vs. a full Java collection type.
-* __Vertical Bar Collections__: Collection which is a list of lists, where the outer collection
-is large, and it's elements are all small collections (ex. List(1000) of List(100))
-* __Zero Size Arrays__: Array where length == 0 (still consumers 12 - 16 bytes).
-* __Vertical Bar Arrays__: Similar to _Vertical Bar Collections_, but for arrays.
-* __Sparse Arrays__: Less than half of the elements are not null.
-* __Long Zero Tail Arrays__: Ends with a consecutive series of zeros, where the tail length is >= size / 2.
-* __Empty Arrays__: Only null elements.
-* __Duplicate Arrays__: Where an array contents are the same in another instance, but they are separate array instances.
-* __Duplicate Strings__: Same as _Duplicate Array_, where `string1.equals(string2)` and `string1 != string2`.
-
-Reference: [JOverflow: Advanced Heap Analysis in Java Mission Control](https://www.youtube.com/watch?v=b-mv9iWY8kw)
-
-#### Filtering
-
-As you play with JOverflow, once you click on something, it will begin filtering down your content. If you wish to reduce
-down to code that you may own, you can start doing a package filter on the ancestor section. In this example, I want to see duplicate strings for code under `cchesser`. In this case, I can see that our workshop service has several duplicate
-strings (as this content is replicated on each object):
-* Regular Session
-* 4-Hour Workshop
-* 8-Hour Workshop
-
-However, the number of instances / overhead is extremely low (since this is a small service), it gives you visibility of areas that you could optimize.
-
-
-
-### Eclipse Memory Analyzer
-
-[Eclipse Memory Analyzer](https://eclipse.org/mat/) is a fairly mature tool on analyzing heap dumps. It is a rich tool that includes the abilities to do OQL queries on the heap, general reporting on anti-patterns, and helpful common views (like the dominator tree). Eclipse Memory Analyzer tool is a separate install which can be a standalone install, or it can run as a plugin within Eclipse. First, install the tool if you haven't already via their [downloads page](https://eclipse.org/mat/downloads.php).
-
-After you have it installed, go to __File__ and then __Open Heap Dump...__ and specify the `hprof` file that you wish to analyze.
-
-:bulb: When Eclipse Memory Analyzer loads your `hprof` file, it will create many other index files to assist in optimally analyzing and navigating through your heap dump. It may make it easier to isolate your `prof` file in its own directory prior to opening it, based on the secondary files which are created. You can always just delete these files within Eclipse Memory Analyzer by opening the __Heap Dump History__ window, right-clicking the `hprof` which was previously loaded, and selecting __Delete Index Files__. Example listing of index files which get generated by suffix:
-
-* `.domIn.index`
-* `.domOut.index`
-* `.index`
-* `.o2ret.index`
-* `.a2s.index`
-* `.idx.index`
-* `.inbound.index`
-* `.o2c.index`
-* `.o2hprof.index`
-* `.outbound.index`
-* `.threads`
-
-#### Dominator Tree
-
-A common first area to look at your heap within Eclipse Memory Analyzer is the dominator tree. From the dominator tree, you can organize by the retained heap size, and then begin drilling down the tree to see the contributors to the largest GC roots.
-
-
-
-#### Histogram
-
-The histogram gives you a quick listing of all the top consumers by type. Typically this is going to provide context of the large consumers based on their "lower-level" types. For example, `char[]` is a common large contributor, which then will be followed by `String` which is a type that is predominately weighted by the size of the `char[]`.
-
-
-
-#### Thread Overview
-
-The thread overview is a helpful view when you are looking at contributors based on the execution of code. For example, if you have a JVM which has thrown an `OutOfMemoryError`, you can tell if some type of request caused a massive spike which caused the exhaustion of memory, or if the requests may have not been abnormal, there just wasn't sufficient space to support the request.
-
-
-
-#### OQL
-
-Another strong feature of Eclipse Memory Analyzer is the OQL studio to execute queries to do lookup on objects in your heap.
-
-Lookup our `ConferenceSession` class type:
-
-```sql
-SELECT *
-FROM INSTANCEOF cchesser.javaperf.workshop.data.ConferenceSession
-```
-
-:bulb: To execute the query, you click on the red exclamation mark (:exclamation:). Alternatively, you can press `CTRL+Enter` on Windows or `Command+Enter` on macOS.
-
-
-
-By returning the raw type back, you can expand each one to further look at the contents of the object. If you wanted to just report the object with its `title` attribute and the object's retained sized, you could do this:
-
-```sql
-SELECT c.title.toString(), c.@retainedHeapSize
-FROM INSTANCEOF cchesser.javaperf.workshop.data.ConferenceSession c
-```
-
-Now, you could then filter this by including a `WHERE` clause, where you can filter it by
-the title or the abstract:
+* [JOverflow Analysis](/docs/memory/joverflow)
+* [Eclipse MAT](/docs/memory/mat)
+* [VisualVM](/docs/memory/visualvm)
-```sql
-SELECT c.title.toString(), c.@retainedHeapSize FROM INSTANCEOF cchesser.javaperf.workshop.data.ConferenceSession c
-WHERE c.title.toString() LIKE ".*(J|j)ava.*" OR c.abstract.toString() LIKE ".*(J|j)ava.*"
-```
+We will then tie all our knowledge together and attempt to solve a quick challenge:
+* [Memory Challenge](/docs/memory/challenge)
-Reference: [Eclipse Memory Analyzer OQL Syntax](http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Freference%2Foqlsyntax.html)
+
+{{% nextSection %}}
+In the next section, we'll learn how to acquire a Heap Dump.
+{{% /nextSection %}}
\ No newline at end of file
diff --git a/docs/content/docs/memory/joverflow.md b/docs/content/docs/memory/joverflow.md
new file mode 100644
index 0000000..ebc84e9
--- /dev/null
+++ b/docs/content/docs/memory/joverflow.md
@@ -0,0 +1,98 @@
+---
+title: "JOverflow"
+weight: 12
+description: Heap Analysis using JOverflow
+---
+
+Included in [JDK Mission Control](https://www.oracle.com/java/technologies/jdk-mission-control.html) is a plugin that used to be a separate instance, the JOverflow Heap Analyzer. This plugin now adds a context menu selection to __Dump Heap__ of JVMs from the JVM Browser.
+
+
+
+**JOverflow** is a great tool to start our analysis with since it is tailored to identifying common anti-patterns present in most heap dumps. This should give us an idea of the kinds of problems we can see in our JVMs.
+
+
+
+## Anti-Patterns
+
+Here is a listing of some the patterns that JOverflow identifies:
+
+* __Empty Unused Collections__: Empty collection, where modification `count == 0`.
+* __Empty Used Collections__: Empty collection, where modification `count != 0`.
+* __Small Sparse__: Only for array-based, where less than half the slots are occupied.
+Small is considered: size <= default (ex. 16 for HashMap).
+* __Large Sparse__: Only for array-based, where less than half the slots are occupied.
+Large is considered: Size > default.
+* __Boxed__: Contains boxed Numbers (ex. java.lang.Integer). Each of these boxed
+number has overhead as compared to their primitive counterpart due to object references.
+* __Small Collections__: Collections with 1 to 4 elements. There are fixed costs of collections, which may lend this
+set of data better hosted in an array vs. a full Java collection type.
+* __Vertical Bar Collections__: Collection which is a list of lists, where the outer collection
+is large, and it's elements are all small collections (ex. List(1000) of List(100))
+* __Zero Size Arrays__: Array where length == 0 (still consumers 12 - 16 bytes).
+* __Vertical Bar Arrays__: Similar to _Vertical Bar Collections_, but for arrays.
+* __Sparse Arrays__: Less than half of the elements are not null.
+* __Long Zero Tail Arrays__: Ends with a consecutive series of zeros, where the tail length is >= size / 2.
+* __Empty Arrays__: Only null elements.
+* __Duplicate Arrays__: Where an array contents are the same in another instance, but they are separate array instances.
+* __Duplicate Strings__: Same as _Duplicate Array_, where `string1.equals(string2)` and `string1 != string2`.
+
+Reference: [JOverflow: Advanced Heap Analysis in JDK Mission Control](https://www.youtube.com/watch?v=b-mv9iWY8kw)
+
+## Filtering
+
+As you play with JOverflow, once you click on something, it will begin filtering down your content. If you wish to reduce down to code that you may own, you can start doing a package filter on the ancestor section.
+
+In this example, I want to see duplicate strings for code under `cchesser`. In this case, I can see that our workshop service has several duplicate
+strings (as this content is replicated on each object):
+* Regular Session
+* 4-Hour Workshop
+* 8-Hour Workshop
+
+However, the number of instances / overhead is extremely low (since this is a small service), it gives you visibility of areas that you could optimize.
+
+
+
+### Navigating
+
+Since JOverflow's mechanism of drilling down is by applying filters, it doesn't have an easy way to undo most operations, and instead relies on resetting the state to the unfiltered state. You can undo all operations by using the backwards arrow button:
+
+
+
+## Instances
+
+We can also use the plugin to drill down a bit into particular instances.
+
+We can enable the instances view by navigating to:
+
+1. Window > Show View > Other
+
+2. Selecting JOverflow Instances
+
+
+
+### Example - Arrays Size 1
+
+In the following example, we're going to find:
+
+1. Arrays with One Element
+
+2. Coming from our WorkshopConfiguration
+
+
+This should filter the Instances view down to that single object.
+
+
+
+### Example - Conference Session Details
+
+We can use this same mechanism to also explore values of some of the classes we own, in the next example we're going to:
+
+1. Use All Objects of type Conference Session
+
+2. Drill down into a couple of the instances
+
+
+
+{{% nextSection %}}
+In the next section, we'll continue our analysis in Eclipse MAT.
+{{% /nextSection %}}
\ No newline at end of file
diff --git a/docs/content/docs/memory/mat.md b/docs/content/docs/memory/mat.md
new file mode 100644
index 0000000..50e89b1
--- /dev/null
+++ b/docs/content/docs/memory/mat.md
@@ -0,0 +1,133 @@
+---
+title: "Eclipse MAT"
+weight: 13
+description: Heap Analysis using Eclipse MAT
+---
+
+{{% alert title="Note" color="info" %}}
+Make sure you've gone through the [Prerequisites](/docs/prereqs)
+{{% /alert %}}
+
+[Eclipse Memory Analyzer](https://eclipse.org/mat/) is a fairly mature tool on analyzing heap dumps. It is a rich tool that includes the abilities to do OQL queries on the heap, general reporting on anti-patterns, and helpful common views (like the dominator tree). Eclipse Memory Analyzer tool is a separate install which can be a standalone install, or it can run as a plugin within Eclipse.
+
+## Opening Heap Dumps
+
+After you have it installed, go to __File__ and then __Open Heap Dump...__ and specify the `hprof` file that you wish to analyze.
+
+### Index Files
+
+š” When Eclipse Memory Analyzer loads your `hprof` file, it will create many other index files to assist in optimally analyzing and navigating through your heap dump. It may make it easier to isolate your `prof` file in its own directory prior to opening it, based on the secondary files which are created. You can always just delete these files within Eclipse Memory Analyzer by opening the __Heap Dump History__ window, right-clicking the `hprof` which was previously loaded, and selecting __Delete Index Files__. Example listing of index files which get generated by suffix:
+
+* `.domIn.index`
+* `.domOut.index`
+* `.index`
+* `.o2ret.index`
+* `.a2s.index`
+* `.idx.index`
+* `.inbound.index`
+* `.o2c.index`
+* `.o2hprof.index`
+* `.outbound.index`
+* `.threads`
+
+## Analyzing the Heap Dump
+
+In the following section, we'll go through a couple of the views and what sort of data we can gather from them.
+
+### Dominator Tree
+
+A common first area to look at your heap within Eclipse Memory Analyzer is the dominator tree. From the dominator tree, you can organize by the retained heap size, and then begin drilling down the tree to see the contributors to the largest GC roots.
+
+
+
+### Histogram
+
+The histogram gives you a quick listing of all the top consumers by type. Typically this is going to provide context of the large consumers based on their "lower-level" types. For example, `char[]` is a common large contributor, which then will be followed by `String` which is a type that is predominately weighted by the size of the `char[]`.
+
+
+
+From the histogram, we can drill down into particular instances of an object and see what's referencing them by right clicking on a row and selecting __List Objects__ > __with Incoming References__
+
+
+
+This should let us drill down into an instance and find what exactly is holding on to that specific value:
+
+
+
+Since this view shows references by incoming link, we would read the results as:
+
+"angularjs" is pointed to by the `[0]` index of the `tags` of a specific `ConferenceSession` instance, which is pointed to by `LocalCache`. Notice that this specific example is the inverse of what we found with the dominator tree, if we explored this table enough we would end up at a `ConferenceSessionLoader` reference.
+
+### Thread Overview
+
+The thread overview is a helpful view when you are looking at contributors based on the execution of code. For example, if you have a JVM which has thrown an `OutOfMemoryError`, you can tell if some type of request caused a massive spike which caused the exhaustion of memory, or if the requests may have not been abnormal, there just wasn't sufficient space to support the request.
+
+
+
+{{% alert title="Warning" color="warning" %}}
+It may be the case that the thread that has the OutOfMemoryError in its stack is not the root cause. Consider the following example:
+
+* We have a max heap of 128 Mb.
+* A request comes in that produces a 125Mb `int[]`
+* A second request comes in that produces a 5Mb `int[]`.
+
+The JVM would potentially throw the OutOfMemory on that second request, since there's not enough memory to allocate 5Mb, however, it might be the case that the code path for the initial request is allocating memory unnecessarily.
+{{% /alert %}}
+
+### OQL
+
+Another strong feature of Eclipse Memory Analyzer is the OQL studio to execute queries to do lookup on objects in your heap.
+
+Lookup our `ConferenceSession` class type:
+
+```sql
+SELECT *
+FROM INSTANCEOF cchesser.javaperf.workshop.data.ConferenceSession
+```
+
+š” To execute the query, you click on the red exclamation mark (:exclamation:). Alternatively, you can press `CTRL+Enter` on Windows or `Command+Enter` on macOS.
+
+
+
+By returning the raw type back, you can expand each one to further look at the contents of the object. If you wanted to just report the object with its `title` attribute and the object's retained sized, you could do this:
+
+```sql
+SELECT c.title.toString(), c.@retainedHeapSize
+FROM INSTANCEOF cchesser.javaperf.workshop.data.ConferenceSession c
+```
+
+Now, you could then filter this by including a `WHERE` clause, where you can filter it by
+the title or the abstract:
+
+```sql
+SELECT c.title.toString(), c.@retainedHeapSize FROM INSTANCEOF cchesser.javaperf.workshop.data.ConferenceSession c
+WHERE c.title.toString() LIKE ".*(J|j)ava.*" OR c.abstract.toString() LIKE ".*(J|j)ava.*"
+```
+
+Reference: [Eclipse Memory Analyzer OQL Syntax](http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Freference%2Foqlsyntax.html)
+
+The auto-completion will also let you invoke fields and method's from Eclipse Mat's own [internal model](https://wiki.eclipse.org/MemoryAnalyzer/Reading_Data_from_Heap_Dumps#The_object_model) for the heap dump. You can view other methods available by exploring the [API Reference](http://127.0.0.1:64030/help/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Fdoc%2Forg%2Feclipse%2Fmat%2Fsnapshot%2Fmodel%2FIObject.html)
+
+
+
+## Useful Plugins
+
+### Calcite MAT
+
+The [Calcite MAT Plugin](https://github.com/vlsi/mat-calcite-plugin) adds sort, group by and join behavior (among other things) and an additional SQL query engine.
+
+We can use this plugin to do some more advanced analysis, for example:
+
+* Getting a distribution of the number of tags in our ConferenceSessions
+```sql
+select getSize(c.tags) tag_cnt, count(getSize(c.tags))
+from "cchesser.javaperf.workshop.data.ConferenceSession" c
+group by tag_cnt
+order by tag_cnt desc
+```
+
+
+
+{{% nextSection %}}
+In the next section, we'll continue our analysis in VisualVM.
+{{% /nextSection %}}
\ No newline at end of file
diff --git a/docs/content/docs/memory/visualvm.md b/docs/content/docs/memory/visualvm.md
new file mode 100644
index 0000000..db1afdf
--- /dev/null
+++ b/docs/content/docs/memory/visualvm.md
@@ -0,0 +1,291 @@
+---
+title: "VisualVM"
+weight: 14
+description: Heap Analysis using VisualVM
+---
+
+{{% alert title="Note" color="info" %}}
+Make sure you've gone through the [Prerequisites](/docs/prereqs)
+{{% /alert %}}
+
+[VisualVM](http://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/) is a tool which used to be part of Oracle's JDK and is now a [standalone tool](https://visualvm.github.io/). This tool was spawned from the [Netbeans Profiler](https://profiler.netbeans.org/), and it has some helpful tools to inspect a heap dump.
+
+## Opening Dumps
+
+To load the heap dump in VisualVM, you will just go to __File__ -> __Load...__ and specify the
+__File Format__ to be __Heap Dumps...__.
+
+
+
+## Analyzing the Heap Dump
+
+VisualVM offers the following sections:
+
+* Summary
+* Objects
+* Threads
+* OQL Console
+* R Console
+
+For the purpose of this section we are only going to utilize the __OQL Console__ to construct
+queries on the heap. There are other options in VisualVM (briefly discussed here), but we feel that the other tools presented before this offer much nicer views/data.
+
+### Summary
+
+The __Summary__ view gives you a quick overview of the state of the heap:
+
+
+
+This view also lets you quickly gather the dominators for the heap, similar to the Dominator Tree in Eclipse MAT.
+
+
+
+### Objects
+
+The __Objects__ view groups instances by class.
+
+
+
+Within this view, you can inspect individual instances of an object and see both the fields and the incoming references to that instance:
+
+
+
+### Threads
+
+The __Threads__ view visualizes the state of threads.
+
+
+
+Within this view, you can drill down into certain threads and view what was specifically referenced in a stack frame:
+
+
+
+
+### OQL Console
+
+One of the attractive features for VisualVM is that its __OQL Console__ allows you to write Javascript code to query objects, which you can then do other functions on that data.
+
+From the __OQL Console__, we will issue queries and then allow you to further play around with the language.
+
+## OQL Queries
+
+{{% alert title="Note" color="info" %}}
+The OQL which you use between this tool (and others), isn't necessarily _standard_, and therefore cannot be used between tooling without issues. VisualVM gives you
+the ability to leverage Javascript, which is unique to other tools supporting heap dump analysis.
+{{% /alert %}}
+
+Reference: [VisualVM OQL Help](https://htmlpreview.github.io/?https://raw.githubusercontent.com/visualvm/visualvm.java.net.backup/master/www/oqlhelp.html)
+
+### Deamon Threads
+
+Query for Thread objects which are daemons (you can get context of Threads, since they
+are objects in your heap too):
+
+```js
+select t from java.lang.Thread t where t.daemon == true
+```
+
+Previous versions of VisualVM used to return the results as hyperlinks, which you could then click
+and begin diving into the instance state:
+
+
+
+The newer versions of VisualVM will populate the results in a view similar to the __Objects__ view:
+
+
+
+### Mapping to JSON
+
+Query for Thread objects (similar to last query), but return multiple attributes as JSON:
+
+```js
+select {name: t.name.toString(), thread_id: t.tid }
+from java.lang.Thread t
+where t.daemon == true
+```
+
+
+
+### Applying Javascript
+
+VisualVM offers a helper object that represents the heap, the `heap` object, which offers a few useful functions.
+
+
+
+
+During our OQL searching, we'll be using `heap.objects` to gather the set of objects we want.
+
+We'll start by limiting our objects to instances of `cchesser.javaperf.workshop.data.ConferenceSession` and assign it to a variable called `sessions` (which we'll reference later).
+
+```js
+var sessions = heap.objects('cchesser.javaperf.workshop.data.ConferenceSession');
+```
+
+We're going to find ConferenceSessions that which have _tags_, we'll do that by writing a Javascript function to filter results which have _tags_. We'll apply this filter to our `sessions`.
+
+```js
+var sessions = heap.objects('cchesser.javaperf.workshop.data.ConferenceSession');
+
+function hasTags(conf) {
+ return conf.tags.size > 0
+}
+
+filter(sessions, hasTags);
+```
+
+
+
+
+Take that previous query and further expand it to list it in JSON with the number of tags. It is often times convenient to have a reference to the object we're interacting with, to more easily see the available fields.
+
+```js
+var sessions = heap.objects('cchesser.javaperf.workshop.data.ConferenceSession');
+
+function hasTags(conf) {
+ return conf.tags.size > 0
+}
+
+var withTags = filter(sessions, hasTags);
+
+function toJSON(conf) {
+return { conference: conf , tagCount : conf.tags.size };
+}
+
+map(withTags, toJSON);
+```
+
+
+
+
+We can further expand this to sort the results, descending by number of tags, and list the tags in the results:
+
+```js
+var sessions = heap.objects('cchesser.javaperf.workshop.data.ConferenceSession');
+
+function hasTags(conf) {
+ return conf.tags.size > 0
+}
+
+var withTags = filter(sessions, hasTags);
+
+function toJSON(conf) {
+ return { conference: conf , tagCount : conf.tags.size };
+}
+
+var confs = map(withTags, toJSON);
+
+function tagSorter(lhs, rhs) {
+ return rhs.tagCount - lhs.tagCount;
+}
+
+sort(confs, tagSorter);
+```
+
+
+
+We could also inline most of this using the inline syntax:
+
+```js
+function hasTags(conf) {
+ return conf.tags.size > 0
+}
+
+sort(map(filter(heap.objects('cchesser.javaperf.workshop.data.ConferenceSession'), hasTags),
+ '{ conference: it, tag_count: it.tags.size, tags: toArray(it.tags.elementData) }'), 'rhs.tag_count - lhs.tag_count')
+```
+
+
+
+## Useful Plugins
+
+### OQL Syntax Support
+
+This plugin adds some auto complete and syntax highlighting to the OQL Console
+
+
+
+## Challenge
+
+Apply what you've learned about OQL in this section and write some javascript that will show the distribution of tag counts in our conference sessions (similar to what we did with calcite mat.)
+
+### Sample Solutions
+
+#### JSON Output
+
+This solution will return the result as a JSON object.
+
+{{% spoiler title="Show JSON" %}}
+
+```js
+var sessions = heap.objects('cchesser.javaperf.workshop.data.ConferenceSession');
+
+function toJSON(conf) {
+ return { conference: conf , tagCount : conf.tags ? conf.tags.size : 0, title: conf.title };
+}
+
+var confs = map(sessions, toJSON);
+
+var results = {}
+var arr = toArray(confs)
+arr.length;
+
+for(var i = 0; i < arr.length; i++) {
+ var conf = arr[i];
+ if(!results[conf.tagCount]) {
+ results[conf.tagCount] = 0;
+ }
+ results[conf.tagCount] = results[conf.tagCount] + 1;
+}
+results
+```
+
+
+
+{{% /spoiler %}}
+
+#### HTML Output
+
+This solution will return the result as an HTML `
diff --git a/docs/layouts/shortcodes/gist.html b/docs/layouts/shortcodes/gist.html
new file mode 100644
index 0000000..3dec2a0
--- /dev/null
+++ b/docs/layouts/shortcodes/gist.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/layouts/shortcodes/nextSection.html b/docs/layouts/shortcodes/nextSection.html
new file mode 100644
index 0000000..e72757b
--- /dev/null
+++ b/docs/layouts/shortcodes/nextSection.html
@@ -0,0 +1,20 @@
+{{/*
+ Iterates over the set of pages in the current section, locating the current page and creating a link with the contents of the next page.
+ */}}
+ {{ $scratch := newScratch }}
+ {{ range $index, $element := $.Page.CurrentSection.Pages.ByWeight }}
+ {{ if (eq $.Page.Params.weight .Params.weight) }}
+ {{ $scratch.Set "nextIndex" (add 1 $index)}}
+ {{ end }}
+ {{ end }}
+ {{ with index $.Page.CurrentSection.Pages.ByWeight ($scratch.Get "nextIndex") }}
+
+
+ {{ end}}
\ No newline at end of file
diff --git a/docs/layouts/shortcodes/spoiler.html b/docs/layouts/shortcodes/spoiler.html
new file mode 100644
index 0000000..2d6f6bc
--- /dev/null
+++ b/docs/layouts/shortcodes/spoiler.html
@@ -0,0 +1,12 @@
+
+
+
+
+ {{ .Inner }}
+
+
\ No newline at end of file
diff --git a/docs/package-lock.json b/docs/package-lock.json
new file mode 100644
index 0000000..744d175
--- /dev/null
+++ b/docs/package-lock.json
@@ -0,0 +1,1277 @@
+{
+ "name": "docs",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "devDependencies": {
+ "autoprefixer": "^10.4.21",
+ "postcss": "^8.2.10",
+ "postcss-cli": "^8.3.1",
+ "reveal.js": "^6.0.1"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
+ "dev": true
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "node_modules/@babel/highlight/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
+ "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.4",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz",
+ "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz",
+ "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.4",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
+ "dev": true
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.21",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
+ "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.24.4",
+ "caniuse-lite": "^1.0.30001702",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.1.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+ "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.5",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz",
+ "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001716",
+ "electron-to-chromium": "^1.5.149",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001717",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz",
+ "integrity": "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.0.tgz",
+ "integrity": "sha512-JgQM9JS92ZbFR4P90EvmzNpSGhpPBGBSj10PILeDyYFwp4h2/D9OM03wsJ4zW1fEp4ka2DGrnUeD7FuvQ2aZ2Q==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.5.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.1"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/colorette": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
+ "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
+ "dev": true
+ },
+ "node_modules/cosmiconfig": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
+ "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
+ "dev": true,
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/dependency-graph": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.9.0.tgz",
+ "integrity": "sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.150",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.150.tgz",
+ "integrity": "sha512-rOOkP2ZUMx1yL4fCxXQKDHQ8ZXwisb2OycOQVKHgvB3ZI4CvehOd4y2tfnnLDieJ3Zs1RL1Dlp3cMkyIn7nnXA==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
+ "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.0",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.2",
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz",
+ "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
+ "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
+ "dev": true,
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz",
+ "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-stdin": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
+ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz",
+ "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.1.1",
+ "ignore": "^5.1.4",
+ "merge2": "^1.3.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+ "dev": true
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz",
+ "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==",
+ "dev": true,
+ "dependencies": {
+ "import-from": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz",
+ "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==",
+ "dev": true,
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/import-from/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonfile/node_modules/universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+ "dev": true
+ },
+ "node_modules/lodash.difference": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
+ "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=",
+ "dev": true
+ },
+ "node_modules/lodash.forown": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-4.4.0.tgz",
+ "integrity": "sha1-hRFc8E9z75ZuztUlEdOJPMRmg68=",
+ "dev": true
+ },
+ "node_modules/lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
+ "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.",
+ "dev": true
+ },
+ "node_modules/lodash.groupby": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz",
+ "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=",
+ "dev": true
+ },
+ "node_modules/lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.1.23",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
+ "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "dev": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
+ "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.2.10",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.10.tgz",
+ "integrity": "sha512-b/h7CPV7QEdrqIxtAf2j31U5ef05uBDuvoXv6L51Q4rcS1jdlXAVKJv+atCFdUXYl9dyTHGyoMzIepwowRJjFw==",
+ "dev": true,
+ "dependencies": {
+ "colorette": "^1.2.2",
+ "nanoid": "^3.1.22",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-cli": {
+ "version": "8.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-8.3.1.tgz",
+ "integrity": "sha512-leHXsQRq89S3JC9zw/tKyiVV2jAhnfQe0J8VI4eQQbUjwIe0XxVqLrR+7UsahF1s9wi4GlqP6SJ8ydf44cgF2Q==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "chokidar": "^3.3.0",
+ "dependency-graph": "^0.9.0",
+ "fs-extra": "^9.0.0",
+ "get-stdin": "^8.0.0",
+ "globby": "^11.0.0",
+ "postcss-load-config": "^3.0.0",
+ "postcss-reporter": "^7.0.0",
+ "pretty-hrtime": "^1.0.3",
+ "read-cache": "^1.0.0",
+ "slash": "^3.0.0",
+ "yargs": "^16.0.0"
+ },
+ "bin": {
+ "postcss": "bin/postcss"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.0.0.tgz",
+ "integrity": "sha512-lErrN8imuEF1cSiHBV8MiR7HeuzlDpCGNtaMyYHlOBuJHHOGw6S4xOMZp8BbXPr7AGQp14L6PZDlIOpfFJ6f7w==",
+ "dev": true,
+ "dependencies": {
+ "cosmiconfig": "^7.0.0",
+ "import-cwd": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-reporter": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.2.tgz",
+ "integrity": "sha512-JyQ96NTQQsso42y6L1H1RqHfWH1C3Jr0pt91mVv5IdYddZAE9DUZxuferNgk6q0o6vBVOrfVJb10X1FgDzjmDw==",
+ "dev": true,
+ "dependencies": {
+ "colorette": "^1.2.1",
+ "lodash.difference": "^4.5.0",
+ "lodash.forown": "^4.4.0",
+ "lodash.get": "^4.4.2",
+ "lodash.groupby": "^4.6.0",
+ "lodash.sortby": "^4.7.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/postcss/node_modules/colorette": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
+ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
+ "dev": true
+ },
+ "node_modules/pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+ "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/reveal.js": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/reveal.js/-/reveal.js-6.0.1.tgz",
+ "integrity": "sha512-9eacArNIgqO2HGWOK+93gJNn+gvdGDVbSq+i2u3Ja9kjiHps0XNLpgYTZTYjKRH91uXy3clGimeGiw4umHG/tg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/run-parallel": {
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz",
+ "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
+ "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
+ "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yaml": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
+ "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ }
+ }
+}
diff --git a/docs/package.json b/docs/package.json
new file mode 100644
index 0000000..b9d5ca4
--- /dev/null
+++ b/docs/package.json
@@ -0,0 +1,8 @@
+{
+ "devDependencies": {
+ "autoprefixer": "^10.4.21",
+ "postcss": "^8.2.10",
+ "postcss-cli": "^8.3.1",
+ "reveal.js": "^6.0.1"
+ }
+}
diff --git a/docs/static/containers/jmx/all_jmx_servers.png b/docs/static/containers/jmx/all_jmx_servers.png
new file mode 100644
index 0000000..3c089b8
Binary files /dev/null and b/docs/static/containers/jmx/all_jmx_servers.png differ
diff --git a/docs/static/containers/jmx/empty_browser.png b/docs/static/containers/jmx/empty_browser.png
new file mode 100644
index 0000000..0e89565
Binary files /dev/null and b/docs/static/containers/jmx/empty_browser.png differ
diff --git a/docs/static/containers/jmx/new_connection.png b/docs/static/containers/jmx/new_connection.png
new file mode 100644
index 0000000..f722006
Binary files /dev/null and b/docs/static/containers/jmx/new_connection.png differ
diff --git a/docs/static/diagrams/interaction_wiremock.png b/docs/static/diagrams/interaction_wiremock.png
new file mode 100644
index 0000000..dec5817
Binary files /dev/null and b/docs/static/diagrams/interaction_wiremock.png differ
diff --git a/docs/static/diagrams/jmx_remote_docker.png b/docs/static/diagrams/jmx_remote_docker.png
new file mode 100644
index 0000000..3b628e3
Binary files /dev/null and b/docs/static/diagrams/jmx_remote_docker.png differ
diff --git a/docs/static/diagrams/web_traffic.png b/docs/static/diagrams/web_traffic.png
new file mode 100644
index 0000000..e4b4f54
Binary files /dev/null and b/docs/static/diagrams/web_traffic.png differ
diff --git a/docs/static/diagrams/workshop_docker_setup.png b/docs/static/diagrams/workshop_docker_setup.png
new file mode 100644
index 0000000..7bf52b3
Binary files /dev/null and b/docs/static/diagrams/workshop_docker_setup.png differ
diff --git a/docs/static/diagrams/workshop_service_interaction.png b/docs/static/diagrams/workshop_service_interaction.png
new file mode 100644
index 0000000..09b47b0
Binary files /dev/null and b/docs/static/diagrams/workshop_service_interaction.png differ
diff --git a/docs/static/favicons/android-144x144.png b/docs/static/favicons/android-144x144.png
new file mode 100644
index 0000000..ee455db
Binary files /dev/null and b/docs/static/favicons/android-144x144.png differ
diff --git a/docs/static/favicons/android-192x192.png b/docs/static/favicons/android-192x192.png
new file mode 100644
index 0000000..235ee38
Binary files /dev/null and b/docs/static/favicons/android-192x192.png differ
diff --git a/docs/static/favicons/android-36x36.png b/docs/static/favicons/android-36x36.png
new file mode 100644
index 0000000..c9585cb
Binary files /dev/null and b/docs/static/favicons/android-36x36.png differ
diff --git a/docs/static/favicons/android-48x48.png b/docs/static/favicons/android-48x48.png
new file mode 100644
index 0000000..d8feced
Binary files /dev/null and b/docs/static/favicons/android-48x48.png differ
diff --git a/docs/static/favicons/android-72x72.png b/docs/static/favicons/android-72x72.png
new file mode 100644
index 0000000..e401bb9
Binary files /dev/null and b/docs/static/favicons/android-72x72.png differ
diff --git a/docs/static/favicons/android-96x96.png b/docs/static/favicons/android-96x96.png
new file mode 100644
index 0000000..3edc5f5
Binary files /dev/null and b/docs/static/favicons/android-96x96.png differ
diff --git a/docs/static/favicons/apple-touch-icon-180x180.png b/docs/static/favicons/apple-touch-icon-180x180.png
new file mode 100644
index 0000000..ef92d70
Binary files /dev/null and b/docs/static/favicons/apple-touch-icon-180x180.png differ
diff --git a/docs/static/favicons/favicon-16x16.png b/docs/static/favicons/favicon-16x16.png
new file mode 100644
index 0000000..1db290b
Binary files /dev/null and b/docs/static/favicons/favicon-16x16.png differ
diff --git a/docs/static/favicons/favicon-32x32.png b/docs/static/favicons/favicon-32x32.png
new file mode 100644
index 0000000..d68986b
Binary files /dev/null and b/docs/static/favicons/favicon-32x32.png differ
diff --git a/docs/static/favicons/favicon.ico b/docs/static/favicons/favicon.ico
new file mode 100644
index 0000000..55548af
Binary files /dev/null and b/docs/static/favicons/favicon.ico differ
diff --git a/docs/static/jmc/edit_thread_lanes.png b/docs/static/jmc/edit_thread_lanes.png
new file mode 100644
index 0000000..96ab894
Binary files /dev/null and b/docs/static/jmc/edit_thread_lanes.png differ
diff --git a/docs/static/jmc/exceptions_page.png b/docs/static/jmc/exceptions_page.png
new file mode 100644
index 0000000..c423281
Binary files /dev/null and b/docs/static/jmc/exceptions_page.png differ
diff --git a/docs/static/jmc/exceptions_select_iae.png b/docs/static/jmc/exceptions_select_iae.png
new file mode 100644
index 0000000..bdc4cf1
Binary files /dev/null and b/docs/static/jmc/exceptions_select_iae.png differ
diff --git a/docs/static/jmc/filter_sleeping_threads.png b/docs/static/jmc/filter_sleeping_threads.png
new file mode 100644
index 0000000..92eb825
Binary files /dev/null and b/docs/static/jmc/filter_sleeping_threads.png differ
diff --git a/docs/static/jmc/hot_method_line_number.png b/docs/static/jmc/hot_method_line_number.png
new file mode 100644
index 0000000..7853eff
Binary files /dev/null and b/docs/static/jmc/hot_method_line_number.png differ
diff --git a/docs/static/jmc/io_page.png b/docs/static/jmc/io_page.png
new file mode 100644
index 0000000..3508eb5
Binary files /dev/null and b/docs/static/jmc/io_page.png differ
diff --git a/docs/static/jmc/io_page_9090.png b/docs/static/jmc/io_page_9090.png
new file mode 100644
index 0000000..fb16c19
Binary files /dev/null and b/docs/static/jmc/io_page_9090.png differ
diff --git a/docs/static/jmc/java_application_method_profiling.png b/docs/static/jmc/java_application_method_profiling.png
new file mode 100644
index 0000000..22d3ce1
Binary files /dev/null and b/docs/static/jmc/java_application_method_profiling.png differ
diff --git a/docs/static/jmc/java_application_page.png b/docs/static/jmc/java_application_page.png
new file mode 100644
index 0000000..7ab41a1
Binary files /dev/null and b/docs/static/jmc/java_application_page.png differ
diff --git a/docs/static/jmc/java_application_stack_trace.png b/docs/static/jmc/java_application_stack_trace.png
new file mode 100644
index 0000000..429d7c1
Binary files /dev/null and b/docs/static/jmc/java_application_stack_trace.png differ
diff --git a/docs/static/jmc/memory_class_selected.png b/docs/static/jmc/memory_class_selected.png
new file mode 100644
index 0000000..a6d829c
Binary files /dev/null and b/docs/static/jmc/memory_class_selected.png differ
diff --git a/docs/static/jmc/memory_heap_rise.png b/docs/static/jmc/memory_heap_rise.png
new file mode 100644
index 0000000..18e9d6c
Binary files /dev/null and b/docs/static/jmc/memory_heap_rise.png differ
diff --git a/docs/static/jmc/memory_page.png b/docs/static/jmc/memory_page.png
new file mode 100644
index 0000000..f0ca6ed
Binary files /dev/null and b/docs/static/jmc/memory_page.png differ
diff --git a/docs/static/jmc/memory_stack_trace_period.png b/docs/static/jmc/memory_stack_trace_period.png
new file mode 100644
index 0000000..2ec96c6
Binary files /dev/null and b/docs/static/jmc/memory_stack_trace_period.png differ
diff --git a/docs/static/jmc/method_profile_distinguish_line_numbers.png b/docs/static/jmc/method_profile_distinguish_line_numbers.png
new file mode 100644
index 0000000..5841dad
Binary files /dev/null and b/docs/static/jmc/method_profile_distinguish_line_numbers.png differ
diff --git a/docs/static/jmc/method_profile_page.png b/docs/static/jmc/method_profile_page.png
new file mode 100644
index 0000000..0f02498
Binary files /dev/null and b/docs/static/jmc/method_profile_page.png differ
diff --git a/docs/static/jmc/method_profile_with_line_numbers.png b/docs/static/jmc/method_profile_with_line_numbers.png
new file mode 100644
index 0000000..f0e427c
Binary files /dev/null and b/docs/static/jmc/method_profile_with_line_numbers.png differ
diff --git a/docs/static/jmc/profile_settings.png b/docs/static/jmc/profile_settings.png
new file mode 100644
index 0000000..15575cd
Binary files /dev/null and b/docs/static/jmc/profile_settings.png differ
diff --git a/docs/static/jmc/reset_thread_page.png b/docs/static/jmc/reset_thread_page.png
new file mode 100644
index 0000000..7a045a5
Binary files /dev/null and b/docs/static/jmc/reset_thread_page.png differ
diff --git a/docs/static/jmc/sleeping_threads.png b/docs/static/jmc/sleeping_threads.png
new file mode 100644
index 0000000..e5fc957
Binary files /dev/null and b/docs/static/jmc/sleeping_threads.png differ
diff --git a/docs/static/jmc/start_flight_recording.png b/docs/static/jmc/start_flight_recording.png
new file mode 100644
index 0000000..e12e8f0
Binary files /dev/null and b/docs/static/jmc/start_flight_recording.png differ
diff --git a/docs/static/jmc/start_recording_wizard.png b/docs/static/jmc/start_recording_wizard.png
new file mode 100644
index 0000000..dd4e8a1
Binary files /dev/null and b/docs/static/jmc/start_recording_wizard.png differ
diff --git a/docs/static/jmc/thread_chart.png b/docs/static/jmc/thread_chart.png
new file mode 100644
index 0000000..f097011
Binary files /dev/null and b/docs/static/jmc/thread_chart.png differ
diff --git a/docs/static/jmc/thread_selected.png b/docs/static/jmc/thread_selected.png
new file mode 100644
index 0000000..3e22085
Binary files /dev/null and b/docs/static/jmc/thread_selected.png differ
diff --git a/docs/static/jmc/thread_selected_stack_trace.png b/docs/static/jmc/thread_selected_stack_trace.png
new file mode 100644
index 0000000..7d8302c
Binary files /dev/null and b/docs/static/jmc/thread_selected_stack_trace.png differ
diff --git a/docs/static/jmc/threads_page.png b/docs/static/jmc/threads_page.png
new file mode 100644
index 0000000..257f564
Binary files /dev/null and b/docs/static/jmc/threads_page.png differ
diff --git a/docs/static/joverflow/arrays_one_element.png b/docs/static/joverflow/arrays_one_element.png
new file mode 100644
index 0000000..4e369ef
Binary files /dev/null and b/docs/static/joverflow/arrays_one_element.png differ
diff --git a/docs/static/joverflow/conference_session_instances.png b/docs/static/joverflow/conference_session_instances.png
new file mode 100644
index 0000000..9e22c92
Binary files /dev/null and b/docs/static/joverflow/conference_session_instances.png differ
diff --git a/docs/static/joverflow/conference_sessions.png b/docs/static/joverflow/conference_sessions.png
new file mode 100644
index 0000000..80cb38d
Binary files /dev/null and b/docs/static/joverflow/conference_sessions.png differ
diff --git a/docs/static/joverflow/config_instance.png b/docs/static/joverflow/config_instance.png
new file mode 100644
index 0000000..0313bad
Binary files /dev/null and b/docs/static/joverflow/config_instance.png differ
diff --git a/docs/static/joverflow/dump_heap.png b/docs/static/joverflow/dump_heap.png
new file mode 100644
index 0000000..c298b0a
Binary files /dev/null and b/docs/static/joverflow/dump_heap.png differ
diff --git a/docs/static/joverflow/duplicate_strings.png b/docs/static/joverflow/duplicate_strings.png
new file mode 100644
index 0000000..e20e248
Binary files /dev/null and b/docs/static/joverflow/duplicate_strings.png differ
diff --git a/docs/static/joverflow/main_page.png b/docs/static/joverflow/main_page.png
new file mode 100644
index 0000000..630a106
Binary files /dev/null and b/docs/static/joverflow/main_page.png differ
diff --git a/docs/static/joverflow/referrer_workshop_configuration.png b/docs/static/joverflow/referrer_workshop_configuration.png
new file mode 100644
index 0000000..e7a58d2
Binary files /dev/null and b/docs/static/joverflow/referrer_workshop_configuration.png differ
diff --git a/docs/static/joverflow/reset.png b/docs/static/joverflow/reset.png
new file mode 100644
index 0000000..a9381ca
Binary files /dev/null and b/docs/static/joverflow/reset.png differ
diff --git a/docs/static/joverflow/show_instances.png b/docs/static/joverflow/show_instances.png
new file mode 100644
index 0000000..9ad0864
Binary files /dev/null and b/docs/static/joverflow/show_instances.png differ
diff --git a/docs/static/joverflow/window_showview_other.png b/docs/static/joverflow/window_showview_other.png
new file mode 100644
index 0000000..6e45b7c
Binary files /dev/null and b/docs/static/joverflow/window_showview_other.png differ
diff --git a/docs/static/mat/calcite_tag_distributions.png b/docs/static/mat/calcite_tag_distributions.png
new file mode 100644
index 0000000..9c2df2f
Binary files /dev/null and b/docs/static/mat/calcite_tag_distributions.png differ
diff --git a/docs/static/mat/char_array_incoming_refs.png b/docs/static/mat/char_array_incoming_refs.png
new file mode 100644
index 0000000..d7872ff
Binary files /dev/null and b/docs/static/mat/char_array_incoming_refs.png differ
diff --git a/docs/static/mat/dominator_tree.png b/docs/static/mat/dominator_tree.png
new file mode 100644
index 0000000..e9d696b
Binary files /dev/null and b/docs/static/mat/dominator_tree.png differ
diff --git a/docs/static/mat/histogram.png b/docs/static/mat/histogram.png
new file mode 100644
index 0000000..ac16736
Binary files /dev/null and b/docs/static/mat/histogram.png differ
diff --git a/docs/static/mat/list_objects_menu.png b/docs/static/mat/list_objects_menu.png
new file mode 100644
index 0000000..9fb7a98
Binary files /dev/null and b/docs/static/mat/list_objects_menu.png differ
diff --git a/docs/static/mat/mat_oql_model_invocation.png b/docs/static/mat/mat_oql_model_invocation.png
new file mode 100644
index 0000000..eb1e643
Binary files /dev/null and b/docs/static/mat/mat_oql_model_invocation.png differ
diff --git a/docs/static/mem_challenge/calcite_size_report.png b/docs/static/mem_challenge/calcite_size_report.png
new file mode 100644
index 0000000..a2007dd
Binary files /dev/null and b/docs/static/mem_challenge/calcite_size_report.png differ
diff --git a/docs/static/mem_challenge/cc_entry_incoming_refs.png b/docs/static/mem_challenge/cc_entry_incoming_refs.png
new file mode 100644
index 0000000..6353944
Binary files /dev/null and b/docs/static/mem_challenge/cc_entry_incoming_refs.png differ
diff --git a/docs/static/mem_challenge/dominator_tree_clever_cache.png b/docs/static/mem_challenge/dominator_tree_clever_cache.png
new file mode 100644
index 0000000..22c28ad
Binary files /dev/null and b/docs/static/mem_challenge/dominator_tree_clever_cache.png differ
diff --git a/docs/static/mem_challenge/dominator_tree_resource.png b/docs/static/mem_challenge/dominator_tree_resource.png
new file mode 100644
index 0000000..ef88766
Binary files /dev/null and b/docs/static/mem_challenge/dominator_tree_resource.png differ
diff --git a/docs/static/mem_challenge/dominator_tree_start.png b/docs/static/mem_challenge/dominator_tree_start.png
new file mode 100644
index 0000000..150ff3c
Binary files /dev/null and b/docs/static/mem_challenge/dominator_tree_start.png differ
diff --git a/docs/static/mem_challenge/dw_thread_safety.png b/docs/static/mem_challenge/dw_thread_safety.png
new file mode 100644
index 0000000..3be42f8
Binary files /dev/null and b/docs/static/mem_challenge/dw_thread_safety.png differ
diff --git a/docs/static/mem_challenge/histogram.png b/docs/static/mem_challenge/histogram.png
new file mode 100644
index 0000000..534a588
Binary files /dev/null and b/docs/static/mem_challenge/histogram.png differ
diff --git a/docs/static/mem_challenge/histogram_clevercache.png b/docs/static/mem_challenge/histogram_clevercache.png
new file mode 100644
index 0000000..8a36703
Binary files /dev/null and b/docs/static/mem_challenge/histogram_clevercache.png differ
diff --git a/docs/static/mem_challenge/mat_cc_instance.png b/docs/static/mem_challenge/mat_cc_instance.png
new file mode 100644
index 0000000..ba3c621
Binary files /dev/null and b/docs/static/mem_challenge/mat_cc_instance.png differ
diff --git a/docs/static/mem_challenge/mat_clevercache_instance.png b/docs/static/mem_challenge/mat_clevercache_instance.png
new file mode 100644
index 0000000..d0beac6
Binary files /dev/null and b/docs/static/mem_challenge/mat_clevercache_instance.png differ
diff --git a/docs/static/mem_challenge/mat_oql_clevercache.png b/docs/static/mem_challenge/mat_oql_clevercache.png
new file mode 100644
index 0000000..1707b30
Binary files /dev/null and b/docs/static/mem_challenge/mat_oql_clevercache.png differ
diff --git a/docs/static/mem_challenge/oql_size_report.png b/docs/static/mem_challenge/oql_size_report.png
new file mode 100644
index 0000000..6446002
Binary files /dev/null and b/docs/static/mem_challenge/oql_size_report.png differ
diff --git a/docs/static/mem_challenge/sre_incoming_refs.png b/docs/static/mem_challenge/sre_incoming_refs.png
new file mode 100644
index 0000000..2892d26
Binary files /dev/null and b/docs/static/mem_challenge/sre_incoming_refs.png differ
diff --git a/docs/static/mem_challenge/visualvm_cc_instance.png b/docs/static/mem_challenge/visualvm_cc_instance.png
new file mode 100644
index 0000000..12a57b0
Binary files /dev/null and b/docs/static/mem_challenge/visualvm_cc_instance.png differ
diff --git a/docs/static/mem_challenge/visualvm_size_report.png b/docs/static/mem_challenge/visualvm_size_report.png
new file mode 100644
index 0000000..151447b
Binary files /dev/null and b/docs/static/mem_challenge/visualvm_size_report.png differ
diff --git a/docs/static/slides/_shared/img/logo.svg b/docs/static/slides/_shared/img/logo.svg
new file mode 100644
index 0000000..87126d6
--- /dev/null
+++ b/docs/static/slides/_shared/img/logo.svg
@@ -0,0 +1,18 @@
+
+
+
diff --git a/docs/static/slides/_shared/img/me.png b/docs/static/slides/_shared/img/me.png
new file mode 100644
index 0000000..e3330c4
Binary files /dev/null and b/docs/static/slides/_shared/img/me.png differ
diff --git a/docs/static/slides/_shared/reveal/dist/config.d.ts b/docs/static/slides/_shared/reveal/dist/config.d.ts
new file mode 100644
index 0000000..4cd1590
--- /dev/null
+++ b/docs/static/slides/_shared/reveal/dist/config.d.ts
@@ -0,0 +1,753 @@
+/**
+ * Slide transition styles.
+ *
+ * @see {@link https://revealjs.com/transitions/}
+ */
+type TransitionStyle = 'none' | 'fade' | 'slide' | 'convex' | 'concave' | 'zoom';
+/**
+ * Slide transition speeds.
+ *
+ * @see {@link https://revealjs.com/transitions/}
+ */
+type TransitionSpeed = 'default' | 'fast' | 'slow';
+/**
+ * Fragment animation classes.
+ *
+ * @see {@link https://revealjs.com/fragments/}
+ */
+type FragmentAnimation = 'fade-out' | 'fade-up' | 'fade-down' | 'fade-left' | 'fade-right' | 'fade-in-then-out' | 'fade-in-then-semi-out' | 'grow' | 'shrink' | 'strike' | 'highlight-red' | 'highlight-blue' | 'highlight-green' | 'highlight-current-red' | 'highlight-current-blue' | 'highlight-current-green' | (string & {});
+/**
+ * katex - Math Plugin configuration
+ *
+ * @see {@link https://github.com/reveal/revealjs.com/blob/master/src/math.md}
+ * @see {@link https://github.com/hakimel/reveal.js/blob/master/plugin/math/katex.js}
+ */
+interface KatexConfig {
+ local?: string;
+ version?: string;
+ delimiters?: Array<{
+ left: string;
+ right: string;
+ display: boolean;
+ }>;
+ ignoredTags?: string[];
+}
+/**
+ * mathjax2 - Math Plugin configuration
+ *
+ * @see {@link https://github.com/reveal/revealjs.com/blob/master/src/math.md}
+ * @see {@link https://github.com/hakimel/reveal.js/blob/master/plugin/math/mathjax2.js}
+ */
+interface Mathjax2Config {
+ mathjax?: string;
+ config?: string;
+ tex2jax?: {
+ inlineMath?: any;
+ skipTags?: string[];
+ };
+}
+/**
+ * mathjax3 - Math Plugin configuration
+ *
+ * @see {@link https://github.com/reveal/revealjs.com/blob/master/src/math.md}
+ * @see {@link https://github.com/hakimel/reveal.js/blob/master/plugin/math/mathjax3.js}
+ */
+interface Mathjax3Config {
+ mathjax?: string;
+ tex?: {
+ inlineMath?: any;
+ };
+ options?: {
+ skipHtmlTags: string[];
+ };
+}
+/**
+ * mathjax4 - Math Plugin configuration
+ *
+ * @see {@link https://github.com/reveal/revealjs.com/blob/master/src/math.md}
+ * @see {@link https://github.com/hakimel/reveal.js/blob/master/plugin/math/mathjax4.js}
+ */
+interface Mathjax4Config {
+ mathjax?: string;
+ tex?: {
+ inlineMath?: Array<[string, string]>;
+ displayMath?: Array<[string, string]>;
+ macros?: Record;
+ };
+ options?: {
+ skipHtmlTags?: string[];
+ };
+ startup?: {
+ ready?: () => void;
+ };
+ output?: {
+ font?: string;
+ displayOverflow?: string;
+ linebreaks?: {
+ inline?: boolean;
+ width?: string;
+ lineleading?: number;
+ LinebreakVisitor?: unknown;
+ };
+ };
+}
+/**
+ * Highlight Plugin configuration
+ *
+ * @see {@link https://github.com/hakimel/reveal.js/blob/master/plugin/highlight/plugin.js}
+ */
+interface HighlightConfig {
+ highlightOnLoad?: boolean;
+ escapeHTML?: boolean;
+ beforeHighlight?: (...args: any) => any;
+}
+/**
+ * Markdown Plugin configuration
+ *
+ * @see {@link https://github.com/reveal/revealjs.com/blob/master/src/markdown.md}
+ * @see {@link https://marked.js.org/using_advanced}
+ */
+interface MarkdownConfig {
+ async?: boolean;
+ baseUrl?: string;
+ breaks?: boolean;
+ gfm?: boolean;
+ headerIds?: boolean;
+ headerPrefix?: string;
+ highlight?: (...args: any) => any;
+ langPrefix?: string;
+ mangle?: boolean;
+ pedantic?: boolean;
+ renderer?: object;
+ sanitize?: boolean;
+ sanitizer?: (...args: any) => any;
+ silent?: boolean;
+ smartLists?: boolean;
+ smartypants?: boolean;
+ tokenizer?: object;
+ walkTokens?: (...args: any) => any;
+ xhtml?: boolean;
+ separator?: string;
+ verticalSeparator?: string;
+ notesSeparator?: string;
+ attributes?: string;
+}
+/**
+ * Configuration object for reveal.js.
+ *
+ * @see {@link https://revealjs.com/config/}
+ */
+interface RevealConfig {
+ /**
+ * The "normal" size of the presentation, aspect ratio will be preserved
+ * when the presentation is scaled to fit different resolutions
+ *
+ * @see {@link https://revealjs.com/presentation-size/}
+ *
+ * @defaultValue 960
+ */
+ width?: number | string;
+ /**
+ * The "normal" size of the presentation, aspect ratio will be preserved
+ * when the presentation is scaled to fit different resolutions
+ *
+ * @see {@link https://revealjs.com/presentation-size/}
+ *
+ * @defaultValue 700
+ */
+ height?: number | string;
+ /**
+ * Factor of the display size that should remain empty around the content
+ *
+ * @see {@link https://revealjs.com/presentation-size/}
+ *
+ * @defaultValue 0.04
+ */
+ margin?: number;
+ /**
+ * The smallest possible factor to scale content down by in order to fit
+ * the available viewport.
+ *
+ * @see {@link https://revealjs.com/presentation-size/}
+ *
+ * @defaultValue 0.2
+ */
+ minScale?: number;
+ /**
+ * The largest possible factor to scale content up by in order to cover
+ * the available viewport.
+ *
+ * @see {@link https://revealjs.com/presentation-size/}
+ *
+ * @defaultValue 2.0
+ */
+ maxScale?: number;
+ /**
+ * Display presentation control arrows
+ * - true: Display controls in all views
+ * - false: Hide controls in all views
+ * - 'speaker': Display controls only in the speaker view
+ *
+ * @defaultValue true
+ */
+ controls?: boolean | 'speaker' | 'speaker-only';
+ /**
+ * Help the user learn the controls by providing hints, for example by
+ * bouncing the down arrow when they first encounter a vertical slide
+ *
+ * @defaultValue true
+ */
+ controlsTutorial?: boolean;
+ /**
+ * Determines where controls appear, "edges" or "bottom-right"
+ *
+ * @defaultValue 'bottom-right'
+ */
+ controlsLayout?: 'edges' | 'bottom-right';
+ /**
+ * Visibility rule for backwards navigation arrows; "faded", "hidden"
+ * or "visible"
+ *
+ * @defaultValue 'faded'
+ */
+ controlsBackArrows?: 'faded' | 'hidden' | 'visible';
+ /**
+ * Display a presentation progress bar
+ *
+ * @defaultValue true
+ */
+ progress?: boolean;
+ /**
+ * Display the page number of the current slide
+ * - true: Show slide number
+ * - false: Hide slide number
+ *
+ * Can optionally be set as a string that specifies the number formatting:
+ * - "h.v": Horizontal . vertical slide number (default)
+ * - "h/v": Horizontal / vertical slide number
+ * - "c": Flattened slide number
+ * - "c/t": Flattened slide number / total slides
+ *
+ * Alternatively, you can provide a function that returns the slide
+ * number for the current slide. The function should take in a slide
+ * object and return an array with one string [slideNumber] or
+ * three strings [n1,delimiter,n2]. See #formatSlideNumber().
+ *
+ * @defaultValue false
+ */
+ slideNumber?: boolean | 'h.v' | 'h/v' | 'c' | 'c/t' | ((slide: any) => string | [string, string, string]);
+ /**
+ * Can be used to limit the contexts in which the slide number appears
+ * - "all": Always show the slide number
+ * - "print": Only when printing to PDF
+ * - "speaker": Only in the speaker view
+ *
+ * @defaultValue 'all'
+ */
+ showSlideNumber?: 'all' | 'print' | 'speaker';
+ /**
+ * Use 1 based indexing for # links to match slide number (default is zero
+ * based)
+ *
+ * @defaultValue false
+ */
+ hashOneBasedIndex?: boolean;
+ /**
+ * Add the current slide number to the URL hash so that reloading the
+ * page/copying the URL will return you to the same slide
+ *
+ * @defaultValue false
+ */
+ hash?: boolean;
+ /**
+ * Flags if we should monitor the hash and change slides accordingly
+ *
+ * @defaultValue true
+ */
+ respondToHashChanges?: boolean;
+ /**
+ * Enable support for jump-to-slide navigation shortcuts
+ *
+ * @defaultValue true
+ */
+ jumpToSlide?: boolean;
+ /**
+ * Push each slide change to the browser history. Implies `hash: true`
+ *
+ * @defaultValue false
+ */
+ history?: boolean;
+ /**
+ * Enable keyboard shortcuts for navigation
+ *
+ * @defaultValue true
+ */
+ keyboard?: boolean | {
+ [keyCode: number]: string | ((event: KeyboardEvent) => void);
+ };
+ /**
+ * Optional function that blocks keyboard events when returning false
+ *
+ * If you set this to 'focused', we will only capture keyboard events
+ * for embedded decks when they are in focus
+ *
+ * @defaultValue null
+ */
+ keyboardCondition?: null | 'focused' | ((event: KeyboardEvent) => boolean);
+ /**
+ * Disables the default reveal.js slide layout (scaling and centering)
+ * so that you can use custom CSS layout
+ *
+ * @defaultValue false
+ */
+ disableLayout?: boolean;
+ /**
+ * Enable the slide overview mode
+ *
+ * @see {@link https://revealjs.com/overview/}
+ *
+ * @defaultValue true
+ */
+ overview?: boolean;
+ /**
+ * Vertical centering of slides
+ *
+ * @defaultValue true
+ */
+ center?: boolean;
+ /**
+ * Enables touch navigation on devices with touch input
+ *
+ * @defaultValue true
+ */
+ touch?: boolean;
+ /**
+ * Loop the presentation
+ *
+ * @defaultValue false
+ */
+ loop?: boolean;
+ /**
+ * Change the presentation direction to be RTL
+ *
+ * @defaultValue false
+ */
+ rtl?: boolean;
+ /**
+ * Changes the behavior of our navigation directions.
+ *
+ * "default"
+ * Left/right arrow keys step between horizontal slides, up/down
+ * arrow keys step between vertical slides. Space key steps through
+ * all slides (both horizontal and vertical).
+ *
+ * "linear"
+ * Removes the up/down arrows. Left/right arrows step through all
+ * slides (both horizontal and vertical).
+ *
+ * "grid"
+ * When this is enabled, stepping left/right from a vertical stack
+ * to an adjacent vertical stack will land you at the same vertical
+ * index.
+ *
+ * Consider a deck with six slides ordered in two vertical stacks:
+ * 1.1 2.1
+ * 1.2 2.2
+ * 1.3 2.3
+ *
+ * If you're on slide 1.3 and navigate right, you will normally move
+ * from 1.3 -> 2.1. If "grid" is used, the same navigation takes you
+ * from 1.3 -> 2.3.
+ *
+ * @defaultValue 'default'
+ */
+ navigationMode?: 'default' | 'linear' | 'grid';
+ /**
+ * Randomizes the order of slides each time the presentation loads
+ *
+ * @defaultValue false
+ */
+ shuffle?: boolean;
+ /**
+ * Turns fragments on and off globally
+ *
+ * @see {@link https://revealjs.com/fragments/}
+ *
+ * @defaultValue true
+ */
+ fragments?: boolean;
+ /**
+ * Flags whether to include the current fragment in the URL,
+ * so that reloading brings you to the same fragment position
+ *
+ * @defaultValue true
+ */
+ fragmentInURL?: boolean;
+ /**
+ * Flags if the presentation is running in an embedded mode,
+ * i.e. contained within a limited portion of the screen
+ *
+ * @defaultValue false
+ */
+ embedded?: boolean;
+ /**
+ * Flags if we should show a help overlay when the question-mark
+ * key is pressed
+ *
+ * @defaultValue true
+ */
+ help?: boolean;
+ /**
+ * Flags if it should be possible to pause the presentation (blackout)
+ *
+ * @defaultValue true
+ */
+ pause?: boolean;
+ /**
+ * Flags if speaker notes should be visible to all viewers
+ *
+ * @defaultValue false
+ */
+ showNotes?: boolean;
+ /**
+ * Flags if slides with data-visibility="hidden" should be kept visible
+ *
+ * @defaultValue false
+ */
+ showHiddenSlides?: boolean;
+ /**
+ * Global override for autoplaying embedded media (video/audio/iframe)
+ * - null: Media will only autoplay if data-autoplay is present
+ * - true: All media will autoplay, regardless of individual setting
+ * - false: No media will autoplay, regardless of individual setting
+ *
+ * @defaultValue null
+ */
+ autoPlayMedia?: null | boolean;
+ /**
+ * Global override for preloading lazy-loaded iframes
+ * - null: Iframes with data-src AND data-preload will be loaded when within
+ * the viewDistance, iframes with only data-src will be loaded when visible
+ * - true: All iframes with data-src will be loaded when within the viewDistance
+ * - false: All iframes with data-src will be loaded only when visible
+ *
+ * @defaultValue null
+ */
+ preloadIframes?: null | boolean;
+ /**
+ * Prevent embedded iframes from automatically focusing on themselves
+ *
+ * @defaultValue false
+ */
+ preventIframeAutoFocus?: boolean;
+ /**
+ * Can be used to globally disable auto-animation
+ *
+ * @see {@link https://revealjs.com/auto-animate/}
+ *
+ * @defaultValue true
+ */
+ autoAnimate?: boolean;
+ /**
+ * Optionally provide a custom element matcher that will be
+ * used to dictate which elements we can animate between.
+ *
+ * @defaultValue null
+ */
+ autoAnimateMatcher?: null | Function;
+ /**
+ * Default settings for our auto-animate transitions, can be
+ * overridden per-slide or per-element via data arguments
+ *
+ * @defaultValue 'ease'
+ */
+ autoAnimateEasing?: 'ease' | string;
+ /**
+ * Number of seconds to animate each element.
+ *
+ * @defaultValue 1.0
+ */
+ autoAnimateDuration?: number;
+ /**
+ * Should unmatched elements be faded in?
+ *
+ * @defaultValue true
+ */
+ autoAnimateUnmatched?: boolean;
+ /**
+ * CSS properties that can be auto-animated. Position & scale
+ * is matched separately so there's no need to include styles
+ * like top/right/bottom/left, width/height or margin.
+ *
+ * @defaultValue ['opacity', 'color', 'background-color', 'padding', 'font-size', 'line-height', 'letter-spacing', 'border-width', 'border-color', 'border-radius', 'outline', 'outline-offset']
+ */
+ autoAnimateStyles?: string[];
+ /**
+ * Controls automatic progression to the next slide
+ * - 0: Auto-sliding only happens if the data-autoslide HTML attribute
+ * is present on the current slide or fragment
+ * - 1+: All slides will progress automatically at the given interval
+ * - false: No auto-sliding, even if data-autoslide is present
+ *
+ * @defaultValue 0
+ */
+ autoSlide?: number | false;
+ /**
+ * Stop auto-sliding after user input
+ *
+ * @defaultValue true
+ */
+ autoSlideStoppable?: boolean;
+ /**
+ * Use this method for navigation when auto-sliding (defaults to navigateNext)
+ *
+ * @defaultValue null
+ */
+ autoSlideMethod?: null | Function;
+ /**
+ * Specify the average time in seconds that you think you will spend
+ * presenting each slide. This is used to show a pacing timer in the
+ * speaker view
+ *
+ * @defaultValue null
+ */
+ defaultTiming?: null;
+ /**
+ * Enable slide navigation via mouse wheel
+ *
+ * @defaultValue false
+ */
+ mouseWheel?: boolean;
+ /**
+ * Opens links in an iframe preview overlay
+ * Add `data-preview-link` and `data-preview-link="false"` to customize each link
+ * individually
+ *
+ * @defaultValue false
+ */
+ previewLinks?: boolean;
+ /**
+ * Exposes the reveal.js API through window.postMessage
+ *
+ * @defaultValue true
+ */
+ postMessage?: boolean;
+ /**
+ * Dispatches all reveal.js events to the parent window through postMessage
+ *
+ * @defaultValue false
+ */
+ postMessageEvents?: boolean;
+ /**
+ * Focuses body when page changes visibility to ensure keyboard shortcuts work
+ *
+ * @defaultValue true
+ */
+ focusBodyOnPageVisibilityChange?: boolean;
+ /**
+ * Transition style
+ *
+ * @see {@link https://revealjs.com/transitions/}
+ *
+ * @defaultValue 'slide'
+ */
+ transition?: TransitionStyle;
+ /**
+ * Transition speed
+ *
+ * @defaultValue 'default'
+ */
+ transitionSpeed?: TransitionSpeed;
+ /**
+ * Transition style for full page slide backgrounds
+ *
+ * @defaultValue 'fade'
+ */
+ backgroundTransition?: TransitionStyle;
+ /**
+ * Parallax background image
+ *
+ * @defaultValue ''
+ */
+ parallaxBackgroundImage?: null | string;
+ /**
+ * Parallax background size
+ *
+ * @defaultValue ''
+ */
+ parallaxBackgroundSize?: null | string;
+ /**
+ * Parallax background repeat
+ *
+ * @defaultValue ''
+ */
+ parallaxBackgroundRepeat?: null | string;
+ /**
+ * Parallax background position
+ *
+ * @defaultValue ''
+ */
+ parallaxBackgroundPosition?: null | string;
+ /**
+ * Amount of pixels to move the parallax background per slide step
+ *
+ * @defaultValue null
+ */
+ parallaxBackgroundHorizontal?: null | number;
+ /**
+ *
+ * @defaultValue null
+ */
+ parallaxBackgroundVertical?: null | number;
+ /**
+ * Can be used to initialize reveal.js in one of the following views:
+ * - print: Render the presentation so that it can be printed to PDF
+ * - scroll: Show the presentation as a tall scrollable page with scroll
+ * triggered animations
+ *
+ * @see {@link https://revealjs.com/scroll-view/}
+ *
+ * @defaultValue null
+ */
+ view?: null | 'print' | 'scroll';
+ /**
+ * Adjusts the height of each slide in the scroll view.
+ * - full: Each slide is as tall as the viewport
+ * - compact: Slides are as small as possible, allowing multiple slides
+ * to be visible in parallel on tall devices
+ *
+ * @defaultValue 'full'
+ */
+ scrollLayout?: 'full' | 'compact';
+ /**
+ * Control how scroll snapping works in the scroll view.
+ * - false: No snapping, scrolling is continuous
+ * - proximity: Snap when close to a slide
+ * - mandatory: Always snap to the closest slide
+ *
+ * Only applies to presentations in scroll view.
+ *
+ * @defaultValue 'mandatory'
+ */
+ scrollSnap?: false | 'proximity' | 'mandatory';
+ /**
+ * Enables and configures the scroll view progress bar.
+ * - 'auto': Show the scrollbar while scrolling, hide while idle
+ * - true: Always show the scrollbar
+ * - false: Never show the scrollbar
+ *
+ * @defaultValue 'auto'
+ */
+ scrollProgress?: 'auto' | boolean;
+ /**
+ * Automatically activate the scroll view when we the viewport falls
+ * below the given width.
+ *
+ * @defaultValue 435
+ */
+ scrollActivationWidth?: number;
+ /**
+ * The maximum number of pages a single slide can expand onto when printing
+ * to PDF, unlimited by default
+ *
+ * @defaultValue Number.POSITIVE_INFINITY
+ */
+ pdfMaxPagesPerSlide?: number;
+ /**
+ * Prints each fragment on a separate slide
+ *
+ * @defaultValue true
+ */
+ pdfSeparateFragments?: boolean;
+ /**
+ * Offset used to reduce the height of content within exported PDF pages.
+ * This exists to account for environment differences based on how you
+ * print to PDF. CLI printing options, like phantomjs and wkpdf, can end
+ * on precisely the total height of the document whereas in-browser
+ * printing has to end one pixel before.
+ *
+ * @defaultValue -1
+ */
+ pdfPageHeightOffset?: number;
+ /**
+ * Number of slides away from the current that are visible
+ *
+ * @defaultValue 3
+ */
+ viewDistance?: number;
+ /**
+ * Number of slides away from the current that are visible on mobile
+ * devices. It is advisable to set this to a lower number than
+ * viewDistance in order to save resources.
+ *
+ * @defaultValue 2
+ */
+ mobileViewDistance?: number;
+ /**
+ * The display mode that will be used to show slides
+ *
+ * @defaultValue 'block'
+ */
+ display?: string;
+ /**
+ * Hide cursor if inactive
+ *
+ * @defaultValue true
+ */
+ hideInactiveCursor?: boolean;
+ /**
+ * Time before the cursor is hidden (in ms)
+ *
+ * @defaultValue 5000
+ */
+ hideCursorTime?: number;
+ /**
+ * Should we automatically sort and set indices for fragments
+ * at each sync? (See Reveal.sync)
+ *
+ * @defaultValue true
+ */
+ sortFragmentsOnSync?: boolean;
+ /**
+ * Highlight plugin configuration
+ */
+ highlight?: HighlightConfig;
+ /**
+ * Markdown plugin configuration
+ */
+ markdown?: MarkdownConfig;
+ /**
+ * KaTeX math plugin configuration
+ */
+ katex?: KatexConfig;
+ /**
+ * MathJax 2 plugin configuration
+ */
+ mathjax2?: Mathjax2Config;
+ /**
+ * MathJax 3 plugin configuration
+ */
+ mathjax3?: Mathjax3Config;
+ /**
+ * MathJax 4 plugin configuration
+ */
+ mathjax4?: Mathjax4Config;
+ /**
+ * Script dependencies to load
+ *
+ * @defaultValue []
+ */
+ dependencies?: any[];
+ /**
+ * Plugin objects to register and use for this presentation
+ *
+ * @defaultValue []
+ */
+ plugins?: any[];
+}
+/**
+ * The default reveal.js config object.
+ */
+declare const defaultConfig: RevealConfig;
+export type { RevealConfig, TransitionStyle, TransitionSpeed, FragmentAnimation, KatexConfig, Mathjax2Config, Mathjax3Config, Mathjax4Config, HighlightConfig, MarkdownConfig, };
+export { defaultConfig };
diff --git a/docs/static/slides/_shared/reveal/dist/plugin/highlight.d.ts b/docs/static/slides/_shared/reveal/dist/plugin/highlight.d.ts
new file mode 100644
index 0000000..6cec111
--- /dev/null
+++ b/docs/static/slides/_shared/reveal/dist/plugin/highlight.d.ts
@@ -0,0 +1,40 @@
+import { HLJSApi } from 'highlight.js';
+import { RevealPlugin } from 'reveal.js';
+export interface HighlightLine {
+ start?: number;
+ end?: number;
+}
+export interface HighlightLineNumbersOptions {
+ singleLine?: boolean;
+ startFrom?: number;
+}
+export interface HighlightJsApi extends HLJSApi {
+ initLineNumbersOnLoad(options?: HighlightLineNumbersOptions): void;
+ lineNumbersBlock(element: HTMLElement, options?: HighlightLineNumbersOptions): void;
+ lineNumbersValue(code: string, options?: HighlightLineNumbersOptions): string | undefined;
+}
+export interface HighlightScrollState {
+ currentBlock?: HTMLElement;
+ animationFrameID?: number;
+}
+export interface HighlightLineBounds {
+ top: number;
+ bottom: number;
+}
+export type HighlightLineStep = HighlightLine[];
+export interface HighlightPlugin extends RevealPlugin {
+ id: 'highlight';
+ HIGHLIGHT_STEP_DELIMITER: '|';
+ HIGHLIGHT_LINE_DELIMITER: ',';
+ HIGHLIGHT_LINE_RANGE_DELIMITER: '-';
+ hljs: HighlightJsApi;
+ highlightBlock(block: HTMLElement): void;
+ scrollHighlightedLineIntoView(block: HTMLElement, scrollState: HighlightScrollState, skipAnimation?: boolean): void;
+ easeInOutQuart(t: number): number;
+ getHighlightedLineBounds(block: HTMLElement): HighlightLineBounds;
+ highlightLines(block: HTMLElement, linesToHighlight?: string): void;
+ deserializeHighlightSteps(highlightSteps: string): HighlightLineStep[];
+ serializeHighlightSteps(highlightSteps: HighlightLineStep[]): string;
+}
+declare const Highlight: () => HighlightPlugin;
+export default Highlight;
diff --git a/docs/static/slides/_shared/reveal/dist/plugin/highlight.js b/docs/static/slides/_shared/reveal/dist/plugin/highlight.js
new file mode 100644
index 0000000..9928c9b
--- /dev/null
+++ b/docs/static/slides/_shared/reveal/dist/plugin/highlight.js
@@ -0,0 +1,17 @@
+(function(e,t){typeof exports==`object`&&typeof module<`u`?module.exports=t():typeof define==`function`&&define.amd?define([],t):(e=typeof globalThis<`u`?globalThis:e||self,e.RevealHighlight=t())})(this,function(){var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n)),l=o(((e,t)=>{function n(e){return e instanceof Map?e.clear=e.delete=e.set=function(){throw Error(`map is read-only`)}:e instanceof Set&&(e.add=e.clear=e.delete=function(){throw Error(`set is read-only`)}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach(t=>{let r=e[t],i=typeof r;(i===`object`||i===`function`)&&!Object.isFrozen(r)&&n(r)}),e}var r=class{constructor(e){e.data===void 0&&(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,`'`)}function a(e,...t){let n=Object.create(null);for(let t in e)n[t]=e[t];return t.forEach(function(e){for(let t in e)n[t]=e[t]}),n}var o=``,s=e=>!!e.scope,c=(e,{prefix:t})=>{if(e.startsWith(`language:`))return e.replace(`language:`,`language-`);if(e.includes(`.`)){let n=e.split(`.`);return[`${t}${n.shift()}`,...n.map((e,t)=>`${e}${`_`.repeat(t+1)}`)].join(` `)}return`${t}${e}`},l=class{constructor(e,t){this.buffer=``,this.classPrefix=t.classPrefix,e.walk(this)}addText(e){this.buffer+=i(e)}openNode(e){if(!s(e))return;let t=c(e.scope,{prefix:this.classPrefix});this.span(t)}closeNode(e){s(e)&&(this.buffer+=o)}value(){return this.buffer}span(e){this.buffer+=``}},u=(e={})=>{let t={children:[]};return Object.assign(t,e),t},d=class e{constructor(){this.rootNode=u(),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){let t=u({scope:e});this.add(t),this.stack.push(t)}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,t){return typeof t==`string`?e.addText(t):t.children&&(e.openNode(t),t.children.forEach(t=>this._walk(e,t)),e.closeNode(t)),e}static _collapse(t){typeof t!=`string`&&t.children&&(t.children.every(e=>typeof e==`string`)?t.children=[t.children.join(``)]:t.children.forEach(t=>{e._collapse(t)}))}},f=class extends d{constructor(e){super(),this.options=e}addText(e){e!==``&&this.add(e)}startScope(e){this.openNode(e)}endScope(){this.closeNode()}__addSublanguage(e,t){let n=e.root;t&&(n.scope=`language:${t}`),this.add(n)}toHTML(){return new l(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}};function p(e){return e?typeof e==`string`?e:e.source:null}function m(e){return _(`(?=`,e,`)`)}function h(e){return _(`(?:`,e,`)*`)}function g(e){return _(`(?:`,e,`)?`)}function _(...e){return e.map(e=>p(e)).join(``)}function v(e){let t=e[e.length-1];return typeof t==`object`&&t.constructor===Object?(e.splice(e.length-1,1),t):{}}function y(...e){return`(`+(v(e).capture?``:`?:`)+e.map(e=>p(e)).join(`|`)+`)`}function b(e){return RegExp(e.toString()+`|`).exec(``).length-1}function x(e,t){let n=e&&e.exec(t);return n&&n.index===0}var S=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function C(e,{joinWith:t}){let n=0;return e.map(e=>{n+=1;let t=n,r=p(e),i=``;for(;r.length>0;){let e=S.exec(r);if(!e){i+=r;break}i+=r.substring(0,e.index),r=r.substring(e.index+e[0].length),e[0][0]===`\\`&&e[1]?i+=`\\`+String(Number(e[1])+t):(i+=e[0],e[0]===`(`&&n++)}return i}).map(e=>`(${e})`).join(t)}var w=/\b\B/,T=`[a-zA-Z]\\w*`,E=`[a-zA-Z_]\\w*`,D=`\\b\\d+(\\.\\d+)?`,O=`(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)`,k=`\\b(0b[01]+)`,A=`!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~`,j=(e={})=>{let t=/^#![ ]*\//;return e.binary&&(e.begin=_(t,/.*\b/,e.binary,/\b.*/)),a({scope:`meta`,begin:t,end:/$/,relevance:0,"on:begin":(e,t)=>{e.index!==0&&t.ignoreMatch()}},e)},M={begin:`\\\\[\\s\\S]`,relevance:0},N={scope:`string`,begin:`'`,end:`'`,illegal:`\\n`,contains:[M]},P={scope:`string`,begin:`"`,end:`"`,illegal:`\\n`,contains:[M]},F={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/},I=function(e,t,n={}){let r=a({scope:`comment`,begin:e,end:t,contains:[]},n);r.contains.push({scope:`doctag`,begin:`[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)`,end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});let i=y(`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 r.contains.push({begin:_(/[ ]+/,`(`,i,/[.]?[:]?([.][ ]|[ ])/,`){3}`)}),r},L=I(`//`,`$`),R=I(`/\\*`,`\\*/`),z=I(`#`,`$`),B={scope:`number`,begin:D,relevance:0},ee={scope:`number`,begin:O,relevance:0},te={scope:`number`,begin:k,relevance:0},V={scope:`regexp`,begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[M,{begin:/\[/,end:/\]/,relevance:0,contains:[M]}]},ne={scope:`title`,begin:T,relevance:0},H={scope:`title`,begin:E,relevance:0},U={begin:`\\.\\s*`+E,relevance:0},W=Object.freeze({__proto__:null,APOS_STRING_MODE:N,BACKSLASH_ESCAPE:M,BINARY_NUMBER_MODE:te,BINARY_NUMBER_RE:k,COMMENT:I,C_BLOCK_COMMENT_MODE:R,C_LINE_COMMENT_MODE:L,C_NUMBER_MODE:ee,C_NUMBER_RE:O,END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{t.data._beginMatch!==e[1]&&t.ignoreMatch()}})},HASH_COMMENT_MODE:z,IDENT_RE:T,MATCH_NOTHING_RE:w,METHOD_GUARD:U,NUMBER_MODE:B,NUMBER_RE:D,PHRASAL_WORDS_MODE:F,QUOTE_STRING_MODE:P,REGEXP_MODE:V,RE_STARTERS_RE:A,SHEBANG:j,TITLE_MODE:ne,UNDERSCORE_IDENT_RE:E,UNDERSCORE_TITLE_MODE:H});function G(e,t){e.input[e.index-1]===`.`&&t.ignoreMatch()}function re(e,t){e.className!==void 0&&(e.scope=e.className,delete e.className)}function ie(e,t){t&&e.beginKeywords&&(e.begin=`\\b(`+e.beginKeywords.split(` `).join(`|`)+`)(?!\\.)(?=\\b|\\s)`,e.__beforeBegin=G,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords,e.relevance===void 0&&(e.relevance=0))}function K(e,t){Array.isArray(e.illegal)&&(e.illegal=y(...e.illegal))}function ae(e,t){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 oe(e,t){e.relevance===void 0&&(e.relevance=1)}var se=(e,t)=>{if(!e.beforeMatch)return;if(e.starts)throw Error(`beforeMatch cannot be used with starts`);let n=Object.assign({},e);Object.keys(e).forEach(t=>{delete e[t]}),e.keywords=n.keywords,e.begin=_(n.beforeMatch,m(n.begin)),e.starts={relevance:0,contains:[Object.assign(n,{endsParent:!0})]},e.relevance=0,delete n.beforeMatch},ce=[`of`,`and`,`for`,`in`,`not`,`or`,`if`,`then`,`parent`,`list`,`value`],le=`keyword`;function q(e,t,n=le){let r=Object.create(null);return typeof e==`string`?i(n,e.split(` `)):Array.isArray(e)?i(n,e):Object.keys(e).forEach(function(n){Object.assign(r,q(e[n],t,n))}),r;function i(e,n){t&&(n=n.map(e=>e.toLowerCase())),n.forEach(function(t){let n=t.split(`|`);r[n[0]]=[e,ue(n[0],n[1])]})}}function ue(e,t){return t?Number(t):+!de(e)}function de(e){return ce.includes(e.toLowerCase())}var fe={},J=e=>{console.error(e)},pe=(e,...t)=>{console.log(`WARN: ${e}`,...t)},Y=(e,t)=>{fe[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),fe[`${e}/${t}`]=!0)},X=Error();function me(e,t,{key:n}){let r=0,i=e[n],a={},o={};for(let e=1;e<=t.length;e++)o[e+r]=i[e],a[e+r]=!0,r+=b(t[e-1]);e[n]=o,e[n]._emit=a,e[n]._multi=!0}function he(e){if(Array.isArray(e.begin)){if(e.skip||e.excludeBegin||e.returnBegin)throw J(`skip, excludeBegin, returnBegin not compatible with beginScope: {}`),X;if(typeof e.beginScope!=`object`||e.beginScope===null)throw J(`beginScope must be object`),X;me(e,e.begin,{key:`beginScope`}),e.begin=C(e.begin,{joinWith:``})}}function ge(e){if(Array.isArray(e.end)){if(e.skip||e.excludeEnd||e.returnEnd)throw J(`skip, excludeEnd, returnEnd not compatible with endScope: {}`),X;if(typeof e.endScope!=`object`||e.endScope===null)throw J(`endScope must be object`),X;me(e,e.end,{key:`endScope`}),e.end=C(e.end,{joinWith:``})}}function _e(e){e.scope&&typeof e.scope==`object`&&e.scope!==null&&(e.beginScope=e.scope,delete e.scope)}function ve(e){_e(e),typeof e.beginScope==`string`&&(e.beginScope={_wrap:e.beginScope}),typeof e.endScope==`string`&&(e.endScope={_wrap:e.endScope}),he(e),ge(e)}function ye(e){function t(t,n){return new RegExp(p(t),`m`+(e.case_insensitive?`i`:``)+(e.unicodeRegex?`u`:``)+(n?`g`:``))}class n{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,t){t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]),this.matchAt+=b(e)+1}compile(){this.regexes.length===0&&(this.exec=()=>null),this.matcherRe=t(C(this.regexes.map(e=>e[1]),{joinWith:`|`}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;let t=this.matcherRe.exec(e);if(!t)return null;let n=t.findIndex((e,t)=>t>0&&e!==void 0),r=this.matchIndexes[n];return t.splice(0,n),Object.assign(t,r)}}class r{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];let t=new n;return this.rules.slice(e).forEach(([e,n])=>t.addRule(e,n)),t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(e,t){this.rules.push([e,t]),t.type===`begin`&&this.count++}exec(e){let t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex;let n=t.exec(e);if(this.resumingScanAtSamePosition()&&!(n&&n.index===this.lastIndex)){let t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)}return n&&(this.regexIndex+=n.position+1,this.regexIndex===this.count&&this.considerAll()),n}}function i(e){let t=new r;return e.contains.forEach(e=>t.addRule(e.begin,{rule:e,type:`begin`})),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:`end`}),e.illegal&&t.addRule(e.illegal,{type:`illegal`}),t}function o(n,r){let a=n;if(n.isCompiled)return a;[re,ae,ve,se].forEach(e=>e(n,r)),e.compilerExtensions.forEach(e=>e(n,r)),n.__beforeBegin=null,[ie,K,oe].forEach(e=>e(n,r)),n.isCompiled=!0;let s=null;return typeof n.keywords==`object`&&n.keywords.$pattern&&(n.keywords=Object.assign({},n.keywords),s=n.keywords.$pattern,delete n.keywords.$pattern),s||=/\w+/,n.keywords&&=q(n.keywords,e.case_insensitive),a.keywordPatternRe=t(s,!0),r&&(n.begin||=/\B|\b/,a.beginRe=t(a.begin),!n.end&&!n.endsWithParent&&(n.end=/\B|\b/),n.end&&(a.endRe=t(a.end)),a.terminatorEnd=p(a.end)||``,n.endsWithParent&&r.terminatorEnd&&(a.terminatorEnd+=(n.end?`|`:``)+r.terminatorEnd)),n.illegal&&(a.illegalRe=t(n.illegal)),n.contains||=[],n.contains=[].concat(...n.contains.map(function(e){return xe(e===`self`?n:e)})),n.contains.forEach(function(e){o(e,a)}),n.starts&&o(n.starts,r),a.matcher=i(a),a}if(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=a(e.classNameAliases||{}),o(e)}function be(e){return e?e.endsWithParent||be(e.starts):!1}function xe(e){return e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map(function(t){return a(e,{variants:null},t)})),e.cachedVariants?e.cachedVariants:be(e)?a(e,{starts:e.starts?a(e.starts):null}):Object.isFrozen(e)?a(e):e}var Se=`11.11.1`,Ce=class extends Error{constructor(e,t){super(e),this.name=`HTMLInjectionError`,this.html=t}},we=i,Te=a,Ee=Symbol(`nomatch`),De=7,Oe=function(e){let t=Object.create(null),i=Object.create(null),a=[],o=!0,s=`Could not find the language '{}', did you forget to load/include a language module?`,c={disableAutodetect:!0,name:`Plain text`,contains:[]},l={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:`hljs-`,cssSelector:`pre code`,languages:null,__emitter:f};function u(e){return l.noHighlightRe.test(e)}function d(e){let t=e.className+` `;t+=e.parentNode?e.parentNode.className:``;let n=l.languageDetectRe.exec(t);if(n){let t=N(n[1]);return t||(pe(s.replace(`{}`,n[1])),pe(`Falling back to no-highlight mode for this block.`,e)),t?n[1]:`no-highlight`}return t.split(/\s+/).find(e=>u(e)||N(e))}function p(e,t,n){let r=``,i=``;typeof t==`object`?(r=e,n=t.ignoreIllegals,i=t.language):(Y(`10.7.0`,`highlight(lang, code, ...args) has been deprecated.`),Y(`10.7.0`,`Please use highlight(code, options) instead.
+https://github.com/highlightjs/highlight.js/issues/2277`),i=e,r=t),n===void 0&&(n=!0);let a={code:r,language:i};z(`before:highlight`,a);let o=a.result?a.result:v(a.language,a.code,n);return o.code=a.code,z(`after:highlight`,o),o}function v(e,n,i,a){let c=Object.create(null);function u(e,t){return e.keywords[t]}function d(){if(!A.keywords){M.addText(P);return}let e=0;A.keywordPatternRe.lastIndex=0;let t=A.keywordPatternRe.exec(P),n=``;for(;t;){n+=P.substring(e,t.index);let r=D.case_insensitive?t[0].toLowerCase():t[0],i=u(A,r);if(i){let[e,a]=i;if(M.addText(n),n=``,c[r]=(c[r]||0)+1,c[r]<=De&&(F+=a),e.startsWith(`_`))n+=t[0];else{let n=D.classNameAliases[e]||e;m(t[0],n)}}else n+=t[0];e=A.keywordPatternRe.lastIndex,t=A.keywordPatternRe.exec(P)}n+=P.substring(e),M.addText(n)}function f(){if(P===``)return;let e=null;if(typeof A.subLanguage==`string`){if(!t[A.subLanguage]){M.addText(P);return}e=v(A.subLanguage,P,!0,j[A.subLanguage]),j[A.subLanguage]=e._top}else e=S(P,A.subLanguage.length?A.subLanguage:null);A.relevance>0&&(F+=e.relevance),M.__addSublanguage(e._emitter,e.language)}function p(){A.subLanguage==null?d():f(),P=``}function m(e,t){e!==``&&(M.startScope(t),M.addText(e),M.endScope())}function h(e,t){let n=1,r=t.length-1;for(;n<=r;){if(!e._emit[n]){n++;continue}let r=D.classNameAliases[e[n]]||e[n],i=t[n];r?m(i,r):(P=i,d(),P=``),n++}}function g(e,t){return e.scope&&typeof e.scope==`string`&&M.openNode(D.classNameAliases[e.scope]||e.scope),e.beginScope&&(e.beginScope._wrap?(m(P,D.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap),P=``):e.beginScope._multi&&(h(e.beginScope,t),P=``)),A=Object.create(e,{parent:{value:A}}),A}function _(e,t,n){let i=x(e.endRe,n);if(i){if(e[`on:end`]){let n=new r(e);e[`on:end`](t,n),n.isMatchIgnored&&(i=!1)}if(i){for(;e.endsParent&&e.parent;)e=e.parent;return e}}if(e.endsWithParent)return _(e.parent,t,n)}function y(e){return A.matcher.regexIndex===0?(P+=e[0],1):(R=!0,0)}function b(e){let t=e[0],n=e.rule,i=new r(n),a=[n.__beforeBegin,n[`on:begin`]];for(let n of a)if(n&&(n(e,i),i.isMatchIgnored))return y(t);return n.skip?P+=t:(n.excludeBegin&&(P+=t),p(),!n.returnBegin&&!n.excludeBegin&&(P=t)),g(n,e),n.returnBegin?0:t.length}function C(e){let t=e[0],r=n.substring(e.index),i=_(A,e,r);if(!i)return Ee;let a=A;A.endScope&&A.endScope._wrap?(p(),m(t,A.endScope._wrap)):A.endScope&&A.endScope._multi?(p(),h(A.endScope,e)):a.skip?P+=t:(a.returnEnd||a.excludeEnd||(P+=t),p(),a.excludeEnd&&(P=t));do A.scope&&M.closeNode(),!A.skip&&!A.subLanguage&&(F+=A.relevance),A=A.parent;while(A!==i.parent);return i.starts&&g(i.starts,e),a.returnEnd?0:t.length}function w(){let e=[];for(let t=A;t!==D;t=t.parent)t.scope&&e.unshift(t.scope);e.forEach(e=>M.openNode(e))}let T={};function E(t,r){let a=r&&r[0];if(P+=t,a==null)return p(),0;if(T.type===`begin`&&r.type===`end`&&T.index===r.index&&a===``){if(P+=n.slice(r.index,r.index+1),!o){let t=Error(`0 width match regex (${e})`);throw t.languageName=e,t.badRule=T.rule,t}return 1}if(T=r,r.type===`begin`)return b(r);if(r.type===`illegal`&&!i){let e=Error(`Illegal lexeme "`+a+`" for mode "`+(A.scope||``)+`"`);throw e.mode=A,e}else if(r.type===`end`){let e=C(r);if(e!==Ee)return e}if(r.type===`illegal`&&a===``)return P+=`
+`,1;if(L>1e5&&L>r.index*3)throw Error(`potential infinite loop, way more iterations than matches`);return P+=a,a.length}let D=N(e);if(!D)throw J(s.replace(`{}`,e)),Error(`Unknown language: "`+e+`"`);let O=ye(D),k=``,A=a||O,j={},M=new l.__emitter(l);w();let P=``,F=0,I=0,L=0,R=!1;try{if(D.__emitTokens)D.__emitTokens(n,M);else{for(A.matcher.considerAll();;){L++,R?R=!1:A.matcher.considerAll(),A.matcher.lastIndex=I;let e=A.matcher.exec(n);if(!e)break;let t=E(n.substring(I,e.index),e);I=e.index+t}E(n.substring(I))}return M.finalize(),k=M.toHTML(),{language:e,value:k,relevance:F,illegal:!1,_emitter:M,_top:A}}catch(t){if(t.message&&t.message.includes(`Illegal`))return{language:e,value:we(n),illegal:!0,relevance:0,_illegalBy:{message:t.message,index:I,context:n.slice(I-100,I+100),mode:t.mode,resultSoFar:k},_emitter:M};if(o)return{language:e,value:we(n),illegal:!1,relevance:0,errorRaised:t,_emitter:M,_top:A};throw t}}function b(e){let t={value:we(e),illegal:!1,relevance:0,_top:c,_emitter:new l.__emitter(l)};return t._emitter.addText(e),t}function S(e,n){n=n||l.languages||Object.keys(t);let r=b(e),i=n.filter(N).filter(F).map(t=>v(t,e,!1));i.unshift(r);let[a,o]=i.sort((e,t)=>{if(e.relevance!==t.relevance)return t.relevance-e.relevance;if(e.language&&t.language){if(N(e.language).supersetOf===t.language)return 1;if(N(t.language).supersetOf===e.language)return-1}return 0}),s=a;return s.secondBest=o,s}function C(e,t,n){let r=t&&i[t]||n;e.classList.add(`hljs`),e.classList.add(`language-${r}`)}function w(e){let t=null,n=d(e);if(u(n))return;if(z(`before:highlightElement`,{el:e,language:n}),e.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e);return}if(e.children.length>0&&(l.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/wiki/security`),console.warn(`The element with unescaped HTML:`),console.warn(e)),l.throwUnescapedHTML))throw new Ce(`One of your code blocks includes unescaped HTML.`,e.innerHTML);t=e;let r=t.textContent,i=n?p(r,{language:n,ignoreIllegals:!0}):S(r);e.innerHTML=i.value,e.dataset.highlighted=`yes`,C(e,n,i.language),e.result={language:i.language,re:i.relevance,relevance:i.relevance},i.secondBest&&(e.secondBest={language:i.secondBest.language,relevance:i.secondBest.relevance}),z(`after:highlightElement`,{el:e,result:i,text:r})}function T(e){l=Te(l,e)}let E=()=>{k(),Y(`10.6.0`,`initHighlighting() deprecated. Use highlightAll() now.`)};function D(){k(),Y(`10.6.0`,`initHighlightingOnLoad() deprecated. Use highlightAll() now.`)}let O=!1;function k(){function e(){k()}if(document.readyState===`loading`){O||window.addEventListener(`DOMContentLoaded`,e,!1),O=!0;return}document.querySelectorAll(l.cssSelector).forEach(w)}function A(n,r){let i=null;try{i=r(e)}catch(e){if(J(`Language definition for '{}' could not be registered.`.replace(`{}`,n)),o)J(e);else throw e;i=c}i.name||=n,t[n]=i,i.rawDefinition=r.bind(null,e),i.aliases&&P(i.aliases,{languageName:n})}function j(e){delete t[e];for(let t of Object.keys(i))i[t]===e&&delete i[t]}function M(){return Object.keys(t)}function N(e){return e=(e||``).toLowerCase(),t[e]||t[i[e]]}function P(e,{languageName:t}){typeof e==`string`&&(e=[e]),e.forEach(e=>{i[e.toLowerCase()]=t})}function F(e){let t=N(e);return t&&!t.disableAutodetect}function I(e){e[`before:highlightBlock`]&&!e[`before:highlightElement`]&&(e[`before:highlightElement`]=t=>{e[`before:highlightBlock`](Object.assign({block:t.el},t))}),e[`after:highlightBlock`]&&!e[`after:highlightElement`]&&(e[`after:highlightElement`]=t=>{e[`after:highlightBlock`](Object.assign({block:t.el},t))})}function L(e){I(e),a.push(e)}function R(e){let t=a.indexOf(e);t!==-1&&a.splice(t,1)}function z(e,t){let n=e;a.forEach(function(e){e[n]&&e[n](t)})}function B(e){return Y(`10.7.0`,`highlightBlock will be removed entirely in v12.0`),Y(`10.7.0`,`Please use highlightElement now.`),w(e)}Object.assign(e,{highlight:p,highlightAuto:S,highlightAll:k,highlightElement:w,highlightBlock:B,configure:T,initHighlighting:E,initHighlightingOnLoad:D,registerLanguage:A,unregisterLanguage:j,listLanguages:M,getLanguage:N,registerAliases:P,autoDetection:F,inherit:Te,addPlugin:L,removePlugin:R}),e.debugMode=function(){o=!1},e.safeMode=function(){o=!0},e.versionString=Se,e.regex={concat:_,lookahead:m,either:y,optional:g,anyNumberOfTimes:h};for(let e in W)typeof W[e]==`object`&&n(W[e]);return Object.assign(e,W),e},Z=Oe({});Z.newInstance=()=>Oe({}),t.exports=Z,Z.HighlightJS=Z,Z.default=Z})),u=o(((e,t)=>{function n(e){let t=`[A-Za-zŠ-Яа-ŃŃŠ_][A-Za-zŠ-Яа-ŃŃŠ_0-9]+`,n=`Галее Š²Š¾Š·Š²ŃŠ°Ń Š²ŃŠ·Š²Š°ŃŃŠøŃŠŗŠ»ŃŃŠµŠ½ŠøŠµ Š²ŃŠæŠ¾Š»Š½ŠøŃŃ Š“Š»Ń ŠµŃŠ»Šø Šø ŠøŠ· или ŠøŠ½Š°Ńе ŠøŠ½Š°ŃееŃли ŠøŃŠŗŠ»ŃŃŠµŠ½ŠøŠµ кажГого ŠŗŠ¾Š½ŠµŃеŃли ŠŗŠ¾Š½ŠµŃпопŃŃŠŗŠø конеŃŃŠøŠŗŠ»Š° не Š½Š¾Š²Ńй ŠæŠµŃŠµŠ¹ŃŠø ŠæŠµŃŠµŠ¼ по пока попŃŃŠŗŠ° ŠæŃŠµŃваŃŃ ŠæŃŠ¾Š“олжиŃŃ ŃŠ¾Š³Š“а ŃŠøŠŗŠ» ŃŠŗŃпоŃŃ `,r=`null ŠøŃŃŠøŠ½Š° Š»Š¾Š¶Ń Š½ŠµŠ¾ŠæŃŠµŠ“елено`,i=e.inherit(e.NUMBER_MODE),a={className:`string`,begin:`"|\\|`,end:`"|$`,contains:[{begin:`""`}]},o={begin:`'`,end:`'`,excludeBegin:!0,excludeEnd:!0,contains:[{className:`number`,begin:`\\d{4}([\\.\\\\/:-]?\\d{2}){0,5}`}]},s={match:/[;()+\-:=,]/,className:`punctuation`,relevance:0},c=e.inherit(e.C_LINE_COMMENT_MODE),l={className:`meta`,begin:`#|&`,end:`$`,keywords:{$pattern:t,keyword:n+`загŃŃŠ·ŠøŃŃŠøŠ·Ńайла Š²ŠµŠ±ŠŗŠ»ŠøŠµŠ½Ń вмеŃŃŠ¾ Š²Š½ŠµŃŠ½ŠµŠµŃоеГинение ŠŗŠ»ŠøŠµŠ½Ń ŠŗŠ¾Š½ŠµŃŠ¾Š±Š»Š°ŃŃŠø Š¼Š¾Š±ŠøŠ»ŃŠ½Š¾ŠµŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŠµŠŗŠ»ŠøŠµŠ½Ń Š¼Š¾Š±ŠøŠ»ŃŠ½Š¾ŠµŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŠµŃŠµŃŠ²ŠµŃ Š½Š°ŠŗŠ»ŠøŠµŠ½ŃŠµ Š½Š°ŠŗŠ»ŠøŠµŠ½ŃŠµŠ½Š°ŃŠµŃŠ²ŠµŃе Š½Š°ŠŗŠ»ŠøŠµŠ½ŃŠµŠ½Š°ŃŠµŃŠ²ŠµŃŠµŠ±ŠµŠ·ŠŗŠ¾Š½ŃекŃŃŠ° Š½Š°ŃŠµŃŠ²ŠµŃŠµ Š½Š°ŃŠµŃŠ²ŠµŃŠµŠ±ŠµŠ·ŠŗŠ¾Š½ŃекŃŃŠ° облаŃŃŃ ŠæŠµŃŠµŠ“ ŠæŠ¾ŃŠ»Šµ ŃŠµŃŠ²ŠµŃ ŃŠ¾Š»ŃŃŃŠ¹ŠŗŠ»ŠøŠµŠ½ŃобŃŃŠ½Š¾ŠµŠæŃиложение ŃŠ¾Š»ŃŃŃŠ¹ŠŗŠ»ŠøŠµŠ½ŃŃŠæŃŠ°Š²Š»ŃŠµŠ¼Š¾ŠµŠæŃиложение ŃŠ¾Š½ŠŗŠøŠ¹ŠŗŠ»ŠøŠµŠ½Ń `},contains:[c]},u={className:`symbol`,begin:`~`,end:`;|:`,excludeEnd:!0},d={className:`function`,variants:[{begin:`ŠæŃŠ¾ŃеГŃŃŠ°|ŃŃŠ½ŠŗŃŠøŃ`,end:`\\)`,keywords:`ŠæŃŠ¾ŃеГŃŃŠ° ŃŃŠ½ŠŗŃŠøŃ`},{begin:`ŠŗŠ¾Š½ŠµŃŠæŃŠ¾ŃŠµŠ“ŃŃŃ|конеŃŃŃŠ½ŠŗŃŠøŠø`,keywords:`ŠŗŠ¾Š½ŠµŃŠæŃŠ¾ŃŠµŠ“ŃŃŃ ŠŗŠ¾Š½ŠµŃŃŃŠ½ŠŗŃŠøŠø`}],contains:[{begin:`\\(`,end:`\\)`,endsParent:!0,contains:[{className:`params`,begin:t,end:`,`,excludeEnd:!0,endsWithParent:!0,keywords:{$pattern:t,keyword:`знаŃ`,literal:r},contains:[i,a,o]},c]},e.inherit(e.TITLE_MODE,{begin:t})]};return{name:`1C:Enterprise`,case_insensitive:!0,keywords:{$pattern:t,keyword:n,built_in:`ŃŠ°Š·Š“ŠµŠ»ŠøŃŠµŠ»ŃŃŃŃŠ°Š½ŠøŃ ŃŠ°Š·Š“ŠµŠ»ŠøŃŠµŠ»ŃŃŃŃŠ¾Šŗ ŃŠøŠ¼Š²Š¾Š»ŃŠ°Š±ŃŠ»ŃŃŠøŠø ansitooem oemtoansi ввеŃŃŠøŠ²ŠøŠ“ŃŃŠ±ŠŗŠ¾Š½Ńо ввеŃŃŠøŠæŠµŃŠµŃŠøŃление ввеŃŃŠøŠæŠµŃиоГ ввеŃŃŠøŠæŠ»Š°Š½ŃŃŠµŃов Š²ŃŠ±ŃŠ°Š½Š½ŃйпланŃŃŠµŃов Š“Š°ŃŠ°Š³Š¾Š“ Š“Š°ŃŠ°Š¼ŠµŃŃŃ Š“Š°ŃŠ°ŃŠøŃŠ»Š¾ Š·Š°Š³Š¾Š»Š¾Š²Š¾ŠŗŃŠøŃŃŠµŠ¼Ń Š·Š½Š°ŃŠµŠ½ŠøŠµŠ²ŃŃŃŠ¾ŠŗŃ Š·Š½Š°ŃŠµŠ½ŠøŠµŠøŠ·ŃŃŃŠ¾ŠŗŠø ŠŗŠ°ŃŠ°Š»Š¾Š³ŠøŠ± ŠŗŠ°ŃŠ°Š»Š¾Š³ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń ŠŗŠ¾Š“ŃŠøŠ¼Š² конгоГа ŠŗŠ¾Š½ŠµŃŠæŠµŃŠøŠ¾Š“аби конеŃŃŠ°ŃŃŃŠøŃŠ°Š½Š½Š¾Š³Š¾ŠæŠµŃŠøŠ¾Š“аби конеŃŃŃŠ°Š½Š“аŃŃŠ½Š¾Š³Š¾ŠøŠ½ŃŠµŃŠ²Š°Š»Š° конкваŃŃŠ°Š»Š° конмеŃŃŃŠ° коннеГели лог лог10 Š¼Š°ŠŗŃŠøŠ¼Š°Š»ŃŠ½Š¾ŠµŠŗŠ¾Š»ŠøŃŠµŃŃŠ²Š¾ŃŃŠ±ŠŗŠ¾Š½Ńо Š½Š°Š·Š²Š°Š½ŠøŠµŠøŠ½ŃеŃŃŠµŠ¹Ńа Š½Š°Š·Š²Š°Š½ŠøŠµŠ½Š°Š±Š¾ŃапŃав Š½Š°Š·Š½Š°ŃŠøŃŃŠ²ŠøŠ“ Š½Š°Š·Š½Š°ŃŠøŃŃŃŃŠµŃ Š½Š°Š¹ŃŠøŃŃŃŠ»ŠŗŠø Š½Š°ŃŠ°Š»Š¾ŠæŠµŃиоГаби Š½Š°ŃалоŃŃŠ°Š½Š“аŃŃŠ½Š¾Š³Š¾ŠøŠ½ŃŠµŃŠ²Š°Š»Š° Š½Š°ŃŠ³Š¾Š“а Š½Š°ŃкваŃŃŠ°Š»Š° Š½Š°ŃŠ¼ŠµŃŃŃŠ° Š½Š°ŃŠ½ŠµŠ“ели Š½Š¾Š¼ŠµŃŠ“Š½ŃŠ³Š¾Š“а Š½Š¾Š¼ŠµŃŠ“Š½ŃŠ½ŠµŠ“ели Š½Š¾Š¼ŠµŃнеГелигоГа Š¾Š±ŃŠ°Š±Š¾ŃŠŗŠ°Š¾Š¶ŠøŠ“Š°Š½ŠøŃ Š¾ŃŠ½Š¾Š²Š½Š¾Š¹Š¶ŃŃŠ½Š°Š»ŃаŃŃŠµŃов Š¾ŃновнойпланŃŃŠµŃов Š¾ŃŠ½Š¾Š²Š½Š¾Š¹ŃŠ·ŃŠŗ Š¾ŃŠøŃŃŠøŃŃŠ¾ŠŗŠ½Š¾ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠ¹ ŠæŠµŃŠøŠ¾Š“ŃŃŃ ŠæŠ¾Š»ŃŃŠøŃŃŠ²ŃемŃŃŠ° полŃŃŠøŃŃŠ“аŃŃŃŠ° полŃŃŠøŃŃŠ“Š¾ŠŗŃŠ¼ŠµŠ½ŃŃŠ° полŃŃŠøŃŃŠ·Š½Š°ŃŠµŠ½ŠøŃŠ¾ŃŠ±Š¾ŃŠ° полŃŃŠøŃŃŠæŠ¾Š·ŠøŃŠøŃŃŠ° полŃŃŠøŃŃŠæŃŃŃŠ¾ŠµŠ·Š½Š°Ńение полŃŃŠøŃŃŃŠ° ŠæŃŠµŃŠøŠŗŃŠ°Š²ŃŠ¾Š½ŃŠ¼ŠµŃŠ°ŃŠøŠø ŠæŃŠ¾ŠæŠøŃŃ ŠæŃŃŃŠ¾ŠµŠ·Š½Š°Ńение ŃŠ°Š·Š¼ ŃŠ°Š·Š¾Š±ŃаŃŃŠæŠ¾Š·ŠøŃŠøŃŠ“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŃŠ°ŃŃŃŠøŃаŃŃŃŠµŠ³ŠøŃŃŃŃŠ½Š° ŃŠ°ŃŃŃŠøŃаŃŃŃŠµŠ³ŠøŃŃŃŃŠæŠ¾ ŃŠøŠ¼Š² ŃŠ¾Š·Š“аŃŃŠ¾Š±ŃŠµŠŗŃ ŃŃŠ°ŃŃŃŠ²Š¾Š·Š²ŃŠ°ŃŠ° ŃŃŃŠŗŠ¾Š»ŠøŃеŃŃŠ²Š¾ŃŃŃŠ¾Šŗ ŃŃŠ¾ŃŠ¼ŠøŃŠ¾Š²Š°ŃŃŠæŠ¾Š·ŠøŃŠøŃŠ“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŃŃŠµŃŠæŠ¾ŠŗŠ¾Š“Ń ŃŠµŠŗŃŃŠµŠµŠ²ŃŠµŠ¼Ń ŃŠøŠæŠ·Š½Š°ŃŠµŠ½ŠøŃ ŃŠøŠæŠ·Š½Š°ŃениŃŃŃŃ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŃŠ°Š½Š° ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŃŠ°ŠæŠ¾ ŃŠøŠŗŃŃŠ°Š±Š»Š¾Š½ ŃŠ°Š±Š»Š¾Š½ acos asin atan base64Š·Š½Š°ŃŠµŠ½ŠøŠµ base64ŃŃŃŠ¾ŠŗŠ° cos exp log log10 pow sin sqrt tan xmlŠ·Š½Š°ŃŠµŠ½ŠøŠµ xmlŃŃŃŠ¾ŠŗŠ° xmlŃŠøŠæ xmlŃŠøŠæŠ·Š½Ń Š°ŠŗŃŠøŠ²Š½Š¾ŠµŠ¾ŠŗŠ½Š¾ Š±ŠµŠ·Š¾ŠæŠ°ŃŠ½ŃŠ¹ŃŠµŠ¶ŠøŠ¼ Š±ŠµŠ·Š¾ŠæŠ°ŃŠ½ŃŠ¹ŃŠµŠ¶ŠøŠ¼ŃŠ°Š·Š“ŠµŠ»ŠµŠ½ŠøŃŠ“аннŃŃ Š±ŃŠ»ŠµŠ²Š¾ ввеŃŃŠøŠ“аŃŃ Š²Š²ŠµŃŃŠøŠ·Š½Š°Ńение ввеŃŃŠøŃŃŃŠ¾ŠŗŃ ввеŃŃŠøŃŠøŃŠ»Š¾ возможноŃŃŃŃŃŠµŠ½ŠøŃxml Š²Š¾ŠæŃŠ¾Ń воŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠ·Š½Š°Ńение Š²Ńег Š²ŃгŃŃŠ·ŠøŃŃŠ¶ŃŃŠ½Š°Š»ŃегиŃŃŃŠ°ŃŠøŠø Š²ŃŠæŠ¾Š»Š½ŠøŃŃŠ¾Š±ŃŠ°Š±Š¾ŃŠŗŃŠ¾ŠæŠ¾Š²ŠµŃŠµŠ½ŠøŃ Š²ŃŠæŠ¾Š»Š½ŠøŃŃŠæŃŠ¾Š²ŠµŃŠŗŃŠæŃŠ°Š²Š“оŃŃŃŠæŠ° вŃŃŠøŃлиŃŃ Š³Š¾Š“ Š“Š°Š½Š½ŃŠµŃŠ¾ŃŠ¼ŃŠ²Š·Š½Š°ŃŠµŠ½ŠøŠµ Š“Š°ŃŠ° Š“ŠµŠ½Ń Š“ŠµŠ½ŃŠ³Š¾Š“а Š“ŠµŠ½ŃŠ½ŠµŠ“ели ГобавиŃŃŠ¼ŠµŃŃŃ Š·Š°Š±Š»Š¾ŠŗŠøŃŠ¾Š²Š°ŃŃŠ“Š°Š½Š½ŃŠµŠ“Š»ŃŃŠµŠ“Š°ŠŗŃŠøŃŠ¾Š²Š°Š½ŠøŃ Š·Š°Š±Š»Š¾ŠŗŠøŃŠ¾Š²Š°ŃŃŃŠ°Š±Š¾ŃŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń Š·Š°Š²ŠµŃŃŠøŃŃŃŠ°Š±Š¾ŃŃŃŠøŃŃŠµŠ¼Ń загŃŃŠ·ŠøŃŃŠ²Š½ŠµŃнŃŃŠŗŠ¾Š¼ŠæŠ¾Š½ŠµŠ½ŃŃ Š·Š°ŠŗŃŃŃŃŃŠæŃŠ°Š²ŠŗŃ Š·Š°ŠæŠøŃŠ°ŃŃjson Š·Š°ŠæŠøŃŠ°ŃŃxml Š·Š°ŠæŠøŃŠ°ŃŃŠ“аŃŃjson запиŃŃŠ¶ŃŃŠ½Š°Š»Š°ŃегиŃŃŃŠ°ŃŠøŠø заполниŃŃŠ·Š½Š°ŃениŃŃŠ²Š¾Š¹ŃŃŠ² Š·Š°ŠæŃŠ¾ŃŠøŃŃŃŠ°Š·ŃŠµŃŠµŠ½ŠøŠµŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń запŃŃŃŠøŃŃŠæŃиложение запŃŃŃŠøŃŃŃŠøŃŃŠµŠ¼Ń Š·Š°ŃŠøŠŗŃŠøŃŠ¾Š²Š°ŃŃŃŃŠ°Š½Š·Š°ŠŗŃŠøŃ Š·Š½Š°ŃŠµŠ½ŠøŠµŠ²Š“Š°Š½Š½ŃŠµŃŠ¾ŃŠ¼Ń Š·Š½Š°ŃŠµŠ½ŠøŠµŠ²ŃŃŃŠ¾ŠŗŃвнŃŃŃ Š·Š½Š°ŃŠµŠ½ŠøŠµŠ²Ńайл Š·Š½Š°Ńениезаполнено Š·Š½Š°ŃениеизŃŃŃŠ¾ŠŗŠøŠ²Š½ŃŃŃ Š·Š½Š°ŃŠµŠ½ŠøŠµŠøŠ·Ńайла ŠøŠ·xmlŃŠøŠæŠ° импоŃŃŠ¼Š¾Š“елиxdto ŠøŠ¼ŃŠŗŠ¾Š¼ŠæŃŃŃŠµŃа ŠøŠ¼ŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń ŠøŠ½ŠøŃŠøŠ°Š»ŠøŠ·ŠøŃоваŃŃŠæŃŠµŠ“Š¾ŠæŃŠµŠ“ŠµŠ»ŠµŠ½Š½ŃŠµŠ“Š°Š½Š½ŃŠµ ŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŃŠ¾Š±Š¾ŃŠøŠ±ŠŗŠµ ŠŗŠ°ŃŠ°Š»Š¾Š³Š±ŠøŠ±Š»ŠøŠ¾ŃŠµŠŗŠøŠ¼Š¾Š±ŠøŠ»ŃŠ½Š¾Š³Š¾ŃŃŃŃŠ¾Š¹ŃŃŠ²Š° ŠŗŠ°ŃŠ°Š»Š¾Š³Š²ŃеменнŃŃ ŃŠ°Š¹Š»Š¾Š² ŠŗŠ°ŃŠ°Š»Š¾Š³Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńов ŠŗŠ°ŃŠ°Š»Š¾Š³ŠæŃŠ¾Š³ŃŠ°Š¼Š¼Ń ŠŗŠ¾Š“ŠøŃŠ¾Š²Š°ŃŃŃŃŃŠ¾ŠŗŃ ŠŗŠ¾Š“Š»Š¾ŠŗŠ°Š»ŠøŠ·Š°ŃŠøŠøŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŠ¾Š½Š½Š¾Š¹Š±Š°Š·Ń ŠŗŠ¾Š“ŃŠøŠ¼Š²Š¾Š»Š° ŠŗŠ¾Š¼Š°Š½Š“Š°ŃŠøŃŃŠµŠ¼Ń ŠŗŠ¾Š½ŠµŃŠ³Š¾Š“а ŠŗŠ¾Š½ŠµŃŠ“Š½Ń ŠŗŠ¾Š½ŠµŃŠŗŠ²Š°ŃŃŠ°Š»Š° ŠŗŠ¾Š½ŠµŃŠ¼ŠµŃŃŃŠ° ŠŗŠ¾Š½ŠµŃŠ¼ŠøŠ½ŃŃŃ ŠŗŠ¾Š½ŠµŃŠ½ŠµŠ“ели конеŃŃŠ°Ńа ŠŗŠ¾Š½ŃигŃŃŠ°ŃŠøŃŠ±Š°Š·ŃГаннŃŃ ŠøŠ·Š¼ŠµŠ½ŠµŠ½Š°Š“ŠøŠ½Š°Š¼ŠøŃŠµŃŠŗŠø ŠŗŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŃŠøŠ·Š¼ŠµŠ½ŠµŠ½Š° ŠŗŠ¾ŠæŠøŃŠ¾Š²Š°ŃŃŠ“Š°Š½Š½ŃŠµŃŠ¾ŃŠ¼Ń ŠŗŠ¾ŠæŠøŃŠ¾Š²Š°ŃŃŃŠ°Š¹Š» ŠŗŃŠ°ŃŠŗŠ¾ŠµŠæŃŠµŠ“ŃŃŠ°Š²Š»ŠµŠ½ŠøŠµŠ¾Ńибки лев Š¼Š°ŠŗŃ меŃŃŠ½Š¾ŠµŠ²ŃŠµŠ¼Ń Š¼ŠµŃŃŃ Š¼ŠøŠ½ минŃŃŠ° Š¼Š¾Š½Š¾ŠæŠ¾Š»ŃŠ½ŃŠ¹ŃŠµŠ¶ŠøŠ¼ Š½Š°Š¹ŃŠø Š½Š°Š¹ŃŠøŠ½ŠµŠ“опŃŃŃŠøŠ¼ŃŠµŃŠøŠ¼Š²Š¾Š»Ńxml Š½Š°Š¹ŃŠøŠ¾ŠŗŠ½Š¾ŠæŠ¾Š½Š°Š²ŠøŠ³Š°ŃионнойŃŃŃŠ»ŠŗŠµ Š½Š°Š¹ŃŠøŠæŠ¾Š¼ŠµŃŠµŠ½Š½ŃŠµŠ½Š°ŃГаление Š½Š°Š¹ŃипоŃŃŃŠ»ŠŗŠ°Š¼ Š½Š°Š¹ŃŠøŃŠ°Š¹Š»Ń Š½Š°ŃŠ°Š»Š¾Š³Š¾Š“а Š½Š°ŃŠ°Š»Š¾Š“Š½Ń Š½Š°ŃŠ°Š»Š¾ŠŗŠ²Š°ŃŃŠ°Š»Š° Š½Š°ŃŠ°Š»Š¾Š¼ŠµŃŃŃŠ° Š½Š°ŃŠ°Š»Š¾Š¼ŠøŠ½ŃŃŃ Š½Š°ŃŠ°Š»Š¾Š½ŠµŠ“ели Š½Š°ŃŠ°Š»Š¾ŃŠ°Ńа Š½Š°ŃаŃŃŠ·Š°ŠæŃоŃŃŠ°Š·ŃŠµŃŠµŠ½ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń Š½Š°ŃŠ°ŃŃŠ·Š°ŠæŃŃŠŗŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ Š½Š°ŃŠ°ŃŃŠŗŠ¾ŠæŠøŃŠ¾Š²Š°Š½ŠøŠµŃŠ°Š¹Š»Š° Š½Š°ŃŠ°ŃŃŠæŠµŃŠµŠ¼ŠµŃŠµŠ½ŠøŠµŃŠ°Š¹Š»Š° Š½Š°ŃŠ°ŃŃŠæŠ¾Š“ŠŗŠ»ŃŃŠµŠ½ŠøŠµŠ²Š½ŠµŃнейкомпоненŃŃ Š½Š°ŃŠ°ŃŃŠæŠ¾Š“ŠŗŠ»ŃŃŠµŠ½ŠøŠµŃаŃŃŠøŃениŃŃŠ°Š±Š¾ŃŃŃŠŗŃŠøŠæŃŠ¾Š³ŃŠ°ŃŠøŠµŠ¹ Š½Š°ŃŠ°ŃŃŠæŠ¾Š“ŠŗŠ»ŃŃŠµŠ½ŠøŠµŃаŃŃŠøŃениŃŃŠ°Š±Š¾ŃŃŃŃŠ°Š¹Š»Š°Š¼Šø Š½Š°ŃŠ°ŃŃŠæŠ¾ŠøŃŠŗŃайлов Š½Š°ŃаŃŃŠæŠ¾Š»ŃŃŠµŠ½ŠøŠµŠŗŠ°ŃŠ°Š»Š¾Š³Š°Š²ŃŠµŠ¼ŠµŠ½Š½ŃŃ ŃŠ°Š¹Š»Š¾Š² Š½Š°ŃŠ°ŃŃŠæŠ¾Š»ŃŃŠµŠ½ŠøŠµŠŗŠ°ŃŠ°Š»Š¾Š³Š°Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńов Š½Š°ŃаŃŃŠæŠ¾Š»ŃŃŠµŠ½ŠøŠµŃŠ°Š±Š¾ŃŠµŠ³Š¾ŠŗŠ°ŃалогаГаннŃŃ ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń Š½Š°ŃŠ°ŃŃŠæŠ¾Š»ŃŃŠµŠ½ŠøŠµŃайлов Š½Š°ŃаŃŃŠæŠ¾Š¼ŠµŃŠµŠ½ŠøŠµŃайла Š½Š°ŃаŃŃŠæŠ¾Š¼ŠµŃŠµŠ½ŠøŠµŃайлов Š½Š°ŃаŃŃŃŠ¾Š·Š“Š°Š½ŠøŠµŠ“Š²Š¾ŠøŃŠ½ŃŃ Š“Š°Š½Š½ŃŃ ŠøŠ·ŃŠ°Š¹Š»Š° Š½Š°ŃŠ°ŃŃŃŠ¾Š·Š“Š°Š½ŠøŠµŠŗŠ°ŃŠ°Š»Š¾Š³Š° Š½Š°ŃŠ°ŃŃŃŃŠ°Š½Š·Š°ŠŗŃŠøŃ Š½Š°ŃŠ°ŃŃŃŠ“Š°Š»ŠµŠ½ŠøŠµŃŠ°Š¹Š»Š¾Š² Š½Š°ŃŠ°ŃŃŃŃŃŠ°Š½Š¾Š²ŠŗŃŠ²Š½ŠµŃŠ½ŠµŠ¹ŠŗŠ¾Š¼ŠæŠ¾Š½ŠµŠ½ŃŃ Š½Š°ŃŠ°ŃŃŃŃŃŠ°Š½Š¾Š²ŠŗŃŃŠ°ŃŃŠøŃениŃŃŠ°Š±Š¾ŃŃŃŠŗŃŠøŠæŃŠ¾Š³ŃŠ°ŃŠøŠµŠ¹ Š½Š°ŃŠ°ŃŃŃŃŃŠ°Š½Š¾Š²ŠŗŃŃŠ°ŃŃŠøŃениŃŃŠ°Š±Š¾ŃŃŃŃŠ°Š¹Š»Š°Š¼Šø Š½ŠµŠ“ŠµŠ»ŃŠ³Š¾Š“а Š½ŠµŠ¾Š±Ń оГимоŃŃŃŠ·Š°Š²ŠµŃŃŠµŠ½ŠøŃŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃ Š½Š¾Š¼ŠµŃŃŠµŠ°Š½ŃŠ°ŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŠ¾Š½Š½Š¾Š¹Š±Š°Š·Ń номеŃŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŠ¾Š½Š½Š¾Š¹Š±Š°Š·Ń Š½ŃŠµŠ³ нŃŃŃ Š¾Š±Š½Š¾Š²ŠøŃŃŠøŠ½ŃеŃŃŠµŠ¹Ń обновиŃŃŠ½ŃŠ¼ŠµŃŠ°ŃŠøŃŠ¾Š±ŃŠµŠŗŃŠ¾Š² обновиŃŃŠæŠ¾Š²ŃŠ¾ŃŠ½Š¾ŠøŃŠæŠ¾Š»ŃŠ·ŃŠµŠ¼ŃŠµŠ·Š½Š°ŃŠµŠ½ŠøŃ Š¾Š±ŃŠ°Š±Š¾ŃŠŗŠ°ŠæŃŠµŃŃŠ²Š°Š½ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń Š¾Š±ŃŠµŠ“иниŃŃŃŠ°Š¹Š»Ń Š¾ŠŗŃ Š¾ŠæŠøŃŠ°Š½ŠøŠµŠ¾Ńибки оповеŃŃŠøŃŃ Š¾ŠæŠ¾Š²ŠµŃŃŠøŃŃŠ¾Š±ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŠø Š¾ŃŠŗŠ»ŃŃŠøŃŃŠ¾Š±ŃабоŃŃŠøŠŗŠ·Š°ŠæŃŠ¾ŃŠ°Š½Š°ŃŃŃŠ¾ŠµŠŗŠŗŠ»ŠøŠµŠ½ŃŠ°Š»ŠøŃŠµŠ½Š·ŠøŃŠ¾Š²Š°Š½ŠøŃ Š¾ŃŠŗŠ»ŃŃŠøŃŃŠ¾Š±ŃабоŃŃŠøŠŗŠ¾Š¶ŠøŠ“Š°Š½ŠøŃ Š¾ŃŠŗŠ»ŃŃŠøŃŃŠ¾Š±ŃабоŃŃŠøŠŗŠ¾ŠæŠ¾Š²ŠµŃŠµŠ½ŠøŃ Š¾ŃŠŗŃŃŃŃŠ·Š½Š°Ńение Š¾ŃŠŗŃŃŃŃŠøŠ½Š“екŃŃŠæŃавки Š¾ŃŠŗŃŃŃŃŃŠ¾Š“ŠµŃŠ¶Š°Š½ŠøŠµŃŠæŃŠ°Š²ŠŗŠø Š¾ŃŠŗŃŃŃŃŃŠæŃŠ°Š²ŠŗŃ Š¾ŃŠŗŃŃŃŃŃŠ¾ŃŠ¼Ń Š¾ŃŠŗŃŃŃŃŃŠ¾ŃŠ¼ŃŠ¼Š¾Š“Š°Š»ŃŠ½Š¾ Š¾ŃŠ¼ŠµŠ½ŠøŃŃŃŃŠ°Š½Š·Š°ŠŗŃŠøŃ Š¾ŃŠøŃŃŠøŃŃŠ¶ŃŃŠ½Š°Š»ŃегиŃŃŃŠ°ŃŠøŠø Š¾ŃŠøŃŃŠøŃŃŠ½Š°ŃŃŃŠ¾Š¹ŠŗŠøŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń Š¾ŃŠøŃŃŠøŃŃŃŠ¾Š¾Š±ŃŠµŠ½ŠøŃ ŠæŠ°ŃŠ°Š¼ŠµŃŃŃŠ“оŃŃŃŠæŠ° ŠæŠµŃŠµŠ¹ŃŠøŠæŠ¾Š½Š°Š²ŠøŠ³Š°ŃŠøŠ¾Š½Š½Š¾Š¹ŃŃŃŠ»ŠŗŠµ ŠæŠµŃŠµŠ¼ŠµŃŃŠøŃŃŃŠ°Š¹Š» поГклŃŃŠøŃŃŠ²Š½ŠµŃнŃŃŠŗŠ¾Š¼ŠæŠ¾Š½ŠµŠ½ŃŃ ŠæŠ¾Š“ŠŗŠ»ŃŃŠøŃŃŠ¾Š±ŃабоŃŃŠøŠŗŠ·Š°ŠæŃŠ¾ŃŠ°Š½Š°ŃŃŃŠ¾ŠµŠŗŠŗŠ»ŠøŠµŠ½ŃŠ°Š»ŠøŃŠµŠ½Š·ŠøŃŠ¾Š²Š°Š½ŠøŃ ŠæŠ¾Š“ŠŗŠ»ŃŃŠøŃŃŠ¾Š±ŃабоŃŃŠøŠŗŠ¾Š¶ŠøŠ“Š°Š½ŠøŃ ŠæŠ¾Š“ŠŗŠ»ŃŃŠøŃŃŠ¾Š±ŃабоŃŃŠøŠŗŠ¾ŠæŠ¾Š²ŠµŃŠµŠ½ŠøŃ ŠæŠ¾Š“ŠŗŠ»ŃŃŠøŃŃŃŠ°ŃŃŠøŃŠµŠ½ŠøŠµŃŠ°Š±Š¾ŃŃŃŠŗŃŠøŠæŃŠ¾Š³ŃŠ°ŃŠøŠµŠ¹ поГклŃŃŠøŃŃŃŠ°ŃŃŠøŃŠµŠ½ŠøŠµŃŠ°Š±Š¾ŃŃŃŃŠ°Š¹Š»Š°Š¼Šø ŠæŠ¾Š“ŃŠ¾Š±Š½Š¾ŠµŠæŃеГŃŃŠ°Š²Š»ŠµŠ½ŠøŠµŠ¾Ńибки показаŃŃŠ²Š²Š¾Š“ГаŃŃ ŠæŠ¾ŠŗŠ°Š·Š°ŃŃŠ²Š²Š¾Š“Š·Š½Š°ŃŠµŠ½ŠøŃ показаŃŃŠ²Š²Š¾Š“ŃŃŃŠ¾ŠŗŠø показаŃŃŠ²Š²Š¾Š“ŃŠøŃла показаŃŃŠ²Š¾ŠæŃŠ¾Ń ŠæŠ¾ŠŗŠ°Š·Š°ŃŃŠ·Š½Š°Ńение показаŃŃŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŃŠ¾Š±Š¾Ńибке показаŃŃŠ½Š°ŠŗŠ°ŃŃŠµ показаŃŃŠ¾ŠæŠ¾Š²ŠµŃŠµŠ½ŠøŠµŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń ŠæŠ¾ŠŗŠ°Š·Š°ŃŃŠæŃŠµŠ“ŃŠæŃежГение ŠæŠ¾Š»Š½Š¾ŠµŠøŠ¼ŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń ŠæŠ¾Š»ŃŃŠøŃŃcomŠ¾Š±ŃŠµŠŗŃ полŃŃŠøŃŃxmlŃŠøŠæ полŃŃŠøŃŃŠ°Š“ŃŠµŃпомеŃŃŠ¾ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŃ полŃŃŠøŃŃŠ±Š»Š¾ŠŗŠøŃовкŃŃŠµŠ°Š½Ńов полŃŃŠøŃŃŠ²ŃŠµŠ¼ŃŠ·Š°Š²ŠµŃŃŠµŠ½ŠøŃŃŠæŃŃŠµŠ³Š¾ŃŠµŠ°Š½ŃŠ° полŃŃŠøŃŃŠ²ŃŠµŠ¼ŃŠ·Š°ŃŃŠæŠ°Š½ŠøŃŠæŠ°ŃŃŠøŠ²Š½Š¾Š³Š¾ŃŠµŠ°Š½ŃŠ° полŃŃŠøŃŃŠ²ŃŠµŠ¼ŃŠ¾Š¶ŠøŠ“Š°Š½ŠøŃŠ±Š»Š¾ŠŗŠøŃовкиГаннŃŃ ŠæŠ¾Š»ŃŃŠøŃŃŠ“Š°Š½Š½ŃŠµŠ²ŃŠ±Š¾ŃŠ° полŃŃŠøŃŃŠ“Š¾ŠæŠ¾Š»Š½ŠøŃŠµŠ»ŃŠ½ŃŠ¹ŠæŠ°ŃамеŃŃŠŗŠ»ŠøŠµŠ½ŃŠ°Š»ŠøŃŠµŠ½Š·ŠøŃŠ¾Š²Š°Š½ŠøŃ ŠæŠ¾Š»ŃŃŠøŃŃŠ“опŃŃŃŠøŠ¼ŃŠµŠŗŠ¾Š“ŃŠ»Š¾ŠŗŠ°Š»ŠøŠ·Š°ŃŠøŠø полŃŃŠøŃŃŠ“опŃŃŃŠøŠ¼ŃŠµŃŠ°ŃŠ¾Š²ŃŠµŠæŠ¾ŃŃŠ° полŃŃŠøŃŃŠ·Š°Š³Š¾Š»Š¾Š²Š¾ŠŗŠŗŠ»ŠøŠµŠ½ŃŃŠŗŠ¾Š³Š¾ŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ ŠæŠ¾Š»ŃŃŠøŃŃŠ·Š°Š³Š¾Š»Š¾Š²Š¾ŠŗŃŠøŃŃŠµŠ¼Ń полŃŃŠøŃŃŠ·Š½Š°ŃŠµŠ½ŠøŃŠ¾ŃŠ±Š¾ŃŠ°Š¶ŃŃŠ½Š°Š»Š°ŃегиŃŃŃŠ°ŃŠøŠø полŃŃŠøŃŃŠøŠ“ŠµŠ½ŃŠøŃŠøŠŗŠ°ŃŠ¾ŃŠŗŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŠø полŃŃŠøŃŃŠøŠ·Š²ŃŠµŠ¼ŠµŠ½Š½Š¾Š³Š¾Ń ŃŠ°Š½ŠøŠ»ŠøŃа полŃŃŠøŃŃŠøŠ¼ŃŠ²ŃŠµŠ¼ŠµŠ½Š½Š¾Š³Š¾Ńайла полŃŃŠøŃŃŠøŠ¼ŃŠŗŠ»ŠøŠµŠ½ŃŠ°Š»ŠøŃŠµŠ½Š·ŠøŃŠ¾Š²Š°Š½ŠøŃ полŃŃŠøŃŃŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŃŃŠŗŃŠ°Š½Š¾Š²ŠŗŠ»ŠøŠµŠ½ŃŠ° полŃŃŠøŃŃŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠ¶ŃŃŠ½Š°Š»Š°ŃегиŃŃŃŠ°ŃŠøŠø полŃŃŠøŃŃŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŃобŃŃŠøŃжŃŃŠ½Š°Š»Š°ŃегиŃŃŃŠ°ŃŠøŠø полŃŃŠøŃŃŠŗŃŠ°ŃŠŗŠøŠ¹Š·Š°Š³Š¾Š»Š¾Š²Š¾ŠŗŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ ŠæŠ¾Š»ŃŃŠøŃŃŠ¼Š°ŠŗŠµŃŠ¾ŃŠ¾ŃŠ¼Š»ŠµŠ½ŠøŃ ŠæŠ¾Š»ŃŃŠøŃŃŠ¼Š°ŃŠŗŃŠ²ŃŠµŃŠ°Š¹Š»Ń полŃŃŠøŃŃŠ¼Š°ŃŠŗŃŠ²ŃŠµŃŠ°Š¹Š»ŃŠŗŠ»ŠøŠµŠ½ŃŠ° полŃŃŠøŃŃŠ¼Š°ŃŠŗŃŠ²ŃŠµŃŠ°Š¹Š»ŃŃŠµŃŠ²ŠµŃŠ° полŃŃŠøŃŃŠ¼ŠµŃŃŠ¾ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŠæŠ¾Š°Š“ŃŠµŃŃ ŠæŠ¾Š»ŃŃŠøŃŃŠ¼ŠøŠ½ŠøŠ¼Š°Š»ŃнŃŃŠ“Š»ŠøŠ½ŃŠæŠ°ŃŠ¾Š»ŠµŠ¹ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»ŠµŠ¹ полŃŃŠøŃŃŠ½Š°Š²ŠøŠ³Š°ŃионнŃŃŃŃŃŠ»ŠŗŃ полŃŃŠøŃŃŠ½Š°Š²ŠøŠ³Š°ŃионнŃŃŃŃŃŠ»ŠŗŃŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŠ¾Š½Š½Š¾Š¹Š±Š°Š·Ń полŃŃŠøŃŃŠ¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŠµŠŗŠ¾Š½ŃигŃŃŠ°ŃŠøŠøŠ±Š°Š·ŃŠ“аннŃŃ ŠæŠ¾Š»ŃŃŠøŃŃŠ¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŠµŠæŃŠµŠ“Š¾ŠæŃŠµŠ“еленнŃŃ Š“Š°Š½Š½ŃŃ ŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŠ¾Š½Š½Š¾Š¹Š±Š°Š·Ń полŃŃŠøŃŃŠ¾Š±ŃŠøŠ¹Š¼Š°ŠŗŠµŃ ŠæŠ¾Š»ŃŃŠøŃŃŠ¾Š±ŃŃŃŃŠ¾ŃŠ¼Ń ŠæŠ¾Š»ŃŃŠøŃŃŠ¾ŠŗŠ½Š° полŃŃŠøŃŃŠ¾ŠæŠµŃŠ°ŃŠøŠ²Š½ŃŃŠ¾ŃŠ¼ŠµŃŠŗŃŠ²ŃŠµŠ¼ŠµŠ½Šø полŃŃŠøŃŃŠ¾ŃŠŗŠ»ŃŃŠµŠ½ŠøŠµŠ±ŠµŠ·Š¾ŠæŠ°ŃŠ½Š¾Š³Š¾ŃŠµŠ¶ŠøŠ¼Š° полŃŃŠøŃŃŠæŠ°ŃŠ°Š¼ŠµŃŃŃŃŃŠ½ŠŗŃŠøŠ¾Š½Š°Š»ŃŠ½ŃŃ Š¾ŠæŃŠøŠ¹ŠøŠ½ŃеŃŃŠµŠ¹Ńа полŃŃŠøŃŃŠæŠ¾Š»Š½Š¾ŠµŠøŠ¼ŃŠæŃŠµŠ“Š¾ŠæŃŠµŠ“ŠµŠ»ŠµŠ½Š½Š¾Š³Š¾Š·Š½Š°ŃŠµŠ½ŠøŃ полŃŃŠøŃŃŠæŃеГŃŃŠ°Š²Š»ŠµŠ½ŠøŃŠ½Š°Š²ŠøŠ³Š°ŃŠøŠ¾Š½Š½ŃŃ ŃŃŃŠ»Š¾Šŗ полŃŃŠøŃŃŠæŃŠ¾Š²ŠµŃŠŗŃŃŠ»Š¾Š¶Š½Š¾ŃŃŠøŠæŠ°ŃŠ¾Š»ŠµŠ¹ŠæŠ¾Š»ŃŠ·Š¾Š²Š°Ńелей полŃŃŠøŃŃŃŠ°Š·Š“ŠµŠ»ŠøŃŠµŠ»ŃŠæŃŃŠø полŃŃŠøŃŃŃŠ°Š·Š“ŠµŠ»ŠøŃŠµŠ»ŃŠæŃŃŠøŠŗŠ»ŠøŠµŠ½Ńа полŃŃŠøŃŃŃŠ°Š·Š“ŠµŠ»ŠøŃŠµŠ»ŃŠæŃŃŠøŃŠµŃŠ²ŠµŃа полŃŃŠøŃŃŃŠµŠ°Š½ŃŃŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŠ¾Š½Š½Š¾Š¹Š±Š°Š·Ń ŠæŠ¾Š»ŃŃŠøŃŃŃŠŗŠ¾ŃоŃŃŃŠŗŠ»ŠøŠµŠ½ŃŃŠŗŠ¾Š³Š¾ŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃ ŠæŠ¾Š»ŃŃŠøŃŃŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŠ¾Š½Š½Š¾Š¹Š±Š°Š·Ń ŠæŠ¾Š»ŃŃŠøŃŃŃŠ¾Š¾Š±ŃŠµŠ½ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń ŠæŠ¾Š»ŃŃŠøŃŃŃŠ¾Š¾ŃвеŃŃŃŠ²ŠøŠµŠ¾Š±ŃŠµŠŗŃŠ°ŠøŃŠ¾ŃŠ¼Ń полŃŃŠøŃŃŃŠ¾ŃŃŠ°Š²ŃŃŠ°Š½Š“аŃŃŠ½Š¾Š³Š¾ŠøŠ½ŃеŃŃŠµŠ¹Ńаodata полŃŃŠøŃŃŃŃŃŃŠŗŃŃŃŃŃ ŃŠ°Š½ŠµŠ½ŠøŃŠ±Š°Š·ŃŠ“аннŃŃ ŠæŠ¾Š»ŃŃŠøŃŃŃŠµŠŗŃŃŠøŠ¹ŃŠµŠ°Š½ŃŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŠ¾Š½Š½Š¾Š¹Š±Š°Š·Ń ŠæŠ¾Š»ŃŃŠøŃŃŃŠ°Š¹Š» полŃŃŠøŃŃŃŠ°Š¹Š»Ń полŃŃŠøŃŃŃŠ¾ŃŠ¼Ń ŠæŠ¾Š»ŃŃŠøŃŃŃŃŠ½ŠŗŃŠøŠ¾Š½Š°Š»ŃŠ½ŃŃŠ¾ŠæŃŠøŃ ŠæŠ¾Š»ŃŃŠøŃŃŃŃŠ½ŠŗŃŠøŠ¾Š½Š°Š»ŃŠ½ŃŃŠ¾ŠæŃŠøŃŠøŠ½ŃеŃŃŠµŠ¹Ńа полŃŃŠøŃŃŃŠ°ŃовойпоŃŃŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŠ¾Š½Š½Š¾Š¹Š±Š°Š·Ń ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»ŠøŠ¾Ń ŠæŠ¾Š¼ŠµŃŃŠøŃŃŠ²Š¾Š²ŃŠµŠ¼ŠµŠ½Š½Š¾ŠµŃ ŃŠ°Š½ŠøŠ»ŠøŃе помеŃŃŠøŃŃŃŠ°Š¹Š» помеŃŃŠøŃŃŃŠ°Š¹Š»Ń ŠæŃŠ°Š² ŠæŃŠ°Š²Š¾Š“оŃŃŃŠæŠ° ŠæŃŠµŠ“Š¾ŠæŃŠµŠ“ŠµŠ»ŠµŠ½Š½Š¾ŠµŠ·Š½Š°ŃŠµŠ½ŠøŠµ ŠæŃŠµŠ“ŃŃŠ°Š²Š»ŠµŠ½ŠøŠµŠŗŠ¾Š“Š°Š»Š¾ŠŗŠ°Š»ŠøŠ·Š°ŃŠøŠø ŠæŃŠµŠ“ŃŃŠ°Š²Š»ŠµŠ½ŠøŠµŠæŠµŃиоГа ŠæŃеГŃŃŠ°Š²Š»ŠµŠ½ŠøŠµŠæŃава ŠæŃеГŃŃŠ°Š²Š»ŠµŠ½ŠøŠµŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ ŠæŃŠµŠ“ŃŃŠ°Š²Š»ŠµŠ½ŠøŠµŃобŃŃŠøŃжŃŃŠ½Š°Š»Š°ŃегиŃŃŃŠ°ŃŠøŠø ŠæŃŠµŠ“ŃŃŠ°Š²Š»ŠµŠ½ŠøŠµŃŠ°ŃŠ¾Š²Š¾Š³Š¾ŠæŠ¾ŃŃŠ° ŠæŃŠµŠ“ŃŠæŃежГение ŠæŃŠµŠŗŃŠ°ŃŠøŃŃŃŠ°Š±Š¾ŃŃŃŠøŃŃŠµŠ¼Ń ŠæŃŠøŠ²ŠøŠ»ŠµŠ³ŠøŃŠ¾Š²Š°Š½Š½ŃŠ¹Ńежим ŠæŃоГолжиŃŃŠ²Ńзов ŠæŃŠ¾ŃŠøŃаŃŃjson ŠæŃŠ¾ŃŠøŃŠ°ŃŃxml ŠæŃŠ¾ŃŠøŃŠ°ŃŃŠ“аŃŃjson ŠæŃŃŃŠ°ŃŃŃŃŠ¾ŠŗŠ° ŃŠ°Š±Š¾ŃŠøŠ¹ŠŗŠ°ŃŠ°Š»Š¾Š³Š“аннŃŃ ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń ŃŠ°Š·Š±Š»Š¾ŠŗŠøŃоваŃŃŠ“Š°Š½Š½ŃŠµŠ“Š»ŃŃŠµŠ“Š°ŠŗŃŠøŃŠ¾Š²Š°Š½ŠøŃ ŃŠ°Š·Š“елиŃŃŃŠ°Š¹Š» ŃŠ°Š·Š¾ŃваŃŃŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŠµŃŠ²Š½ŠµŃнимиŃŃŠ¾ŃникомГаннŃŃ ŃŠ°ŃŠŗŠ¾Š“ŠøŃŠ¾Š²Š°ŃŃŃŃŃŠ¾ŠŗŃ ŃŠ¾Š»ŃГоŃŃŃŠæŠ½Š° ŃŠµŠŗŃнГа ŃŠøŠ³Š½Š°Š» ŃŠøŠ¼Š²Š¾Š» ŃŠŗŠ¾ŠæŠøŃоваŃŃŠ¶ŃŃŠ½Š°Š»ŃегиŃŃŃŠ°ŃŠøŠø ŃŠ¼ŠµŃŠµŠ½ŠøŠµŠ»ŠµŃŠ½ŠµŠ³Š¾Š²Ńемени ŃŠ¼ŠµŃениеŃŃŠ°Š½Š“аŃŃŠ½Š¾Š³Š¾Š²Ńемени ŃŠ¾ŠµŠ“иниŃŃŠ±ŃŃŠµŃŃŠ“Š²Š¾ŠøŃŠ½ŃŃ Š“Š°Š½Š½ŃŃ ŃŠ¾Š·Š“аŃŃŠŗŠ°Ńалог ŃŠ¾Š·Š“аŃŃŃŠ°Š±ŃŠøŠŗŃxdto ŃŠ¾ŠŗŃŠ» ŃŠ¾ŠŗŃлп ŃŠ¾ŠŗŃŠæ ŃŠ¾Š¾Š±ŃŠøŃŃ ŃŠ¾ŃŃŠ¾Ńние ŃŠ¾Ń ŃŠ°Š½ŠøŃŃŠ·Š½Š°Ńение ŃŠ¾Ń ŃŠ°Š½ŠøŃŃŠ½Š°ŃŃŃŠ¾Š¹ŠŗŠøŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń ŃŃŠµŠ“ ŃŃŃŠ“лина ŃŃŃŠ·Š°ŠŗŠ°Š½ŃиваеŃŃŃŠ½Š° ŃŃŃŠ·Š°Š¼ŠµŠ½ŠøŃŃ ŃŃŃŠ½Š°Š¹ŃŠø ŃŃŃŠ½Š°ŃинаеŃŃŃŃ ŃŃŃŠ¾ŠŗŠ° ŃŃŃŠ¾ŠŗŠ°ŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŠ¾Š½Š½Š¾Š¹Š±Š°Š·Ń ŃŃŃŠæŠ¾Š»ŃŃŠøŃŃŃŃŃŠ¾ŠŗŃ ŃŃŃŃŠ°Š·Š“елиŃŃ ŃŃŃŃŠ¾ŠµŠ“иниŃŃ ŃŃŃŃŃŠ°Š²Š½ŠøŃŃ ŃŃŃŃŠøŃŠ»Š¾Š²Ń Š¾Š¶Š“ŠµŠ½ŠøŠ¹ ŃŃŃŃŠøŃлоŃŃŃŠ¾Šŗ ŃŃŃŃŠ°Š±Š»Š¾Š½ ŃŠµŠŗŃŃŠ°ŃŠ“Š°ŃŠ° ŃŠµŠŗŃŃŠ°ŃŠ“Š°ŃŠ°ŃŠµŠ°Š½ŃŠ° ŃŠµŠŗŃŃŠ°ŃŃŠ½ŠøŠ²ŠµŃŃŠ°Š»ŃŠ½Š°ŃŠ“Š°ŃŠ° ŃŠµŠŗŃŃŠ°ŃŃŠ½ŠøŠ²ŠµŃŃŠ°Š»ŃŠ½Š°ŃŠ“Š°ŃŠ°Š²Š¼ŠøŠ»Š»ŠøŃŠµŠŗŃŠ½Š“Š°Ń ŃŠµŠŗŃŃŠøŠ¹Š²Š°ŃŠøŠ°Š½ŃŠøŠ½ŃеŃŃŠµŠ¹ŃаклиенŃŃŠŗŠ¾Š³Š¾ŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ ŃŠµŠŗŃŃŠøŠ¹Š²Š°ŃŠøŠ°Š½ŃŠ¾ŃновногоŃŃŠøŃŃŠ°ŠŗŠ»ŠøŠµŠ½ŃŃŠŗŠ¾Š³Š¾ŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ ŃŠµŠŗŃŃŠøŠ¹ŠŗŠ¾Š“Š»Š¾ŠŗŠ°Š»ŠøŠ·Š°ŃŠøŠø ŃŠµŠŗŃŃŠøŠ¹ŃежимзапŃŃŠŗŠ° ŃŠµŠŗŃŃŠøŠ¹ŃŠ·ŃŠŗ ŃŠµŠŗŃŃŠøŠ¹ŃŠ·ŃŠŗŃŠøŃŃŠµŠ¼Ń ŃŠøŠæ ŃŠøŠæŠ·Š½Ń ŃŃŠ°Š½Š·Š°ŠŗŃŠøŃŠ°ŠŗŃивна ŃŃŠµŠ³ ŃŠ“алиŃŃŠ“Š°Š½Š½ŃŠµŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŠ¾Š½Š½Š¾Š¹Š±Š°Š·Ń ŃŠ“алиŃŃŠøŠ·Š²ŃŠµŠ¼ŠµŠ½Š½Š¾Š³Š¾Ń ŃŠ°Š½ŠøŠ»ŠøŃа ŃŠ“алиŃŃŠ¾Š±ŃекŃŃ ŃŠ“алиŃŃŃŠ°Š¹Š»Ń ŃŠ½ŠøŠ²ŠµŃŃŠ°Š»ŃŠ½Š¾ŠµŠ²ŃŠµŠ¼Ń ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠ±ŠµŠ·Š¾ŠæŠ°ŃŠ½ŃŠ¹Ńежим ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠ±ŠµŠ·Š¾ŠæŠ°ŃŠ½ŃŠ¹ŃŠµŠ¶ŠøŠ¼ŃŠ°Š·Š“ŠµŠ»ŠµŠ½ŠøŃŠ“аннŃŃ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠ±Š»Š¾ŠŗŠøŃовкŃŃŠµŠ°Š½Ńов ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠ²Š½ŠµŃнŃŃŠŗŠ¾Š¼ŠæŠ¾Š½ŠµŠ½ŃŃ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠ²ŃŠµŠ¼ŃŠ·Š°Š²ŠµŃŃŠµŠ½ŠøŃŃŠæŃŃŠµŠ³Š¾ŃŠµŠ°Š½ŃŠ° ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠ²ŃŠµŠ¼ŃŠ·Š°ŃŃŠæŠ°Š½ŠøŃŠæŠ°ŃŃŠøŠ²Š½Š¾Š³Š¾ŃŠµŠ°Š½ŃŠ° ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠ²ŃŠµŠ¼ŃŠ¾Š¶ŠøŠ“Š°Š½ŠøŃŠ±Š»Š¾ŠŗŠøŃовкиГаннŃŃ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠ·Š°Š³Š¾Š»Š¾Š²Š¾ŠŗŠŗŠ»ŠøŠµŠ½ŃŃŠŗŠ¾Š³Š¾ŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠ·Š°Š³Š¾Š»Š¾Š²Š¾ŠŗŃŠøŃŃŠµŠ¼Ń ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠ¶ŃŃŠ½Š°Š»Š°ŃегиŃŃŃŠ°ŃŠøŠø ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŃобŃŃŠøŃжŃŃŠ½Š°Š»Š°ŃегиŃŃŃŠ°ŃŠøŠø ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠŗŃŠ°ŃŠŗŠøŠ¹Š·Š°Š³Š¾Š»Š¾Š²Š¾ŠŗŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠ¼ŠøŠ½ŠøŠ¼Š°Š»ŃнŃŃŠ“Š»ŠøŠ½ŃŠæŠ°ŃŠ¾Š»ŠµŠ¹ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»ŠµŠ¹ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠ¼Š¾Š½Š¾ŠæŠ¾Š»ŃŠ½ŃŠ¹Ńежим ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠ½Š°ŃŃŃŠ¾Š¹ŠŗŠøŠŗŠ»ŠøŠµŠ½ŃŠ°Š»ŠøŃŠµŠ½Š·ŠøŃŠ¾Š²Š°Š½ŠøŃ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠ¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŠµŠæŃŠµŠ“Š¾ŠæŃŠµŠ“еленнŃŃ Š“Š°Š½Š½ŃŃ ŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŠ¾Š½Š½Š¾Š¹Š±Š°Š·Ń ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠ¾ŃŠŗŠ»ŃŃŠµŠ½ŠøŠµŠ±ŠµŠ·Š¾ŠæŠ°ŃŠ½Š¾Š³Š¾ŃŠµŠ¶ŠøŠ¼Š° ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠæŠ°ŃŠ°Š¼ŠµŃŃŃŃŃŠ½ŠŗŃŠøŠ¾Š½Š°Š»ŃŠ½ŃŃ Š¾ŠæŃŠøŠ¹ŠøŠ½ŃеŃŃŠµŠ¹Ńа ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠæŃŠøŠ²ŠøŠ»ŠµŠ³ŠøŃŠ¾Š²Š°Š½Š½ŃŠ¹ŃŠµŠ¶ŠøŠ¼ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŠæŃŠ¾Š²ŠµŃŠŗŃŃŠ»Š¾Š¶Š½Š¾ŃŃŠøŠæŠ°ŃŠ¾Š»ŠµŠ¹ŠæŠ¾Š»ŃŠ·Š¾Š²Š°Ńелей ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŃŠ°ŃŃŠøŃŠµŠ½ŠøŠµŃŠ°Š±Š¾ŃŃŃŠŗŃŠøŠæŃŠ¾Š³ŃŠ°ŃŠøŠµŠ¹ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŃŠ°ŃŃŠøŃŠµŠ½ŠøŠµŃŠ°Š±Š¾ŃŃŃŃŠ°Š¹Š»Š°Š¼Šø ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŠµŃŠ²Š½ŠµŃнимиŃŃŠ¾ŃникомГаннŃŃ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŃŠ¾Š¾ŃвеŃŃŃŠ²ŠøŠµŠ¾Š±ŃŠµŠŗŃŠ°ŠøŃŠ¾ŃŠ¼Ń ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŃŠ¾ŃŃŠ°Š²ŃŃŠ°Š½Š“аŃŃŠ½Š¾Š³Š¾ŠøŠ½ŃеŃŃŠµŠ¹Ńаodata ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŃŠ°ŃовойпоŃŃŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŠ¾Š½Š½Š¾Š¹Š±Š°Š·Ń ŃŃŃŠ°Š½Š¾Š²ŠøŃŃŃŠ°ŃовойпоŃŃŃŠµŠ°Š½Ńа ŃŠ¾ŃŠ¼Š°Ń ŃŠµŠ» ŃŠ°Ń ŃŠ°ŃовойпоŃŃ ŃŠ°ŃовойпоŃŃŃŠµŠ°Š½Ńа ŃŠøŃло ŃŠøŃŠ»Š¾ŠæŃŠ¾ŠæŠøŃŃŃ ŃŃŠ¾Š°Š“ŃŠµŃŠ²ŃŠµŠ¼ŠµŠ½Š½Š¾Š³Š¾Ń ŃŠ°Š½ŠøŠ»ŠøŃа wsŃŃŃŠ»ŠŗŠø Š±ŠøŠ±Š»ŠøŠ¾ŃŠµŠŗŠ°ŠŗŠ°ŃŃŠøŠ½Š¾Šŗ Š±ŠøŠ±Š»ŠøŠ¾ŃŠµŠŗŠ°Š¼Š°ŠŗŠµŃŠ¾Š²Š¾ŃŠ¾ŃŠ¼Š»ŠµŠ½ŠøŃŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ Š±ŠøŠ±Š»ŠøŠ¾ŃŠµŠŗŠ°ŃŃŠøŠ»ŠµŠ¹ Š±ŠøŠ·Š½ŠµŃŠæŃŠ¾ŃŠµŃŃŃ Š²Š½ŠµŃŠ½ŠøŠµŠøŃŃŠ¾ŃникиГаннŃŃ Š²Š½ŠµŃŠ½ŠøŠµŠ¾Š±ŃŠ°Š±Š¾ŃŠŗŠø Š²Š½ŠµŃŠ½ŠøŠµŠ¾ŃŃŠµŃŃ Š²ŃŃŃŠ¾ŠµŠ½Š½ŃŠµŠæŠ¾ŠŗŃŠæŠŗŠø Š³Š»Š°Š²Š½ŃŠ¹ŠøŠ½ŃеŃŃŠµŠ¹Ń Š³Š»Š°Š²Š½ŃŠ¹ŃŃŠøŠ»Ń Š“Š¾ŠŗŃŠ¼ŠµŠ½ŃŃ Š“Š¾ŃŃŠ°Š²Š»ŃŠµŠ¼ŃŠµŃŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŃ Š¶ŃŃŠ½Š°Š»ŃŠ“Š¾ŠŗŃŠ¼ŠµŠ½Ńов Š·Š°Š“Š°ŃŠø ŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŃŠ¾Š±ŠøŠ½ŃŠµŃнеŃŃŠ¾ŠµŠ“инении ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŃŠ°Š±Š¾ŃŠµŠ¹Š“аŃŃ ŠøŃŃŠ¾ŃŠøŃŃŠ°Š±Š¾ŃŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń ŠŗŠ¾Š½ŃŃŠ°Š½ŃŃ ŠŗŃŠøŃŠµŃŠøŠøŠ¾ŃŠ±Š¾ŃŠ° Š¼ŠµŃŠ°Š“Š°Š½Š½ŃŠµ Š¾Š±ŃŠ°Š±Š¾ŃŠŗŠø Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŃŠµŠŗŠ»Š°Š¼Ń Š¾ŃŠæŃавкаГоŃŃŠ°Š²Š»ŃемŃŃ ŃŠ²ŠµŠ“омлений оŃŃŠµŃŃ ŠæŠ°Š½ŠµŠ»ŃŠ·Š°Š“Š°ŃŠ¾Ń ŠæŠ°ŃŠ°Š¼ŠµŃŃŠ·Š°ŠæŃŃŠŗŠ° ŠæŠ°ŃŠ°Š¼ŠµŃŃŃŃŠµŠ°Š½Ńа ŠæŠµŃŠµŃŠøŃŠ»ŠµŠ½ŠøŃ ŠæŠ»Š°Š½ŃŠ²ŠøŠ“Š¾Š²ŃŠ°ŃŃŠµŃа ŠæŠ»Š°Š½ŃŠ²ŠøŠ“Š¾Š²Ń Š°ŃŠ°ŠŗŃŠµŃŠøŃŃŠøŠŗ ŠæŠ»Š°Š½ŃŠ¾Š±Š¼ŠµŠ½Š° планŃŃŃŠµŃов ŠæŠ¾Š»Š½Š¾ŃŠµŠŗŃŃŠ¾Š²ŃŠ¹ŠæŠ¾ŠøŃŠŗ ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»ŠøŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŠ¾Š½Š½Š¾Š¹Š±Š°Š·Ń ŠæŠ¾ŃŠ»ŠµŠ“Š¾Š²Š°ŃŠµŠ»ŃноŃŃŠø ŠæŃŠ¾Š²ŠµŃкавŃŃŃŠ¾ŠµŠ½Š½ŃŃ ŠæŠ¾ŠŗŃŠæŠ¾Šŗ ŃŠ°Š±Š¾ŃŠ°ŃŠ“Š°ŃŠ° ŃŠ°ŃŃŠøŃŠµŠ½ŠøŃŠŗŠ¾Š½ŃигŃŃŠ°ŃŠøŠø ŃŠµŠ³ŠøŃŃŃŃŠ±ŃŃ Š³Š°Š»ŃŠµŃŠøŠø ŃŠµŠ³ŠøŃŃŃŃŠ½Š°ŠŗŠ¾ŠæŠ»ŠµŠ½ŠøŃ ŃŠµŠ³ŠøŃŃŃŃŃŠ°ŃŃŠµŃа ŃŠµŠ³ŠøŃŃŃŃŃŠ²ŠµŠ“ений ŃŠµŠ³Š»Š°Š¼ŠµŠ½ŃŠ½ŃŠµŠ·Š°Š“Š°Š½ŠøŃ ŃŠµŃŠøŠ°Š»ŠøŠ·Š°ŃŠ¾Ńxdto ŃŠæŃŠ°Š²Š¾ŃŠ½ŠøŠŗŠø ŃŃŠµŠ“ŃŃŠ²Š°Š³ŠµŠ¾ŠæŠ¾Š·ŠøŃŠøŠ¾Š½ŠøŃŠ¾Š²Š°Š½ŠøŃ ŃŃŠµŠ“ŃŃŠ²Š°ŠŗŃŠøŠæŃŠ¾Š³ŃŠ°ŃŠøŠø ŃŃŠµŠ“ŃŃŠ²Š°Š¼ŃŠ»ŃŃŠøŠ¼ŠµŠ“иа ŃŃŠµŠ“ŃŃŠ²Š°Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃŃŠµŠŗŠ»Š°Š¼Ń ŃŃŠµŠ“ŃŃŠ²Š°ŠæŠ¾ŃŃŃ ŃŃŠµŠ“ŃŃŠ²Š°ŃŠµŠ»ŠµŃŠ¾Š½ŠøŠø ŃŠ°Š±Ńикаxdto ŃŠ°Š¹Š»Š¾Š²ŃŠµŠæŠ¾ŃŠ¾ŠŗŠø ŃŠ¾Š½Š¾Š²ŃŠµŠ·Š°Š“Š°Š½ŠøŃ Ń ŃŠ°Š½ŠøŠ»ŠøŃанаŃŃŃŠ¾ŠµŠŗ Ń ŃŠ°Š½ŠøŠ»ŠøŃŠµŠ²Š°ŃŠøŠ°Š½ŃовоŃŃŠµŃов Ń ŃŠ°Š½ŠøŠ»ŠøŃенаŃŃŃŠ¾ŠµŠŗŠ“аннŃŃ ŃŠ¾Ńм Ń ŃŠ°Š½ŠøŠ»ŠøŃŠµŠ¾Š±ŃŠøŃ наŃŃŃŠ¾ŠµŠŗ Ń ŃŠ°Š½ŠøŠ»ŠøŃŠµŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃелŃŃŠŗŠøŃ наŃŃŃŠ¾ŠµŠŗŠ“ŠøŠ½Š°Š¼ŠøŃŠµŃŠŗŠøŃ ŃŠæŠøŃŠŗŠ¾Š² Ń ŃŠ°Š½ŠøŠ»ŠøŃŠµŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃелŃŃŠŗŠøŃ наŃŃŃŠ¾ŠµŠŗŠ¾ŃŃŠµŃов Ń ŃŠ°Š½ŠøŠ»ŠøŃŠµŃŠøŃŃŠµŠ¼Š½ŃŃ Š½Š°ŃŃŃŠ¾ŠµŠŗ `,class:`webŃŠ²ŠµŃа windowsŃŠ²ŠµŃа windowsŃŃŠøŃŃŃ Š±ŠøŠ±Š»ŠøŠ¾ŃŠµŠŗŠ°ŠŗŠ°ŃŃŠøŠ½Š¾Šŗ ŃŠ°Š¼ŠŗŠøŃŃŠøŠ»Ń ŃŠøŠ¼Š²Š¾Š»Ń ŃŠ²ŠµŃаŃŃŠøŠ»Ń ŃŃŠøŃŃŃŃŃŠøŠ»Ń Š°Š²ŃŠ¾Š¼Š°ŃŠøŃŠµŃŠŗŠ¾ŠµŃŠ¾Ń ŃŠ°Š½ŠµŠ½ŠøŠµŠ“аннŃŃ ŃŠ¾ŃŠ¼ŃŠ²Š½Š°ŃŃŃŠ¾Š¹ŠŗŠ°Ń Š°Š²ŃŠ¾Š½ŃŠ¼ŠµŃŠ°ŃŠøŃŠ²ŃŠ¾ŃŠ¼Šµ Š°Š²ŃŠ¾ŃŠ°Š·Š“Š²ŠøŠ¶ŠµŠ½ŠøŠµŃŠµŃий Š°Š½ŠøŠ¼Š°ŃŠøŃŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń Š²Š°ŃŠøŠ°Š½ŃвŃŃŠ°Š²Š½ŠøŠ²Š°Š½ŠøŃŃŠ»ŠµŠ¼ŠµŠ½Ńовизаголовков Š²Š°ŃианŃŃŠæŃŠ°Š²Š»ŠµŠ½ŠøŃŠ²ŃŃŠ¾ŃŠ¾Š¹ŃŠ°Š±Š»ŠøŃŃ Š²ŠµŃŃŠøŠŗŠ°Š»ŃŠ½Š°ŃŠæŃокŃŃŃŠŗŠ°ŃŠ¾ŃŠ¼Ń веŃŃŠøŠŗŠ°Š»Ńноеположение веŃŃŠøŠŗŠ°Š»ŃŠ½Š¾ŠµŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŃŠ»ŠµŠ¼ŠµŠ½Ńа виГгŃŃŠæŠæŃŃŠ¾ŃŠ¼Ń Š²ŠøŠ“Š“ŠµŠŗŠ¾ŃŠ°ŃŠøŠøŃŠ¾ŃŠ¼Ń Š²ŠøŠ“Š“Š¾ŠæŠ¾Š»Š½ŠµŠ½ŠøŃŃŠ»ŠµŠ¼ŠµŠ½ŃŠ°ŃŠ¾ŃŠ¼Ń Š²ŠøŠ“ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŃŠ“аннŃŃ Š²ŠøŠ“ŠŗŠ½Š¾ŠæŠŗŠøŃŠ¾ŃŠ¼Ń Š²ŠøŠ“ŠæŠµŃŠµŠŗŠ»ŃŃŠ°ŃŠµŠ»Ń Š²ŠøŠ“ŠæŠ¾Š“ŠæŠøŃŠµŠ¹ŠŗŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Šµ виГполŃŃŠ¾ŃŠ¼Ń Š²ŠøŠ“ŃŠ»Š°Š¶ŠŗŠ° Š²Š»ŠøŃŠ½ŠøŠµŃŠ°Š·Š¼ŠµŃŠ°Š½Š°ŠæŃŠ·ŃŃŠµŠŗŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń Š³Š¾ŃŠøŠ·Š¾Š½ŃŠ°Š»ŃŠ½Š¾ŠµŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµ Š³Š¾ŃŠøŠ·Š¾Š½ŃŠ°Š»ŃŠ½Š¾ŠµŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŃŠ»ŠµŠ¼ŠµŠ½ŃŠ° гŃŃŠæŠæŠøŃŠ¾Š²ŠŗŠ°ŠŗŠ¾Š»Š¾Š½Š¾Šŗ гŃŃŠæŠæŠøŃŠ¾Š²ŠŗŠ°ŠæŠ¾Š“ŃŠøŠ½ŠµŠ½Š½ŃŃ ŃŠ»ŠµŠ¼ŠµŠ½ŃŠ¾Š²ŃŠ¾ŃŠ¼Ń Š³ŃŃŠæŠæŃŠøŃлеменŃŃ Š“ŠµŠ¹ŃŃŠ²ŠøŠµŠæŠµŃŠµŃŠ°ŃŠŗŠøŠ²Š°Š½ŠøŃ Š“Š¾ŠæŠ¾Š»Š½ŠøŃŠµŠ»ŃŠ½ŃŠ¹ŃŠµŠ¶ŠøŠ¼Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃ Š“Š¾ŠæŃŃŃŠøŠ¼ŃеГейŃŃŠ²ŠøŃŠæŠµŃŠµŃŠ°ŃŠŗŠøŠ²Š°Š½ŠøŃ ŠøŠ½ŃŠµŃвалмежГŃŃŠ»ŠµŠ¼ŠµŠ½ŃŠ°Š¼ŠøŃŠ¾ŃŠ¼Ń ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠ²ŃвоГа ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠæŠ¾Š»Š¾ŃŃŠæŃокŃŃŃŠŗŠø ŠøŃŠæŠ¾Š»ŃŠ·ŃŠµŠ¼Š¾ŠµŠ·Š½Š°ŃŠµŠ½ŠøŠµŃŠ¾ŃŠŗŠøŠ±ŠøŃŠ¶ŠµŠ²Š¾Š¹Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŠøŃŃŠ¾ŃŠøŃŠ²ŃŠ±Š¾ŃŠ°ŠæŃиввоГе ŠøŃŃŠ¾ŃŠ½ŠøŠŗŠ·Š½Š°ŃŠµŠ½ŠøŠ¹Š¾ŃŠøŃŠ¾ŃŠµŠŗŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŠøŃŃŠ¾ŃŠ½ŠøŠŗŠ·Š½Š°ŃŠµŠ½ŠøŃŃŠ°Š·Š¼ŠµŃŠ°ŠæŃŠ·ŃŃŃŠŗŠ°Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŠŗŠ°ŃŠµŠ³Š¾ŃŠøŃŠ³ŃŃŠæŠæŃŠŗŠ¾Š¼Š°Š½Š“ Š¼Š°ŠŗŃŠøŠ¼ŃŠ¼ŃŠµŃий Š½Š°ŃŠ°Š»ŃŠ½Š¾ŠµŠ¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŠ“ŠµŃŠµŠ²Š° Š½Š°ŃŠ°Š»ŃŠ½Š¾ŠµŠ¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŃŠæŠøŃŠŗŠ° Š¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŠµŃŠµŠŗŃŃŠ°ŃŠµŠ“Š°ŠŗŃŠøŃŠ¾Š²Š°Š½ŠøŃ Š¾ŃŠøŠµŠ½ŃŠ°ŃŠøŃŠ“ŠµŠ½Š“ŃŠ¾Š³ŃŠ°Š¼Š¼Ń Š¾ŃŠøŠµŠ½ŃŠ°ŃŠøŃŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń Š¾ŃŠøŠµŠ½ŃŠ°ŃŠøŃŠ¼ŠµŃŠ¾ŠŗŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń Š¾ŃŠøŠµŠ½ŃŠ°ŃŠøŃŠ¼ŠµŃŠ¾ŠŗŃŠ²Š¾Š“Š½Š¾Š¹Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń Š¾ŃŠøŠµŠ½ŃŠ°ŃŠøŃŃŠ»ŠµŠ¼ŠµŠ½ŃŠ°ŃŠ¾ŃŠ¼Ń Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŠ²Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Šµ Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŠ²Š»ŠµŠ³ŠµŠ½Š“ŠµŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń Š¾ŃŠ¾Š±ŃажениегŃŃŠæŠæŃŠŗŠ½Š¾ŠæŠ¾Šŗ Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŠ·Š°Š³Š¾Š»Š¾Š²ŠŗŠ°ŃŠŗŠ°Š»ŃŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŠ·Š½Š°ŃŠµŠ½ŠøŠ¹ŃŠ²Š¾Š“Š½Š¾Š¹Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŠ·Š½Š°ŃŠµŠ½ŠøŃŠøŠ·Š¼ŠµŃŠøŃŠµŠ»ŃŠ½Š¾Š¹Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŠøŠ½ŃŠµŃŠ²Š°Š»Š°Š“ŠøŠ°Š³ŃŠ°Š¼Š¼ŃŠ³Š°Š½ŃŠ° Š¾ŃŠ¾Š±Ńажениекнопки Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŠŗŠ½Š¾ŠæŠŗŠøŠ²ŃбоŃа Š¾ŃобŃажениеобŃŃŠ¶Š“ŠµŠ½ŠøŠ¹ŃŠ¾ŃŠ¼Ń Š¾ŃŠ¾Š±ŃажениеобŃŃŠ½Š¾Š¹Š³ŃŃŠæŠæŃ Š¾ŃŠ¾Š±ŃажениеоŃŃŠøŃŠ°ŃŠµŠ»ŃнŃŃ Š·Š½Š°ŃŠµŠ½ŠøŠ¹ŠæŃŠ·ŃŃŃŠŗŠ¾Š²Š¾Š¹Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŠæŠ°Š½ŠµŠ»ŠøŠæŠ¾ŠøŃŠŗŠ° Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŠæŠ¾Š“ŃŠŗŠ°Š·ŠŗŠø Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŠæŃŠµŠ“ŃŠæŃŠµŠ¶Š“ŠµŠ½ŠøŃŠæŃŠøŃŠµŠ“Š°ŠŗŃŠøŃовании Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŃазмеŃкиполоŃŃŃŠµŠ³ŃŠ»ŠøŃŠ¾Š²Š°Š½ŠøŃ Š¾ŃŠ¾Š±ŃажениеŃŃŃŠ°Š½ŠøŃŃŠ¾ŃŠ¼Ń Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŃŠ°Š±Š»ŠøŃŃ Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŃŠµŠŗŃŃŠ°Š·Š½Š°ŃŠµŠ½ŠøŃŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼ŃŠ³Š°Š½ŃŠ° Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŃŠæŃŠ°Š²Š»ŠµŠ½ŠøŃŠ¾Š±ŃŃŠ½Š¾Š¹Š³ŃŃŠæŠæŃ Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŃŠøŠ³ŃŃŃŠŗŠ½Š¾ŠæŠŗŠø палиŃŃŠ°ŃŠ²ŠµŃŠ¾Š²Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń повеГениеобŃŃŠ½Š¾Š¹Š³ŃŃŠæŠæŃ ŠæŠ¾Š“Š“ŠµŃŠ¶ŠŗŠ°Š¼Š°ŃŃŃŠ°Š±Š°Š“ŠµŠ½Š“ŃŠ¾Š³ŃŠ°Š¼Š¼Ń ŠæŠ¾Š“Š“ŠµŃŠ¶ŠŗŠ°Š¼Š°ŃŃŃŠ°Š±Š°Š“ŠøŠ°Š³ŃŠ°Š¼Š¼ŃŠ³Š°Š½ŃŠ° ŠæŠ¾Š“Š“ŠµŃŠ¶ŠŗŠ°Š¼Š°ŃŃŃŠ°Š±Š°ŃŠ²Š¾Š“Š½Š¾Š¹Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŠæŠ¾ŠøŃŠŗŠ²ŃŠ°Š±Š»ŠøŃŠµŠæŃиввоГе ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŠ·Š°Š³Š¾Š»Š¾Š²ŠŗŠ°ŃŠ»ŠµŠ¼ŠµŠ½ŃŠ°ŃŠ¾ŃŠ¼Ń ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŠŗŠ°ŃŃŠøŠ½ŠŗŠøŠŗŠ½Š¾ŠæŠŗŠøŃŠ¾ŃŠ¼Ń положениекаŃŃŠøŠ½ŠŗŠøŃŠ»ŠµŠ¼ŠµŠ½ŃŠ°Š³ŃŠ°ŃŠøŃŠµŃŠŗŠ¾Š¹ŃŃ ŠµŠ¼Ń ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŠŗŠ¾Š¼Š°Š½Š“Š½Š¾Š¹ŠæŠ°Š½ŠµŠ»ŠøŃŠ¾ŃŠ¼Ń ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŠŗŠ¾Š¼Š°Š½Š“Š½Š¾Š¹ŠæŠ°Š½ŠµŠ»ŠøŃŠ»ŠµŠ¼ŠµŠ½ŃŠ°ŃŠ¾ŃŠ¼Ń ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŠ¾ŠæŠ¾ŃŠ½Š¾Š¹ŃŠ¾ŃŠŗŠøŠ¾ŃŃŠøŃовки ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŠæŠ¾Š“ŠæŠøŃŠµŠ¹ŠŗŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Šµ ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŠæŠ¾Š“ŠæŠøŃŠµŠ¹ŃŠŗŠ°Š»ŃŠ·Š½Š°ŃŠµŠ½ŠøŠ¹ŠøŠ·Š¼ŠµŃŠøŃŠµŠ»ŃŠ½Š¾Š¹Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŃŠ¾ŃŃŠ¾ŃŠ½ŠøŃŠæŃŠ¾ŃŠ¼Š¾ŃŃŠ° положениеŃŃŃŠ¾ŠŗŠøŠæŠ¾ŠøŃка ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŃŠµŠŗŃŃŠ°ŃŠ¾ŠµŠ“ŠøŠ½ŠøŃŠµŠ»Ńнойлинии ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŃŠæŃŠ°Š²Š»ŠµŠ½ŠøŃŠæŠ¾ŠøŃŠŗŠ¾Š¼ ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŃŠŗŠ°Š»ŃŠ²ŃŠµŠ¼ŠµŠ½Šø поŃŃŠ“Š¾ŠŗŠ¾ŃŠ¾Š±ŃажениŃŃŠ¾ŃŠµŠŗŠ³Š¾ŃŠøŠ·Š¾Š½ŃŠ°Š»ŃŠ½Š¾Š¹Š³ŠøŃŃŠ¾Š³ŃŠ°Š¼Š¼Ń ŠæŠ¾ŃŃŠ“Š¾ŠŗŃŠµŃŠøŠ¹Š²Š»ŠµŠ³ŠµŠ½Š“ŠµŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŃŠ°Š·Š¼ŠµŃкаŃŃŠøŠ½ŠŗŠø ŃŠ°ŃŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŠ·Š°Š³Š¾Š»Š¾Š²ŠŗŠ°ŃŠŗŠ°Š»ŃŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŃŠ°ŃŃŃŠ³ŠøŠ²Š°Š½ŠøŠµŠæŠ¾Š²ŠµŃŃŠøŠŗŠ°Š»ŠøŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼ŃŠ³Š°Š½ŃŠ° ŃŠµŠ¶ŠøŠ¼Š°Š²ŃŠ¾Š¾ŃŠ¾Š±ŃажениŃŃŠ¾ŃŃŠ¾ŃŠ½ŠøŃ ŃŠµŠ¶ŠøŠ¼Š²Š²Š¾Š“аŃŃŃŠ¾ŠŗŃаблиŃŃ ŃŠµŠ¶ŠøŠ¼Š²ŃŠ±Š¾ŃŠ°Š½ŠµŠ·Š°ŠæŠ¾Š»Š½ŠµŠ½Š½Š¾Š³Š¾ ŃŠµŠ¶ŠøŠ¼Š²ŃŠ“ŠµŠ»ŠµŠ½ŠøŃŠ“аŃŃ ŃŠµŠ¶ŠøŠ¼Š²ŃГелениŃŃŃŃŠ¾ŠŗŠøŃаблиŃŃ ŃŠµŠ¶ŠøŠ¼Š²ŃГелениŃŃŠ°Š±Š»ŠøŃŃ ŃŠµŠ¶ŠøŠ¼ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŃŃŠ°Š·Š¼ŠµŃа ŃŠµŠ¶ŠøŠ¼ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŃŃŠ²ŃŠ·Š°Š½Š½Š¾Š³Š¾Š·Š½Š°ŃŠµŠ½ŠøŃ ŃŠµŠ¶ŠøŠ¼ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŃŠ“ŠøŠ°Š»Š¾Š³Š°ŠæŠµŃŠ°ŃŠø ŃŠµŠ¶ŠøŠ¼ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŃŠæŠ°ŃŠ°Š¼ŠµŃŃŠ°ŠŗŠ¾Š¼Š°Š½Š“Ń ŃŠµŠ¶ŠøŠ¼Š¼Š°ŃŃŃŠ°Š±ŠøŃŠ¾Š²Š°Š½ŠøŃŠæŃŠ¾ŃŠ¼Š¾ŃŃŠ° ŃŠµŠ¶ŠøŠ¼Š¾ŃновногоокнаклиенŃŃŠŗŠ¾Š³Š¾ŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ ŃŠµŠ¶ŠøŠ¼Š¾ŃŠŗŃŃŃŠøŃŠ¾ŠŗŠ½Š°ŃŠ¾ŃŠ¼Ń ŃŠµŠ¶ŠøŠ¼Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃŠ²ŃŠ“ŠµŠ»ŠµŠ½ŠøŃ ŃŠµŠ¶ŠøŠ¼Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃŠ³ŠµŠ¾Š³ŃŠ°ŃŠøŃŠµŃкойŃŃ ŠµŠ¼Ń ŃŠµŠ¶ŠøŠ¼Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃŠ·Š½Š°ŃŠµŠ½ŠøŠ¹ŃŠµŃŠøŠø ŃŠµŠ¶ŠøŠ¼Š¾ŃŃŠøŃŠ¾Š²ŠŗŠøŃŠµŃŠŗŠøŠ³ŃŠ°ŃŠøŃŠµŃкойŃŃ ŠµŠ¼Ń ŃŠµŠ¶ŠøŠ¼ŠæŠ¾Š»ŃŠæŃŠ¾Š·ŃŠ°ŃŠ½Š¾ŃŃŠøŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŃŠµŠ¶ŠøŠ¼ŠæŃŠ¾Š±ŠµŠ»Š¾Š²Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŃŠµŠ¶ŠøŠ¼ŃŠ°Š·Š¼ŠµŃŠµŠ½ŠøŃнаŃŃŃŠ°Š½ŠøŃе ŃŠµŠ¶ŠøŠ¼ŃŠµŠ“Š°ŠŗŃŠøŃŠ¾Š²Š°Š½ŠøŃŠŗŠ¾Š»Š¾Š½ŠŗŠø ŃŠµŠ¶ŠøŠ¼ŃŠ³Š»Š°Š¶ŠøŠ²Š°Š½ŠøŃŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŃŠµŠ¶ŠøŠ¼ŃŠ³Š»Š°Š¶ŠøŠ²Š°Š½ŠøŃŠøŠ½Š“ŠøŠŗŠ°ŃŠ¾Ńа ŃŠµŠ¶ŠøŠ¼ŃŠæŠøŃŠŗŠ°Š·Š°Š“Š°Ń ŃŠŗŠ²Š¾Š·Š½Š¾ŠµŠ²ŃŃŠ°Š²Š½ŠøŠ²Š°Š½ŠøŠµ ŃŠ¾Ń ŃŠ°Š½ŠµŠ½ŠøŠµŠ“аннŃŃ ŃŠ¾ŃŠ¼ŃŠ²Š½Š°ŃŃŃŠ¾Š¹ŠŗŠ°Ń ŃŠæŠ¾ŃŠ¾Š±Š·Š°ŠæŠ¾Š»Š½ŠµŠ½ŠøŃŃŠµŠŗŃŃŠ°Š·Š°Š³Š¾Š»Š¾Š²ŠŗŠ°ŃŠŗŠ°Š»ŃŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŃŠæŠ¾ŃŠ¾Š±Š¾ŠæŃŠµŠ“ŠµŠ»ŠµŠ½ŠøŃŠ¾Š³ŃŠ°Š½ŠøŃŠøŠ²Š°ŃŃŠµŠ³Š¾Š·Š½Š°ŃŠµŠ½ŠøŃŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŃŃŠ°Š½Š“аŃŃŠ½Š°ŃгŃŃŠæŠæŠ°ŠŗŠ¾Š¼Š°Š½Š“ ŃŃŠ°Š½Š“аŃŃŠ½Š¾ŠµŠ¾ŃŠ¾ŃŠ¼Š»ŠµŠ½ŠøŠµ ŃŃŠ°ŃŃŃŠ¾ŠæŠ¾Š²ŠµŃŠµŠ½ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń ŃŃŠøŠ»ŃŃŃŃŠµŠ»ŠŗŠø ŃŠøŠæŠ°ŠæŠæŃŠ¾ŠŗŃŠøŠ¼Š°ŃиилинииŃŃŠµŠ½Š“Š°Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŃŠøŠæŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŃŠøŠæŠµŠ“иниŃŃŃŠŗŠ°Š»ŃŠ²ŃŠµŠ¼ŠµŠ½Šø ŃŠøŠæŠøŠ¼ŠæŠ¾ŃŃŠ°ŃŠµŃŠøŠ¹ŃŠ»Š¾ŃŠ³ŠµŠ¾Š³ŃŠ°ŃŠøŃŠµŃŠŗŠ¾Š¹ŃŃ ŠµŠ¼Ń ŃŠøŠæŠ»ŠøŠ½ŠøŠøŠ³ŠµŠ¾Š³ŃŠ°ŃŠøŃŠµŃŠŗŠ¾Š¹ŃŃ ŠµŠ¼Ń ŃŠøŠæŠ»ŠøŠ½ŠøŠøŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŃŠøŠæŠ¼Š°ŃŠŗŠµŃŠ°Š³ŠµŠ¾Š³ŃŠ°ŃŠøŃŠµŃŠŗŠ¾Š¹ŃŃ ŠµŠ¼Ń ŃŠøŠæŠ¼Š°ŃŠŗŠµŃŠ°Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŃŠøŠæŠ¾Š±Š»Š°ŃŃŠøŠ¾ŃŠ¾ŃŠ¼Š»ŠµŠ½ŠøŃ ŃŠøŠæŠ¾ŃŠ³Š°Š½ŠøŠ·Š°ŃŠøŠøŠøŃŃŠ¾ŃникаГаннŃŃ Š³ŠµŠ¾Š³ŃŠ°ŃŠøŃŠµŃкойŃŃ ŠµŠ¼Ń ŃŠøŠæŠ¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃŃŠµŃŠøŠøŃŠ»Š¾ŃŠ³ŠµŠ¾Š³ŃŠ°ŃŠøŃŠµŃкойŃŃ ŠµŠ¼Ń ŃŠøŠæŠ¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃŃŠ¾ŃŠµŃŠ½Š¾Š³Š¾Š¾Š±ŃŠµŠŗŃŠ°Š³ŠµŠ¾Š³ŃŠ°ŃŠøŃŠµŃŠŗŠ¾Š¹ŃŃ ŠµŠ¼Ń ŃŠøŠæŠ¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃŃŠŗŠ°Š»ŃŃŠ»ŠµŠ¼ŠµŠ½ŃŠ°Š»ŠµŠ³ŠµŠ½Š“ŃŠ³ŠµŠ¾Š³ŃŠ°ŃŠøŃŠµŃŠŗŠ¾Š¹ŃŃ ŠµŠ¼Ń ŃŠøŠæŠæŠ¾ŠøŃŠŗŠ°Š¾Š±ŃŠµŠŗŃŠ¾Š²Š³ŠµŠ¾Š³ŃŠ°ŃŠøŃŠµŃкойŃŃ ŠµŠ¼Ń ŃŠøŠæŠæŃŠ¾ŠµŠŗŃŠøŠøŠ³ŠµŠ¾Š³ŃŠ°ŃŠøŃŠµŃŠŗŠ¾Š¹ŃŃ ŠµŠ¼Ń ŃŠøŠæŃŠ°Š·Š¼ŠµŃŠµŠ½ŠøŃŠøŠ·Š¼ŠµŃŠµŠ½ŠøŠ¹ ŃŠøŠæŃŠ°Š·Š¼ŠµŃŠµŠ½ŠøŃŃŠµŠŗŠ²ŠøŠ·ŠøŃŠ¾Š²ŠøŠ·Š¼ŠµŃŠµŠ½ŠøŠ¹ ŃŠøŠæŃŠ°Š¼ŠŗŠøŃŠ»ŠµŠ¼ŠµŠ½ŃŠ°ŃŠæŃŠ°Š²Š»ŠµŠ½ŠøŃ ŃŠøŠæŃŠ²Š¾Š“Š½Š¾Š¹Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŃŠøŠæŃŠ²ŃŠ·ŠøŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼ŃŠ³Š°Š½ŃŠ° ŃŠøŠæŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃŠ·Š½Š°ŃŠµŠ½ŠøŠ¹ŠæŠ¾ŃŠµŃŠøŃŠ¼Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŃŠøŠæŃоеГинениŃŃŠ¾ŃŠµŠŗŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŃŠøŠæŃŠ¾ŠµŠ“ŠøŠ½ŠøŃŠµŠ»Ńнойлинии ŃŠøŠæŃŃŠ¾ŃонŃŃŠ»ŠµŠ¼ŠµŠ½ŃŠ°Š³ŃŠ°ŃŠøŃŠµŃкойŃŃ ŠµŠ¼Ń ŃŠøŠæŃŠ¾ŃŠ¼ŃоŃŃŠµŃа ŃŠøŠæŃкалŃŃŠ°Š“Š°ŃŠ½Š¾Š¹Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŃŠ°ŠŗŃŠ¾ŃŠ»ŠøŠ½ŠøŠøŃŃŠµŠ½Š“Š°Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Ń ŃŠøŠ³ŃŃŠ°ŠŗŠ½Š¾ŠæŠŗŠø ŃŠøŠ³ŃŃŃŠ³ŃŠ°ŃŠøŃŠµŃŠŗŠ¾Š¹ŃŃ ŠµŠ¼Ń ŃŠøŠŗŃŠ°ŃŠøŃŠ²ŃŠ°Š±Š»ŠøŃе ŃŠ¾ŃŠ¼Š°ŃŠ“нŃŃŠŗŠ°Š»ŃŠ²ŃŠµŠ¼ŠµŠ½Šø ŃŠ¾ŃŠ¼Š°ŃŠŗŠ°ŃŃŠøŠ½ŠŗŠø ŃŠøŃŠøŠ½Š°ŠæŠ¾Š“ŃŠøŠ½ŠµŠ½Š½ŃŃ ŃŠ»ŠµŠ¼ŠµŠ½ŃŠ¾Š²ŃŠ¾ŃŠ¼Ń Š²ŠøŠ“Š“Š²ŠøŠ¶ŠµŠ½ŠøŃŠ±ŃŃ Š³Š°Š»ŃŠµŃŠøŠø Š²ŠøŠ“Š“Š²ŠøŠ¶ŠµŠ½ŠøŃŠ½Š°ŠŗŠ¾ŠæŠ»ŠµŠ½ŠøŃ Š²ŠøŠ“ŠæŠµŃŠøŠ¾Š“Š°ŃŠµŠ³ŠøŃŃŃŠ°ŃаŃŃŠµŃа виГŃŃŠµŃа Š²ŠøŠ“ŃŠ¾ŃкимаŃŃŃŃŃŠ°Š±ŠøŠ·Š½ŠµŃŠæŃŠ¾ŃеŃŃŠ° ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠ°Š³ŃŠµŠ³Š°ŃŠ°ŃегиŃŃŃŠ°Š½Š°ŠŗŠ¾ŠæŠ»ŠµŠ½ŠøŃ ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠ³ŃŃŠæŠæŠøŃŠ»ŠµŠ¼ŠµŠ½Ńов ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŃŠµŠ¶ŠøŠ¼Š°ŠæŃŠ¾Š²ŠµŠ“ŠµŠ½ŠøŃ ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŃŃŠµŠ·Š° ŠæŠµŃŠøŠ¾Š“ŠøŃŠ½Š¾ŃŃŃŠ°Š³ŃŠµŠ³Š°ŃŠ°ŃегиŃŃŃŠ°Š½Š°ŠŗŠ¾ŠæŠ»ŠµŠ½ŠøŃ ŃŠµŠ¶ŠøŠ¼Š°Š²ŃŠ¾Š²ŃŠµŠ¼Ń ŃŠµŠ¶ŠøŠ¼Š·Š°ŠæŠøŃŠøŠ“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŃŠµŠ¶ŠøŠ¼ŠæŃŠ¾Š²ŠµŠ“ŠµŠ½ŠøŃŠ“Š¾ŠŗŃŠ¼ŠµŠ½Ńа Š°Š²ŃоŃегиŃŃŃŠ°ŃŠøŃŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŠ¹ ГопŃŃŃŠøŠ¼ŃйномеŃŃŠ¾Š¾Š±ŃŠµŠ½ŠøŃ Š¾ŃŠæŃŠ°Š²ŠŗŠ°ŃŠ»ŠµŠ¼ŠµŠ½ŃаГаннŃŃ ŠæŠ¾Š»ŃŃŠµŠ½ŠøŠµŃŠ»ŠµŠ¼ŠµŠ½ŃŠ°Š“аннŃŃ ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŃаŃŃŠøŃŃŠ¾Š²ŠŗŠøŃŠ°Š±Š»ŠøŃŠ½Š¾Š³Š¾Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńа Š¾ŃŠøŠµŠ½ŃŠ°ŃŠøŃŃŃŃŠ°Š½ŠøŃŃ ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŠøŃŠ¾Š³Š¾Š²ŠŗŠ¾Š»Š¾Š½Š¾ŠŗŃŠ²Š¾Š“Š½Š¾Š¹ŃŠ°Š±Š»ŠøŃŃ ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŠøŃŠ¾Š³Š¾Š²ŃŃŃŠ¾ŠŗŃŠ²Š¾Š“Š½Š¾Š¹ŃŠ°Š±Š»ŠøŃŃ ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŃŠµŠŗŃŃŠ°Š¾ŃŠ½Š¾ŃŠøŃŠµŠ»ŃŠ½Š¾ŠŗŠ°ŃŃŠøŠ½ŠŗŠø ŃŠ°ŃположениезаголовкагŃŃŠæŠæŠøŃŠ¾Š²ŠŗŠøŃŠ°Š±Š»ŠøŃŠ½Š¾Š³Š¾Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŃŠæŠ¾ŃŠ¾Š±ŃŃŠµŠ½ŠøŃŠ·Š½Š°ŃŠµŠ½ŠøŠ¹ŃŠ°Š±Š»ŠøŃŠ½Š¾Š³Š¾Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŃŠøŠæŠ“вŃŃŃŠ¾ŃŠ¾Š½Š½ŠµŠ¹ŠæŠµŃŠ°ŃŠø ŃŠøŠæŠ·Š°ŠæŠ¾Š»Š½ŠµŠ½ŠøŃоблаŃŃŠøŃŠ°Š±Š»ŠøŃŠ½Š¾Š³Š¾Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŃŠøŠæŠŗŃŃŃŠ¾ŃŠ¾Š²ŃŠ°Š±Š»ŠøŃŠ½Š¾Š³Š¾Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŃŠøŠæŠ»ŠøŠ½ŠøŠøŃŠøŃŃŠ½ŠŗŠ°ŃŠ°Š±Š»ŠøŃŠ½Š¾Š³Š¾Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŃŠøŠæŠ»ŠøŠ½ŠøŠøŃŃŠµŠ¹ŠŗŠøŃŠ°Š±Š»ŠøŃŠ½Š¾Š³Š¾Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŃŠøŠæŠ½Š°ŠæŃŠ°Š²Š»ŠµŠ½ŠøŃŠæŠµŃŠµŃ Š¾Š“Š°ŃŠ°Š±Š»ŠøŃŠ½Š¾Š³Š¾Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŃŠøŠæŠ¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃŠ²ŃŠ“елениŃŃŠ°Š±Š»ŠøŃŠ½Š¾Š³Š¾Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŃŠøŠæŠ¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃŠ»ŠøŠ½ŠøŠ¹ŃŠ²Š¾Š“Š½Š¾Š¹ŃŠ°Š±Š»ŠøŃŃ ŃŠøŠæŃŠ°Š·Š¼ŠµŃŠµŠ½ŠøŃŃŠµŠŗŃŃŠ°ŃŠ°Š±Š»ŠøŃŠ½Š¾Š³Š¾Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŃŠøŠæŃŠøŃŃŠ½ŠŗŠ°ŃŠ°Š±Š»ŠøŃŠ½Š¾Š³Š¾Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŃŠøŠæŃŠ¼ŠµŃŠµŠ½ŠøŃŃŠ°Š±Š»ŠøŃŠ½Š¾Š³Š¾Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŃŠøŠæŃŠ·Š¾ŃŠ°ŃŠ°Š±Š»ŠøŃŠ½Š¾Š³Š¾Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŃŠøŠæŃŠ°Š¹Š»Š°ŃŠ°Š±Š»ŠøŃŠ½Š¾Š³Š¾Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŃŠ¾ŃноŃŃŃŠæŠµŃŠ°ŃŠø ŃŠµŃŠµŠ“Š¾Š²Š°Š½ŠøŠµŃŠ°ŃположениŃŃŃŃŠ°Š½ŠøŃ Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŠ²ŃŠµŠ¼ŠµŠ½ŠøŃŠ»ŠµŠ¼ŠµŠ½ŃŠ¾Š²ŠæŠ»Š°Š½ŠøŃŠ¾Š²ŃŠøŠŗŠ° ŃŠøŠæŃŠ°Š¹Š»Š°ŃŠ¾ŃŠ¼Š°ŃŠøŃŠ¾Š²Š°Š½Š½Š¾Š³Š¾Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńа Š¾Š±Ń Š¾Š“ŃŠµŠ·ŃŠ»ŃŃŠ°ŃŠ°Š·Š°ŠæŃŠ¾Ńа ŃŠøŠæŠ·Š°ŠæŠøŃŠøŠ·Š°ŠæŃŠ¾Ńа виГзаполнениŃŃŠ°ŃŃŠøŃŃŠ¾Š²ŠŗŠøŠæŠ¾ŃŃŃŠ¾ŠøŃŠµŠ»ŃŠ¾ŃŃŠµŃа ŃŠøŠæŠ“Š¾Š±Š°Š²Š»ŠµŠ½ŠøŃŠæŃеГŃŃŠ°Š²Š»ŠµŠ½ŠøŠ¹ ŃŠøŠæŠøŠ·Š¼ŠµŃŠµŠ½ŠøŃŠæŠ¾ŃŃŃŠ¾ŠøŃŠµŠ»ŃŠ¾ŃŃŠµŃа ŃŠøŠæŃŠ°Š·Š¼ŠµŃŠµŠ½ŠøŃŠøŃŠ¾Š³Š¾Š² ГоŃŃŃŠæŠŗŃŠ°Š¹Š»Ń ŃŠµŠ¶ŠøŠ¼Š“ŠøŠ°Š»Š¾Š³Š°Š²ŃŠ±Š¾ŃŠ°ŃŠ°Š¹Š»Š° ŃŠµŠ¶ŠøŠ¼Š¾ŃŠŗŃŃŃŠøŃŃŠ°Š¹Š»Š° ŃŠøŠæŠøŠ·Š¼ŠµŃŠµŠ½ŠøŃŠæŠ¾ŃŃŃŠ¾ŠøŃŠµŠ»ŃŠ·Š°ŠæŃŠ¾ŃŠ° виГГаннŃŃ Š°Š½Š°Š»ŠøŠ·Š° Š¼ŠµŃŠ¾Š“клаŃŃŠµŃŠøŠ·Š°ŃŠøŠø ŃŠøŠæŠµŠ“иниŃŃŠøŠ½ŃŠµŃŠ²Š°Š»Š°Š²ŃеменианализаГаннŃŃ ŃŠøŠæŠ·Š°ŠæŠ¾Š»Š½ŠµŠ½ŠøŃŃŠ°Š±Š»ŠøŃŃŃŠµŠ·ŃŠ»ŃŃŠ°ŃаанализаГаннŃŃ ŃŠøŠæŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŃŃŠøŃловŃŃ Š·Š½Š°ŃŠµŠ½ŠøŠ¹Š°Š½Š°Š»ŠøŠ·Š°Š“аннŃŃ ŃŠøŠæŠøŃŃŠ¾ŃникаГаннŃŃ ŠæŠ¾ŠøŃŠŗŠ°Š°ŃŃŠ¾ŃŠøŠ°ŃŠøŠ¹ ŃŠøŠæŠŗŠ¾Š»Š¾Š½ŠŗŠøŠ°Š½Š°Š»ŠøŠ·Š°Š“аннŃŃ Š“ŠµŃŠµŠ²Š¾ŃŠµŃŠµŠ½ŠøŠ¹ ŃŠøŠæŠŗŠ¾Š»Š¾Š½ŠŗŠøŠ°Š½Š°Š»ŠøŠ·Š°Š“аннŃŃ ŠŗŠ»Š°ŃŃŠµŃŠøŠ·Š°ŃŠøŃ ŃŠøŠæŠŗŠ¾Š»Š¾Š½ŠŗŠøŠ°Š½Š°Š»ŠøŠ·Š°Š“аннŃŃ Š¾Š±ŃŠ°ŃŃŃŠ°ŃŠøŃŃŠøŠŗŠ° ŃŠøŠæŠŗŠ¾Š»Š¾Š½ŠŗŠøŠ°Š½Š°Š»ŠøŠ·Š°Š“аннŃŃ ŠæŠ¾ŠøŃŠŗŠ°ŃŃŠ¾ŃŠøŠ°ŃŠøŠ¹ ŃŠøŠæŠŗŠ¾Š»Š¾Š½ŠŗŠøŠ°Š½Š°Š»ŠøŠ·Š°Š“аннŃŃ ŠæŠ¾ŠøŃŠŗŠæŠ¾ŃŠ»ŠµŠ“Š¾Š²Š°ŃŠµŠ»ŃноŃŃŠµŠ¹ ŃŠøŠæŠŗŠ¾Š»Š¾Š½ŠŗŠøŠ¼Š¾Š“ŠµŠ»ŠøŠæŃŠ¾Š³Š½Š¾Š·Š° ŃŠøŠæŠ¼ŠµŃŃŃŠ°ŃŃŃŠ¾ŃŠ½ŠøŃŠ°Š½Š°Š»ŠøŠ·Š°Š“аннŃŃ ŃŠøŠæŠ¾ŃŃŠµŃŠµŠ½ŠøŃŠæŃавилаŃŃŠ¾ŃŠøŠ°ŃŠøŠø ŃŠøŠæŠæŠ¾Š»ŃанализаГаннŃŃ ŃŠøŠæŃŃŠ°Š½Š“аŃŃŠøŠ·Š°ŃиианализаГаннŃŃ ŃŠøŠæŃпоŃŃŠ“Š¾ŃŠøŠ²Š°Š½ŠøŃŠæŃŠ°Š²ŠøŠ»Š°ŃŃŠ¾ŃŠøŠ°ŃŠøŠøŠ°Š½Š°Š»ŠøŠ·Š°Š“аннŃŃ ŃŠøŠæŃпоŃŃŠ“Š¾ŃŠøŠ²Š°Š½ŠøŃŃŠ°Š±Š»Š¾Š½Š¾Š²ŠæŠ¾ŃŠ»ŠµŠ“Š¾Š²Š°ŃŠµŠ»ŃноŃŃŠµŠ¹Š°Š½Š°Š»ŠøŠ·Š°Š“аннŃŃ ŃŠøŠæŃŠæŃŠ¾ŃŠµŠ½ŠøŃŠ“ŠµŃŠµŠ²Š°ŃŠµŃŠµŠ½ŠøŠ¹ wsŠ½Š°ŠæŃŠ°Š²Š»ŠµŠ½ŠøŠµŠæŠ°ŃамеŃŃŠ° Š²Š°ŃŠøŠ°Š½Ńxpathxs Š²Š°ŃŠøŠ°Š½ŃŠ·Š°ŠæŠøŃŠøŠ“аŃŃjson Š²Š°ŃŠøŠ°Š½ŃŠæŃŠ¾ŃŃŠ¾Š³Š¾Ńипаxs виГгŃŃŠæŠæŃŠ¼Š¾Š“елиxs Š²ŠøŠ“ŃŠ°ŃŠµŃŠ°xdto ГейŃŃŠ²ŠøŠµŠæŠ¾ŃŃŃŠ¾ŠøŃелŃdom завеŃŃŠµŠ½Š½Š¾ŃŃŃŠæŃоŃŃŠ¾Š³Š¾Ńипаxs завеŃŃŠµŠ½Š½Š¾ŃŃŃŃŠ¾ŃŃŠ°Š²Š½Š¾Š³Š¾Ńипаxs завеŃŃŠµŠ½Š½Š¾ŃŃŃŃŃ ŠµŠ¼Ńxs Š·Š°ŠæŃŠµŃŠµŠ½Š½ŃŠµŠæŠ¾Š“ŃŃŠ°Š½Š¾Š²ŠŗŠøxs ŠøŃŠŗŠ»ŃŃŠµŠ½ŠøŃгŃŃŠæŠæŠæŠ¾Š“ŃŃŠ°Š½Š¾Š²ŠŗŠøxs ŠŗŠ°ŃŠµŠ³Š¾ŃŠøŃŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŃаŃŃŠøŠ±ŃŃŠ°xs ŠŗŠ°ŃŠµŠ³Š¾ŃŠøŃŠ¾Š³ŃŠ°Š½ŠøŃŠµŠ½ŠøŃŠøŠ“ŠµŠ½ŃŠøŃноŃŃŠøxs ŠŗŠ°ŃŠµŠ³Š¾ŃŠøŃŠ¾Š³ŃŠ°Š½ŠøŃŠµŠ½ŠøŃŠæŃŠ¾ŃŃŃŠ°Š½ŃŃŠ²ŠøŠ¼ŠµŠ½xs Š¼ŠµŃŠ¾Š“Š½Š°ŃŠ»ŠµŠ“ованиŃxs моГелŃŃŠ¾Š“ŠµŃŠ¶ŠøŠ¼Š¾Š³Š¾xs Š½Š°Š·Š½Š°ŃŠµŠ½ŠøŠµŃипаxml неГопŃŃŃŠøŠ¼ŃепоГŃŃŠ°Š½Š¾Š²ŠŗŠøxs Š¾Š±ŃŠ°Š±Š¾ŃŠŗŠ°ŠæŃŠ¾Š±ŠµŠ»ŃнŃŃ ŃŠøŠ¼Š²Š¾Š»Š¾Š²xs Š¾Š±ŃŠ°Š±Š¾ŃŠŗŠ°ŃŠ¾Š“ŠµŃŠ¶ŠøŠ¼Š¾Š³Š¾xs Š¾Š³ŃŠ°Š½ŠøŃŠµŠ½ŠøŠµŠ·Š½Š°ŃŠµŠ½ŠøŃxs ŠæŠ°ŃŠ°Š¼ŠµŃŃŃŠ¾ŃŠ±Š¾ŃŠ°Ńзловdom ŠæŠµŃŠµŠ½Š¾ŃŃŃŃŠ¾Šŗjson ŠæŠ¾Š·ŠøŃŠøŃŠ²Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńеdom ŠæŃŠ¾Š±ŠµŠ»ŃŠ½ŃŠµŃимволŃxml ŃŠøŠæŠ°ŃŃŠøŠ±ŃŃŠ°xml ŃŠøŠæŠ·Š½Š°ŃениŃjson ŃŠøŠæŠŗŠ°Š½Š¾Š½ŠøŃŠµŃŠŗŠ¾Š³Š¾xml ŃŠøŠæŠŗŠ¾Š¼ŠæŠ¾Š½ŠµŠ½ŃŃxs ŃŠøŠæŠæŃŠ¾Š²ŠµŃŠŗŠøxml ŃŠøŠæŃŠµŠ·ŃŠ»ŃŃŠ°Ńаdomxpath ŃŠøŠæŃзлаdom ŃŠøŠæŃзлаxml ŃŠ¾Ńмаxml ŃŠ¾ŃŠ¼Š°ŠæŃŠµŠ“ŃŃŠ°Š²Š»ŠµŠ½ŠøŃxs ŃŠ¾ŃŠ¼Š°ŃŠ“аŃŃjson ŃŠŗŃŠ°Š½ŠøŃŠ¾Š²Š°Š½ŠøŠµŃимволовjson виГŃŃŠ°Š²Š½ŠµŠ½ŠøŃкомпоновкиГаннŃŃ Š“ŠµŠ¹ŃŃŠ²ŠøŠµŠ¾Š±ŃŠ°Š±Š¾ŃŠŗŠøŃаŃŃŠøŃŃŠ¾Š²ŠŗŠøŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ Š½Š°ŠæŃŠ°Š²Š»ŠµŠ½ŠøŠµŃоŃŃŠøŃовкикомпоновкиГаннŃŃ ŃŠ°ŃположениевложеннŃŃ ŃŠ»ŠµŠ¼ŠµŠ½ŃŠ¾Š²ŃŠµŠ·ŃŠ»ŃŃŠ°ŃакомпоновкиГаннŃŃ ŃŠ°ŃŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŠøŃŠ¾Š³Š¾Š²ŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠ°ŃположениегŃŃŠæŠæŠøŃŠ¾Š²ŠŗŠøŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠ°ŃположениеполейгŃŃŠæŠæŠøŃŠ¾Š²ŠŗŠøŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠ°ŃŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŠæŠ¾Š»ŃŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠ°ŃŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŃŠµŠŗŠ²ŠøŠ·ŠøŃовкомпоновкиГаннŃŃ ŃŠ°ŃŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŃŠµŃŃŃŃŠ¾Š²ŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠøŠæŠ±ŃŃ Š³Š°Š»ŃŠµŃŃŠŗŠ¾Š³Š¾Š¾ŃŃŠ°ŃкакомпоновкиГаннŃŃ ŃŠøŠæŠ²ŃŠ²Š¾Š“Š°ŃŠµŠŗŃŃŠ°ŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠøŠæŠ³ŃŃŠæŠæŠøŃŠ¾Š²ŠŗŠøŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠøŠæŠ³ŃŃŠæŠæŃŃŠ»ŠµŠ¼ŠµŠ½ŃŠ¾Š²Š¾ŃŠ±Š¾ŃакомпоновкиГаннŃŃ ŃŠøŠæŠ“Š¾ŠæŠ¾Š»Š½ŠµŠ½ŠøŃŠæŠµŃŠøŠ¾Š“акомпоновкиГаннŃŃ ŃŠøŠæŠ·Š°Š³Š¾Š»Š¾Š²ŠŗŠ°ŠæŠ¾Š»ŠµŠ¹ŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠøŠæŠ¼Š°ŠŗŠµŃагŃŃŠæŠæŠøŃŠ¾Š²ŠŗŠøŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠøŠæŠ¼Š°ŠŗŠµŃаоблаŃŃŠøŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠøŠæŠ¾ŃŃŠ°ŃкакомпоновкиГаннŃŃ ŃŠøŠæŠæŠµŃиоГакомпоновкиГаннŃŃ ŃŠøŠæŃŠ°Š·Š¼ŠµŃŠµŠ½ŠøŃŃŠµŠŗŃŃŠ°ŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠøŠæŃŠ²ŃŠ·ŠøŠ½Š°Š±Š¾ŃовГаннŃŃ ŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“Š°Š½Š½ŃŃ ŃŠøŠæŃŠ»ŠµŠ¼ŠµŠ½ŃŠ°ŃŠµŠ·ŃŠ»ŃŃŠ°ŃакомпоновкиГаннŃŃ ŃŠ°ŃŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŠ»ŠµŠ³ŠµŠ½Š“ŃŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼ŃкомпоновкиГаннŃŃ ŃŠøŠæŠæŃŠøŠ¼ŠµŠ½ŠµŠ½ŠøŃŠ¾ŃŠ±Š¾ŃŠ°ŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠµŠ¶ŠøŠ¼Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃŃŠ»ŠµŠ¼ŠµŠ½ŃанаŃŃŃŠ¾Š¹ŠŗŠøŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠµŠ¶ŠøŠ¼Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃнаŃŃŃŠ¾ŠµŠŗŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠ¾ŃŃŠ¾ŃŠ½ŠøŠµŃŠ»ŠµŠ¼ŠµŠ½ŃанаŃŃŃŠ¾Š¹ŠŗŠøŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠæŠ¾ŃŠ¾Š±Š²Š¾ŃŃŃŠ°Š½Š¾Š²Š»ŠµŠ½ŠøŃнаŃŃŃŠ¾ŠµŠŗŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠµŠ¶ŠøŠ¼ŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŃŠµŠ·ŃŠ»ŃŃŠ°Ńа ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠæŠ°ŃамеŃŃŠ°ŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ Š°Š²ŃŠ¾ŠæŠ¾Š·ŠøŃŠøŃŃŠµŃŃŃŃŠ¾Š²ŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ Š²Š°ŃŠøŠ°Š½ŃŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŃгŃŃŠæŠæŠøŃŠ¾Š²ŠŗŠøŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠ°ŃŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŃŠµŃŃŃŃŠ¾Š²Š²Š“ŠøŠ°Š³ŃŠ°Š¼Š¼ŠµŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŃŠøŠŗŃŠ°ŃŠøŃкомпоновкиГаннŃŃ ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŃŃŠ»Š¾Š²Š½Š¾Š³Š¾Š¾ŃŠ¾ŃŠ¼Š»ŠµŠ½ŠøŃкомпоновкиГаннŃŃ Š²Š°Š¶Š½Š¾ŃŃŃŠøŠ½ŃŠµŃŠ½ŠµŃпоŃŃŠ¾Š²Š¾Š³Š¾ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŃ Š¾Š±ŃŠ°Š±Š¾ŃŠŗŠ°ŃŠµŠŗŃŃŠ°ŠøŠ½ŃŠµŃŠ½ŠµŃпоŃŃŠ¾Š²Š¾Š³Š¾ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŃ ŃŠæŠ¾ŃŠ¾Š±ŠŗŠ¾Š“ŠøŃŠ¾Š²Š°Š½ŠøŃŠøŠ½ŃŠµŃŠ½ŠµŃŠæŠ¾ŃŃŠ¾Š²Š¾Š³Š¾Š²Š»Š¾Š¶ŠµŠ½ŠøŃ ŃŠæŠ¾ŃŠ¾Š±ŠŗŠ¾Š“ŠøŃŠ¾Š²Š°Š½ŠøŃнеasciiŃŠøŠ¼Š²Š¾Š»Š¾Š²ŠøŠ½ŃŠµŃŠ½ŠµŃпоŃŃŠ¾Š²Š¾Š³Š¾ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŃ ŃŠøŠæŃекŃŃŠ°ŠæŠ¾ŃŃŠ¾Š²Š¾Š³Š¾ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŃ ŠæŃŠ¾ŃŠ¾ŠŗŠ¾Š»ŠøŠ½ŃŠµŃŠ½ŠµŃŠæŠ¾ŃŃŃ ŃŃŠ°ŃŃŃŃŠ°Š·Š±Š¾ŃапоŃŃŠ¾Š²Š¾Š³Š¾ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŃ ŃŠµŠ¶ŠøŠ¼ŃŃŠ°Š½Š·Š°ŠŗŃŠøŠøŠ·Š°ŠæŠøŃŠøŠ¶ŃŃŠ½Š°Š»Š°ŃегиŃŃŃŠ°ŃŠøŠø ŃŃŠ°ŃŃŃŃŃŠ°Š½Š·Š°ŠŗŃŠøŠøŠ·Š°ŠæŠøŃŠøŠ¶ŃŃŠ½Š°Š»Š°ŃегиŃŃŃŠ°ŃŠøŠø ŃŃŠ¾Š²ŠµŠ½ŃжŃŃŠ½Š°Š»Š°ŃегиŃŃŃŠ°ŃŠøŠø ŃŠ°ŃŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŃ ŃŠ°Š½ŠøŠ»ŠøŃŠ°ŃŠµŃŃŠøŃŠøŠŗŠ°ŃŠ¾Š²ŠŗŃŠøŠæŃŠ¾Š³ŃŠ°ŃŠøŠø ŃŠµŠ¶ŠøŠ¼Š²ŠŗŠ»ŃŃŠµŠ½ŠøŃŃŠµŃŃŠøŃŠøŠŗŠ°ŃŠ¾Š²ŠŗŃŠøŠæŃŠ¾Š³ŃŠ°ŃŠøŠø ŃŠµŠ¶ŠøŠ¼ŠæŃŠ¾Š²ŠµŃŠŗŠøŃеŃŃŠøŃŠøŠŗŠ°ŃŠ°ŠŗŃŠøŠæŃŠ¾Š³ŃŠ°ŃŠøŠø ŃŠøŠæŃ ŃŠ°Š½ŠøŠ»ŠøŃŠ°ŃŠµŃŃŠøŃŠøŠŗŠ°ŃŠ¾Š²ŠŗŃŠøŠæŃŠ¾Š³ŃŠ°ŃŠøŠø ŠŗŠ¾Š“ŠøŃŠ¾Š²ŠŗŠ°ŠøŠ¼ŠµŠ½ŃайловвzipŃŠ°Š¹Š»Šµ Š¼ŠµŃŠ¾Š“ŃŠ¶Š°ŃŠøŃzip Š¼ŠµŃŠ¾Š“ŃŠøŃŃŠ¾Š²Š°Š½ŠøŃzip ŃŠµŠ¶ŠøŠ¼Š²Š¾ŃŃŃŠ°Š½Š¾Š²Š»ŠµŠ½ŠøŃŠæŃŃŠµŠ¹Ńайловzip ŃŠµŠ¶ŠøŠ¼Š¾Š±ŃŠ°Š±Š¾ŃŠŗŠøŠæŠ¾Š“ŠŗŠ°ŃŠ°Š»Š¾Š³Š¾Š²zip ŃŠµŠ¶ŠøŠ¼ŃŠ¾Ń ŃŠ°Š½ŠµŠ½ŠøŃŠæŃŃŠµŠ¹zip ŃŃŠ¾Š²ŠµŠ½ŃŃŠ¶Š°ŃŠøŃzip Š·Š²ŃŠŗŠ¾Š²Š¾ŠµŠ¾ŠæŠ¾Š²ŠµŃение Š½Š°ŠæŃŠ°Š²Š»ŠµŠ½ŠøŠµŠæŠµŃŠµŃ оГакŃŃŃŠ¾ŠŗŠµ ŠæŠ¾Š·ŠøŃŠøŃŠ²ŠæŠ¾ŃŠ¾ŠŗŠµ поŃŃŠ“Š¾ŠŗŠ±Š°Š¹ŃŠ¾Š² ŃŠµŠ¶ŠøŠ¼Š±Š»Š¾ŠŗŠøŃовкиГаннŃŃ ŃŠµŠ¶ŠøŠ¼ŃŠæŃŠ°Š²Š»ŠµŠ½ŠøŃŠ±Š»Š¾ŠŗŠøŃŠ¾Š²ŠŗŠ¾Š¹Š“аннŃŃ ŃŠµŃŠ²ŠøŃŠ²ŃŃŃŠ¾ŠµŠ½Š½ŃŃ ŠæŠ¾ŠŗŃŠæŠ¾Šŗ ŃŠ¾ŃŃŠ¾ŃŠ½ŠøŠµŃŠ¾Š½Š¾Š²Š¾Š³Š¾Š·Š°Š“Š°Š½ŠøŃ ŃŠøŠæŠæŠ¾Š“пиŃŃŠøŠŗŠ°Š“оŃŃŠ°Š²Š»ŃемŃŃ ŃŠ²ŠµŠ“омлений ŃŃŠ¾Š²ŠµŠ½ŃŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŃŠ·Š°ŃŠøŃŠµŠ½Š½Š¾Š³Š¾ŃŠ¾ŠµŠ“инениŃftp Š½Š°ŠæŃŠ°Š²Š»ŠµŠ½ŠøŠµŠæŠ¾ŃŃŠ“каŃŃ ŠµŠ¼ŃŠ·Š°ŠæŃŠ¾ŃŠ° ŃŠøŠæŠ“Š¾ŠæŠ¾Š»Š½ŠµŠ½ŠøŃŠæŠµŃŠøŠ¾Š“амиŃŃ ŠµŠ¼ŃŠ·Š°ŠæŃŠ¾ŃŠ° ŃŠøŠæŠŗŠ¾Š½ŃŃŠ¾Š»ŃŠ½Š¾Š¹ŃŠ¾ŃŠŗŠøŃŃ ŠµŠ¼ŃŠ·Š°ŠæŃŠ¾ŃŠ° ŃŠøŠæŠ¾Š±ŃеГинениŃŃŃ ŠµŠ¼ŃŠ·Š°ŠæŃŠ¾ŃŠ° ŃŠøŠæŠæŠ°ŃамеŃŃŠ°Š“оŃŃŃŠæŠ½Š¾Š¹ŃŠ°Š±Š»ŠøŃŃŃŃ ŠµŠ¼ŃŠ·Š°ŠæŃŠ¾ŃŠ° ŃŠøŠæŃоеГинениŃŃŃ ŠµŠ¼ŃŠ·Š°ŠæŃŠ¾ŃŠ° httpŠ¼ŠµŃŠ¾Š“ Š°Š²ŃŠ¾ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠ¾Š±ŃŠµŠ³Š¾ŃŠµŠŗŠ²ŠøŠ·ŠøŃа Š°Š²ŃŠ¾ŠæŃŠµŃŠøŠŗŃŠ½Š¾Š¼ŠµŃŠ°Š·Š°Š“Š°ŃŠø Š²Š°ŃŠøŠ°Š½ŃвŃŃŃŠ¾ŠµŠ½Š½Š¾Š³Š¾ŃŠ·ŃŠŗŠ° Š²ŠøŠ“ŠøŠµŃŠ°ŃŃ ŠøŠø Š²ŠøŠ“ŃŠµŠ³ŠøŃŃŃŠ°Š½Š°ŠŗŠ¾ŠæŠ»ŠµŠ½ŠøŃ Š²ŠøŠ“ŃŠ°Š±Š»ŠøŃŃŠ²Š½ŠµŃнегоиŃŃŠ¾ŃникаГаннŃŃ Š·Š°ŠæŠøŃŃŠ“Š²ŠøŠ¶ŠµŠ½ŠøŠ¹ŠæŃŠøŠæŃовеГении Š·Š°ŠæŠ¾Š»Š½ŠµŠ½ŠøŠµŠæŠ¾ŃŠ»ŠµŠ“Š¾Š²Š°ŃŠµŠ»ŃноŃŃŠµŠ¹ ŠøŠ½Š“ŠµŠŗŃŠøŃование ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠ±Š°Š·ŃŠæŠ»Š°Š½Š°Š²ŠøŠ“Š¾Š²ŃŠ°ŃŃŠµŃа ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠ±ŃŃŃŃŠ¾Š³Š¾Š²ŃŠ±Š¾ŃŠ° ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠ¾Š±ŃŠµŠ³Š¾ŃŠµŠŗŠ²ŠøŠ·ŠøŃа ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠæŠ¾Š“ŃŠøŠ½ŠµŠ½ŠøŃ ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠæŠ¾Š»Š½Š¾ŃекŃŃŠ¾Š²Š¾Š³Š¾ŠæŠ¾ŠøŃка ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŃŠ°Š·Š“ŠµŠ»ŃŠµŠ¼ŃŃ Š“Š°Š½Š½ŃŃ Š¾Š±ŃŠµŠ³Š¾ŃŠµŠŗŠ²ŠøŠ·ŠøŃŠ° ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŃŠµŠŗŠ²ŠøŠ·ŠøŃŠ° Š½Š°Š·Š½Š°ŃŠµŠ½ŠøŠµŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŃŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ Š½Š°Š·Š½Š°ŃŠµŠ½ŠøŠµŃаŃŃŠøŃŠµŠ½ŠøŃŠŗŠ¾Š½ŃигŃŃŠ°ŃŠøŠø Š½Š°ŠæŃŠ°Š²Š»ŠµŠ½ŠøŠµŠæŠµŃŠµŠ“Š°ŃŠø Š¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŠµŠæŃŠµŠ“Š¾ŠæŃŠµŠ“еленнŃŃ Š“Š°Š½Š½ŃŃ Š¾ŠæŠµŃŠ°ŃŠøŠ²Š½Š¾ŠµŠæŃŠ¾Š²ŠµŠ“ение Š¾ŃновноепŃеГŃŃŠ°Š²Š»ŠµŠ½ŠøŠµŠ²ŠøŠ“Š°ŃŠ°ŃŃŠµŃа Š¾ŃновноепŃеГŃŃŠ°Š²Š»ŠµŠ½ŠøŠµŠ²ŠøŠ“Š°Ń Š°ŃŠ°ŠŗŃŠµŃŠøŃŃŠøŠŗŠø Š¾ŃŠ½Š¾Š²Š½Š¾ŠµŠæŃеГŃŃŠ°Š²Š»ŠµŠ½ŠøŠµŠ·Š°Š“Š°ŃŠø Š¾ŃŠ½Š¾Š²Š½Š¾ŠµŠæŃеГŃŃŠ°Š²Š»ŠµŠ½ŠøŠµŠæŠ»Š°Š½Š°Š¾Š±Š¼ŠµŠ½Š° Š¾ŃŠ½Š¾Š²Š½Š¾ŠµŠæŃеГŃŃŠ°Š²Š»ŠµŠ½ŠøŠµŃŠæŃŠ°Š²Š¾Ńника Š¾ŃновноепŃеГŃŃŠ°Š²Š»ŠµŠ½ŠøŠµŃŃŠµŃа ŠæŠµŃŠµŠ¼ŠµŃŠµŠ½ŠøŠµŠ³ŃŠ°Š½ŠøŃŃŠæŃŠøŠæŃŠ¾Š²ŠµŠ“ении ŠæŠµŃŠøŠ¾Š“ŠøŃŠ½Š¾ŃŃŃŠ½Š¾Š¼ŠµŃŠ°Š±ŠøŠ·Š½ŠµŃŠæŃŠ¾ŃŠµŃŃŠ° ŠæŠµŃŠøŠ¾Š“ŠøŃŠ½Š¾ŃŃŃŠ½Š¾Š¼ŠµŃŠ°Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŠæŠµŃŠøŠ¾Š“ŠøŃŠ½Š¾ŃŃŃŃŠµŠ³ŠøŃŃŃŠ°ŃаŃŃŠµŃа ŠæŠµŃŠøŠ¾Š“ŠøŃŠ½Š¾ŃŃŃŃŠµŠ³ŠøŃŃŃŠ°ŃвеГений ŠæŠ¾Š²ŃŠ¾ŃŠ½Š¾ŠµŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠ²Š¾Š·Š²ŃŠ°ŃŠ°ŠµŠ¼ŃŃ Š·Š½Š°ŃŠµŠ½ŠøŠ¹ ŠæŠ¾Š»Š½Š¾ŃŠµŠŗŃŃŠ¾Š²ŃŠ¹ŠæŠ¾ŠøŃŠŗŠæŃиввоГепоŃŃŃŠ¾ŠŗŠµ ŠæŃŠøŠ½Š°Š“лежноŃŃŃŠ¾Š±ŃŠµŠŗŃŠ° ŠæŃŠ¾Š²ŠµŠ“ение ŃŠ°Š·Š“елениеаŃŃŠµŠ½ŃŠøŃŠøŠŗŠ°ŃŠøŠøŠ¾Š±ŃŠµŠ³Š¾ŃŠµŠŗŠ²ŠøŠ·ŠøŃŠ° ŃŠ°Š·Š“елениеГаннŃŃ Š¾Š±ŃŠµŠ³Š¾ŃŠµŠŗŠ²ŠøŠ·ŠøŃŠ° ŃŠ°Š·Š“ŠµŠ»ŠµŠ½ŠøŠµŃŠ°ŃŃŠøŃŠµŠ½ŠøŠ¹ŠŗŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŠøŠ¾Š±ŃŠµŠ³Š¾ŃŠµŠŗŠ²ŠøŠ·ŠøŃŠ° ŃŠµŠ¶ŠøŠ¼Š°Š²ŃŠ¾Š½ŃŠ¼ŠµŃŠ°ŃŠøŠøŠ¾Š±ŃŠµŠŗŃŠ¾Š² ŃŠµŠ¶ŠøŠ¼Š·Š°ŠæŠøŃŠøŃŠµŠ³ŠøŃŃŃŠ° ŃŠµŠ¶ŠøŠ¼ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŃŠ¼Š¾Š“Š°Š»ŃŠ½Š¾ŃŃŠø ŃŠµŠ¶ŠøŠ¼ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŃŃŠøŠ½Ń ŃŠ¾Š½Š½ŃŃ Š²ŃŠ·Š¾Š²Š¾Š²ŃаŃŃŠøŃенийплаŃŃŠ¾ŃŠ¼ŃŠøŠ²Š½ŠµŃŠ½ŠøŃ ŠŗŠ¾Š¼ŠæŠ¾Š½ŠµŠ½Ń ŃŠµŠ¶ŠøŠ¼ŠæŠ¾Š²ŃŠ¾ŃŠ½Š¾Š³Š¾ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŃŃŠµŠ°Š½Ńов ŃŠµŠ¶ŠøŠ¼ŠæŠ¾Š»ŃŃŠµŠ½ŠøŃГаннŃŃ Š²ŃŠ±Š¾ŃŠ°ŠæŃŠøŠ²Š²Š¾Š“епоŃŃŃŠ¾ŠŗŠµ ŃŠµŠ¶ŠøŠ¼ŃовмеŃŃŠøŠ¼Š¾ŃŃŠø ŃŠµŠ¶ŠøŠ¼ŃовмеŃŃŠøŠ¼Š¾ŃŃŠøŠøŠ½ŃеŃŃŠµŠ¹Ńа ŃŠµŠ¶ŠøŠ¼ŃŠæŃŠ°Š²Š»ŠµŠ½ŠøŃŠ±Š»Š¾ŠŗŠøŃŠ¾Š²ŠŗŠ¾Š¹Š“аннŃŃ ŠæŠ¾ŃŠ¼Š¾Š»ŃŠ°Š½ŠøŃ ŃŠµŃŠøŠøŠŗŠ¾Š“Š¾Š²ŠæŠ»Š°Š½Š°Š²ŠøŠ“Š¾Š²Ń Š°ŃŠ°ŠŗŃŠµŃŠøŃŃŠøŠŗ ŃŠµŃиикоГовпланаŃŃŠµŃов ŃŠµŃŠøŠøŠŗŠ¾Š“Š¾Š²ŃŠæŃŠ°Š²Š¾ŃŠ½ŠøŠŗŠ° ŃŠ¾Š·Š“Š°Š½ŠøŠµŠæŃŠøŠ²Š²Š¾Š“е ŃŠæŠ¾ŃŠ¾Š±Š²ŃŠ±Š¾ŃŠ° ŃŠæŠ¾ŃŠ¾Š±ŠæŠ¾ŠøŃкаŃŃŃŠ¾ŠŗŠøŠæŃиввоГепоŃŃŃŠ¾ŠŗŠµ ŃŠæŠ¾ŃŠ¾Š±ŃŠµŠ“Š°ŠŗŃŠøŃŠ¾Š²Š°Š½ŠøŃ ŃŠøŠæŠ“аннŃŃ ŃŠ°Š±Š»ŠøŃŃŠ²Š½ŠµŃнегоиŃŃŠ¾ŃникаГаннŃŃ ŃŠøŠæŠŗŠ¾Š“Š°ŠæŠ»Š°Š½Š°Š²ŠøŠ“Š¾Š²ŃŠ°ŃŃŠµŃа ŃŠøŠæŠŗŠ¾Š“Š°ŃŠæŃŠ°Š²Š¾ŃŠ½ŠøŠŗŠ° ŃŠøŠæŠ¼Š°ŠŗŠµŃа ŃŠøŠæŠ½Š¾Š¼ŠµŃŠ°Š±ŠøŠ·Š½ŠµŃŠæŃŠ¾ŃŠµŃŃŠ° ŃŠøŠæŠ½Š¾Š¼ŠµŃŠ°Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńа ŃŠøŠæŠ½Š¾Š¼ŠµŃŠ°Š·Š°Š“Š°ŃŠø ŃŠøŠæŃŠ¾ŃŠ¼Ń ŃŠ“алениеГвижений важноŃŃŃŠæŃŠ¾Š±Š»ŠµŠ¼ŃŠæŃименениŃŃŠ°ŃŃŠøŃŠµŠ½ŠøŃŠŗŠ¾Š½ŃигŃŃŠ°ŃŠøŠø Š²Š°ŃŠøŠ°Š½ŃŠøŠ½ŃŠµŃŃŠµŠ¹ŃаклиенŃŃŠŗŠ¾Š³Š¾ŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ Š²Š°ŃŠøŠ°Š½ŃмаŃŃŃŠ°Š±Š°ŃŠ¾ŃŠ¼ŠŗŠ»ŠøŠµŠ½ŃŃŠŗŠ¾Š³Š¾ŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ Š²Š°ŃŠøŠ°Š½ŃŠ¾ŃŠ½Š¾Š²Š½Š¾Š³Š¾ŃŃŠøŃŃŠ°ŠŗŠ»ŠøŠµŠ½ŃŃŠŗŠ¾Š³Š¾ŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ Š²Š°ŃŠøŠ°Š½ŃŃŃŠ°Š½Š“аŃŃŠ½Š¾Š³Š¾ŠæŠµŃиоГа Š²Š°ŃианŃŃŃŠ°Š½Š“аŃŃŠ½Š¾Š¹Š“аŃŃŠ½Š°Ńала Š²ŠøŠ“Š³ŃŠ°Š½ŠøŃŃ Š²ŠøŠ“ŠŗŠ°ŃŃŠøŠ½ŠŗŠø Š²ŠøŠ“Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃŠæŠ¾Š»Š½Š¾ŃŠµŠŗŃŃŠ¾Š²Š¾Š³Š¾ŠæŠ¾ŠøŃка Š²ŠøŠ“ŃŠ°Š¼ŠŗŠø виГŃŃŠ°Š²Š½ŠµŠ½ŠøŃ Š²ŠøŠ“ŃŠ²ŠµŃа Š²ŠøŠ“ŃŠøŃŠ»Š¾Š²Š¾Š³Š¾Š·Š½Š°ŃŠµŠ½ŠøŃ виГŃŃŠøŃŃŠ° ГопŃŃŃŠøŠ¼Š°ŃГлина ГопŃŃŃŠøŠ¼Ńйзнак ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµbyteordermark ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠ¼ŠµŃаГаннŃŃ ŠæŠ¾Š»Š½Š¾ŃŠµŠŗŃŃŠ¾Š²Š¾Š³Š¾ŠæŠ¾ŠøŃка ŠøŃŃŠ¾ŃŠ½ŠøŠŗŃŠ°ŃŃŠøŃŠµŠ½ŠøŠ¹ŠŗŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŠø ŠŗŠ»Š°Š²ŠøŃŠ° ŠŗŠ¾Š“Š²Š¾Š·Š²ŃŠ°ŃаГиалога ŠŗŠ¾Š“ŠøŃŠ¾Š²ŠŗŠ°xbase ŠŗŠ¾Š“ŠøŃŠ¾Š²ŠŗŠ°ŃекŃŃŠ° Š½Š°ŠæŃŠ°Š²Š»ŠµŠ½ŠøŠµŠæŠ¾ŠøŃка Š½Š°ŠæŃавлениеŃоŃŃŠøŃовки Š¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŠµŠæŃŠµŠ“Š¾ŠæŃŠµŠ“еленнŃŃ Š“Š°Š½Š½ŃŃ Š¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŠµŠæŃŠøŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŠøŠ“аннŃŃ Š¾ŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŠæŠ°Š½ŠµŠ»ŠøŃŠ°Š·Š“елов ŠæŃŠ¾Š²ŠµŃŠŗŠ°Š·Š°ŠæŠ¾Š»Š½ŠµŠ½ŠøŃ ŃŠµŠ¶ŠøŠ¼Š“ŠøŠ°Š»Š¾Š³Š°Š²Š¾ŠæŃŠ¾Ń ŃŠµŠ¶ŠøŠ¼Š·Š°ŠæŃŃŠŗŠ°ŠŗŠ»ŠøŠµŠ½ŃŃŠŗŠ¾Š³Š¾ŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ ŃŠµŠ¶ŠøŠ¼Š¾ŠŗŃŃŠ³Š»ŠµŠ½ŠøŃ ŃŠµŠ¶ŠøŠ¼Š¾ŃŠŗŃŃŃŠøŃŃŠ¾ŃŠ¼ŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ ŃŠµŠ¶ŠøŠ¼ŠæŠ¾Š»Š½Š¾ŃекŃŃŠ¾Š²Š¾Š³Š¾ŠæŠ¾ŠøŃка ŃŠŗŠ¾ŃоŃŃŃŠŗŠ»ŠøŠµŠ½ŃŃŠŗŠ¾Š³Š¾ŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃ ŃŠ¾ŃŃŠ¾ŃŠ½ŠøŠµŠ²Š½ŠµŃŠ½ŠµŠ³Š¾ŠøŃŃŠ¾ŃникаГаннŃŃ ŃŠ¾ŃŃŠ¾ŃŠ½ŠøŠµŠ¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŃŠŗŠ¾Š½ŃигŃŃŠ°ŃŠøŠøŠ±Š°Š·ŃŠ“аннŃŃ ŃŠæŠ¾ŃŠ¾Š±Š²ŃŠ±Š¾ŃŠ°ŃеŃŃŠøŃŠøŠŗŠ°ŃŠ°windows ŃŠæŠ¾ŃŠ¾Š±ŠŗŠ¾Š“ŠøŃŠ¾Š²Š°Š½ŠøŃŃŃŃŠ¾ŠŗŠø ŃŃŠ°ŃŃŃŃŠ¾Š¾Š±ŃŠµŠ½ŠøŃ ŃŠøŠæŠ²Š½ŠµŃнейкомпоненŃŃ ŃŠøŠæŠæŠ»Š°ŃŃŠ¾ŃŠ¼Ń ŃŠøŠæŠæŠ¾Š²ŠµŠ“ŠµŠ½ŠøŃŠŗŠ»Š°Š²ŠøŃŠøenter ŃŠøŠæŃŠ»ŠµŠ¼ŠµŠ½ŃŠ°ŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŠøŠ¾Š²ŃŠæŠ¾Š»Š½ŠµŠ½ŠøŠøŠ¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŃŠŗŠ¾Š½ŃигŃŃŠ°ŃŠøŠøŠ±Š°Š·ŃŠ“аннŃŃ ŃŃŠ¾Š²ŠµŠ½ŃизолŃŃŠøŠøŃŃŠ°Š½Š·Š°ŠŗŃий Ń ŠµŃŃŃŠ½ŠŗŃŠøŃ ŃŠ°ŃŃŠøŠ“аŃŃ`,type:`comŠ¾Š±ŃŠµŠŗŃ ftpŃŠ¾ŠµŠ“инение httpŠ·Š°ŠæŃŠ¾Ń httpŃŠµŃŠ²ŠøŃŠ¾ŃŠ²ŠµŃ httpŃŠ¾ŠµŠ“инение wsŠ¾ŠæŃŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ wsŠæŃŠ¾ŠŗŃŠø xbase анализГаннŃŃ Š°Š½Š½Š¾ŃŠ°ŃŠøŃxs Š±Š»Š¾ŠŗŠøŃŠ¾Š²ŠŗŠ°Š“аннŃŃ Š±ŃŃŠµŃŠ“Š²Š¾ŠøŃŠ½ŃŃ Š“Š°Š½Š½ŃŃ Š²ŠŗŠ»ŃŃŠµŠ½ŠøŠµxs вŃŃŠ°Š¶ŠµŠ½ŠøŠµŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ Š³ŠµŠ½ŠµŃŠ°ŃоŃŃŠ»ŃŃŠ°Š¹Š½ŃŃ ŃŠøŃел Š³ŠµŠ¾Š³ŃŠ°ŃŠøŃеŃкаŃŃŃ ŠµŠ¼Š° Š³ŠµŠ¾Š³ŃŠ°ŃŠøŃŠµŃŠŗŠøŠµŠŗŠ¾Š¾ŃŠ“инаŃŃ Š³ŃŠ°ŃŠøŃŠµŃкаŃŃŃ ŠµŠ¼Š° гŃŃŠæŠæŠ°Š¼Š¾Š“ŠµŠ»Šøxs Š“Š°Š½Š½ŃŠµŃаŃŃŠøŃŃŠ¾Š²ŠŗŠøŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ Š“Š²Š¾ŠøŃŠ½ŃŠµŠ“Š°Š½Š½ŃŠµ Š“ŠµŠ½Š“ŃŠ¾Š³Ńамма Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Š° Š“ŠøŠ°Š³ŃŠ°Š¼Š¼Š°Š³Š°Š½Ńа Š“ŠøŠ°Š»Š¾Š³Š²ŃŠ±Š¾ŃŠ°ŃŠ°Š¹Š»Š° Š“ŠøŠ°Š»Š¾Š³Š²ŃŠ±Š¾ŃŠ°ŃŠ²ŠµŃа Š“ŠøŠ°Š»Š¾Š³Š²ŃŠ±Š¾ŃаŃŃŠøŃŃŠ° Š“ŠøŠ°Š»Š¾Š³ŃŠ°ŃŠæŠøŃŠ°Š½ŠøŃŃŠµŠ³Š»Š°Š¼ŠµŠ½ŃŠ½Š¾Š³Š¾Š·Š°Š“Š°Š½ŠøŃ Š“ŠøŠ°Š»Š¾Š³ŃŠµŠ“Š°ŠŗŃŠøŃованиŃŃŃŠ°Š½Š“аŃŃŠ½Š¾Š³Š¾ŠæŠµŃиоГа Гиапазон Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńdom Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńhtml Š“Š¾ŠŗŃŠ¼ŠµŠ½ŃŠ°ŃŠøŃxs ГоŃŃŠ°Š²Š»ŃŠµŠ¼Š¾ŠµŃŠ²ŠµŠ“омление запиŃŃdom запиŃŃfastinfoset запиŃŃhtml запиŃŃjson запиŃŃxml запиŃŃzipŃŠ°Š¹Š»Š° запиŃŃŠ“аннŃŃ Š·Š°ŠæŠøŃŃŃŠµŠŗŃŃŠ° запиŃŃŃŠ·Š»Š¾Š²dom Š·Š°ŠæŃŠ¾Ń Š·Š°ŃŠøŃŠµŠ½Š½Š¾ŠµŃŠ¾ŠµŠ“инениеopenssl Š·Š½Š°ŃŠµŠ½ŠøŃŠæŠ¾Š»ŠµŠ¹ŃŠ°ŃŃŠøŃŃŠ¾Š²ŠŗŠøŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŠøŠ·Š²Š»ŠµŃŠµŠ½ŠøŠµŃекŃŃŠ° импоŃŃxs ŠøŠ½ŃŠµŃŠ½ŠµŃŠæŠ¾ŃŃŠ° ŠøŠ½ŃŠµŃŠ½ŠµŃŠæŠ¾ŃŃŠ¾Š²Š¾ŠµŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠµ ŠøŠ½ŃŠµŃŠ½ŠµŃŠæŠ¾ŃŃŠ¾Š²ŃŠ¹ŠæŃŠ¾ŃŠøŠ»Ń ŠøŠ½ŃŠµŃŠ½ŠµŃŠæŃŠ¾ŠŗŃŠø ŠøŠ½ŃŠµŃнеŃŃŠ¾ŠµŠ“инение ŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŃŠ“Š»ŃŠæŃиложениŃxs ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠ°ŃŃŠøŠ±ŃŃŠ°xs ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŃобŃŃŠøŃжŃŃŠ½Š°Š»Š°ŃегиŃŃŃŠ°ŃŠøŠø ŠøŃŃŠ¾ŃникГоŃŃŃŠæŠ½ŃŃ Š½Š°ŃŃŃŠ¾ŠµŠŗŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŠøŃŠµŃŠ°ŃŠ¾ŃŃŠ·Š»Š¾Š²dom каŃŃŠøŠ½ŠŗŠ° ŠŗŠ²Š°Š»ŠøŃŠøŠŗŠ°ŃоŃŃŠ“аŃŃ ŠŗŠ²Š°Š»ŠøŃŠøŠŗŠ°ŃоŃŃŠ“Š²Š¾ŠøŃŠ½ŃŃ Š“Š°Š½Š½ŃŃ ŠŗŠ²Š°Š»ŠøŃŠøŠŗŠ°ŃоŃŃŃŃŃŠ¾ŠŗŠø ŠŗŠ²Š°Š»ŠøŃŠøŠŗŠ°ŃоŃŃŃŠøŃла ŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŃикмакеŃакомпоновкиГаннŃŃ ŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŃŠøŠŗŠ½Š°ŃŃŃŠ¾ŠµŠŗŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŠŗŠ¾Š½ŃŃŃŃŠŗŃŠ¾ŃŠ¼Š°ŠŗŠµŃŠ°Š¾ŃŠ¾ŃŠ¼Š»ŠµŠ½ŠøŃŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŠŗŠ¾Š½ŃŃŃŃŠŗŃŠ¾ŃŠ½Š°ŃŃŃŠ¾ŠµŠŗŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŠŗŠ¾Š½ŃŃŃŃŠŗŃоŃŃŠ¾ŃŠ¼Š°ŃŠ½Š¾Š¹ŃŃŃŠ¾ŠŗŠø Š»ŠøŠ½ŠøŃ Š¼Š°ŠŗŠµŃŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ Š¼Š°ŠŗŠµŃŠ¾Š±Š»Š°ŃŃŠøŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ Š¼Š°ŠŗŠµŃŠ¾ŃŠ¾ŃŠ¼Š»ŠµŠ½ŠøŃкомпоновкиГаннŃŃ Š¼Š°ŃŠŗŠ°xs Š¼ŠµŠ½ŠµŠ“Š¶ŠµŃŠŗŃŠøŠæŃŠ¾Š³ŃŠ°ŃŠøŠø набоŃŃŃ ŠµŠ¼xml наŃŃŃŠ¾Š¹ŠŗŠøŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ Š½Š°ŃŃŃŠ¾Š¹ŠŗŠøŃŠµŃŠøŠ°Š»ŠøŠ·Š°ŃŠøŠøjson Š¾Š±ŃŠ°Š±Š¾ŃкакаŃŃŠøŠ½Š¾Šŗ Š¾Š±ŃŠ°Š±Š¾ŃŠŗŠ°ŃŠ°ŃŃŠøŃŃŠ¾Š²ŠŗŠøŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ Š¾Š±Ń Š¾Š“Š“ŠµŃŠµŠ²Š°dom обŃŃŠ²Š»ŠµŠ½ŠøŠµŠ°ŃŃŠøŠ±ŃŃŠ°xs обŃŃŠ²Š»ŠµŠ½ŠøŠµŠ½Š¾ŃŠ°ŃŠøŠøxs обŃŃŠ²Š»ŠµŠ½ŠøŠµŃŠ»ŠµŠ¼ŠµŠ½ŃŠ°xs Š¾ŠæŠøŃŠ°Š½ŠøŠµŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŃŃŠ¾Š±ŃŃŠøŃГоŃŃŃŠæŠ¶ŃŃŠ½Š°Š»Š°ŃегиŃŃŃŠ°ŃŠøŠø Š¾ŠæŠøŃŠ°Š½ŠøŠµŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŃŃŠ¾Š±ŃŃŠøŃŠ¾ŃŠŗŠ°Š·Š²Š“оŃŃŃŠæŠµŠ¶ŃŃŠ½Š°Š»Š°ŃегиŃŃŃŠ°ŃŠøŠø Š¾ŠæŠøŃŠ°Š½ŠøŠµŠ¾Š±ŃŠ°Š±Š¾ŃŠŗŠøŃаŃŃŠøŃŃŠ¾Š²ŠŗŠøŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ Š¾ŠæŠøŃŠ°Š½ŠøŠµŠæŠµŃŠµŠ“Š°Š²Š°ŠµŠ¼Š¾Š³Š¾ŃŠ°Š¹Š»Š° Š¾ŠæŠøŃŠ°Š½ŠøŠµŃипов Š¾ŠæŃеГелениегŃŃŠæŠæŃŠ°ŃŃŠøŠ±ŃŃŠ¾Š²xs Š¾ŠæŃŠµŠ“елениегŃŃŠæŠæŃŠ¼Š¾Š“елиxs Š¾ŠæŃŠµŠ“ŠµŠ»ŠµŠ½ŠøŠµŠ¾Š³ŃŠ°Š½ŠøŃŠµŠ½ŠøŃŠøŠ“ŠµŠ½ŃŠøŃноŃŃŠøxs Š¾ŠæŃŠµŠ“ŠµŠ»ŠµŠ½ŠøŠµŠæŃŠ¾ŃŃŠ¾Š³Š¾Ńипаxs Š¾ŠæŃŠµŠ“ŠµŠ»ŠµŠ½ŠøŠµŃŠ¾ŃŃŠ°Š²Š½Š¾Š³Š¾Ńипаxs Š¾ŠæŃŠµŠ“ŠµŠ»ŠµŠ½ŠøŠµŃŠøŠæŠ°Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńаdom Š¾ŠæŃŠµŠ“елениŃxpathxs Š¾ŃŠ±Š¾ŃкомпоновкиГаннŃŃ ŠæŠ°ŠŗŠµŃŠ¾ŃŠ¾Š±ŃŠ°Š¶Š°ŠµŠ¼ŃŃ Š“Š¾ŠŗŃŠ¼ŠµŠ½Ńов ŠæŠ°ŃŠ°Š¼ŠµŃŃŠ²ŃŠ±Š¾ŃŠ° ŠæŠ°ŃŠ°Š¼ŠµŃŃŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“аннŃŃ ŠæŠ°ŃŠ°Š¼ŠµŃŃŃŠ·Š°ŠæŠøŃŠøjson ŠæŠ°ŃŠ°Š¼ŠµŃŃŃŠ·Š°ŠæŠøŃŠøxml ŠæŠ°ŃŠ°Š¼ŠµŃŃŃŃŃŠµŠ½ŠøŃxml ŠæŠµŃŠµŠ¾ŠæŃеГелениеxs ŠæŠ»Š°Š½ŠøŃŠ¾Š²ŃŠøŠŗ полеанализаГаннŃŃ ŠæŠ¾Š»ŠµŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“Š°Š½Š½ŃŃ ŠæŠ¾ŃŃŃŠ¾ŠøŃелŃdom поŃŃŃŠ¾ŠøŃŠµŠ»ŃŠ·Š°ŠæŃŠ¾ŃŠ° поŃŃŃŠ¾ŠøŃŠµŠ»ŃŠ¾ŃŃŠµŃа поŃŃŃŠ¾ŠøŃŠµŠ»ŃŠ¾ŃŃŠµŃаанализаГаннŃŃ ŠæŠ¾ŃŃŃŠ¾ŠøŃелŃŃŃ ŠµŠ¼xml ŠæŠ¾ŃŠ¾Šŗ ŠæŠ¾ŃŠ¾ŠŗŠ²ŠæŠ°Š¼ŃŃŠø поŃŃŠ° поŃŃŠ¾Š²Š¾ŠµŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠµ ŠæŃŠµŠ¾Š±Ńазованиеxsl ŠæŃŠµŠ¾Š±ŃŠ°Š·Š¾Š²Š°Š½ŠøŠµŠŗŠŗŠ°Š½Š¾Š½ŠøŃŠµŃкомŃxml ŠæŃŠ¾ŃеŃŃŠ¾ŃŠ²ŃŠ²Š¾Š“Š°ŃŠµŠ·ŃŠ»ŃŃŠ°ŃакомпоновкиГаннŃŃ Š²ŠŗŠ¾Š»Š»ŠµŠŗŃŠøŃŠ·Š½Š°ŃŠµŠ½ŠøŠ¹ ŠæŃŠ¾ŃеŃŃŠ¾ŃŠ²ŃŠ²Š¾Š“Š°ŃŠµŠ·ŃŠ»ŃŃŠ°ŃакомпоновкиГаннŃŃ Š²ŃŠ°Š±Š»ŠøŃŠ½ŃŠ¹Š“Š¾ŠŗŃŠ¼ŠµŠ½Ń ŠæŃŠ¾ŃеŃŃŠ¾ŃкомпоновкиГаннŃŃ ŃŠ°Š·ŃŠ¼ŠµŠ½Š¾Š²Š°ŃŠµŠ»ŃŠæŃŠ¾ŃŃŃŠ°Š½ŃŃŠ²ŠøŠ¼ŠµŠ½dom ŃŠ°Š¼ŠŗŠ° ŃŠ°ŃŠæŠøŃŠ°Š½ŠøŠµŃŠµŠ³Š»Š°Š¼ŠµŠ½ŃŠ½Š¾Š³Š¾Š·Š°Š“Š°Š½ŠøŃ ŃŠ°ŃŃŠøŃенноеимŃxml ŃŠµŠ·ŃŠ»ŃŃŠ°ŃŃŃŠµŠ½ŠøŃГаннŃŃ ŃŠ²Š¾Š“Š½Š°ŃŠ“ŠøŠ°Š³ŃŠ°Š¼Š¼Š° ŃŠ²ŃŠ·ŃŠæŠ°ŃŠ°Š¼ŠµŃŃŠ°Š²ŃŠ±Š¾ŃŠ° ŃŠ²ŃŠ·ŃŠæŠ¾ŃŠøŠæŃ ŃŠ²ŃŠ·ŃŠæŠ¾ŃŠøŠæŃкомпоновкиГаннŃŃ ŃŠµŃŠøŠ°Š»ŠøŠ·Š°ŃŠ¾Ńxdto ŃŠµŃŃŠøŃŠøŠŗŠ°ŃŠŗŠ»ŠøŠµŠ½Ńаwindows ŃŠµŃŃŠøŃŠøŠŗŠ°ŃŠŗŠ»ŠøŠµŠ½ŃŠ°ŃŠ°Š¹Š» ŃŠµŃŃŠøŃŠøŠŗŠ°ŃŠŗŃŠøŠæŃŠ¾Š³ŃŠ°ŃŠøŠø ŃŠµŃŃŠøŃикаŃŃŃŠ“оŃŃŠ¾Š²ŠµŃŃŃŃŠøŃ ŃŠµŠ½ŃŃŠ¾Š²windows ŃŠµŃŃŠøŃикаŃŃŃŠ“оŃŃŠ¾Š²ŠµŃŃŃŃŠøŃ ŃŠµŠ½ŃŃŠ¾Š²Ńайл ŃŠ¶Š°ŃиеГаннŃŃ ŃŠøŃŃŠµŠ¼Š½Š°ŃŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŃ ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠµŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń ŃŠ¾ŃŠµŃŠ°Š½ŠøŠµŠŗŠ»Š°Š²ŠøŃ ŃŃŠ°Š²Š½ŠµŠ½ŠøŠµŠ·Š½Š°Ńений ŃŃŠ°Š½Š“аŃŃŠ½Š°ŃŠ“Š°ŃŠ°Š½Š°Ńала ŃŃŠ°Š½Š“аŃŃŠ½ŃŠ¹ŠæŠµŃŠøŠ¾Š“ ŃŃ ŠµŠ¼Š°xml ŃŃ ŠµŠ¼Š°ŠŗŠ¾Š¼ŠæŠ¾Š½Š¾Š²ŠŗŠøŠ“Š°Š½Š½ŃŃ ŃŠ°Š±Š»ŠøŃŠ½ŃŠ¹Š“Š¾ŠŗŃŠ¼ŠµŠ½Ń ŃŠµŠŗŃŃŠ¾Š²ŃŠ¹Š“Š¾ŠŗŃŠ¼ŠµŠ½Ń ŃŠµŃŃŠøŃŃŠµŠ¼Š¾ŠµŠæŃиложение ŃŠøŠæŠ“аннŃŃ xml ŃŠ½ŠøŠŗŠ°Š»ŃŠ½ŃŠ¹ŠøŠ“ŠµŠ½ŃŠøŃŠøŠŗŠ°ŃŠ¾Ń ŃŠ°Š±Ńикаxdto ŃŠ°Š¹Š» ŃŠ°Š¹Š»Š¾Š²ŃŠ¹ŠæŠ¾ŃŠ¾Šŗ ŃŠ°ŃŠµŃŠ“линŃxs ŃŠ°ŃŠµŃŠŗŠ¾Š»ŠøŃеŃŃŠ²Š°ŃазŃŃŠ“Š¾Š²Š“ŃŠ¾Š±Š½Š¾Š¹ŃаŃŃŠøxs ŃŠ°ŃŠµŃŠ¼Š°ŠŗŃŠøŠ¼Š°Š»ŃŠ½Š¾Š³Š¾Š²ŠŗŠ»ŃŃŠ°ŃŃŠµŠ³Š¾Š·Š½Š°ŃениŃxs ŃŠ°ŃŠµŃŠ¼Š°ŠŗŃŠøŠ¼Š°Š»ŃŠ½Š¾Š³Š¾ŠøŃŠŗŠ»ŃŃŠ°ŃŃŠµŠ³Š¾Š·Š½Š°ŃениŃxs ŃŠ°ŃŠµŃŠ¼Š°ŠŗŃŠøŠ¼Š°Š»ŃŠ½Š¾Š¹Š“линŃxs ŃŠ°ŃŠµŃŠ¼ŠøŠ½ŠøŠ¼Š°Š»ŃноговклŃŃŠ°ŃŃŠµŠ³Š¾Š·Š½Š°ŃениŃxs ŃŠ°ŃŠµŃŠ¼ŠøŠ½ŠøŠ¼Š°Š»ŃŠ½Š¾Š³Š¾ŠøŃŠŗŠ»ŃŃŠ°ŃŃŠµŠ³Š¾Š·Š½Š°ŃениŃxs ŃŠ°ŃŠµŃŠ¼ŠøŠ½ŠøŠ¼Š°Š»ŃнойГлинŃxs ŃŠ°ŃŠµŃŠ¾Š±ŃŠ°Š·ŃŠ°xs ŃŠ°ŃŠµŃŠ¾Š±ŃŠµŠ³Š¾ŠŗŠ¾Š»ŠøŃŠµŃŃŠ²Š°ŃазŃŃŠ“овxs ŃŠ°ŃŠµŃŠæŠµŃŠµŃŠøŃŠ»ŠµŠ½ŠøŃxs ŃŠ°ŃŠµŃŠæŃŠ¾Š±ŠµŠ»ŃŠ½ŃŃ ŃŠøŠ¼Š²Š¾Š»Š¾Š²xs ŃŠøŠ»ŃŃŃŃŠ·Š»Š¾Š²dom ŃŠ¾ŃŠ¼Š°ŃŠøŃованнаŃŃŃŃŠ¾ŠŗŠ° ŃŠ¾ŃŠ¼Š°ŃŠøŃŠ¾Š²Š°Š½Š½ŃŠ¹Š“Š¾ŠŗŃŠ¼ŠµŠ½Ń ŃŃŠ°Š³Š¼ŠµŠ½Ńxs Ń ŠµŃŠøŃованиеГаннŃŃ Ń ŃŠ°Š½ŠøŠ»ŠøŃŠµŠ·Š½Š°ŃŠµŠ½ŠøŃ ŃŠ²ŠµŃ ŃŃŠµŠ½ŠøŠµfastinfoset ŃŃŠµŠ½ŠøŠµhtml ŃŃŠµŠ½ŠøŠµjson ŃŃŠµŠ½ŠøŠµxml ŃŃŠµŠ½ŠøŠµzipŃŠ°Š¹Š»Š° ŃŃŠµŠ½ŠøŠµŠ“аннŃŃ ŃŃŠµŠ½ŠøŠµŃекŃŃŠ° ŃŃŠµŠ½ŠøŠµŃзловdom ŃŃŠøŃŃ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃŠµŠ·ŃŠ»ŃŃŠ°ŃакомпоновкиГаннŃŃ comsafearray Š“ŠµŃŠµŠ²Š¾Š·Š½Š°Ńений маŃŃŠøŠ² ŃŠ¾Š¾ŃвеŃŃŃŠ²ŠøŠµ ŃŠæŠøŃŠ¾ŠŗŠ·Š½Š°Ńений ŃŃŃŃŠŗŃŃŃŠ° ŃŠ°Š±Š»ŠøŃŠ°Š·Š½Š°ŃŠµŠ½ŠøŠ¹ ŃŠøŠŗŃŠøŃŠ¾Š²Š°Š½Š½Š°ŃŃŃŃŃŠŗŃŃŃŠ° ŃŠøŠŗŃŠøŃŠ¾Š²Š°Š½Š½Š¾ŠµŃŠ¾Š¾ŃŠ²ŠµŃŃŃŠ²ŠøŠµ ŃŠøŠŗŃŠøŃŠ¾Š²Š°Š½Š½ŃймаŃŃŠøŠ² `,literal:r},contains:[l,d,c,u,i,a,o,s]}}t.exports=n})),d=o(((e,t)=>{function n(e){let t=e.regex,n=/^[a-zA-Z][a-zA-Z0-9-]*/,r=[`ALPHA`,`BIT`,`CHAR`,`CR`,`CRLF`,`CTL`,`DIGIT`,`DQUOTE`,`HEXDIG`,`HTAB`,`LF`,`LWSP`,`OCTET`,`SP`,`VCHAR`,`WSP`],i=e.COMMENT(/;/,/$/);return{name:`Augmented Backus-Naur Form`,illegal:/[!@#$^&',?+~`|:]/,keywords:r,contains:[{scope:`operator`,match:/=\/?/},{scope:`attribute`,match:t.concat(n,/(?=\s*=)/)},i,{scope:`symbol`,match:/%b[0-1]+(-[0-1]+|(\.[0-1]+)+)?/},{scope:`symbol`,match:/%d[0-9]+(-[0-9]+|(\.[0-9]+)+)?/},{scope:`symbol`,match:/%x[0-9A-F]+(-[0-9A-F]+|(\.[0-9A-F]+)+)?/},{scope:`symbol`,match:/%[si](?=".*")/},e.QUOTE_STRING_MODE,e.NUMBER_MODE]}}t.exports=n})),f=o(((e,t)=>{function n(e){let t=e.regex,n=[`GET`,`POST`,`HEAD`,`PUT`,`DELETE`,`CONNECT`,`OPTIONS`,`PATCH`,`TRACE`];return{name:`Apache Access Log`,contains:[{className:`number`,begin:/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d{1,5})?\b/,relevance:5},{className:`number`,begin:/\b\d+\b/,relevance:0},{className:`string`,begin:t.concat(/"/,t.either(...n)),end:/"/,keywords:n,illegal:/\n/,relevance:5,contains:[{begin:/HTTP\/[12]\.\d'/,relevance:5}]},{className:`string`,begin:/\[\d[^\]\n]{8,}\]/,illegal:/\n/,relevance:1},{className:`string`,begin:/\[/,end:/\]/,illegal:/\n/,relevance:0},{className:`string`,begin:/"Mozilla\/\d\.\d \(/,end:/"/,illegal:/\n/,relevance:3},{className:`string`,begin:/"/,end:/"/,illegal:/\n/,relevance:0}]}}t.exports=n})),p=o(((e,t)=>{function n(e){let t=e.regex,n=/[a-zA-Z_$][a-zA-Z0-9_$]*/,r=t.concat(n,t.concat(`(\\.`,n,`)*`)),i=/([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)/,a={className:`rest_arg`,begin:/[.]{3}/,end:n,relevance:10};return{name:`ActionScript`,aliases:[`as`],keywords:{keyword:`as.break.case.catch.class.const.continue.default.delete.do.dynamic.each.else.extends.final.finally.for.function.get.if.implements.import.in.include.instanceof.interface.internal.is.namespace.native.new.override.package.private.protected.public.return.set.static.super.switch.this.throw.try.typeof.use.var.void.while.with`.split(`.`),literal:[`true`,`false`,`null`,`undefined`]},contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.C_NUMBER_MODE,{match:[/\bpackage/,/\s+/,r],className:{1:`keyword`,3:`title.class`}},{match:[/\b(?:class|interface|extends|implements)/,/\s+/,n],className:{1:`keyword`,3:`title.class`}},{className:`meta`,beginKeywords:`import include`,end:/;/,keywords:{keyword:`import include`}},{beginKeywords:`function`,end:/[{;]/,excludeEnd:!0,illegal:/\S/,contains:[e.inherit(e.TITLE_MODE,{className:`title.function`}),{className:`params`,begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a]},{begin:t.concat(/:\s*/,i)}]},e.METHOD_GUARD],illegal:/#/}}t.exports=n})),m=o(((e,t)=>{function n(e){let t=`\\d(_|\\d)*`;``+t,t+``,t+``;let n=`[A-Za-z](_?[A-Za-z0-9.])*`,r=`[]\\{\\}%#'"`,i=e.COMMENT(`--`,`$`),a={begin:`\\s+:\\s+`,end:`\\s*(:=|;|\\)|=>|$)`,illegal:r,contains:[{beginKeywords:`loop for declare others`,endsParent:!0},{className:`keyword`,beginKeywords:`not null constant access function procedure in out aliased exception`},{className:`type`,begin:n,endsParent:!0,relevance:0}]};return{name:`Ada`,case_insensitive:!0,keywords:{keyword:`abort.else.new.return.abs.elsif.not.reverse.abstract.end.accept.entry.select.access.exception.of.separate.aliased.exit.or.some.all.others.subtype.and.for.out.synchronized.array.function.overriding.at.tagged.generic.package.task.begin.goto.pragma.terminate.body.private.then.if.procedure.type.case.in.protected.constant.interface.is.raise.use.declare.range.delay.limited.record.when.delta.loop.rem.while.digits.renames.with.do.mod.requeue.xor`.split(`.`),literal:[`True`,`False`]},contains:[i,{className:`string`,begin:/"/,end:/"/,contains:[{begin:/""/,relevance:0}]},{className:`string`,begin:/'.'/},{className:`number`,begin:`\\b(\\d(_|\\d)*#\\w+(\\.\\w+)?#([eE][-+]?\\d(_|\\d)*)?|\\d(_|\\d)*(\\.\\d(_|\\d)*)?([eE][-+]?\\d(_|\\d)*)?)`,relevance:0},{className:`symbol`,begin:`'`+n},{className:`title`,begin:`(\\bwith\\s+)?(\\bprivate\\s+)?\\bpackage\\s+(\\bbody\\s+)?`,end:`(is|$)`,keywords:`package body`,excludeBegin:!0,excludeEnd:!0,illegal:r},{begin:`(\\b(with|overriding)\\s+)?\\b(function|procedure)\\s+`,end:`(\\bis|\\bwith|\\brenames|\\)\\s*;)`,keywords:`overriding function procedure with is renames return`,returnBegin:!0,contains:[i,{className:`title`,begin:`(\\bwith\\s+)?\\b(function|procedure)\\s+`,end:`(\\(|\\s+|$)`,excludeBegin:!0,excludeEnd:!0,illegal:r},a,{className:`type`,begin:`\\breturn\\s+`,end:`(\\s+|;|$)`,keywords:`return`,excludeBegin:!0,excludeEnd:!0,endsParent:!0,illegal:r}]},{className:`type`,begin:`\\b(sub)?type\\s+`,end:`\\s+`,keywords:`type`,excludeBegin:!0,illegal:r},a]}}t.exports=n})),h=o(((e,t)=>{function n(e){let t={className:`built_in`,begin:`\\b(void|bool|int8|int16|int32|int64|int|uint8|uint16|uint32|uint64|uint|string|ref|array|double|float|auto|dictionary)`},n={className:`symbol`,begin:`[a-zA-Z0-9_]+@`},r={className:`keyword`,begin:`<`,end:`>`,contains:[t,n]};return t.contains=[r],n.contains=[r],{name:`AngelScript`,aliases:[`asc`],keywords:`for.in|0.break.continue.while.do|0.return.if.else.case.switch.namespace.is.cast.or.and.xor.not.get|0.in.inout|10.out.override.set|0.private.public.const.default|0.final.shared.external.mixin|10.enum.typedef.funcdef.this.super.import.from.interface.abstract|0.try.catch.protected.explicit.property`.split(`.`),illegal:`(^using\\s+[A-Za-z0-9_\\.]+;$|\\bfunction\\s*[^\\(])`,contains:[{className:`string`,begin:`'`,end:`'`,illegal:`\\n`,contains:[e.BACKSLASH_ESCAPE],relevance:0},{className:`string`,begin:`"""`,end:`"""`},{className:`string`,begin:`"`,end:`"`,illegal:`\\n`,contains:[e.BACKSLASH_ESCAPE],relevance:0},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:`string`,begin:`^\\s*\\[`,end:`\\]`},{beginKeywords:`interface namespace`,end:/\{/,illegal:`[;.\\-]`,contains:[{className:`symbol`,begin:`[a-zA-Z0-9_]+`}]},{beginKeywords:`class`,end:/\{/,illegal:`[;.\\-]`,contains:[{className:`symbol`,begin:`[a-zA-Z0-9_]+`,contains:[{begin:`[:,]\\s*`,contains:[{className:`symbol`,begin:`[a-zA-Z0-9_]+`}]}]}]},t,n,{className:`literal`,begin:`\\b(null|true|false)`},{className:`number`,relevance:0,begin:`(-?)(\\b0[xXbBoOdD][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?f?|\\.\\d+f?)([eE][-+]?\\d+f?)?)`}]}}t.exports=n})),g=o(((e,t)=>{function n(e){let t={className:`number`,begin:/[$%]\d+/},n={className:`number`,begin:/\b\d+/},r={className:`number`,begin:/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d{1,5})?/};return{name:`Apache config`,aliases:[`apacheconf`],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:`section`,begin:/<\/?/,end:/>/,contains:[r,{className:`number`,begin:/:\d{1,5}/},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:`attribute`,begin:/\w+/,relevance:0,keywords:{_:[`order`,`deny`,`allow`,`setenv`,`rewriterule`,`rewriteengine`,`rewritecond`,`documentroot`,`sethandler`,`errordocument`,`loadmodule`,`options`,`header`,`listen`,`serverroot`,`servername`]},starts:{end:/$/,relevance:0,keywords:{literal:`on off all deny allow`},contains:[{scope:`punctuation`,match:/\\\n/},{className:`meta`,begin:/\s\[/,end:/\]$/},{className:`variable`,begin:/[\$%]\{/,end:/\}/,contains:[`self`,t]},r,n,e.QUOTE_STRING_MODE]}}],illegal:/\S/}}t.exports=n})),_=o(((e,t)=>{function n(e){let t=e.regex,n=e.inherit(e.QUOTE_STRING_MODE,{illegal:null}),r={className:`params`,begin:/\(/,end:/\)/,contains:[`self`,e.C_NUMBER_MODE,n]},i=e.COMMENT(/--/,/$/),a=[i,e.COMMENT(/\(\*/,/\*\)/,{contains:[`self`,i]}),e.HASH_COMMENT_MODE];return{name:`AppleScript`,aliases:[`osascript`],keywords:{keyword:`about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the|0 then third through thru timeout times to transaction try until where while whose with without`,literal:`AppleScript false linefeed return pi quote result space tab true`,built_in:`alias application boolean class constant date file integer list number real record string text activate beep count delay launch log offset read round run say summarize write character characters contents day frontmost id item length month name|0 paragraph paragraphs rest reverse running time version weekday word words year`},contains:[n,e.C_NUMBER_MODE,{className:`built_in`,begin:t.concat(/\b/,t.either(/clipboard info/,/the clipboard/,/info for/,/list (disks|folder)/,/mount volume/,/path to/,/(close|open for) access/,/(get|set) eof/,/current date/,/do shell script/,/get volume settings/,/random number/,/set volume/,/system attribute/,/system info/,/time to GMT/,/(load|run|store) script/,/scripting components/,/ASCII (character|number)/,/localized string/,/choose (application|color|file|file name|folder|from list|remote application|URL)/,/display (alert|dialog)/),/\b/)},{className:`built_in`,begin:/^\s*return\b/},{className:`literal`,begin:/\b(text item delimiters|current application|missing value)\b/},{className:`keyword`,begin:t.concat(/\b/,t.either(/apart from/,/aside from/,/instead of/,/out of/,/greater than/,/isn't|(doesn't|does not) (equal|come before|come after|contain)/,/(greater|less) than( or equal)?/,/(starts?|ends|begins?) with/,/contained by/,/comes (before|after)/,/a (ref|reference)/,/POSIX (file|path)/,/(date|time) string/,/quoted form/),/\b/)},{beginKeywords:`on`,illegal:/[${=;\n]/,contains:[e.UNDERSCORE_TITLE_MODE,r]},...a],illegal:/\/\/|->|=>|\[\[/}}t.exports=n})),v=o(((e,t)=>{function n(e){let t=e.regex,n=`[A-Za-z_][0-9A-Za-z_]*`,r={keyword:[`break`,`case`,`catch`,`continue`,`debugger`,`do`,`else`,`export`,`for`,`function`,`if`,`import`,`in`,`new`,`of`,`return`,`switch`,`try`,`var`,`void`,`while`],literal:[`BackSlash`,`DoubleQuote`,`ForwardSlash`,`Infinity`,`NaN`,`NewLine`,`PI`,`SingleQuote`,`Tab`,`TextFormatting`,`false`,`null`,`true`,`undefined`],built_in:`Abs.Acos.All.Angle.Any.Area.AreaGeodetic.Array.Asin.Atan.Atan2.Attachments.Average.Back.Bearing.Boolean.Buffer.BufferGeodetic.Ceil.Centroid.ChangeTimeZone.Clip.Concatenate.Console.Constrain.Contains.ConvertDirection.ConvexHull.Cos.Count.Crosses.Cut.Date|0.DateAdd.DateDiff.DateOnly.Day.Decode.DefaultValue.Densify.DensifyGeodetic.Dictionary.Difference.Disjoint.Distance.DistanceGeodetic.DistanceToCoordinate.Distinct.Domain.DomainCode.DomainName.EnvelopeIntersects.Equals.Erase.Exp.Expects.Extent.Feature.FeatureInFilter.FeatureSet.FeatureSetByAssociation.FeatureSetById.FeatureSetByName.FeatureSetByPortalItem.FeatureSetByRelationshipClass.FeatureSetByRelationshipName.Filter.FilterBySubtypeCode.Find.First|0.Floor.FromCharCode.FromCodePoint.FromJSON.Front.GdbVersion.Generalize.Geometry.GetEnvironment.GetFeatureSet.GetFeatureSetInfo.GetUser.GroupBy.Guid.HasKey.HasValue.Hash.Hour.IIf.ISOMonth.ISOWeek.ISOWeekday.ISOYear.Includes.IndexOf.Insert.Intersection.Intersects.IsEmpty.IsNan.IsSelfIntersecting.IsSimple.KnowledgeGraphByPortalItem.Left|0.Length.Length3D.LengthGeodetic.Log.Lower.Map.Max.Mean.MeasureToCoordinate.Mid.Millisecond.Min.Minute.Month.MultiPartToSinglePart.Multipoint.NearestCoordinate.NearestVertex.NextSequenceValue.None.Now.Number.Offset.OrderBy.Overlaps.Point.PointToCoordinate.Polygon.Polyline.Pop.Portal.Pow.Proper.Push.QueryGraph.Random.Reduce.Relate.Replace.Resize.Reverse.Right|0.RingIsClockwise.Rotate.Round.Schema.Second.SetGeometry.Simplify.Sin.Slice.Sort.Splice.Split.Sqrt.StandardizeFilename.StandardizeGuid.Stdev.SubtypeCode.SubtypeName.Subtypes.Sum.SymmetricDifference.Tan.Text.Time.TimeZone.TimeZoneOffset.Timestamp.ToCharCode.ToCodePoint.ToHex.ToLocal.ToUTC.Today.Top|0.Touches.TrackAccelerationAt.TrackAccelerationWindow.TrackCurrentAcceleration.TrackCurrentDistance.TrackCurrentSpeed.TrackCurrentTime.TrackDistanceAt.TrackDistanceWindow.TrackDuration.TrackFieldWindow.TrackGeometryWindow.TrackIndex.TrackSpeedAt.TrackSpeedWindow.TrackStartTime.TrackWindow.Trim.TypeOf.Union.Upper.UrlEncode.Variance.Week.Weekday.When|0.Within.Year|0`.split(`.`)},i={className:`symbol`,begin:`\\$`+t.either(...`aggregatedFeatures.analytic.config.datapoint.datastore.editcontext.feature.featureSet.feedfeature.fencefeature.fencenotificationtype.graph.join.layer.locationupdate.map.measure.measure.originalFeature.record.reference.rowindex.sourcedatastore.sourcefeature.sourcelayer.target.targetdatastore.targetfeature.targetlayer.userInput.value.variables.view`.split(`.`))},a={className:`number`,variants:[{begin:`\\b(0[bB][01]+)`},{begin:`\\b(0[oO][0-7]+)`},{begin:e.C_NUMBER_RE}],relevance:0},o={className:`subst`,begin:`\\$\\{`,end:`\\}`,keywords:r,contains:[]},s={className:`string`,begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,o]};o.contains=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,s,a,e.REGEXP_MODE];let c=o.contains.concat([e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]);return{name:`ArcGIS Arcade`,case_insensitive:!0,keywords:r,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,s,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a,{begin:/[{,]\s*/,relevance:0,contains:[{begin:n+`\\s*:`,returnBegin:!0,relevance:0,contains:[{className:`attr`,begin:n,relevance:0}]}]},{begin:`(`+e.RE_STARTERS_RE+`|\\b(return)\\b)\\s*`,keywords:`return`,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.REGEXP_MODE,{className:`function`,begin:`(\\(.*?\\)|`+n+`)\\s*=>`,returnBegin:!0,end:`\\s*=>`,contains:[{className:`params`,variants:[{begin:n},{begin:/\(\s*\)/},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:r,contains:c}]}]}],relevance:0},{beginKeywords:`function`,end:/\{/,excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{className:`title.function`,begin:n}),{className:`params`,begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:c}],illegal:/\[|%/},{begin:/\$[(.]/}],illegal:/#(?!!)/}}t.exports=n})),y=o(((e,t)=>{function n(e){let t=e.regex,n=e.COMMENT(`//`,`$`,{contains:[{begin:/\\\n/}]}),r=`decltype\\(auto\\)`,i=`[a-zA-Z_]\\w*::`,a=`(?!struct)(`+r+`|`+t.optional(i)+`[a-zA-Z_]\\w*`+t.optional(`<[^<>]+>`)+`)`,o={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})"/})]},c={className:`number`,variants:[{begin:`[+-]?(?:(?:[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?|\\.[0-9](?:'?[0-9])*)(?:[Ee][+-]?[0-9](?:'?[0-9])*)?|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*|0[Xx](?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)[Pp][+-]?[0-9](?:'?[0-9])*)(?:[Ff](?:16|32|64|128)?|(BF|bf)16|[Ll]|)`},{begin:`[+-]?\\b(?:0[Bb][01](?:'?[01])*|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*|0(?:'?[0-7])*|[1-9](?:'?[0-9])*)(?:[Uu](?:LL?|ll?)|[Uu][Zz]?|(?:LL?|ll?)[Uu]?|[Zz][Uu]|)`}],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:/<.*?>/},n,e.C_BLOCK_COMMENT_MODE]},u={className:`title`,begin:t.optional(i)+e.IDENT_RE,relevance:0},d=t.optional(i)+e.IDENT_RE+`\\s*\\(`,f=`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.nullptr.operator.or.or_eq.override.private.protected.public.reflexpr.register.reinterpret_cast|10.requires.return.sizeof.static_assert.static_cast|10.struct.switch.synchronized.template.this.thread_local.throw.transaction_safe.transaction_safe_dynamic.true.try.typedef.typeid.typename.union.using.virtual.volatile.while.xor.xor_eq`.split(`.`),p=[`bool`,`char`,`char16_t`,`char32_t`,`char8_t`,`double`,`float`,`int`,`long`,`short`,`void`,`wchar_t`,`unsigned`,`signed`,`const`,`static`],m=`any.auto_ptr.barrier.binary_semaphore.bitset.complex.condition_variable.condition_variable_any.counting_semaphore.deque.false_type.flat_map.flat_set.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_mutex.shared_ptr.stack.string_view.stringstream.timed_mutex.thread.true_type.tuple.unique_lock.unique_ptr.unordered_map.unordered_multimap.unordered_multiset.unordered_set.variant.vector.weak_ptr.wstring.wstring_view`.split(`.`),h=`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.malloc.memchr.memcmp.memcpy.memset.modf.move.pow.printf.putchar.puts.realloc.scanf.sin.sinh.snprintf.sprintf.sqrt.sscanf.std.stderr.stdin.stdout.strcat.strchr.strcmp.strcpy.strcspn.strlen.strncat.strncmp.strncpy.strpbrk.strrchr.strspn.strstr.swap.tan.tanh.terminate.to_underlying.tolower.toupper.vfprintf.visit.vprintf.vsprintf`.split(`.`),g={type:p,keyword:f,literal:[`NULL`,`false`,`nullopt`,`nullptr`,`true`],built_in:[`_Pragma`],_type_hints:m},_={className:`function.dispatch`,relevance:0,keywords:{_hint:h},begin:t.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,t.lookahead(/(<[^<>]+>|)\s*\(/))},v=[_,l,o,n,e.C_BLOCK_COMMENT_MODE,c,s],y={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:`new throw return else`,end:/;/}],keywords:g,contains:v.concat([{begin:/\(/,end:/\)/,keywords:g,contains:v.concat([`self`]),relevance:0}]),relevance:0},b={className:`function`,begin:`(`+a+`[\\*&\\s]+)+`+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:g,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:r,keywords:g,relevance:0},{begin:d,returnBegin:!0,contains:[u],relevance:0},{begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[s,c]},{relevance:0,match:/,/},{className:`params`,begin:/\(/,end:/\)/,keywords:g,relevance:0,contains:[n,e.C_BLOCK_COMMENT_MODE,s,c,o,{begin:/\(/,end:/\)/,keywords:g,relevance:0,contains:[`self`,n,e.C_BLOCK_COMMENT_MODE,s,c,o]}]},o,n,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(y,b,_,v,[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|flat_map|flat_set)\\s*<(?!<)`,end:`>`,keywords:g,contains:[`self`,o]},{begin:e.IDENT_RE+`::`,keywords:g},{match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],className:{1:`keyword`,3:`title.class`}}])}}function r(e){let t={type:[`boolean`,`byte`,`word`,`String`],built_in:`KeyboardController.MouseController.SoftwareSerial.EthernetServer.EthernetClient.LiquidCrystal.RobotControl.GSMVoiceCall.EthernetUDP.EsploraTFT.HttpClient.RobotMotor.WiFiClient.GSMScanner.FileSystem.Scheduler.GSMServer.YunClient.YunServer.IPAddress.GSMClient.GSMModem.Keyboard.Ethernet.Console.GSMBand.Esplora.Stepper.Process.WiFiUDP.GSM_SMS.Mailbox.USBHost.Firmata.PImage.Client.Server.GSMPIN.FileIO.Bridge.Serial.EEPROM.Stream.Mouse.Audio.Servo.File.Task.GPRS.WiFi.Wire.TFT.GSM.SPI.SD`.split(`.`),_hints:`setup.loop.runShellCommandAsynchronously.analogWriteResolution.retrieveCallingNumber.printFirmwareVersion.analogReadResolution.sendDigitalPortPair.noListenOnLocalhost.readJoystickButton.setFirmwareVersion.readJoystickSwitch.scrollDisplayRight.getVoiceCallStatus.scrollDisplayLeft.writeMicroseconds.delayMicroseconds.beginTransmission.getSignalStrength.runAsynchronously.getAsynchronously.listenOnLocalhost.getCurrentCarrier.readAccelerometer.messageAvailable.sendDigitalPorts.lineFollowConfig.countryNameWrite.runShellCommand.readStringUntil.rewindDirectory.readTemperature.setClockDivider.readLightSensor.endTransmission.analogReference.detachInterrupt.countryNameRead.attachInterrupt.encryptionType.readBytesUntil.robotNameWrite.readMicrophone.robotNameRead.cityNameWrite.userNameWrite.readJoystickY.readJoystickX.mouseReleased.openNextFile.scanNetworks.noInterrupts.digitalWrite.beginSpeaker.mousePressed.isActionDone.mouseDragged.displayLogos.noAutoscroll.addParameter.remoteNumber.getModifiers.keyboardRead.userNameRead.waitContinue.processInput.parseCommand.printVersion.readNetworks.writeMessage.blinkVersion.cityNameRead.readMessage.setDataMode.parsePacket.isListening.setBitOrder.beginPacket.isDirectory.motorsWrite.drawCompass.digitalRead.clearScreen.serialEvent.rightToLeft.setTextSize.leftToRight.requestFrom.keyReleased.compassRead.analogWrite.interrupts.WiFiServer.disconnect.playMelody.parseFloat.autoscroll.getPINUsed.setPINUsed.setTimeout.sendAnalog.readSlider.analogRead.beginWrite.createChar.motorsStop.keyPressed.tempoWrite.readButton.subnetMask.debugPrint.macAddress.writeGreen.randomSeed.attachGPRS.readString.sendString.remotePort.releaseAll.mouseMoved.background.getXChange.getYChange.answerCall.getResult.voiceCall.endPacket.constrain.getSocket.writeJSON.getButton.available.connected.findUntil.readBytes.exitValue.readGreen.writeBlue.startLoop.IPAddress.isPressed.sendSysex.pauseMode.gatewayIP.setCursor.getOemKey.tuneWrite.noDisplay.loadImage.switchPIN.onRequest.onReceive.changePIN.playFile.noBuffer.parseInt.overflow.checkPIN.knobRead.beginTFT.bitClear.updateIR.bitWrite.position.writeRGB.highByte.writeRed.setSpeed.readBlue.noStroke.remoteIP.transfer.shutdown.hangCall.beginSMS.endWrite.attached.maintain.noCursor.checkReg.checkPUK.shiftOut.isValid.shiftIn.pulseIn.connect.println.localIP.pinMode.getIMEI.display.noBlink.process.getBand.running.beginSD.drawBMP.lowByte.setBand.release.bitRead.prepare.pointTo.readRed.setMode.noFill.remove.listen.stroke.detach.attach.noTone.exists.buffer.height.bitSet.circle.config.cursor.random.IRread.setDNS.endSMS.getKey.micros.millis.begin.print.write.ready.flush.width.isPIN.blink.clear.press.mkdir.rmdir.close.point.yield.image.BSSID.click.delay.read.text.move.peek.beep.rect.line.open.seek.fill.size.turn.stop.home.find.step.tone.sqrt.RSSI.SSID.end.bit.tan.cos.sin.pow.map.abs.max.min.get.run.put`.split(`.`),literal:[`DIGITAL_MESSAGE`,`FIRMATA_STRING`,`ANALOG_MESSAGE`,`REPORT_DIGITAL`,`REPORT_ANALOG`,`INPUT_PULLUP`,`SET_PIN_MODE`,`INTERNAL2V56`,`SYSTEM_RESET`,`LED_BUILTIN`,`INTERNAL1V1`,`SYSEX_START`,`INTERNAL`,`EXTERNAL`,`DEFAULT`,`OUTPUT`,`INPUT`,`HIGH`,`LOW`]},r=n(e),i=r.keywords;return i.type=[...i.type,...t.type],i.literal=[...i.literal,...t.literal],i.built_in=[...i.built_in,...t.built_in],i._hints=t._hints,r.name=`Arduino`,r.aliases=[`ino`],r.supersetOf=`cpp`,r}t.exports=r})),b=o(((e,t)=>{function n(e){let t={variants:[e.COMMENT(`^[ \\t]*(?=#)`,`$`,{relevance:0,excludeBegin:!0}),e.COMMENT(`[;@]`,`$`,{relevance:0}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]};return{name:`ARM Assembly`,case_insensitive:!0,aliases:[`arm`],keywords:{$pattern:`\\.?`+e.IDENT_RE,meta:`.2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND `,built_in:`r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 w0 w1 w2 w3 w4 w5 w6 w7 w8 w9 w10 w11 w12 w13 w14 w15 w16 w17 w18 w19 w20 w21 w22 w23 w24 w25 w26 w27 w28 w29 w30 x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @`},contains:[{className:`keyword`,begin:`\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)`},t,e.QUOTE_STRING_MODE,{className:`string`,begin:`'`,end:`[^\\\\]'`,relevance:0},{className:`title`,begin:`\\|`,end:`\\|`,illegal:`\\n`,relevance:0},{className:`number`,variants:[{begin:`[#$=]?0x[0-9a-f]+`},{begin:`[#$=]?0b[01]+`},{begin:`[#$=]\\d+`},{begin:`\\b\\d+`}],relevance:0},{className:`symbol`,variants:[{begin:`^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:`},{begin:`^[a-z_\\.\\$][a-z0-9_\\.\\$]+`},{begin:`[=#]\\w+`}],relevance:0}]}}t.exports=n})),x=o(((e,t)=>{function n(e){let t=e.regex,n=t.concat(/[\p{L}_]/u,t.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),r=/[\p{L}0-9._:-]+/u,i={className:`symbol`,begin:/&[a-z]+;|[0-9]+;|[a-f0-9]+;/},a={begin:/\s/,contains:[{className:`keyword`,begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},o=e.inherit(a,{begin:/\(/,end:/\)/}),s=e.inherit(e.APOS_STRING_MODE,{className:`string`}),c=e.inherit(e.QUOTE_STRING_MODE,{className:`string`}),l={endsWithParent:!0,illegal:/,relevance:0,contains:[{className:`attr`,begin:r,relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:`string`,endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[i]},{begin:/'/,end:/'/,contains:[i]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:`HTML, XML`,aliases:[`html`,`xhtml`,`rss`,`atom`,`xjb`,`xsd`,`xsl`,`plist`,`wsf`,`svg`],case_insensitive:!0,unicodeRegex:!0,contains:[{className:`meta`,begin://,relevance:10,contains:[a,c,s,o,{begin:/\[/,end:/\]/,contains:[{className:`meta`,begin://,contains:[a,o,c,s]}]}]},e.COMMENT(//,{relevance:10}),{begin://,relevance:10},i,{className:`meta`,end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[c]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:`tag`,begin:/
+
+
+
+
+