diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f38fae7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+_site
+.sass-cache
+.jekyll-metadata
+*.DS_Store
diff --git a/404.html b/404.html
new file mode 100644
index 0000000..76c6662
--- /dev/null
+++ b/404.html
@@ -0,0 +1,15 @@
+---
+layout: page
+heading: 404 Not found…
+title:
+
+---
+
+
+
+ Not Found :-(
+ The requested page could not be found.
+
+
+
+
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..d7ad497
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,30 @@
+source "https://rubygems.org"
+
+# Hello! This is where you manage which Jekyll version is used to run.
+# When you want to use a different version, change it below, save the
+# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
+#
+# bundle exec jekyll serve
+#
+# This will help ensure the proper Jekyll version is running.
+# Happy Jekylling!
+# gem "jekyll", "~> 3.7.3"
+
+# This is the default theme for new Jekyll sites. You may change this to anything you like.
+
+# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
+# uncomment the line below. To upgrade, run `bundle update github-pages`.
+gem "github-pages", group: :jekyll_plugins
+
+# If you have any plugins, put them here!
+group :jekyll_plugins do
+ gem "jekyll-seo-tag", "~> 2.1"
+ gem "jekyll-feed", "~> 0.9"
+end
+
+# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
+gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby]
+
+# Performance-booster for watching directories on Windows
+gem "wdm", "~> 0.1.0" if Gem.win_platform?
+
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 0000000..f109d02
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,251 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ activesupport (4.2.10)
+ i18n (~> 0.7)
+ minitest (~> 5.1)
+ thread_safe (~> 0.3, >= 0.3.4)
+ tzinfo (~> 1.1)
+ addressable (2.5.2)
+ public_suffix (>= 2.0.2, < 4.0)
+ coffee-script (2.4.1)
+ coffee-script-source
+ execjs
+ coffee-script-source (1.11.1)
+ colorator (1.1.0)
+ commonmarker (0.17.13)
+ ruby-enum (~> 0.5)
+ concurrent-ruby (1.0.5)
+ dnsruby (1.61.2)
+ addressable (~> 2.5)
+ em-websocket (0.5.1)
+ eventmachine (>= 0.12.9)
+ http_parser.rb (~> 0.6.0)
+ ethon (0.11.0)
+ ffi (>= 1.3.0)
+ eventmachine (1.2.7)
+ execjs (2.7.0)
+ faraday (0.15.4)
+ multipart-post (>= 1.2, < 3)
+ ffi (1.9.25)
+ forwardable-extended (2.6.0)
+ gemoji (3.0.0)
+ github-pages (190)
+ activesupport (= 4.2.10)
+ github-pages-health-check (= 1.8.1)
+ jekyll (= 3.7.3)
+ jekyll-avatar (= 0.6.0)
+ jekyll-coffeescript (= 1.1.1)
+ jekyll-commonmark-ghpages (= 0.1.5)
+ jekyll-default-layout (= 0.1.4)
+ jekyll-feed (= 0.10.0)
+ jekyll-gist (= 1.5.0)
+ jekyll-github-metadata (= 2.9.4)
+ jekyll-mentions (= 1.4.1)
+ jekyll-optional-front-matter (= 0.3.0)
+ jekyll-paginate (= 1.1.0)
+ jekyll-readme-index (= 0.2.0)
+ jekyll-redirect-from (= 0.14.0)
+ jekyll-relative-links (= 0.5.3)
+ jekyll-remote-theme (= 0.3.1)
+ jekyll-sass-converter (= 1.5.2)
+ jekyll-seo-tag (= 2.5.0)
+ jekyll-sitemap (= 1.2.0)
+ jekyll-swiss (= 0.4.0)
+ jekyll-theme-architect (= 0.1.1)
+ jekyll-theme-cayman (= 0.1.1)
+ jekyll-theme-dinky (= 0.1.1)
+ jekyll-theme-hacker (= 0.1.1)
+ jekyll-theme-leap-day (= 0.1.1)
+ jekyll-theme-merlot (= 0.1.1)
+ jekyll-theme-midnight (= 0.1.1)
+ jekyll-theme-minimal (= 0.1.1)
+ jekyll-theme-modernist (= 0.1.1)
+ jekyll-theme-primer (= 0.5.3)
+ jekyll-theme-slate (= 0.1.1)
+ jekyll-theme-tactile (= 0.1.1)
+ jekyll-theme-time-machine (= 0.1.1)
+ jekyll-titles-from-headings (= 0.5.1)
+ jemoji (= 0.10.1)
+ kramdown (= 1.16.2)
+ liquid (= 4.0.0)
+ listen (= 3.1.5)
+ mercenary (~> 0.3)
+ minima (= 2.5.0)
+ nokogiri (>= 1.8.2, < 2.0)
+ rouge (= 2.2.1)
+ terminal-table (~> 1.4)
+ github-pages-health-check (1.8.1)
+ addressable (~> 2.3)
+ dnsruby (~> 1.60)
+ octokit (~> 4.0)
+ public_suffix (~> 2.0)
+ typhoeus (~> 1.3)
+ html-pipeline (2.10.0)
+ activesupport (>= 2)
+ nokogiri (>= 1.4)
+ http_parser.rb (0.6.0)
+ i18n (0.9.5)
+ concurrent-ruby (~> 1.0)
+ jekyll (3.7.3)
+ addressable (~> 2.4)
+ colorator (~> 1.0)
+ em-websocket (~> 0.5)
+ i18n (~> 0.7)
+ jekyll-sass-converter (~> 1.0)
+ jekyll-watch (~> 2.0)
+ kramdown (~> 1.14)
+ liquid (~> 4.0)
+ mercenary (~> 0.3.3)
+ pathutil (~> 0.9)
+ rouge (>= 1.7, < 4)
+ safe_yaml (~> 1.0)
+ jekyll-avatar (0.6.0)
+ jekyll (~> 3.0)
+ jekyll-coffeescript (1.1.1)
+ coffee-script (~> 2.2)
+ coffee-script-source (~> 1.11.1)
+ jekyll-commonmark (1.2.0)
+ commonmarker (~> 0.14)
+ jekyll (>= 3.0, < 4.0)
+ jekyll-commonmark-ghpages (0.1.5)
+ commonmarker (~> 0.17.6)
+ jekyll-commonmark (~> 1)
+ rouge (~> 2)
+ jekyll-default-layout (0.1.4)
+ jekyll (~> 3.0)
+ jekyll-feed (0.10.0)
+ jekyll (~> 3.3)
+ jekyll-gist (1.5.0)
+ octokit (~> 4.2)
+ jekyll-github-metadata (2.9.4)
+ jekyll (~> 3.1)
+ octokit (~> 4.0, != 4.4.0)
+ jekyll-mentions (1.4.1)
+ html-pipeline (~> 2.3)
+ jekyll (~> 3.0)
+ jekyll-optional-front-matter (0.3.0)
+ jekyll (~> 3.0)
+ jekyll-paginate (1.1.0)
+ jekyll-readme-index (0.2.0)
+ jekyll (~> 3.0)
+ jekyll-redirect-from (0.14.0)
+ jekyll (~> 3.3)
+ jekyll-relative-links (0.5.3)
+ jekyll (~> 3.3)
+ jekyll-remote-theme (0.3.1)
+ jekyll (~> 3.5)
+ rubyzip (>= 1.2.1, < 3.0)
+ jekyll-sass-converter (1.5.2)
+ sass (~> 3.4)
+ jekyll-seo-tag (2.5.0)
+ jekyll (~> 3.3)
+ jekyll-sitemap (1.2.0)
+ jekyll (~> 3.3)
+ jekyll-swiss (0.4.0)
+ jekyll-theme-architect (0.1.1)
+ jekyll (~> 3.5)
+ jekyll-seo-tag (~> 2.0)
+ jekyll-theme-cayman (0.1.1)
+ jekyll (~> 3.5)
+ jekyll-seo-tag (~> 2.0)
+ jekyll-theme-dinky (0.1.1)
+ jekyll (~> 3.5)
+ jekyll-seo-tag (~> 2.0)
+ jekyll-theme-hacker (0.1.1)
+ jekyll (~> 3.5)
+ jekyll-seo-tag (~> 2.0)
+ jekyll-theme-leap-day (0.1.1)
+ jekyll (~> 3.5)
+ jekyll-seo-tag (~> 2.0)
+ jekyll-theme-merlot (0.1.1)
+ jekyll (~> 3.5)
+ jekyll-seo-tag (~> 2.0)
+ jekyll-theme-midnight (0.1.1)
+ jekyll (~> 3.5)
+ jekyll-seo-tag (~> 2.0)
+ jekyll-theme-minimal (0.1.1)
+ jekyll (~> 3.5)
+ jekyll-seo-tag (~> 2.0)
+ jekyll-theme-modernist (0.1.1)
+ jekyll (~> 3.5)
+ jekyll-seo-tag (~> 2.0)
+ jekyll-theme-primer (0.5.3)
+ jekyll (~> 3.5)
+ jekyll-github-metadata (~> 2.9)
+ jekyll-seo-tag (~> 2.0)
+ jekyll-theme-slate (0.1.1)
+ jekyll (~> 3.5)
+ jekyll-seo-tag (~> 2.0)
+ jekyll-theme-tactile (0.1.1)
+ jekyll (~> 3.5)
+ jekyll-seo-tag (~> 2.0)
+ jekyll-theme-time-machine (0.1.1)
+ jekyll (~> 3.5)
+ jekyll-seo-tag (~> 2.0)
+ jekyll-titles-from-headings (0.5.1)
+ jekyll (~> 3.3)
+ jekyll-watch (2.0.0)
+ listen (~> 3.0)
+ jemoji (0.10.1)
+ gemoji (~> 3.0)
+ html-pipeline (~> 2.2)
+ jekyll (~> 3.0)
+ kramdown (1.16.2)
+ liquid (4.0.0)
+ listen (3.1.5)
+ rb-fsevent (~> 0.9, >= 0.9.4)
+ rb-inotify (~> 0.9, >= 0.9.7)
+ ruby_dep (~> 1.2)
+ mercenary (0.3.6)
+ mini_portile2 (2.4.0)
+ minima (2.5.0)
+ jekyll (~> 3.5)
+ jekyll-feed (~> 0.9)
+ jekyll-seo-tag (~> 2.1)
+ minitest (5.11.3)
+ multipart-post (2.0.0)
+ nokogiri (1.10.0)
+ mini_portile2 (~> 2.4.0)
+ octokit (4.13.0)
+ sawyer (~> 0.8.0, >= 0.5.3)
+ pathutil (0.16.1)
+ forwardable-extended (~> 2.6)
+ public_suffix (2.0.5)
+ rb-fsevent (0.10.3)
+ rb-inotify (0.9.10)
+ ffi (>= 0.5.0, < 2)
+ rouge (2.2.1)
+ ruby-enum (0.7.2)
+ i18n
+ ruby_dep (1.5.0)
+ rubyzip (1.2.2)
+ safe_yaml (1.0.4)
+ sass (3.5.6)
+ sass-listen (~> 4.0.0)
+ sass-listen (4.0.0)
+ rb-fsevent (~> 0.9, >= 0.9.4)
+ rb-inotify (~> 0.9, >= 0.9.7)
+ sawyer (0.8.1)
+ addressable (>= 2.3.5, < 2.6)
+ faraday (~> 0.8, < 1.0)
+ terminal-table (1.8.0)
+ unicode-display_width (~> 1.1, >= 1.1.1)
+ thread_safe (0.3.6)
+ typhoeus (1.3.1)
+ ethon (>= 0.9.0)
+ tzinfo (1.2.5)
+ thread_safe (~> 0.1)
+ unicode-display_width (1.4.1)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ github-pages
+ jekyll-feed (~> 0.9)
+ jekyll-seo-tag (~> 2.1)
+ tzinfo-data
+
+BUNDLED WITH
+ 1.16.3
diff --git a/_config.yml b/_config.yml
index c419263..8fdcf9d 100644
--- a/_config.yml
+++ b/_config.yml
@@ -1 +1,44 @@
-theme: jekyll-theme-cayman
\ No newline at end of file
+# Welcome to Jekyll!
+#
+# This config file is meant for settings that affect your whole blog, values
+# which you are expected to set up once and rarely edit after that. If you find
+# yourself editing this file very often, consider using Jekyll's data files
+# feature for the data you need to update frequently.
+#
+# For technical reasons, this file is *NOT* reloaded automatically when you use
+# 'bundle exec jekyll serve'. If you change this file, please restart the server process.
+
+# Site settings
+# These are used to personalize your new site. If you look in the HTML files,
+# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on.
+# You can create any custom variable you would like, and they will be accessible
+# in the templates via {{ site.myvariable }}.
+title: 3scale API Management
+3scale_docs_url: https://access.redhat.com/documentation/en-us/red_hat_3scale/
+3scale_product_version: 2.3 # used for deep linking to the correct docs on red hat.
+email: your-email@example.com
+description: >- # this means to ignore newlines until "baseurl:"
+ Share, secure, distribute, control, and monetize your APIs.
+baseurl: "" # the subpath of your site, e.g. /blog
+url: "" # the base hostname & protocol for your site, e.g. http://example.com
+twitter_username: 3scale
+github_username: 3scale
+#permalink: pretty
+
+# Build settings
+markdown: kramdown
+plugins:
+ - jekyll-feed
+ - jekyll-seo-tag
+
+# Exclude from processing.
+# The following items will not be processed, by default. Create a custom list
+# to override the default setting.
+# exclude:
+# - Gemfile
+# - Gemfile.lock
+# - node_modules
+# - vendor/bundle/
+# - vendor/cache/
+# - vendor/gems/
+# - vendor/ruby/
diff --git a/_includes/disqus_comments.html b/_includes/disqus_comments.html
new file mode 100644
index 0000000..d9400f2
--- /dev/null
+++ b/_includes/disqus_comments.html
@@ -0,0 +1,20 @@
+{%- if page.comments != false and jekyll.environment == "production" -%}
+
+
+
+ Please enable JavaScript to view the comments powered by Disqus.
+{%- endif -%}
diff --git a/_includes/footer.html b/_includes/footer.html
new file mode 100644
index 0000000..db72885
--- /dev/null
+++ b/_includes/footer.html
@@ -0,0 +1,35 @@
+
diff --git a/_includes/google-analytics.html b/_includes/google-analytics.html
new file mode 100644
index 0000000..e9afb20
--- /dev/null
+++ b/_includes/google-analytics.html
@@ -0,0 +1,12 @@
+
+
diff --git a/_includes/head.html b/_includes/head.html
new file mode 100644
index 0000000..dc6596d
--- /dev/null
+++ b/_includes/head.html
@@ -0,0 +1,14 @@
+
+
+
+
+ {%- seo -%}
+
+
+
+
+ {%- feed_meta -%}
+ {%- if jekyll.environment == 'production' and site.google_analytics -%}
+ {%- include google-analytics.html -%}
+ {%- endif -%}
+
diff --git a/_includes/header.html b/_includes/header.html
new file mode 100644
index 0000000..6a21e16
--- /dev/null
+++ b/_includes/header.html
@@ -0,0 +1,23 @@
+
diff --git a/_includes/icon-github.html b/_includes/icon-github.html
new file mode 100644
index 0000000..e501a16
--- /dev/null
+++ b/_includes/icon-github.html
@@ -0,0 +1 @@
+{% include icon-github.svg %} {{ include.username }}
diff --git a/_includes/icon-github.svg b/_includes/icon-github.svg
new file mode 100644
index 0000000..e6c5f6d
--- /dev/null
+++ b/_includes/icon-github.svg
@@ -0,0 +1 @@
+
diff --git a/_includes/icon-twitter.html b/_includes/icon-twitter.html
new file mode 100644
index 0000000..e623dbd
--- /dev/null
+++ b/_includes/icon-twitter.html
@@ -0,0 +1 @@
+{{ include.username }}
diff --git a/_includes/icon-twitter.svg b/_includes/icon-twitter.svg
new file mode 100644
index 0000000..efc0ecf
--- /dev/null
+++ b/_includes/icon-twitter.svg
@@ -0,0 +1 @@
+
diff --git a/_includes/social.html b/_includes/social.html
new file mode 100644
index 0000000..44046b8
--- /dev/null
+++ b/_includes/social.html
@@ -0,0 +1,14 @@
+
diff --git a/_layouts/default.html b/_layouts/default.html
new file mode 100644
index 0000000..d31a770
--- /dev/null
+++ b/_layouts/default.html
@@ -0,0 +1,20 @@
+
+
+
+ {%- include head.html -%}
+
+
+
+ {%- include header.html -%}
+
+
+
+ {{ content }}
+
+
+
+
+
+
+
+
diff --git a/_layouts/home.html b/_layouts/home.html
new file mode 100644
index 0000000..0eaef02
--- /dev/null
+++ b/_layouts/home.html
@@ -0,0 +1,12 @@
+---
+layout: default
+---
+
+
+
+
{{ page.heading }}
+
+
+
+
+
diff --git a/_layouts/page.html b/_layouts/page.html
new file mode 100644
index 0000000..3ea45c6
--- /dev/null
+++ b/_layouts/page.html
@@ -0,0 +1,11 @@
+---
+layout: default
+---
+
+ {{ page.heading }}
+
+
+ {{ content }}
+
+
+
diff --git a/_layouts/post.html b/_layouts/post.html
new file mode 100644
index 0000000..fe33d2a
--- /dev/null
+++ b/_layouts/post.html
@@ -0,0 +1,28 @@
+---
+layout: default
+---
+
+
+
+
+
+
+ {{ content }}
+
+
+ {%- if site.disqus.shortname -%}
+ {%- include disqus_comments.html -%}
+ {%- endif -%}
+
+
+
diff --git a/_posts/2018-06-17-adding-opentracing-support-to-apicast.md b/_posts/2018-06-17-adding-opentracing-support-to-apicast.md
new file mode 100644
index 0000000..17c1f81
--- /dev/null
+++ b/_posts/2018-06-17-adding-opentracing-support-to-apicast.md
@@ -0,0 +1,278 @@
+---
+layout: post
+title: "Adding OpenTracing support to APIcast"
+date: 2018-09-14 16:31:33 +0200
+categories: istio mesh
+---
+
+
+Going from this:
+
+```
+[17/May/2018:14:19:02 +0000] someclient.production.gw.apicast.io:8080 10.1.13.3:36054 "GET /?user_key=XXXXXXXXXXXXXXXXXX HTTP/1.1" 200 747 (0.100) 0.1
+[17/May/2018:14:19:12 +0000] someclient.production.gw.apicast.io:8080 10.1.5.3:33492 "GET /?user_key=XXXXXXXXXXXXXXXXXX HTTP/1.1" 200 746 (0.000) 0
+[17/May/2018:14:19:27 +0000] someclient.production.gw.apicast.io:8080 10.1.13.3:36874 "GET /?user_key=XXXXXXXXXXXXXXXXXX HTTP/1.1" 200 747 (0.100) 0.1
+[17/May/2018:14:19:37 +0000] someclient.production.gw.apicast.io:8080 10.1.5.3:34364 "GET /?user_key=XXXXXXXXXXXXXXXXXX HTTP/1.1" 200 746 (0.000) 0
+[17/May/2018:14:20:17 +0000] someclient.production.gw.apicast.io:8080 10.1.13.3:38518 "GET /?user_key=XXXXXXXXXXXXXXXXXX HTTP/1.1" 200 747 (0.100) 0
+[17/May/2018:14:20:32 +0000] someclient.production.gw.apicast.io:8080 10.1.5.3:36206 "GET /?user_key=XXXXXXXXXXXXXXXXXX HTTP/1.1" 200 746 (0.000) 0
+[17/May/2018:14:20:37 +0000] someclient.production.gw.apicast.io:8080 10.1.13.3:39170 "GET /?user_key=XXXXXXXXXXXXXXXXXX HTTP/1.1" 200 747 (0.100) 0.1
+[17/May/2018:14:20:47 +0000] someclient.production.gw.apicast.io:8080 10.1.5.3:36686 "GET /?user_key=XXXXXXXXXXXXXXXXXX HTTP/1.1" 200 746 (0.100) 0.1
+[17/May/2018:14:21:02 +0000] someclient.production.gw.apicast.io:8080 10.1.5.3:37192 "GET /?user_key=XXXXXXXXXXXXXXXXXX HTTP/1.1" 200 746 (0.100) 0.1
+[17/May/2018:14:21:22 +0000] someclient.production.gw.apicast.io:8080 10.1.5.3:37826 "GET /?user_key=XXXXXXXXXXXXXXXXXX HTTP/1.1" 200 746 (0.100) 0.1
+
+```
+
+To:
+
+
+
+Let's start by explaining what APIcast, OpenTracing and Jaeger are, and how we improved Observability of our user systems by embracing them.
+
+TL;DR: If you know what APIcast, Jaeger & OpenTracing are, you should jump to the last section :)
+
+### APIcast
+APIcast () is an Opensource API Gateway with it's main focus on high performance and extensibility, is part of the Redhat 3scale API Management solution, and is used by hundreds of companies around the world to expose their APIs in a secure and controlled way.
+
+It's based on Openresty, which is a full-fledged web platform that integrates the standard Nginx core, LuaJIT and Lua Libraries with 3rd-party Nginx modules. So we have the performance and robustness of nginx with an easy way to extend/change it's functionallity by using LUA.
+
+### Improving Observability
+
+APIcast is being deployed in multiple scenarios, but more and more, our users are deploying APIcast as the API Gateway of big and complex microservices deployments.
+
+As you can imagine, we are talking about hundreds of microservices, interacting with each other, and each external requests ends up creating several requests between services. This raises new challenges, and one of them is: "Observability"
+
+* Why this request was so slow?
+* Which service is creating those latency peaks?
+* Which services are interacting when a user hits this endpoint?
+* Why the request failed?
+* Who initiated this request?
+* ...
+
+Right now, answering those questions is slow and complex, as the users start debuging via logs and trying to correlate everything, so we need to we need to start looking at how microservices are monitored, and distributed tracing shows up as the pattern that help us to get insight on what is going on inside the system.
+
+What is required to add distributed tracing to our microservice deployment?
+
+* Each external requests should have a unique request ID attached, usually via a HTTP header
+* Each service should forward the request ID to other services
+* Each service should output the requets ID in the logs
+* Each service should record additional information, like start and end time of the request.
+* Logs will need to be aggregated somewhere, and provide a way to parse via HTTP request ID.
+
+For APIcast, that is simple, attach a unique ID as a HTTP Header and we are done...
+
+But the user will need to define a log format across all the services, what parameters to be stored in the log, the http header to use, how to capture the start/end time of each requests...correlate them, check how to do that in third party applications, try to modify those...
+
+
+So we ask ourselves, *Shouldn't exists a "standard" way of doing this?*
+
+And that's where OpenTracing comes into scene.
+
+### OpenTracing
+
+OpenTracing () offers consistent, vendor-neutral APIs, Opensource libraries and documentation for developers to instrument and add different tracing implementations into their applications.
+
+Currently the OpenTracing project provides libraries for the following languages:
+
+* Go
+* Python
+* Javascript
+* Java
+* C#
+* Objective-C
+* C++
+* Ruby
+* PHP
+
+And there's a huge community pushing new contributions, check: .
+
+Once you have instrumented your application by adding the OpenTracing libraries, you will need to choose the tracing implementation, those are the supported one:
+
+* Jaeger
+* Appdash
+* LightStep
+* Hawkular
+* Instana
+* Apache SkyWalking
+* inspectIT
+* stagemonitor
+* Datadog
+
+We decided to go with Jaeger, as it is part of the CNF, has Openshift ready deployments , and Red Hat is contributing to it.
+
+
+### Tracer: Jaeger
+
+Jaeger is a distributed tracing system developed by Uber Technologies, inspired by Dapper and Openzipkin. It supports multiple storage backends, is OpenTracing native and includes a modern web UI and it's designed for performance.
+
+
+
+As you can see in the diagram, the main components are:
+
+* Jaeger-client: The jaeger library that creates the spans.
+* Jaeger-agent: Reports traces from the jaeger-client to jaeger-collector.
+* Jaeger-collector: Centralizes traces from jaeger-agents and saves them into a storage backend.
+* Jaeger-query: Retrieves traces from a datastore
+* Jaeger-ui: Jaeger UI, uses jaeger-query to get retrieve traces.
+
+Jaeger supports `Adaptative sampling`, which means that we can tune how many traces are sampled by choosing the proper `sampler`:
+
+* Constant: All traces.
+* Probabilistic: can be adjusted from 0% to 100%
+* Rate Limiting: How many traces per second, for ex: 2.0 (only 2 traces per second.)
+* Remote: Checks with the jaeger agent which sampler to use for this service.
+
+If you want to know more about Jaeger, visit:
+
+### Enabling OpenTracing with Jaeger in APIcast
+
+We packaged all the OpenTracing libraries, and the Jaeger Tracer library in the base container image of APIcast, [s2i-openresty](https://github.com/3scale/s2i-openresty) this image is ["source-to-image"](https://github.com/openshift/source-to-image) enabled, so you can use it as the base of your own projects.
+
+We will use [OpenShift](https://www.openshift.com), and the container image of APIcast (), so we assume you have APIcast deployed on top of Openshift and your 3scale account created, if that's not the case, there's an amazing guide to get you up & running in no time here: [Using 3scale API Gateway on Red Hat OpenShift](https://github.com/3scale/apicast/blob/master/doc/openshift-guide.md)
+
+APIcast OpenTracing support is enabled/disabled using ENV vars:
+
+* OPENTRACING_TRACER: Which Tracer implementation to use, right now, only `Jaeger` is available.
+
+* OPENTRACING_CONFIG: Each tracer has a default configuration file, you can see an example here: [jaeger.example.json](https://github.com/3scale/apicast/blob/master/gateway/conf.d/opentracing/jaeger.example.json)
+
+* OPENTRACING_HEADER_FORWARD: By default, uses `uber-trace-id`, if your OpenTracing has a different configuration, you will need to change this value, if not, ignore it.
+
+In the first place let's deploy the Jager All-In-One template, this is not really meant for production environments, but for demo purposes it will be enough.
+
+
+* Install the Jaeger all-in-one in the current namespace:
+
+```
+oc process -f https://raw.githubusercontent.com/jaegertracing/jaeger-openshift/master/all-in-one/jaeger-all-in-one-template.yml | oc create -f -
+```
+
+For more info related to deploying jaeger in a production environment:
+
+* Access the Jaeger-UI:
+
+```
+> oc get route
+
+NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
+apicast apicast.127.0.0.1.nip.io apicast proxy edge None
+jaeger-query jaeger-query-myproject.127.0.0.1.nip.io jaeger-query query-http edge/Allow None
+```
+
+In my case, the url is https://jaeger-query-myproject.127.0.0.1.nip.io
+
+You should be greeted by this menacing looking gopher:
+
+
+
+* Now, let's create our own Jaeger configuration file:
+
+```json
+cat <jaeger_config.json
+ {
+ "service_name": "apicast",
+ "disabled": false,
+ "sampler": {
+ "type": "const",
+ "param": 1
+ },
+ "reporter": {
+ "queueSize": 100,
+ "bufferFlushInterval": 10,
+ "logSpans": false,
+ "localAgentHostPort": "jaeger-agent:6831"
+ },
+ "headers": {
+ "jaegerDebugHeader": "debug-id",
+ "jaegerBaggageHeader": "baggage",
+ "TraceContextHeaderName": "uber-trace-id",
+ "traceBaggageHeaderPrefix": "testctx-"
+ },
+ "baggage_restrictions": {
+ "denyBaggageOnInitializationFailure": false,
+ "hostPort": "127.0.0.1:5778",
+ "refreshInterval": 60
+ }
+ }
+EOF
+```
+This creates a new file: `jaeger_config.json`
+
+* Let's review the important bits:
+
+Sampler configuration:
+
+```json
+"sampler": {
+ "type": "const",
+ "param": 1
+}
+```
+
+This defines the sampler as [const]ant, with a param of "1", the means, it will sample all the requests.
+
+Reporter:
+
+```json
+"reporter": {
+ "queueSize": 100,
+ "bufferFlushInterval": 10,
+ "logSpans": false,
+ "localAgentHostPort": "jaeger-agent:6831"
+}
+```
+
+Max queue of 100 requests and flush interval of 10s, we are not outputting the spans to the log, and the agent host is expected to be running at "jaeger-agent:6831".
+
+!! You will need to tune those values if your service is doing more than 100 requests in less than 10s, either increase the `queueSize`, or decrease the `bufferFlushInterval`.
+
+Headers:
+
+```json
+"headers": {
+ "jaegerDebugHeader": "debug-id",
+ "jaegerBaggageHeader": "baggage",
+ "TraceContextHeaderName": "uber-trace-id",
+ "traceBaggageHeaderPrefix": "testctx-"
+}
+```
+
+The most important one for now, is the `TraceContextHeaderName`, we are going to use the default value of `uber-trace-id`. This is the HTTP header we need to forward in all our services to propagate the span information and be able to correlate them.
+
+* Let's create a ConfigMap from our jaeger configuration so we can mount it inside APIcast:
+
+```
+oc create configmap jaeger-config --from-file=jaeger.json
+```
+
+* Mount the ConfigMap into APIcast.
+
+```
+oc volume dc/apicast --add -m /tmp/jaeger/ --configmap-name jaeger-config
+```
+
+This will trigger a redeployment of APIcast, now all the PODs will have our new configuration, available at `/tmp/jaeger/jaeger_config.json`.
+
+* Let's enable OpenTracing and Jaeger with our custom configuration.
+
+```
+oc env deploymentConfig/apicast OPENTRACING_TRACER=jaeger OPENTRACING_CONFIG=/tmp/jaeger/jaeger_config.json
+```
+
+This will trigger the redeployment of APIcast, and we should go to our jaeger-UI to see if it's populating with APIcast data.
+
+
+
+
+
+
+
+### Current limitations
+
+As you know, Openresty is Nginx + luaJIT, and right now, we only get OpenTracing information for the "Nginx" part of it, there aren't any OpenTracing libraries for lua.
+
+We are working on being able to use the OpenTracing C++ libraries from LUA, so we can create spans directly from it, and gain even more visibility into APIcast internals. For example, this could help debug if that custom policy you just installed is making things slowers.
+
+
+### We are Hiring!
+
+If you are interested in this kind of projects, we are hiring! :)
diff --git a/_posts/2018-09-14-api-management-and-service-mesh.md b/_posts/2018-09-14-api-management-and-service-mesh.md
new file mode 100644
index 0000000..3e5531d
--- /dev/null
+++ b/_posts/2018-09-14-api-management-and-service-mesh.md
@@ -0,0 +1,36 @@
+---
+layout: post
+title: "API Management and Service Mesh"
+date: 2018-09-14 16:31:33 +0200
+categories: istio mesh
+---
+Why a Service Mesh is not a replacement of API Management
+As a disclaimer, I work at Red Hat, more specifically, at the 3scale Team (acquired 2 years ago) developing the 3scale API Management Solution.
+
+Lately, a question is popping up more and more when talking with our customers: “Why do I need API Management if I use Istio?”
+
+To answer this question, first, we need to understand what is what, but if you want a spoiler: 3scale API Management and Istio are amazing together.
+
+I will try to describe what problems those two solutions aim to solve, focusing on 3scale API Management and Istio Service Mesh (those are the two I know better).
+
+## What is an API Management solution?
+
+If we take a look at Wikipedia:
+> “API management is the process of creating and publishing web APIs, enforcing their usage policies, controlling access, nurturing the subscriber community, collecting and analyzing usage statistics, and reporting on performance.”
+
+This is a good definition. As a company that has created some kind of internal service, I now want to build a business around it by providing an API to external subscribers. Of course, I want to monetize it by offering several subscription plans with different usage limits, scopes, and be able to invoice my customers automatically.
+Additionally, external Developers should find my API easily, and sign up for a plan in a self-service way with just their credit card and all of this should be transparent for my API code…
+
+{% highlight ruby %}
+def print_hi(name)
+ puts "Hi, #{name}"
+end
+print_hi('Tom')
+#=> prints 'Hi, Tom' to STDOUT.
+{% endhighlight %}
+
+Check out the [Jekyll docs][jekyll-docs] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll’s GitHub repo][jekyll-gh]. If you have questions, you can ask them on [Jekyll Talk][jekyll-talk].
+
+[jekyll-docs]: https://jekyllrb.com/docs/home
+[jekyll-gh]: https://github.com/jekyll/jekyll
+[jekyll-talk]: https://talk.jekyllrb.com/
diff --git a/_sass/3scale.scss b/_sass/3scale.scss
new file mode 100644
index 0000000..a08cf8a
--- /dev/null
+++ b/_sass/3scale.scss
@@ -0,0 +1,97 @@
+@charset "utf-8";
+
+// Define defaults for each variable.
+$fa-font-path: "../assets/fonts" !default;
+$base-font-family: 'Overpass', helvetica, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default;
+$base-font-size: 16px !default;
+$base-font-weight: 400 !default;
+$small-font-size: $base-font-size * 0.875 !default;
+$base-line-height: 1.5 !default;
+
+$text-color: #111 !default;
+$solid-background-color: rgba(#dadada, .95) !default;
+$background-color: rgba(#dadada, .95) !default;
+$light-background-color: rgba(white, 0.95);
+$appleGreen: #32CD32;
+$brand-color: #FF7314 !default;
+
+$grey-color: #828282 !default;
+$grey-color-light: lighten($grey-color, 40%) !default;
+$grey-color-dark: darken($grey-color, 25%) !default;
+
+$table-text-align: left !default;
+
+// Width of the content area
+$content-width: 100% !default;
+
+$on-palm: 600px !default;
+$on-laptop: 800px !default;
+
+// Use media queries like this:
+// @include media-query($on-palm) {
+// .wrapper {
+// padding-right: $spacing-unit / 2;
+// padding-left: $spacing-unit / 2;
+// }
+// }
+@mixin media-query($device) {
+ @media screen and (max-width: $device) {
+ @content;
+ }
+}
+
+@mixin relative-font-size($ratio) {
+ font-size: $base-font-size * $ratio;
+}
+
+//$minScreen: 1rem;
+//$maxScreen: 20rem;
+$minScreen: 320px;
+$maxScreen: 4000px;
+$minFont: 0.8rem;
+$maxFont: 400rem;
+
+// http://madebymike.com.au/writing/precise-control-responsive-typography/
+// https://gist.github.com/indrekpaas/7f22e44ace49b5124eec
+@mixin fluid-type($properties, $min-vw, $max-vw, $min-value, $max-value) {
+ & {
+ @each $property in $properties {
+ #{$property}: $min-value;
+ }
+
+ @media screen and (min-width: $min-vw) {
+ @each $property in $properties {
+ #{$property}: calc(#{$min-value} + #{strip-unit($max-value - $min-value)} * ((100vw - #{$min-vw}) / #{strip-unit($max-vw - $min-vw)}));
+ }
+ }
+
+ @media screen and (min-width: $max-vw) {
+ @each $property in $properties {
+ #{$property}: $max-value;
+ }
+ }
+ }
+}
+
+@function strip-unit($value) {
+ @return $value / ($value * 0 + 1);
+}
+
+@function line-height-times($multiplier: 1, $subtract-border: false) {
+ $spacer: $base-line-height *1rem * $multiplier;
+
+ @if $subtract-border == true {
+ @return calc(#{$spacer} - #{$border-width});
+ }
+ @else {
+ @return $spacer;
+ }
+}
+
+$spacing-unit: line-height-times(2);
+// Import partials.
+@import
+ "3scale/base",
+ "3scale/layout",
+ "3scale/syntax-highlighting"
+;
diff --git a/_sass/3scale/_base.scss b/_sass/3scale/_base.scss
new file mode 100644
index 0000000..cf551f9
--- /dev/null
+++ b/_sass/3scale/_base.scss
@@ -0,0 +1,249 @@
+/**
+ * Reset some basic elements
+ */
+body, h1, h2, h3, h4, h5, h6,
+p, blockquote, pre, hr,
+dl, dd, ol, ul, figure {
+ margin: 0;
+ padding: 0;
+}
+
+/**
+ * Basic styling
+ */
+body {
+ box-sizing: border-box;
+ font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;
+ color: $text-color;
+ background-color: $background-color;
+ -webkit-text-size-adjust: 100%;
+ -webkit-font-feature-settings: "kern" 1;
+ -moz-font-feature-settings: "kern" 1;
+ -o-font-feature-settings: "kern" 1;
+ font-feature-settings: "kern" 1;
+ font-kerning: normal;
+ display: flex;
+ min-height: 100vh;
+ flex-direction: column;
+}
+
+/**
+ * Wrapper
+ */
+.wrapper {
+ //max-width: calc(#{$content-width} - (#{line-height-times(1)} * 2));
+ padding: line-height-times(1/2) line-height-times(2) 0 line-height-times(2);
+
+ margin-right: auto;
+ margin-left: auto;
+ //padding-right: line-height-times(1);
+ //padding-left: line-height-times(1);
+ @extend %clearfix;
+
+ @include media-query($on-laptop) {
+ padding: line-height-times(1/2) line-height-times(1) 0 line-height-times(1);
+ }
+}
+
+/**
+ * Set `margin-bottom` to maintain vertical rhythm
+ */
+h1, h2, h3, h4, h5, h6,
+p, blockquote, pre,
+ul, ol, dl, figure,
+%vertical-rhythm {
+ margin-bottom: $spacing-unit / 2;
+}
+
+/**
+ * `main` element
+ */
+main {
+ display: block; /* Default value of `display` of `main` element is 'inline' in IE 11. */
+}
+
+/**
+ * Images
+ */
+img {
+ max-width: 100%;
+ vertical-align: middle;
+}
+
+/**
+ * Figures
+ */
+figure > img {
+ display: block;
+}
+
+figcaption {
+ font-size: $small-font-size;
+}
+
+/**
+ * Lists
+ */
+ul, ol {
+ margin-left: 0;// line-height-times(1);
+ //list-style: square outside;
+ list-style: none; /* Remove default bullets */
+}
+
+.page-content ul li::before {
+ content: "\25A0"; /* Add content: \2022 is the CSS Code/unicode for a bullet */
+ color: $appleGreen; //$background-color; /* Change the color */
+ font-weight: bold; /* If you want it to be bold */
+ //display: inline-block; /* Needed to add space between the bullet and the text */
+ //width: line-height-times(1.2); /* Also needed for space (tweak if needed) */
+ margin-left: line-height-times(-1.15); /* Also needed for space (tweak if needed) */
+ //@include relative-font-size(2.5);
+ @include fluid-type(font-size, $minScreen, $maxScreen, 1.5rem, 30rem);
+ position: absolute;
+ top: line-height-times(-0.35);
+}
+
+li {
+ position: relative;
+ > ul,
+ > ol {
+ margin-bottom: 0;
+ }
+}
+
+/**
+ * Headings
+ */
+h1, h2, h3, h4, h5, h6 {
+ font-weight: $base-font-weight;
+}
+
+/**
+ * Links
+ */
+a {
+ color: $text-color;
+ text-decoration: underline;
+ transition: 0.3s;
+
+ &:visited {
+ color: $text-color;
+ }
+
+ &:hover {
+
+ color: $brand-color;
+ text-decoration: underline;
+ }
+
+ .social-media-list &:hover {
+ text-decoration: none;
+
+ .username {
+ text-decoration: underline;
+ }
+ }
+}
+
+
+/**
+ * Blockquotes
+ */
+blockquote {
+ color: $grey-color;
+ border-left: 4px solid $grey-color-light;
+ padding-left: $spacing-unit / 2;
+ @include relative-font-size(1.125);
+ letter-spacing: -1px;
+ font-style: italic;
+
+ > :last-child {
+ margin-bottom: 0;
+ }
+}
+
+
+
+/**
+ * Code formatting
+ */
+
+code {
+ //padding: 1px 5px;
+}
+
+pre {
+ white-space: pre-wrap;
+ padding: line-height-times(1);
+ //overflow-x: auto;
+ //overflow: auto;
+ overflow-x:hidden;
+
+ > code {
+ border: 0;
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+
+
+
+/**
+ * Clearfix
+ */
+%clearfix:after {
+ content: "";
+ display: table;
+ clear: both;
+}
+
+
+
+/**
+ * Icons
+ */
+
+.svg-icon {
+ width: 16px;
+ height: 16px;
+ display: inline-block;
+ fill: #{$grey-color};
+ padding-right: 5px;
+ vertical-align: text-top;
+}
+
+.social-media-list {
+ li + li {
+ padding-top: 5px;
+ }
+}
+
+
+
+/**
+ * Tables
+ */
+table {
+ margin-bottom: $spacing-unit;
+ width: 100%;
+ text-align: $table-text-align;
+ color: lighten($text-color, 18%);
+ border-collapse: collapse;
+ border: 1px solid $grey-color-light;
+ tr {
+ &:nth-child(even) {
+ background-color: lighten($grey-color-light, 6%);
+ }
+ }
+ th, td {
+ padding: ($spacing-unit / 3) ($spacing-unit / 2);
+ }
+ th {
+ background-color: lighten($grey-color-light, 3%);
+ border: 1px solid darken($grey-color-light, 4%);
+ border-bottom-color: darken($grey-color-light, 12%);
+ }
+ td {
+ border: 1px solid $grey-color-light;
+ }
+}
diff --git a/_sass/3scale/_layout.scss b/_sass/3scale/_layout.scss
new file mode 100644
index 0000000..eee20f0
--- /dev/null
+++ b/_sass/3scale/_layout.scss
@@ -0,0 +1,288 @@
+/**
+ * Site header
+ */
+ .site-header {
+ background-color: $background-color;
+ position: fixed;
+ bottom: 0;
+ width: 100%;
+ min-height: 0;
+ padding: line-height-times(1) 0 0 0;
+ font-weight: bold;
+ z-index: 100;
+ }
+
+.site-nav {
+ @include fluid-type(font-size, $minScreen, $maxScreen, $minFont, 30rem);
+ line-height: $base-line-height * $base-font-size * 2.25;
+ white-space: nowrap;
+ overflow-x: auto;
+ overflow-y: visible;
+
+ a {
+ text-decoration: none;
+ }
+
+ .page-link {
+ color: $text-color;
+ line-height: 1;
+ padding: 0 line-height-times(1)line-height-times(1);
+ position: relative;
+ display: block;
+
+ &:hover {
+ color: $brand-color;
+ }
+
+ // Gaps between nav items, but not on the last one
+ &:not(:last-child) {
+ margin-right: 1rem;
+ }
+ }
+}
+
+.page-heading .active,
+.page-link.active {
+ color: $brand-color;
+}
+
+/**
+ * Page content
+ */
+
+
+.page-heading {
+ font-family: 'Overpass';
+ font-size: 9vw;
+ margin-left: 10vw;
+ font-weight: 800;
+ text-align: right;
+ line-height: 1.2;
+ margin-bottom: 2.5vw;
+
+ a {
+ text-decoration: none;
+ }
+}
+
+.page-content {
+ margin-top: 6rem;
+ font-family: 'Overpass Mono';
+ @include fluid-type(font-size, $minScreen, $maxScreen, 0.8rem, 25rem);
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
+ margin: line-height-times(3) line-height-times(-1) line-height-times(1.5) line-height-times(-1);
+ flex: 1;
+
+ h1 {
+ font-family: 'Overpass Mono';
+ font-weight: bold;
+ }
+}
+
+.post-list-heading {
+ @include relative-font-size(1.75);
+}
+
+.post-list {
+ margin-left: 0;
+ list-style: none;
+
+ > li {
+ margin-bottom: $spacing-unit;
+ }
+}
+
+.post-meta {
+ font-size: $small-font-size;
+ color: $grey-color;
+}
+
+.post-link {
+ display: block;
+ @include relative-font-size(1.5);
+}
+
+
+
+/**
+ * Posts
+ */
+.post-header {
+ margin-bottom: $spacing-unit;
+}
+
+.post-title {
+ @include relative-font-size(2.625);
+ letter-spacing: -1px;
+ line-height: 1;
+
+ @include media-query($on-laptop) {
+ @include relative-font-size(2.25);
+ }
+}
+
+.post-content {
+ font-family: 'Overpass';
+ margin-bottom: $spacing-unit;
+ margin: 0 0 6rem 0 !important;
+
+ p {
+ //margin-right: line-height-times(30);
+ display: block;
+ width: 100%;
+ }
+
+ h2 {
+ font-size: 120%;
+ }
+
+ h3 {
+ font-size: 110%;
+ }
+
+ h4 {
+ font-size: 105%;
+ }
+}
+
+.chapter {
+ margin: 0 line-height-times(1) line-height-times(2);
+ flex-grow: 1;
+ flex-basis: 45%;
+ display: flex;
+ flex-direction: row;
+ overflow: hidden;
+
+ &.paragraphed {
+ flex-direction: column;
+
+ .summary {
+ margin-bottom: 1.5rem;
+ }
+ }
+
+ &.focus {
+ position: relative;
+ z-index: 10;
+ }
+
+ .summary {
+ padding: 1.5rem;
+ position: relative;
+ z-index: 10;
+ background-color: $light-background-color;
+ //flex-basis: 40%;
+ }
+
+ &.client {
+ flex-basis: 100%;
+ margin-top: -10rem;
+ margin-bottom: -10rem;
+ font-size: 3vw;
+ background-color: transparent;
+ line-height: 1;
+
+ h1 {
+ height: 6rem;
+ }
+ }
+
+ &.api {
+ background-color: transparent;
+ font-size: 9vw;
+ line-height: 1;
+ }
+
+ .policy-chain,
+ .feature-chain {
+ border-left: 1rem solid transparent;
+ background-color: transparent;
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ margin-left: 0;
+ }
+
+ section {
+ position: relative;
+ flex-basis: 50%;
+
+ h2 {
+ margin-bottom: 0;
+ }
+ }
+
+ .policy, .feature {
+ box-sizing: content-box;
+ background-color: $light-background-color;
+ border-bottom: 1rem solid $solid-background-color;
+ border-right: 0;
+ border-left: 0;
+ padding: 0 1.5rem;
+ text-align: left;
+ list-style: none;
+ flex: 1;
+ display: flex;
+ justify-content: center;
+ flex-direction: column;
+ text-align: center;
+
+ &:first-child {
+ border-top: 0;
+ }
+
+ &:last-child {
+ border-bottom: 0;
+ }
+ }
+
+ .feature {
+ text-align: left;
+ }
+
+ #policy2,
+ #policy3,
+ #policy4 {
+ position: relative;
+ //z-index: 5;
+ }
+
+}
+
+.nav-list {
+ list-style: none;
+ margin-left: 0;
+ margin-bottom: 0;
+ line-height: 1;
+}
+
+.nav-list-item {
+ display: inline-block;
+ border-left: 0.1rem solid $text-color;
+}
+
+
+.nav-list-item:first-child {
+ border-left: 0;
+ margin-left: line-height-times(0.75);
+}
+
+a:focus {
+ color: $brand-color;
+}
+
+:target .conditional-highlight,
+:active .conditional-highlight{
+ color: $brand-color;
+ font-weight: bold;
+ font-family: 'Overpass';
+}
+
+.icon {
+ background-repeat: no-repeat;
+ background-position: line-height-times(2) line-height-times(.2);
+ background-size: line-height-times(1.5) auto;
+ background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHZpZXdCb3g9IjAgMCA3MjQgNzM0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPiAgICAgICAgPHRpdGxlPmljb248L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4gICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+ICAgICAgICA8ZyBpZD0iaWNvbiIgZmlsbC1ydWxlPSJub256ZXJvIj4gICAgICAgICAgICA8ZyBpZD0iR3JvdXAtMiIgZmlsbD0iIzAwMDAwMCI+ICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik01MDEuMDMzNjI4LDEzNC4xNjUwNCBDNTAxLjAzMzYyOCwxMjMuNzQ0NDU0IDUwOS4zNjI4MzIsMTE1LjkyOTAxNSA1MTguOTczNDUyLDExNS45MjkwMTUgQzUyOS4yMjQ3NzksMTE1LjkyOTAxNSA1MzYuOTEzMjc0LDEyNC4zOTU3NDEgNTM2LjkxMzI3NCwxMzQuMTY1MDQgQzUzNi45MTMyNzQsMTQ0LjU4NTYyNiA1MjguNTg0MDcsMTUyLjQwMTA2NSA1MTguOTczNDUyLDE1Mi40MDEwNjUgQzUwOS4zNjI4MzIsMTUyLjQwMTA2NSA1MDEuMDMzNjI4LDE0My45MzQzMzkgNTAxLjAzMzYyOCwxMzQuMTY1MDQgTTQxMC4wNTMwOTYsOTMuNzg1MjcwNiBDNDEwLjA1MzA5Niw3OS40NTY5NjU1IDQyMS41ODU4NDEsNjguMzg1MDkzMyA0MzUuMDQwNzA5LDY4LjM4NTA5MzMgQzQ0OC40OTU1NzUsNjguMzg1MDkzMyA0NjAuMDI4MzIsODAuMTA4MjUyMSA0NjAuMDI4MzIsOTMuNzg1MjcwNiBDNDYwLjAyODMyLDEwOC4xMTM1NzYgNDQ4LjQ5NTU3NSwxMTkuMTg1NDQ4IDQzNS4wNDA3MDksMTE5LjE4NTQ0OCBDNDIxLjU4NTg0MSwxMTkuMTg1NDQ4IDQxMC4wNTMwOTYsMTA4LjExMzU3NiA0MTAuMDUzMDk2LDkzLjc4NTI3MDYgTTE5Ni42OTczNDUsNjY2LjkxNzQ3OSBDMTk2LjY5NzM0NSw2NDkuMzMyNzQxIDIxMC43OTI5MjEsNjM1LjAwNDQzNiAyMjguMDkyMDM2LDYzNS4wMDQ0MzYgQzI0NS4zOTExNTEsNjM1LjAwNDQzNiAyNTkuNDg2NzI2LDY0OS4zMzI3NDEgMjU5LjQ4NjcyNiw2NjYuOTE3NDc5IEMyNTkuNDg2NzI2LDY4NC41MDIyMTkgMjQ1LjM5MTE1MSw2OTguODMwNTI0IDIyOC4wOTIwMzYsNjk4LjgzMDUyNCBDMjEwLjc5MjkyMSw2OTguODMwNTI0IDE5Ni42OTczNDUsNjg0LjUwMjIxOSAxOTYuNjk3MzQ1LDY2Ni45MTc0NzkgTTM1Ni4yMzM2MjgsNTY3LjkyMTkxNiBDMzU2LjIzMzYyOCw1NTIuOTQyMzI0IDM2OC40MDcwNzksNTQwLjU2Nzg3OSAzODMuMTQzMzYzLDU0MC41Njc4NzkgQzM5Ny44Nzk2NDcsNTQwLjU2Nzg3OSA0MTAuMDUzMDk2LDU1Mi45NDIzMjQgNDEwLjA1MzA5Niw1NjcuOTIxOTE2IEM0MTAuMDUzMDk2LDU4Mi45MDE1MDkgMzk3Ljg3OTY0Nyw1OTUuMjc1OTU1IDM4My4xNDMzNjMsNTk1LjI3NTk1NSBDMzY4LjQwNzA3OSw1OTUuMjc1OTU1IDM1Ni4yMzM2MjgsNTgyLjkwMTUwOSAzNTYuMjMzNjI4LDU2Ny45MjE5MTYgTTQzNS42ODE0MTYsNjAzLjc0MjY4IEM0MzUuNjgxNDE2LDU4NC4yMDQwODMgNDUxLjA1ODQwNiw1NjguNTczMjAyIDQ3MC4yNzk2NDcsNTY4LjU3MzIwMiBDNDg5LjUwMDg4NSw1NjguNTczMjAyIDUwNC44Nzc4NzUsNTg0LjIwNDA4MyA1MDQuODc3ODc1LDYwMy43NDI2OCBDNTA0Ljg3Nzg3NSw2MjMuMjgxMjc4IDQ4OS41MDA4ODUsNjM4LjkxMjE1NiA0NzAuMjc5NjQ3LDYzOC45MTIxNTYgQzQ1MS4wNTg0MDYsNjM4LjkxMjE1NiA0MzUuNjgxNDE2LDYyMy4yODEyNzggNDM1LjY4MTQxNiw2MDMuNzQyNjggTTMxNy4xNTA0NDIsMjY1LjcyNDkzNCBDMzE3LjE1MDQ0MiwyNTAuNzQ1MzQxIDMyOS4zMjM4OTQsMjM5LjAyMjE4MiAzNDMuNDE5NDY5LDIzOS4wMjIxODIgQzM1OC4xNTU3NTIsMjM5LjAyMjE4MiAzNjkuNjg4NDk1LDI1MC43NDUzNDEgMzY5LjY4ODQ5NSwyNjUuNzI0OTM0IEMzNjkuNjg4NDk1LDI4MC43MDQ1MjYgMzU4LjE1NTc1MiwyOTIuNDI3Njg1IDM0My40MTk0NjksMjkyLjQyNzY4NSBDMzI4LjY4MzE4NSwyOTIuNDI3Njg1IDMxNy4xNTA0NDIsMjgwLjA1MzIzOSAzMTcuMTUwNDQyLDI2NS43MjQ5MzQgTTMyNi43NjEwNjIsMTgxLjcwODk2MiBDMzI2Ljc2MTA2MiwxNjkuOTg1ODAzIDMzNi4zNzE2OCwxNjAuMjE2NTA0IDM0Ny45MDQ0MjUsMTYwLjIxNjUwNCBDMzU5LjQzNzE2OCwxNjAuMjE2NTA0IDM2OS4wNDc3ODgsMTY5Ljk4NTgwMyAzNjkuMDQ3Nzg4LDE4MS43MDg5NjIgQzM2OS4wNDc3ODgsMTkzLjQzMjEyMSAzNTkuNDM3MTY4LDIwMy4yMDE0MiAzNDcuOTA0NDI1LDIwMy4yMDE0MiBDMzM2LjM3MTY4LDIwMy4yMDE0MiAzMjYuNzYxMDYyLDE5My40MzIxMjEgMzI2Ljc2MTA2MiwxODEuNzA4OTYyIE0yNTMuMDc5NjQ3LDQyMi42ODUwMDQgQzI1My4wNzk2NDcsNDAyLjQ5NTEyIDI2OS4wOTczNDYsMzg1LjU2MTY2OSAyODkuNiwzODUuNTYxNjY5IEMzMDkuNDYxOTQ3LDM4NS41NjE2NjkgMzI2LjEyMDM1Myw0MDIuNDk1MTIgMzI2LjEyMDM1Myw0MjIuNjg1MDA0IEMzMjYuMTIwMzUzLDQ0Mi44NzQ4ODkgMzEwLjEwMjY1NCw0NTkuODA4MzQgMjg5LjYsNDU5LjgwODM0IEMyNjkuMDk3MzQ2LDQ1OS44MDgzNCAyNTMuMDc5NjQ3LDQ0My41MjYxNzUgMjUzLjA3OTY0Nyw0MjIuNjg1MDA0IE01NjMuMTgyMzAxLDQ1OS4xNTcwNTMgQzU2My4xODIzMDEsNDQxLjU3MjMxNSA1NzcuMjc3ODc1LDQyNy4yNDQwMSA1OTQuNTc2OTksNDI3LjI0NDAxIEM2MTEuODc2MTA2LDQyNy4yNDQwMSA2MjUuOTcxNjgsNDQxLjU3MjMxNSA2MjUuOTcxNjgsNDU5LjE1NzA1MyBDNjI1Ljk3MTY4LDQ3Ni43NDE3OTMgNjExLjg3NjEwNiw0OTEuMDcwMDk4IDU5NC41NzY5OSw0OTEuMDcwMDk4IEM1NzcuMjc3ODc1LDQ5MS4wNzAwOTggNTYzLjE4MjMwMSw0NzYuNzQxNzkzIDU2My4xODIzMDEsNDU5LjE1NzA1MyBNNjQ3LjExNTA0MywzODUuNTYxNjY5IEM2NDcuMTE1MDQzLDM2NC4wNjkyMDkgNjY0LjQxNDE1OSwzNDYuNDg0NDcxIDY4NS41NTc1MjIsMzQ2LjQ4NDQ3MSBDNzA2LjcwMDg4NSwzNDYuNDg0NDcxIDcyNCwzNjQuMDY5MjA5IDcyNCwzODUuNTYxNjY5IEM3MjQsNDA3LjA1NDEyNiA3MDYuNzAwODg1LDQyNC42Mzg4NjQgNjg1LjU1NzUyMiw0MjQuNjM4ODY0IEM2NjQuNDE0MTU5LDQyNC42Mzg4NjQgNjQ3LjExNTA0Myw0MDcuMDU0MTI2IDY0Ny4xMTUwNDMsMzg1LjU2MTY2OSBNNjQzLjkxMTUwNSwyMTguODMyMjk4IEM2NDMuOTExNTA1LDIwMS44OTg4NDYgNjU3LjM2NjM3MiwxODguMjIxODI4IDY3NC4wMjQ3NzksMTg4LjIyMTgyOCBDNjkwLjY4MzE4NSwxODguMjIxODI4IDcwNC4xMzgwNTMsMjAxLjg5ODg0NiA3MDQuMTM4MDUzLDIxOC44MzIyOTggQzcwNC4xMzgwNTMsMjM1Ljc2NTc0OSA2OTAuNjgzMTg1LDI0OS40NDI3NjggNjc0LjAyNDc3OSwyNDkuNDQyNzY4IEM2NTcuMzY2MzcyLDI0OS40NDI3NjggNjQzLjkxMTUwNSwyMzUuNzY1NzQ5IDY0My45MTE1MDUsMjE4LjgzMjI5OCBNNjY0LjQxNDE1OSwzMDEuNTQ1Njk3IEM2NjQuNDE0MTU5LDI4OS4xNzEyNTIgNjc0LjAyNDc3OSwyNzkuNDAxOTUzIDY4Ni4xOTgyMzEsMjc5LjQwMTk1MyBDNjk4LjM3MTY4LDI3OS40MDE5NTMgNzA3Ljk4MjMwMSwyODkuMTcxMjUyIDcwNy45ODIzMDEsMzAxLjU0NTY5NyBDNzA3Ljk4MjMwMSwzMTMuOTIwMTQyIDY5OC4zNzE2OCwzMjMuNjg5NDQxIDY4Ni4xOTgyMzEsMzIzLjY4OTQ0MSBDNjc0LjAyNDc3OSwzMjQuMzQwNzI3IDY2NC40MTQxNTksMzEzLjkyMDE0MiA2NjQuNDE0MTU5LDMwMS41NDU2OTcgTTU3NS4zNTU3NTIsMjgyLjAwNzA5OSBDNTc1LjM1NTc1MiwyNzAuMjgzOTQxIDU4NC45NjYzNzIsMjYwLjUxNDY0IDU5Ni40OTkxMTUsMjYwLjUxNDY0IEM2MDguMDMxODU4LDI2MC41MTQ2NCA2MTcuNjQyNDc4LDI3MC4yODM5NDEgNjE3LjY0MjQ3OCwyODIuMDA3MDk5IEM2MTcuNjQyNDc4LDI5My43MzAyNTggNjA4LjAzMTg1OCwzMDMuNDk5NTU3IDU5Ni40OTkxMTUsMzAzLjQ5OTU1NyBDNTg0LjMyNTY2MywzMDMuNDk5NTU3IDU3NS4zNTU3NTIsMjkzLjczMDI1OCA1NzUuMzU1NzUyLDI4Mi4wMDcwOTkgTTUwMy41OTY0NTksMzY0LjcyMDQ5NiBDNTAzLjU5NjQ1OSwzNTUuNjAyNDg0IDUxMC42NDQyNDgsMzQ4LjQzODMzMSA1MTkuNjE0MTU5LDM0OC40MzgzMzEgQzUyOC41ODQwNywzNDguNDM4MzMxIDUzNS42MzE4NTgsMzU1LjYwMjQ4NCA1MzUuNjMxODU4LDM2NC43MjA0OTYgQzUzNS42MzE4NTgsMzczLjgzODUxIDUyOC41ODQwNywzODEuMDAyNjYzIDUxOS42MTQxNTksMzgxLjAwMjY2MyBDNTEwLjY0NDI0OCwzODEuMDAyNjYzIDUwMy41OTY0NTksMzczLjgzODUxIDUwMy41OTY0NTksMzY0LjcyMDQ5NiBNMzg4LjI2OTAyNiwzMTkuMTMwNDM1IEMzODguMjY5MDI2LDMwMi44NDgyNyA0MDEuMDgzMTg1LDI4OS44MjI1MzggNDE3LjEwMDg4NSwyODkuODIyNTM4IEM0MzMuMTE4NTg0LDI4OS44MjI1MzggNDQ1LjkzMjc0MywzMDIuODQ4MjcgNDQ1LjkzMjc0MywzMTkuMTMwNDM1IEM0NDUuOTMyNzQzLDMzNS40MTI1OTkgNDMzLjExODU4NCwzNDguNDM4MzMxIDQxNy4xMDA4ODUsMzQ4LjQzODMzMSBDNDAxLjA4MzE4NSwzNDguNDM4MzMxIDM4OC4yNjkwMjYsMzM1LjQxMjU5OSAzODguMjY5MDI2LDMxOS4xMzA0MzUgTTUyMy40NTg0MDYsMjA0LjUwMzk5MyBDNTIzLjQ1ODQwNiwxODUuNjE2NjgyIDUzOC44MzUzOTksMTY5Ljk4NTgwMyA1NTcuNDE1OTMsMTY5Ljk4NTgwMyBDNTc1Ljk5NjQ1OSwxNjkuOTg1ODAzIDU5MS4zNzM0NTIsMTg1LjYxNjY4MiA1OTEuMzczNDUyLDIwNC41MDM5OTMgQzU5MS4zNzM0NTIsMjIzLjM5MTMwNCA1NzUuOTk2NDU5LDIzOS4wMjIxODIgNTU3LjQxNTkzLDIzOS4wMjIxODIgQzUzOC44MzUzOTksMjM5LjAyMjE4MiA1MjMuNDU4NDA2LDIyNC4wNDI1OTEgNTIzLjQ1ODQwNiwyMDQuNTAzOTkzIE01OTcuNzgwNTMxLDE1MS43NDk3NzggQzU5Ny43ODA1MzEsMTM2Ljc3MDE4NiA2MDkuOTUzOTgzLDEyNC4zOTU3NDEgNjI0LjY5MDI2NSwxMjQuMzk1NzQxIEM2MzkuNDI2NTQ4LDEyNC4zOTU3NDEgNjUxLjYsMTM2Ljc3MDE4NiA2NTEuNiwxNTEuNzQ5Nzc4IEM2NTEuNiwxNjYuNzI5MzcgNjM5LjQyNjU0OCwxNzkuMTAzODE1IDYyNC42OTAyNjUsMTc5LjEwMzgxNSBDNjA5Ljk1Mzk4MywxNzkuMTAzODE1IDU5Ny43ODA1MzEsMTY2LjcyOTM3IDU5Ny43ODA1MzEsMTUxLjc0OTc3OCBNNTM3LjU1Mzk4Myw4Mi43MTMzOTg0IEM1MzcuNTUzOTgzLDcyLjI5MjgxMjggNTQ1Ljg4MzE4NSw2NC40NzczNzM1IDU1NS40OTM4MDUsNjQuNDc3MzczNSBDNTY1Ljc0NTEzMiw2NC40NzczNzM1IDU3My40MzM2MjgsNzIuOTQ0MDk5NCA1NzMuNDMzNjI4LDgyLjcxMzM5ODQgQzU3My40MzM2MjgsOTMuMTMzOTg0MSA1NjUuMTA0NDI1LDEwMC45NDk0MjMgNTU1LjQ5MzgwNSwxMDAuOTQ5NDIzIEM1NDUuMjQyNDc4LDEwMC45NDk0MjMgNTM3LjU1Mzk4Myw5Mi40ODI2OTc1IDUzNy41NTM5ODMsODIuNzEzMzk4NCBNNDEwLjA1MzA5NiwyMDYuNDU3ODUzIEM0MTAuMDUzMDk2LDE4Ni45MTkyNTUgNDI1LjQzMDA4OSwxNzEuOTM5NjYzIDQ0NC4wMTA2MiwxNzEuOTM5NjYzIEM0NjMuMjMxODU4LDE3MS45Mzk2NjMgNDc3Ljk2ODE0MiwxODcuNTcwNTQxIDQ3Ny45NjgxNDIsMjA2LjQ1Nzg1MyBDNDc3Ljk2ODE0MiwyMjUuOTk2NDUgNDYyLjU5MTE1MSwyNDAuOTc2MDQyIDQ0NC4wMTA2MiwyNDAuOTc2MDQyIEM0MjUuNDMwMDg5LDI0MS42MjczMjkgNDEwLjA1MzA5NiwyMjUuOTk2NDUgNDEwLjA1MzA5NiwyMDYuNDU3ODUzIE0zMzcuMDEyMzg5LDExNS4yNzc3MjggQzMzNy4wMTIzODksMTAzLjU1NDU3IDM0Ni42MjMwMSw5My4xMzM5ODQxIDM1OC43OTY0NTksOTMuMTMzOTg0MSBDMzcwLjMyOTIwNCw5My4xMzM5ODQxIDM3OS45Mzk4MjIsMTAyLjkwMzI4MyAzNzkuOTM5ODIyLDExNS4yNzc3MjggQzM3OS45Mzk4MjIsMTI3LjY1MjE3NCAzNzAuMzI5MjA0LDEzNy40MjE0NzMgMzU4Ljc5NjQ1OSwxMzcuNDIxNDczIEMzNDYuNjIzMDEsMTM2Ljc3MDE4NiAzMzcuMDEyMzg5LDEyNy4wMDA4ODcgMzM3LjAxMjM4OSwxMTUuMjc3NzI4IE0zOTEuNDcyNTY3LDI1LjQwMDE3NzQgQzM5MS40NzI1NjcsMTcuNTg0NzM4MiAzOTcuODc5NjQ3LDExLjA3MTg3MjIgNDA1LjU2ODE0MiwxMS4wNzE4NzIyIEM0MTMuMjU2NjM3LDExLjA3MTg3MjIgNDE5LjY2MzcxNiwxNy41ODQ3MzgyIDQxOS42NjM3MTYsMjUuNDAwMTc3NCBDNDE5LjY2MzcxNiwzMy4yMTU2MTY2IDQxMy4yNTY2MzcsMzkuNzI4NDgyNyA0MDUuNTY4MTQyLDM5LjcyODQ4MjcgQzM5Ny44Nzk2NDcsMzkuNzI4NDgyNyAzOTEuNDcyNTY3LDMzLjIxNTYxNjYgMzkxLjQ3MjU2NywyNS40MDAxNzc0IE0zMDcuNTM5ODIyLDM0LjUxODE4OTggQzMwNy41Mzk4MjIsMTQuOTc5NTkxOCAzMjIuOTE2ODE1LDAgMzQxLjQ5NzM0NiwwIEMzNjAuMDc3ODc1LDAgMzc1LjQ1NDg2OCwxNS42MzA4Nzg0IDM3NS40NTQ4NjgsMzQuNTE4MTg5OCBDMzc1LjQ1NDg2OCw1NC4wNTY3ODc5IDM2MC4wNzc4NzUsNjkuMDM2Mzc5OSAzNDEuNDk3MzQ2LDY5LjAzNjM3OTkgQzMyMi45MTY4MTUsNjkuNjg3NjY2NCAzMDcuNTM5ODIyLDU0LjA1Njc4NzkgMzA3LjUzOTgyMiwzNC41MTgxODk4IE0yMzcuMDYxOTQ3LDM5LjcyODQ4MjcgQzIzNy4wNjE5NDcsMjkuMzA3ODk3MSAyNDUuMzkxMTUxLDIwLjg0MTE3MTMgMjU1LjY0MjQ3OCwyMC44NDExNzEzIEMyNjUuODkzODA1LDIwLjg0MTE3MTMgMjc0LjIyMzAxLDI5LjMwNzg5NzEgMjc0LjIyMzAxLDM5LjcyODQ4MjcgQzI3NC4yMjMwMSw1MC4xNDkwNjg0IDI2NS44OTM4MDUsNTguNjE1Nzk0MiAyNTUuNjQyNDc4LDU4LjYxNTc5NDIgQzI0NS4zOTExNTEsNTguNjE1Nzk0MiAyMzcuMDYxOTQ3LDUwLjE0OTA2ODQgMjM3LjA2MTk0NywzOS43Mjg0ODI3IE0xNjMuMzgwNTMxLDczLjU5NTM4NiBDMTYzLjM4MDUzMSw2MC41Njk2NTQgMTc0LjI3MjU2Niw0OS40OTc3ODE4IDE4Ny4wODY3MjYsNDkuNDk3NzgxOCBDMTk5LjkwMDg4NSw0OS40OTc3ODE4IDIxMC43OTI5MjEsNjAuNTY5NjU0IDIxMC43OTI5MjEsNzMuNTk1Mzg2IEMyMTAuNzkyOTIxLDg2LjYyMTExOCAxOTkuOTAwODg1LDk3LjY5Mjk5MDIgMTg3LjA4NjcyNiw5Ny42OTI5OTAyIEMxNzMuNjMxODU4LDk3LjY5Mjk5MDIgMTYzLjM4MDUzMSw4Ni42MjExMTggMTYzLjM4MDUzMSw3My41OTUzODYgTTE0MC45NTU3NTIsMTg4Ljg3MzExNCBDMTQwLjk1NTc1MiwxNzcuODAxMjQyIDE0OS45MjU2NjQsMTY4LjY4MzIzIDE2MC44MTc2OTksMTY4LjY4MzIzIEMxNzEuNzA5NzM1LDE2OC42ODMyMyAxODAuNjc5NjQ2LDE3Ny44MDEyNDIgMTgwLjY3OTY0NiwxODguODczMTE0IEMxODAuNjc5NjQ2LDE5OS45NDQ5ODcgMTcxLjcwOTczNSwyMDkuMDYyOTk5IDE2MC44MTc2OTksMjA5LjA2Mjk5OSBDMTQ5LjkyNTY2NCwyMDkuMDYyOTk5IDE0MC45NTU3NTIsMTk5Ljk0NDk4NyAxNDAuOTU1NzUyLDE4OC44NzMxMTQgTTkwLjk4MDUzMSwxMjYuMzQ5NjAxIEM5MC45ODA1MzEsMTA3LjQ2MjI4OSAxMDYuMzU3NTIyLDkxLjgzMTQxMDkgMTI0LjkzODA1Myw5MS44MzE0MTA5IEMxNDQuMTU5MjkyLDkxLjgzMTQxMDkgMTU4Ljg5NTU3NSwxMDcuNDYyMjg5IDE1OC44OTU1NzUsMTI2LjM0OTYwMSBDMTU4Ljg5NTU3NSwxNDUuODg4MTk5IDE0My41MTg1ODQsMTYwLjg2Nzc5MSAxMjQuOTM4MDUzLDE2MC44Njc3OTEgQzEwNi4zNTc1MjIsMTYwLjg2Nzc5MSA5MC45ODA1MzEsMTQ1LjIzNjkxMiA5MC45ODA1MzEsMTI2LjM0OTYwMSBNNTcuMDIzMDA4OSwxOTQuMDgzNDA3IEM1Ny4wMjMwMDg5LDE4NC4zMTQxMDggNjQuNzExNTA0MywxNzYuNDk4NjY5IDc0LjMyMjEyMzgsMTc2LjQ5ODY2OSBDODMuOTMyNzQzMywxNzYuNDk4NjY5IDkxLjYyMTIzODksMTg0LjMxNDEwOCA5MS42MjEyMzg5LDE5NC4wODM0MDcgQzkxLjYyMTIzODksMjAzLjg1MjcwNiA4My45MzI3NDMzLDIxMS42NjgxNDUgNzQuMzIyMTIzOCwyMTEuNjY4MTQ1IEM2NC43MTE1MDQzLDIxMS4wMTY4NTkgNTcuMDIzMDA4OSwyMDMuMjAxNDIgNTcuMDIzMDA4OSwxOTQuMDgzNDA3IE0xMDQuNDM1Mzk4LDI0OC4xNDAxOTQgQzEwNC40MzUzOTgsMjM4LjM3MDg5NiAxMTIuMTIzODk0LDIzMC41NTU0NTcgMTIxLjczNDUxMywyMzAuNTU1NDU3IEMxMzEuMzQ1MTMzLDIzMC41NTU0NTcgMTM5LjAzMzYyOCwyMzguMzcwODk2IDEzOS4wMzM2MjgsMjQ4LjE0MDE5NCBDMTM5LjAzMzYyOCwyNTcuOTA5NDkzIDEzMS4zNDUxMzMsMjY1LjcyNDkzNCAxMjEuNzM0NTEzLDI2NS43MjQ5MzQgQzExMi4xMjM4OTQsMjY1LjcyNDkzNCAxMDQuNDM1Mzk4LDI1Ny45MDk0OTMgMTA0LjQzNTM5OCwyNDguMTQwMTk0IE0xMDUuMDc2MTA2LDMzOS4zMjAzMTkgQzEwNS4wNzYxMDYsMzI0Ljk5MjAxNCAxMTYuNjA4ODUsMzEzLjI2ODg1NSAxMzAuNzA0NDI1LDMxMy4yNjg4NTUgQzE0NC44LDMxMy4yNjg4NTUgMTU2LjMzMjc0MywzMjQuOTkyMDE0IDE1Ni4zMzI3NDMsMzM5LjMyMDMxOSBDMTU2LjMzMjc0MywzNTMuNjQ4NjI0IDE0NC44LDM2NS4zNzE3ODIgMTMwLjcwNDQyNSwzNjUuMzcxNzgyIEMxMTYuNjA4ODUsMzY1LjM3MTc4MiAxMDUuMDc2MTA2LDM1My42NDg2MjQgMTA1LjA3NjEwNiwzMzkuMzIwMzE5IE0yNS42MjgzMTg1LDQ2OS41Nzc2MzkgQzI1LjYyODMxODUsNDUxLjk5MjkwMSAzOS43MjM4OTM4LDQzNy42NjQ1OTYgNTcuMDIzMDA4OSw0MzcuNjY0NTk2IEM3NC4zMjIxMjM4LDQzNy42NjQ1OTYgODguNDE3Njk5LDQ1MS45OTI5MDEgODguNDE3Njk5LDQ2OS41Nzc2MzkgQzg4LjQxNzY5OSw0ODcuMTYyMzc5IDc0LjMyMjEyMzgsNTAxLjQ5MDY4NCA1Ny4wMjMwMDg5LDUwMS40OTA2ODQgQzM5LjcyMzg5MzgsNTAxLjQ5MDY4NCAyNS42MjgzMTg1LDQ4Ny4xNjIzNzkgMjUuNjI4MzE4NSw0NjkuNTc3NjM5IE0wLDM1OC4yMDc2MyBDMCwzMzUuNDEyNTk5IDE3LjkzOTgyMywzMTcuMTc2NTc1IDQwLjM2NDYwMTcsMzE3LjE3NjU3NSBDNjIuNzg5MzgwNSwzMTcuMTc2NTc1IDgwLjcyOTIwMzYsMzM1LjQxMjU5OSA4MC43MjkyMDM2LDM1OC4yMDc2MyBDODAuNzI5MjAzNiwzODEuMDAyNjYzIDYyLjc4OTM4MDUsMzk5LjIzODY4NyA0MC4zNjQ2MDE3LDM5OS4yMzg2ODcgQzE3LjkzOTgyMywzOTkuMjM4Njg3IDAsMzgxLjAwMjY2MyAwLDM1OC4yMDc2MyBNMjguMTkxMTUwNSwyNjIuNDY4NTAxIEMyOC4xOTExNTA1LDI1MC4wOTQwNTQgMzcuODAxNzY5OSwyNDAuMzI0NzU1IDQ5Ljk3NTIyMTIsMjQwLjMyNDc1NSBDNjIuMTQ4NjcyNiwyNDAuMzI0NzU1IDcxLjc1OTI5MjEsMjUwLjA5NDA1NCA3MS43NTkyOTIxLDI2Mi40Njg1MDEgQzcxLjc1OTI5MjEsMjc0Ljg0Mjk0NyA2Mi4xNDg2NzI2LDI4NC42MTIyNDUgNDkuOTc1MjIxMiwyODQuNjEyMjQ1IEMzNy44MDE3Njk5LDI4NC42MTIyNDUgMjguMTkxMTUwNSwyNzQuODQyOTQ3IDI4LjE5MTE1MDUsMjYyLjQ2ODUwMSBNMTc0LjkxMzI3NCw0NjguMjc1MDY2IEMxNzQuOTEzMjc0LDQ1NS4yNDkzMzQgMTg1LjgwNTMxLDQ0NC4xNzc0NjIgMTk4LjYxOTQ2OSw0NDQuMTc3NDYyIEMyMTEuNDMzNjI4LDQ0NC4xNzc0NjIgMjIyLjMyNTY2Myw0NTUuMjQ5MzM0IDIyMi4zMjU2NjMsNDY4LjI3NTA2NiBDMjIyLjMyNTY2Myw0ODEuMzAwNzk5IDIxMS40MzM2MjgsNDkyLjM3MjY3MSAxOTguNjE5NDY5LDQ5Mi4zNzI2NzEgQzE4NS44MDUzMSw0OTIuMzcyNjcxIDE3NC45MTMyNzQsNDgxLjMwMDc5OSAxNzQuOTEzMjc0LDQ2OC4yNzUwNjYgTTE4MC42Nzk2NDYsMzgyLjMwNTIzNiBDMTgwLjY3OTY0NiwzNjkuMjc5NTA0IDE5MS41NzE2ODEsMzU4LjIwNzYzIDIwNC4zODU4NDEsMzU4LjIwNzYzIEMyMTcuMiwzNTguMjA3NjMgMjI4LjA5MjAzNiwzNjkuMjc5NTA0IDIyOC4wOTIwMzYsMzgyLjMwNTIzNiBDMjI4LjA5MjAzNiwzOTUuMzMwOTY4IDIxNy4yLDQwNi40MDI4NCAyMDQuMzg1ODQxLDQwNi40MDI4NCBDMTkxLjU3MTY4MSw0MDYuNDAyODQgMTgwLjY3OTY0NiwzOTUuMzMwOTY4IDE4MC42Nzk2NDYsMzgyLjMwNTIzNiBNNjcuMjc0MzM2Myw1NTQuODk2MTg0IEM2Ny4yNzQzMzYzLDUzNy4zMTE0NDYgODEuMzY5OTExNSw1MjIuOTgzMTQxIDk4LjY2OTAyNjUsNTIyLjk4MzE0MSBDMTE1Ljk2ODE0Miw1MjIuOTgzMTQxIDEzMC4wNjM3MTcsNTM3LjMxMTQ0NiAxMzAuMDYzNzE3LDU1NC44OTYxODQgQzEzMC4wNjM3MTcsNTcyLjQ4MDkyMiAxMTUuOTY4MTQyLDU4Ni44MDkyMjkgOTguNjY5MDI2NSw1ODYuODA5MjI5IEM4MC43MjkyMDM2LDU4Ni44MDkyMjkgNjcuMjc0MzM2Myw1NzIuNDgwOTIyIDY3LjI3NDMzNjMsNTU0Ljg5NjE4NCBNMTI0LjI5NzM0NSw2MzAuNDQ1NDMgQzEyNC4yOTczNDUsNjIwLjAyNDg0NSAxMzIuNjI2NTQ5LDYxMi4yMDk0MDYgMTQyLjIzNzE2OCw2MTIuMjA5NDA2IEMxNTIuNDg4NDk2LDYxMi4yMDk0MDYgMTYwLjE3Njk5MSw2MjAuNjc2MTMxIDE2MC4xNzY5OTEsNjMwLjQ0NTQzIEMxNjAuMTc2OTkxLDY0MC44NjYwMTYgMTUxLjg0Nzc4OCw2NDguNjgxNDU1IDE0Mi4yMzcxNjgsNjQ4LjY4MTQ1NSBDMTMyLjYyNjU0OSw2NDguNjgxNDU1IDEyNC4yOTczNDUsNjQwLjg2NjAxNiAxMjQuMjk3MzQ1LDYzMC40NDU0MyBNMzE3Ljc5MTE1MSw1MTUuODE4OTg5IEMzMTcuNzkxMTUxLDUwNy4zNTIyNjMgMzI0LjgzODkzOCw1MDAuMTg4MTExIDMzMy4xNjgxNDIsNTAwLjE4ODExMSBDMzQxLjQ5NzM0Niw1MDAuMTg4MTExIDM0OC41NDUxMzIsNTA3LjM1MjI2MyAzNDguNTQ1MTMyLDUxNS44MTg5ODkgQzM0OC41NDUxMzIsNTI0LjI4NTcxNCAzNDEuNDk3MzQ2LDUzMS40NDk4NjcgMzMzLjE2ODE0Miw1MzEuNDQ5ODY3IEMzMjQuMTk4MjMxLDUzMS40NDk4NjcgMzE3Ljc5MTE1MSw1MjQuMjg1NzE0IDMxNy43OTExNTEsNTE1LjgxODk4OSBNMTE5LjgxMjM4OSw0MjUuOTQxNDM3IEMxMTkuODEyMzg5LDQxNy40NzQ3MTIgMTI2Ljg2MDE3Nyw0MTAuMzEwNTU5IDEzNS4xODkzODEsNDEwLjMxMDU1OSBDMTQzLjUxODU4NCw0MTAuMzEwNTU5IDE1MC41NjYzNzIsNDE3LjQ3NDcxMiAxNTAuNTY2MzcyLDQyNS45NDE0MzcgQzE1MC41NjYzNzIsNDM0LjQwODE2MyAxNDMuNTE4NTg0LDQ0MS41NzIzMTUgMTM1LjE4OTM4MSw0NDEuNTcyMzE1IEMxMjYuODYwMTc3LDQ0MS41NzIzMTUgMTE5LjgxMjM4OSw0MzQuNDA4MTYzIDExOS44MTIzODksNDI1Ljk0MTQzNyBNNjU4LjY0Nzc4OCw0NzYuMDkwNTA3IEM2NTguNjQ3Nzg4LDQ2Ny42MjM3NzkgNjY1LjY5NTU3NSw0NjAuNDU5NjI3IDY3NC4wMjQ3NzksNDYwLjQ1OTYyNyBDNjgyLjM1Mzk4Myw0NjAuNDU5NjI3IDY4OS40MDE3NjksNDY3LjYyMzc3OSA2ODkuNDAxNzY5LDQ3Ni4wOTA1MDcgQzY4OS40MDE3NjksNDg0LjU1NzIzMiA2ODIuMzUzOTgzLDQ5MS43MjEzODUgNjc0LjAyNDc3OSw0OTEuNzIxMzg1IEM2NjUuNjk1NTc1LDQ5MS43MjEzODUgNjU4LjY0Nzc4OCw0ODQuNTU3MjMyIDY1OC42NDc3ODgsNDc2LjA5MDUwNyBNNTY4LjMwNzk2NCw2MzEuMDk2NzE3IEM1NjguMzA3OTY0LDYyMi42Mjk5OTEgNTc1LjM1NTc1Miw2MTUuNDY1ODM5IDU4My42ODQ5NTcsNjE1LjQ2NTgzOSBDNTkyLjAxNDE1OSw2MTUuNDY1ODM5IDU5OS4wNjE5NDcsNjIyLjYyOTk5MSA1OTkuMDYxOTQ3LDYzMS4wOTY3MTcgQzU5OS4wNjE5NDcsNjM5LjU2MzQ0MyA1OTIuMDE0MTU5LDY0Ni43Mjc1OTUgNTgzLjY4NDk1Nyw2NDYuNzI3NTk1IEM1NzQuNzE1MDQzLDY0Ni4wNzYzMDggNTY4LjMwNzk2NCw2MzkuNTYzNDQzIDU2OC4zMDc5NjQsNjMxLjA5NjcxNyBNNDA0LjI4NjcyNiw3MDcuOTQ4NTM2IEM0MDQuMjg2NzI2LDY5NS41NzQwOTEgNDE0LjUzODA1Myw2ODUuMTUzNTA2IDQyNi43MTE1MDUsNjg1LjE1MzUwNiBDNDM4Ljg4NDk1Nyw2ODUuMTUzNTA2IDQ0OS4xMzYyODQsNjk1LjU3NDA5MSA0NDkuMTM2Mjg0LDcwNy45NDg1MzYgQzQ0OS4xMzYyODQsNzIwLjMyMjk4MiA0MzguODg0OTU3LDczMC43NDM1NjcgNDI2LjcxMTUwNSw3MzAuNzQzNTY3IEM0MTMuODk3MzQ2LDczMC4wOTIyOCA0MDQuMjg2NzI2LDcyMC4zMjI5ODIgNDA0LjI4NjcyNiw3MDcuOTQ4NTM2IE0yODguMzE4NTg0LDcwNC4wNDA4MTcgQzI4OC4zMTg1ODQsNjg3LjEwNzM2NiAzMDEuNzczNDUyLDY3NC4wODE2MzIgMzE3Ljc5MTE1MSw2NzQuMDgxNjMyIEMzMzQuNDQ5NTU4LDY3NC4wODE2MzIgMzQ3LjkwNDQyNSw2ODcuNzU4NjUyIDM0Ny45MDQ0MjUsNzA0LjA0MDgxNyBDMzQ3LjkwNDQyNSw3MjAuOTc0MjY4IDMzNC40NDk1NTgsNzM0IDMxNy43OTExNTEsNzM0IEMzMDEuNzczNDUyLDczNCAyODguMzE4NTg0LDcyMC45NzQyNjggMjg4LjMxODU4NCw3MDQuMDQwODE3IE0zNDcuMjYzNzE2LDY0Ni4wNzYzMDggQzM0Ny4yNjM3MTYsNjI5LjE0Mjg1NyAzNjAuNzE4NTg0LDYxNi4xMTcxMjUgMzc2LjczNjI4NCw2MTYuMTE3MTI1IEMzOTMuMzk0NjksNjE2LjExNzEyNSA0MDYuODQ5NTU4LDYyOS43OTQxNDQgNDA2Ljg0OTU1OCw2NDYuMDc2MzA4IEM0MDYuODQ5NTU4LDY2My4wMDk3NiAzOTMuMzk0NjksNjc2LjY4Njc3OCAzNzYuNzM2Mjg0LDY3Ni42ODY3NzggQzM2MC43MTg1ODQsNjc2LjY4Njc3OCAzNDcuMjYzNzE2LDY2My4wMDk3NiAzNDcuMjYzNzE2LDY0Ni4wNzYzMDggTTI2OS43MzgwNTMsNTc1LjczNzM1NSBDMjY5LjczODA1Myw1NTguODAzOTAzIDI4My4xOTI5MjEsNTQ1Ljc3ODE3MiAyOTkuMjEwNjIsNTQ1Ljc3ODE3MiBDMzE1Ljg2OTAyNiw1NDUuNzc4MTcyIDMyOS4zMjM4OTQsNTU5LjQ1NTE5IDMyOS4zMjM4OTQsNTc1LjczNzM1NSBDMzI5LjMyMzg5NCw1OTIuMDE5NTIyIDMxNS44NjkwMjYsNjA2LjM0NzgyNyAyOTkuMjEwNjIsNjA2LjM0NzgyNyBDMjgzLjE5MjkyMSw2MDYuMzQ3ODI3IDI2OS43MzgwNTMsNTkyLjY3MDgwOCAyNjkuNzM4MDUzLDU3NS43MzczNTUgTTE4MC42Nzk2NDYsNTYzLjM2MjkxIEMxODAuNjc5NjQ2LDU0NS4xMjY4ODUgMTk1LjQxNTkyOSw1MzAuMTQ3Mjk0IDIxMy4zNTU3NTIsNTMwLjE0NzI5NCBDMjMxLjI5NTU3NSw1MzAuMTQ3Mjk0IDI0Ni4wMzE4NTgsNTQ1LjEyNjg4NSAyNDYuMDMxODU4LDU2My4zNjI5MSBDMjQ2LjAzMTg1OCw1ODEuNTk4OTM2IDIzMS4yOTU1NzUsNTk2LjU3ODUyOCAyMTMuMzU1NzUyLDU5Ni41Nzg1MjggQzE5NS40MTU5MjksNTk1LjkyNzI0MSAxODAuNjc5NjQ2LDU4MS41OTg5MzYgMTgwLjY3OTY0Niw1NjMuMzYyOTEgTTMyMC45OTQ2OSwzNjkuOTMwNzkxIEMzMjAuOTk0NjksMzU4LjIwNzYzIDMzMC42MDUzMSwzNDguNDM4MzMxIDM0Mi4xMzgwNTMsMzQ4LjQzODMzMSBDMzUzLjY3MDc5NiwzNDguNDM4MzMxIDM2My4yODE0MTYsMzU4LjIwNzYzIDM2My4yODE0MTYsMzY5LjkzMDc5MSBDMzYzLjI4MTQxNiwzODEuNjUzOTQ5IDM1My42NzA3OTYsMzkxLjQyMzI0OCAzNDIuMTM4MDUzLDM5MS40MjMyNDggQzMzMC42MDUzMSwzOTEuNDIzMjQ4IDMyMC45OTQ2OSwzODEuNjUzOTQ5IDMyMC45OTQ2OSwzNjkuOTMwNzkxIE01NTkuOTc4NzYyLDM3MS4yMzMzNjQgQzU1OS45Nzg3NjIsMzU3LjU1NjM0MyA1NzAuODcwNzk2LDM0Ni40ODQ0NzEgNTg0LjMyNTY2MywzNDYuNDg0NDcxIEM1OTcuNzgwNTMxLDM0Ni40ODQ0NzEgNjA4LjY3MjU2NywzNTcuNTU2MzQzIDYwOC42NzI1NjcsMzcxLjIzMzM2NCBDNjA4LjY3MjU2NywzODQuOTEwMzgyIDU5Ny43ODA1MzEsMzk1Ljk4MjI1NCA1ODQuMzI1NjYzLDM5NS45ODIyNTQgQzU3MC44NzA3OTYsMzk1Ljk4MjI1NCA1NTkuOTc4NzYyLDM4NC45MTAzODIgNTU5Ljk3ODc2MiwzNzEuMjMzMzY0IE01MzAuNTA2MTk1LDU0My4xNzMwMjUgQzUzMC41MDYxOTUsNTI5LjQ5NjAwNyA1NDEuMzk4MjMxLDUxOC40MjQxMzUgNTU0Ljg1MzA5Niw1MTguNDI0MTM1IEM1NjguMzA3OTY0LDUxOC40MjQxMzUgNTc5LjIsNTI5LjQ5NjAwNyA1NzkuMiw1NDMuMTczMDI1IEM1NzkuMiw1NTYuODUwMDQ0IDU2OC4zMDc5NjQsNTY3LjkyMTkxNiA1NTQuODUzMDk2LDU2Ny45MjE5MTYgQzU0MS4zOTgyMzEsNTY4LjU3MzIwMiA1MzAuNTA2MTk1LDU1Ni44NTAwNDQgNTMwLjUwNjE5NSw1NDMuMTczMDI1IE02MTcuNjQyNDc4LDU0Ny43MzIwMzEgQzYxNy42NDI0NzgsNTI2Ljg5MDg2MSA2MzQuMzAwODg1LDUwOS45NTc0MDkgNjU0LjgwMzU0MSw1MDkuOTU3NDA5IEM2NzUuMzA2MTk1LDUwOS45NTc0MDkgNjkxLjk2NDYwMSw1MjYuODkwODYxIDY5MS45NjQ2MDEsNTQ3LjczMjAzMSBDNjkxLjk2NDYwMSw1NjguNTczMjAyIDY3NS4zMDYxOTUsNTg1LjUwNjY1NiA2NTQuODAzNTQxLDU4NS41MDY2NTYgQzYzNC4zMDA4ODUsNTg1LjUwNjY1NiA2MTcuNjQyNDc4LDU2OC41NzMyMDIgNjE3LjY0MjQ3OCw1NDcuNzMyMDMxIE00OTUuMjY3MjU3LDY3MC4xNzM5MTIgQzQ5NS4yNjcyNTcsNjU1LjE5NDMyMSA1MDcuNDQwNzA5LDY0Mi44MTk4NzYgNTIyLjE3Njk5LDY0Mi44MTk4NzYgQzUzNi45MTMyNzQsNjQyLjgxOTg3NiA1NDkuMDg2NzI2LDY1NS4xOTQzMjEgNTQ5LjA4NjcyNiw2NzAuMTczOTEyIEM1NDkuMDg2NzI2LDY4NS4xNTM1MDYgNTM2LjkxMzI3NCw2OTcuNTI3OTUxIDUyMi4xNzY5OSw2OTcuNTI3OTUxIEM1MDcuNDQwNzA5LDY5Ny41Mjc5NTEgNDk1LjI2NzI1Nyw2ODUuMTUzNTA2IDQ5NS4yNjcyNTcsNjcwLjE3MzkxMiBNNDY1Ljc5NDY5LDU1LjM1OTM2MTEgQzQ2NS43OTQ2OSw0MS4wMzEwNTU5IDQ3Ny4zMjc0MzMsMjkuOTU5MTgzNyA0OTAuNzgyMzAxLDI5Ljk1OTE4MzcgQzUwNC44Nzc4NzUsMjkuOTU5MTgzNyA1MTUuNzY5OTExLDQxLjY4MjM0MjUgNTE1Ljc2OTkxMSw1NS4zNTkzNjExIEM1MTUuNzY5OTExLDY5LjY4NzY2NjQgNTA0LjIzNzE2OCw4MC43NTk1Mzg3IDQ5MC43ODIzMDEsODAuNzU5NTM4NyBDNDc3LjMyNzQzMyw4MC43NTk1Mzg3IDQ2NS43OTQ2OSw2OS42ODc2NjY0IDQ2NS43OTQ2OSw1NS4zNTkzNjExIE0yMzIuNTc2OTksMTQ5Ljc5NTkxOCBDMjMyLjU3Njk5LDEzMC4yNTczMiAyNDcuOTUzOTgzLDExNC42MjY0NDIgMjY3LjE3NTIyMSwxMTQuNjI2NDQyIEMyODYuMzk2NDU5LDExNC42MjY0NDIgMzAxLjc3MzQ1MiwxMzAuMjU3MzIgMzAxLjc3MzQ1MiwxNDkuNzk1OTE4IEMzMDEuNzczNDUyLDE2OS4zMzQ1MTYgMjg2LjM5NjQ1OSwxODQuOTY1Mzk1IDI2Ny4xNzUyMjEsMTg0Ljk2NTM5NSBDMjQ3Ljk1Mzk4MywxODQuOTY1Mzk1IDIzMi41NzY5OSwxNjkuMzM0NTE2IDIzMi41NzY5OSwxNDkuNzk1OTE4IiBpZD0iU2hhcGUiPjwvcGF0aD4gICAgICAgICAgICA8L2c+ICAgICAgICAgICAgPHBhdGggZD0iTTE3NiwyNzMuMTI2MzE2IEMxNzYsMjQxLjggMjAyLjE0MDU0MSwyMTcgMjMzLjY0MzI0MywyMTcgQzI2NS44MTYyMTUsMjE3IDI5MS4yODY0ODcsMjQyLjQ1MjYzMSAyOTEuMjg2NDg3LDI3My4xMjYzMTYgQzI5MS4yODY0ODcsMzA0LjQ1MjYzMSAyNjUuMTQ1OTQ2LDMyOS4yNTI2MzEgMjMzLjY0MzI0MywzMjkuMjUyNjMxIEMyMDIuMTQwNTQxLDMyOS4yNTI2MzEgMTc2LDMwNC40NTI2MzEgMTc2LDI3My4xMjYzMTYgTTQ3Ni45NTEzNTIsMjkwLjc0NzM2OSBDNDc2Ljk1MTM1MiwyNzEuODIxMDUzIDQ5My4wMzc4MzcsMjU2LjE1Nzg5NCA1MTIuNDc1Njc2LDI1Ni4xNTc4OTQgQzUzMS45MTM1MTMsMjU2LjE1Nzg5NCA1NDgsMjcxLjgyMTA1MyA1NDgsMjkwLjc0NzM2OSBDNTQ4LDMwOS42NzM2ODQgNTMxLjkxMzUxMywzMjUuMzM2ODQzIDUxMi40NzU2NzYsMzI1LjMzNjg0MyBDNDkyLjM2NzU2NywzMjUuMzM2ODQzIDQ3Ni45NTEzNTIsMzEwLjMyNjMxNiA0NzYuOTUxMzUyLDI5MC43NDczNjkgTTM3OS43NjIxNjMsNDUzLjI1MjYzMSBDMzc5Ljc2MjE2Myw0MTIuNzg5NDczIDQxMy45NDU5NDYsMzc5LjUwNTI2MyA0NTUuNTAyNzAyLDM3OS41MDUyNjMgQzQ5Ny4wNTk0NTksMzc5LjUwNTI2MyA1MzEuMjQzMjQzLDQxMi43ODk0NzMgNTMxLjI0MzI0Myw0NTMuMjUyNjMxIEM1MzEuMjQzMjQzLDQ5My43MTU3OSA0OTcuMDU5NDU5LDUyNyA0NTUuNTAyNzAyLDUyNyBDNDEzLjk0NTk0Niw1MjcgMzc5Ljc2MjE2Myw0OTQuMzY4NDIgMzc5Ljc2MjE2Myw0NTMuMjUyNjMxIiBpZD0iU2hhcGUiIGZpbGw9IiNGRjczMTQiPjwvcGF0aD4gICAgICAgIDwvZz4gICAgPC9nPjwvc3ZnPg==);
+}
diff --git a/_sass/3scale/_syntax-highlighting.scss b/_sass/3scale/_syntax-highlighting.scss
new file mode 100644
index 0000000..764f670
--- /dev/null
+++ b/_sass/3scale/_syntax-highlighting.scss
@@ -0,0 +1,72 @@
+/**
+ * Syntax highlighting styles
+ */
+.highlight {
+ background: #fff;
+ @extend %vertical-rhythm;
+ width: 100%;
+
+ .highlighter-rouge & {
+ background: #eef;
+ }
+
+ .c { color: #998; font-style: italic } // Comment
+ .err { color: #a61717; background-color: #e3d2d2 } // Error
+ .k { font-weight: bold } // Keyword
+ .o { font-weight: bold } // Operator
+ .cm { color: #998; font-style: italic } // Comment.Multiline
+ .cp { color: #999; font-weight: bold } // Comment.Preproc
+ .c1 { color: #998; font-style: italic } // Comment.Single
+ .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special
+ .gd { color: #000; background-color: #fdd } // Generic.Deleted
+ .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific
+ .ge { font-style: italic } // Generic.Emph
+ .gr { color: #a00 } // Generic.Error
+ .gh { color: #999 } // Generic.Heading
+ .gi { color: #000; background-color: #dfd } // Generic.Inserted
+ .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific
+ .go { color: #888 } // Generic.Output
+ .gp { color: #555 } // Generic.Prompt
+ .gs { font-weight: bold } // Generic.Strong
+ .gu { color: #aaa } // Generic.Subheading
+ .gt { color: #a00 } // Generic.Traceback
+ .kc { font-weight: bold } // Keyword.Constant
+ .kd { font-weight: bold } // Keyword.Declaration
+ .kp { font-weight: bold } // Keyword.Pseudo
+ .kr { font-weight: bold } // Keyword.Reserved
+ .kt { color: #458; font-weight: bold } // Keyword.Type
+ .m { color: #099 } // Literal.Number
+ .s { color: #d14 } // Literal.String
+ .na { color: #008080 } // Name.Attribute
+ .nb { color: #0086B3 } // Name.Builtin
+ .nc { color: #458; font-weight: bold } // Name.Class
+ .no { color: #008080 } // Name.Constant
+ .ni { color: #800080 } // Name.Entity
+ .ne { color: #900; font-weight: bold } // Name.Exception
+ .nf { color: #900; font-weight: bold } // Name.Function
+ .nn { color: #555 } // Name.Namespace
+ .nt { color: #000080 } // Name.Tag
+ .nv { color: #008080 } // Name.Variable
+ .ow { font-weight: bold } // Operator.Word
+ .w { color: #bbb } // Text.Whitespace
+ .mf { color: #099 } // Literal.Number.Float
+ .mh { color: #099 } // Literal.Number.Hex
+ .mi { color: #099 } // Literal.Number.Integer
+ .mo { color: #099 } // Literal.Number.Oct
+ .sb { color: #d14 } // Literal.String.Backtick
+ .sc { color: #d14 } // Literal.String.Char
+ .sd { color: #d14 } // Literal.String.Doc
+ .s2 { color: #d14 } // Literal.String.Double
+ .se { color: #d14 } // Literal.String.Escape
+ .sh { color: #d14 } // Literal.String.Heredoc
+ .si { color: #d14 } // Literal.String.Interpol
+ .sx { color: #d14 } // Literal.String.Other
+ .sr { color: #009926 } // Literal.String.Regex
+ .s1 { color: #d14 } // Literal.String.Single
+ .ss { color: #990073 } // Literal.String.Symbol
+ .bp { color: #999 } // Name.Builtin.Pseudo
+ .vc { color: #008080 } // Name.Variable.Class
+ .vg { color: #008080 } // Name.Variable.Global
+ .vi { color: #008080 } // Name.Variable.Instance
+ .il { color: #099 } // Literal.Number.Integer.Long
+}
diff --git a/apple-touch-icon.png b/apple-touch-icon.png
new file mode 100644
index 0000000..0e42024
Binary files /dev/null and b/apple-touch-icon.png differ
diff --git a/assets/404.js b/assets/404.js
new file mode 100644
index 0000000..2fb02ea
--- /dev/null
+++ b/assets/404.js
@@ -0,0 +1,13 @@
+let nav_404 = document.getElementById('nav_404')
+
+let nav_contribute2contribute = new LeaderLine(
+ LeaderLine.pointAnchor(nav_404, {x: '-5%', y: '50%'}),
+ LeaderLine.pointAnchor(article_404, {x: '10%', y: 0 }),
+ {
+ color: '#FF7314',
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ //dash: {animation: false},
+ path: 'straight'
+ }
+);
diff --git a/assets/anim-event.min.js b/assets/anim-event.min.js
new file mode 100644
index 0000000..8fd3c7b
--- /dev/null
+++ b/assets/anim-event.min.js
@@ -0,0 +1,2 @@
+/*! AnimEvent v1.0.16 (c) anseki https://github.com/anseki/anim-event */
+var AnimEvent=function(n){var e={};function t(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return n[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}return t.m=n,t.c=e,t.d=function(n,e,r){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:r})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(r,o,function(e){return n[e]}.bind(null,o));return r},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){"use strict";t.r(e);var r=500,o=[],i=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||function(n){return setTimeout(n,1e3/60)},u=window.cancelAnimationFrame||window.mozCancelAnimationFrame||window.webkitCancelAnimationFrame||window.msCancelAnimationFrame||function(n){return clearTimeout(n)},a=Date.now(),l=void 0;function c(){var n=void 0,e=void 0;l&&(u.call(window,l),l=null),o.forEach(function(e){var t;(t=e.event)&&(e.event=null,e.listener(t),n=!0)}),n?(a=Date.now(),e=!0):Date.now()-a-1&&(o.splice(e,1),!o.length&&l&&(u.call(window,l),l=null))}};e.default=d}]).default;
\ No newline at end of file
diff --git a/assets/contribute.js b/assets/contribute.js
new file mode 100644
index 0000000..37a8c0e
--- /dev/null
+++ b/assets/contribute.js
@@ -0,0 +1,13 @@
+let nav_contribute = document.getElementById('nav_contribute')
+
+let nav_contribute2contribute = new LeaderLine(
+ LeaderLine.pointAnchor(nav_contribute, {x: '-5%', y: '50%'}),
+ LeaderLine.pointAnchor(contribute, {x: '10%', y: 0 }),
+ {
+ color: '#FF7314',
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ //dash: {animation: false},
+ path: 'straight'
+ }
+);
diff --git a/assets/features.js b/assets/features.js
new file mode 100644
index 0000000..6dca590
--- /dev/null
+++ b/assets/features.js
@@ -0,0 +1,71 @@
+let nav_share = document.getElementById('nav_share')
+let nav_secure = document.getElementById('nav_secure')
+let nav_control = document.getElementById('nav_control')
+let nav_analyze = document.getElementById('nav_analyze')
+let nav_monetize = document.getElementById('nav_monetize')
+
+let nav_share2share = new LeaderLine(
+ LeaderLine.pointAnchor(nav_share, {x: '33.5%', y: '55%'}),
+ LeaderLine.pointAnchor(share, {x: '10%', y: 0 }),
+ {
+ color: '#FF7314',
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ path: 'straight'
+ }
+);
+
+let nav_secure2secure = new LeaderLine(
+ LeaderLine.pointAnchor(nav_secure, {x: '42.5%', y: '58%'}),
+ LeaderLine.pointAnchor(secure, {x: '10%', y: 0 }),
+ {
+ color: '#FF7314',
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ path: 'straight'
+ }
+);
+
+let nav_control2control = new LeaderLine(
+ LeaderLine.pointAnchor(nav_control, {x: '83%', y: '58%'}),
+ LeaderLine.pointAnchor(control, {x: '10%', y: 0 }),
+ {
+ color: '#FF7314',
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ path: 'straight'
+ }
+);
+
+let nav_analyze2analyze = new LeaderLine(
+ LeaderLine.pointAnchor(nav_analyze, {x: '39%', y: '64%'}),
+ LeaderLine.pointAnchor(analyze, {x: '10%', y: 0 }),
+ {
+ color: '#FF7314',
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ path: 'straight'
+ }
+);
+
+let nav_monetize2monetize = new LeaderLine(
+ LeaderLine.pointAnchor(nav_monetize, {x: '71.6%', y: '25%'}),
+ LeaderLine.pointAnchor(monetize, {x: '10%', y: 0 }),
+ {
+ color: '#FF7314',
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ path: 'straight'
+ }
+);
+
+ // Update position delayed so it actually works as somehwo it wasn't on this page
+ window.addEventListener('resize', function(/* event */) {
+ setTimeout(function(){
+ nav_share2share.position();
+ nav_secure2secure.position();
+ nav_control2control.position();
+ nav_analyze2analyze.position();
+ nav_monetize2monetize.position();
+ }, 400);
+ });
diff --git a/assets/grasp.js b/assets/grasp.js
new file mode 100644
index 0000000..2a3da16
--- /dev/null
+++ b/assets/grasp.js
@@ -0,0 +1,350 @@
+let color_request = 'rgba(255, 115, 20, .8)'
+let color_response = 'rgba(0, 136, 206, .8)'
+let color_control = 'rgba(150, 150, 150, 0.5)'
+let color_admin_portal = 'rgba(192, 192, 192, 0.5)'
+let color_dev_portal = 'rgba(230, 230, 230, 0.5)'
+
+let caption_outline_color = '#dadada'
+
+let client = document.getElementById('client')
+let apicast = document.getElementById('apicast')
+let apisonator = document.getElementById('apisonator')
+let apicenter = document.getElementById('apicenter')
+let api = document.getElementById('api')
+
+let client2policy_chain = new LeaderLine(
+ LeaderLine.pointAnchor(client, {x: '77%', y: '100%'}),
+ LeaderLine.pointAnchor(policy_chain, {x: '95%', y: '25%'}),
+ {
+ color: color_request,
+ //startLabel: 'Request',
+ startLabel: LeaderLine.captionLabel('HTTP Request', {color: color_request, outlineColor: caption_outline_color, offset: [10, 0]}),
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ // dash: {animation: false},
+ path: 'straight'
+ }
+);
+
+let policy_chain2policy1 = new LeaderLine(
+ LeaderLine.pointAnchor(policy_chain, {x: '95%', y: '60%'}),
+ LeaderLine.pointAnchor(policy1, {x: '95%', y: '25%'}),
+ {
+ color: color_request,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ // dash: {animation: false},
+ path: 'straight'
+ }
+);
+
+
+//client2policy1.setOptions({startSocket: 'bottom', endSocket: 'top'});
+
+
+
+let policy12policy2 = new LeaderLine(
+ LeaderLine.pointAnchor(policy1, {x: '95%', y: '60%'}),
+ LeaderLine.pointAnchor(policy2, {x: '95%', y: '25%'}),
+ {
+ color: color_request,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ // dash: {animation: false},
+ path: 'straight'
+ }
+);
+
+let policy22policy3 = new LeaderLine(
+ LeaderLine.pointAnchor(policy2, {x: '95%', y: '60%'}),
+ LeaderLine.pointAnchor(policy3, {x: '95%', y: '25%'}),
+ {
+ color: color_request,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ // dash: {animation: false},
+ path: 'straight'
+ }
+);
+
+let policy32policy4 = new LeaderLine(
+ LeaderLine.pointAnchor(policy3, {x: '95%', y: '60%'}),
+ LeaderLine.pointAnchor(policy4, {x: '95%', y: '25%'}),
+ {
+ color: color_request,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ // dash: {animation: false},
+ path: 'straight'
+ }
+);
+
+let policy42policy5 = new LeaderLine(
+ LeaderLine.pointAnchor(policy4, {x: '95%', y: '60%'}),
+ LeaderLine.pointAnchor(policy5, {x: '95%', y: '35%'}),
+ {
+ color: color_request,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ // dash: {animation: false},
+ path: 'straight'
+ }
+);
+//policy12policy5.setOptions({startSocket: 'bottom', endSocket: 'top'});
+
+
+let policy52api = new LeaderLine(
+ LeaderLine.pointAnchor(policy5, {x: '95%', y: '75%'}),
+ LeaderLine.pointAnchor(api, {x: '100%', y: '50%'}),
+ {
+ color: color_request,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ // dash: {animation: false},
+ path: 'straight'
+ }
+);
+
+//policy52api.setOptions({startSocket: 'bottom', endSocket: 'top'});
+
+
+let api2policy5 = new LeaderLine(
+ LeaderLine.pointAnchor(api, {x: '70%', y: 0}),
+ LeaderLine.pointAnchor(policy5, {x: '5%', y: '75%'}),
+ {
+ color: color_response,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ // dash: {animation: false},
+ path: 'straight'
+ }
+);
+
+let policy52policy4 = new LeaderLine(
+ LeaderLine.pointAnchor(policy5, {x: '5%', y: '25%' }),
+ LeaderLine.pointAnchor(policy4, {x: '5%', y: '55%'}),
+ {
+ color: color_response,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ // dash: {animation: false},
+ path: 'straight'
+ }
+);
+
+let policy42policy3 = new LeaderLine(
+ LeaderLine.pointAnchor(policy4, {x: '5%', y: '15%'}),
+ LeaderLine.pointAnchor(policy3, {x: '5%', y: '55%' }),
+ {
+ color: color_response,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ // dash: {animation: false},
+ path: 'straight'
+ }
+);
+
+let policy32policy2 = new LeaderLine(
+ LeaderLine.pointAnchor(policy3, {x: '5%', y: '15%'}),
+ LeaderLine.pointAnchor(policy2, {x: '5%', y: '55%' }),
+ {
+ color: color_response,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ // dash: {animation: false},
+ path: 'straight'
+ }
+);
+
+let policy22policy1 = new LeaderLine(
+ LeaderLine.pointAnchor(policy2, {x: '5%', y: '15%'}),
+ LeaderLine.pointAnchor(policy1, {x: '5%', y: '55%' }),
+ {
+ color: color_response,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ // dash: {animation: false},
+ path: 'straight'
+ }
+);
+
+let policy12policy_chain = new LeaderLine(
+ LeaderLine.pointAnchor(policy1, {x: '5%', y: '15%'}),
+ LeaderLine.pointAnchor(policy_chain, {x: '5%', y: '55%' }),
+ {
+ color: color_response,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ // dash: {animation: false},
+ path: 'straight'
+ }
+);
+
+let policy_chain2client = new LeaderLine(
+ LeaderLine.pointAnchor(policy_chain , {x: '5%', y: '15%'}),
+ LeaderLine.pointAnchor(client, {x: '10%', y: '100%'}),
+ {
+ color: color_response,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ // dash: {animation: false},
+ endLabel: 'Response',
+ endLabel: LeaderLine.captionLabel('HTTP Response', {color: color_response, outlineColor: caption_outline_color, offset: [10, 0]}),
+ path: 'straight',
+ }
+);
+
+//api2policy5.setOptions({startSocket: 'left', endSocket: 'left'});
+
+
+
+//policy52policy1.setOptions({startSocket: 'top', endSocket: 'bottom'});
+
+
+
+
+
+//policy12client.setOptions({startSocket: 'top', endSocket: 'bottom'});
+
+
+
+
+let policy32authrep = new LeaderLine(
+ LeaderLine.pointAnchor(policy3, {x: '95%', y: '20%'}),
+ LeaderLine.pointAnchor(authenticate, {x: '5%', y: '15%'}),
+ {
+ color: color_control,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ path: 'straight',
+ // dash: {animation: false},
+ //endLabel: 'Control',
+ }
+);
+
+
+
+
+let authenticate2authorize = new LeaderLine(
+ LeaderLine.pointAnchor(authenticate, {x: '5%', y: '70%'}),
+ LeaderLine.pointAnchor(authorize, {x: '5%', y: '20%'}),
+ {
+ color: color_control,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ path: 'straight',
+ // dash: {animation: false},
+ }
+);
+
+let authorize2policy3 = new LeaderLine(
+ LeaderLine.pointAnchor(authorize, {x: '5%', y: '70%'}),
+ LeaderLine.pointAnchor(policy3, {x: '95%', y: '60%'}),
+ {
+ color: color_control,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ path: 'straight',
+ // dash: {animation: false},
+ }
+);
+
+let authorize2report = new LeaderLine(
+ LeaderLine.pointAnchor(authorize, {x: '5%', y: '70%'}),
+ LeaderLine.pointAnchor(report, {x: '5%', y: '20%'}),
+ {
+ color: color_control,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ path: 'straight',
+ // dash: {animation: false},
+ }
+);
+
+
+
+// Apicenter
+
+let report2analytics = new LeaderLine(
+ LeaderLine.pointAnchor(report, {x: '80%', y: '50%'}),
+ LeaderLine.pointAnchor(analytics, {x: '80%', y: '50%'}),
+ {
+ color: color_admin_portal,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ path: 'straight',
+ // dash: {animation: false},
+ }
+);
+
+let report2portal = new LeaderLine(
+ LeaderLine.pointAnchor(report, {x: '90%', y: '50%'}),
+ LeaderLine.pointAnchor(portal, {x: '90%', y: '50%'}),
+ {
+ color: color_admin_portal,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ path: 'straight',
+ // dash: {animation: false},
+ }
+);
+
+let services2pisoni = new LeaderLine(
+ LeaderLine.pointAnchor(services, {x: '20%', y: '50%'}),
+ LeaderLine.pointAnchor(pisoni, {x: '20%', y: '50%'}),
+ {
+ color: color_admin_portal,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ path: 'straight',
+ // dash: {animation: false},
+ }
+);
+
+let plans2pisoni = new LeaderLine(
+ LeaderLine.pointAnchor(plans, {x: '15%', y: '50%'}),
+ LeaderLine.pointAnchor(pisoni, {x: '15%', y: '50%'}),
+ {
+ color: color_admin_portal,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ path: 'straight',
+ // dash: {animation: false},
+ }
+);
+
+let apps2pisoni = new LeaderLine(
+ LeaderLine.pointAnchor(apps, {x: '10%', y: '50%'}),
+ LeaderLine.pointAnchor(pisoni, {x: '10%', y: '50%'}),
+ {
+ color: color_admin_portal,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ path: 'straight',
+ // dash: {animation: false},
+ }
+);
+
+let pisoni2internal_api = new LeaderLine(
+ LeaderLine.pointAnchor(pisoni, {x: '25%', y: '50%'}),
+ LeaderLine.pointAnchor(internal_api, {x: '25%', y: '50%'}),
+ {
+ color: color_admin_portal,
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ path: 'straight',
+ // dash: {animation: false},
+ }
+);
+
+let policy_chain2services = new LeaderLine(
+ LeaderLine.pointAnchor(policy_chain, {x: '100%', y: '50%'}),
+ LeaderLine.pointAnchor(services, {x: '100%', y: '50%'}),
+ {
+ color: color_admin_portal,
+ startPlug: 'arrow2',
+ endPlug: 'arrow2',
+ path: 'straight',
+ // dash: {animation: false},
+ }
+);
diff --git a/assets/leader-line.min.js b/assets/leader-line.min.js
new file mode 100755
index 0000000..d6e6183
--- /dev/null
+++ b/assets/leader-line.min.js
@@ -0,0 +1,2 @@
+/*! LeaderLine v1.0.5 (c) anseki https://anseki.github.io/leader-line/ */
+var LeaderLine=function(){"use strict";var te,g,y,S,_,o,t,h,f,p,a,i,l,v="leader-line",M=1,I=2,C=3,L=4,n={top:M,right:I,bottom:C,left:L},A=1,V=2,P=3,N=4,T=5,m={straight:A,arc:V,fluid:P,magnet:N,grid:T},ne="behind",r=v+"-defs",s=' ',ae={disc:{elmId:"leader-line-disc",noRotate:!0,bBox:{left:-5,top:-5,width:10,height:10,right:5,bottom:5},widthR:2.5,heightR:2.5,bCircle:5,sideLen:5,backLen:5,overhead:0,outlineBase:1,outlineMax:4},square:{elmId:"leader-line-square",noRotate:!0,bBox:{left:-5,top:-5,width:10,height:10,right:5,bottom:5},widthR:2.5,heightR:2.5,bCircle:5,sideLen:5,backLen:5,overhead:0,outlineBase:1,outlineMax:4},arrow1:{elmId:"leader-line-arrow1",bBox:{left:-8,top:-8,width:16,height:16,right:8,bottom:8},widthR:4,heightR:4,bCircle:8,sideLen:8,backLen:8,overhead:8,outlineBase:2,outlineMax:1.5},arrow2:{elmId:"leader-line-arrow2",bBox:{left:-7,top:-8,width:11,height:16,right:4,bottom:8},widthR:2.75,heightR:4,bCircle:8,sideLen:8,backLen:7,overhead:4,outlineBase:1,outlineMax:1.75},arrow3:{elmId:"leader-line-arrow3",bBox:{left:-4,top:-5,width:12,height:10,right:8,bottom:5},widthR:3,heightR:2.5,bCircle:8,sideLen:5,backLen:4,overhead:8,outlineBase:1,outlineMax:2.5},hand:{elmId:"leader-line-hand",bBox:{left:-3,top:-12,width:40,height:24,right:37,bottom:12},widthR:10,heightR:6,bCircle:37,sideLen:12,backLen:3,overhead:37},crosshair:{elmId:"leader-line-crosshair",noRotate:!0,bBox:{left:-96,top:-96,width:192,height:192,right:96,bottom:96},widthR:48,heightR:48,bCircle:96,sideLen:96,backLen:96,overhead:0}},E={behind:ne,disc:"disc",square:"square",arrow1:"arrow1",arrow2:"arrow2",arrow3:"arrow3",hand:"hand",crosshair:"crosshair"},ie={disc:"disc",square:"square",arrow1:"arrow1",arrow2:"arrow2",arrow3:"arrow3",hand:"hand",crosshair:"crosshair"},W=[M,I,C,L],x="auto",oe={x:"left",y:"top",width:"width",height:"height"},B=80,R=4,F=5,G=120,D=8,z=3.75,j=10,H=30,U=.5522847,Z=.25*Math.PI,u=/^\s*(\-?[\d\.]+)\s*(\%)?\s*$/,b="http://www.w3.org/2000/svg",e="-ms-scroll-limit"in document.documentElement.style&&"-ms-ime-align"in document.documentElement.style&&!window.navigator.msPointerEnabled,le=!e&&!!document.uniqueID,re="MozAppearance"in document.documentElement.style,se=!(e||re||!window.chrome||!window.CSS),ue=!e&&!le&&!re&&!se&&!window.chrome&&"WebkitAppearance"in document.documentElement.style,he=le||e?.2:.1,pe={path:P,lineColor:"coral",lineSize:4,plugSE:[ne,"arrow1"],plugSizeSE:[1,1],lineOutlineEnabled:!1,lineOutlineColor:"indianred",lineOutlineSize:.25,plugOutlineEnabledSE:[!1,!1],plugOutlineSizeSE:[1,1]},k=(a={}.toString,i={}.hasOwnProperty.toString,l=i.call(Object),function(e){var t,n;return e&&"[object Object]"===a.call(e)&&(!(t=Object.getPrototypeOf(e))||(n=t.hasOwnProperty("constructor")&&t.constructor)&&"function"==typeof n&&i.call(n)===l)}),w=Number.isFinite||function(e){return"number"==typeof e&&window.isFinite(e)},c=function(){var e,x={ease:[.25,.1,.25,1],linear:[0,0,1,1],"ease-in":[.42,0,1,1],"ease-out":[0,0,.58,1],"ease-in-out":[.42,0,.58,1]},b=1e3/60/2,t=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||function(e){setTimeout(e,b)},n=window.cancelAnimationFrame||window.mozCancelAnimationFrame||window.webkitCancelAnimationFrame||window.msCancelAnimationFrame||function(e){clearTimeout(e)},a=Number.isFinite||function(e){return"number"==typeof e&&window.isFinite(e)},k=[],w=0;function l(){var i=Date.now(),o=!1;e&&(n.call(window,e),e=null),k.forEach(function(e){var t,n,a;if(e.framesStart){if((t=i-e.framesStart)>=e.duration&&e.count&&e.loopsLeft<=1)return a=e.frames[e.lastFrame=e.reverse?0:e.frames.length-1],e.frameCallback(a.value,!0,a.timeRatio,a.outputRatio),void(e.framesStart=null);if(t>e.duration){if(n=Math.floor(t/e.duration),e.count){if(n>=e.loopsLeft)return a=e.frames[e.lastFrame=e.reverse?0:e.frames.length-1],e.frameCallback(a.value,!0,a.timeRatio,a.outputRatio),void(e.framesStart=null);e.loopsLeft-=n}e.framesStart+=e.duration*n,t=i-e.framesStart}e.reverse&&(t=e.duration-t),a=e.frames[e.lastFrame=Math.round(t/b)],!1!==e.frameCallback(a.value,!1,a.timeRatio,a.outputRatio)?o=!0:e.framesStart=null}}),o&&(e=t.call(window,l))}function O(e,t){e.framesStart=Date.now(),null!=t&&(e.framesStart-=e.duration*(e.reverse?1-t:t)),e.loopsLeft=e.count,e.lastFrame=null,l()}return{add:function(n,e,t,a,i,o,l){var r,s,u,h,p,c,d,f,y,S,m,g,_,v=++w;function E(e,t){return{value:n(t),timeRatio:e,outputRatio:t}}if("string"==typeof i&&(i=x[i]),n=n||function(){},t=this._endIndex||this._string[this._currentIndex]<"0"||"9"=this._endIndex||this._string[this._currentIndex]<"0"||"9"=this._endIndex)return null;var e=null,t=this._string[this._currentIndex];if(this._currentIndex+=1,"0"===t)e=0;else{if("1"!==t)return null;e=1}return this._skipOptionalSpacesOrDelimiter(),e}};var a=function(e){if(!e||0===e.length)return[];var t=new o(e),n=[];if(t.initialCommandIsMoveTo())for(;t.hasMoreData();){var a=t.parseSegment();if(null===a)break;n.push(a)}return n},n=e.SVGPathElement.prototype.setAttribute,r=e.SVGPathElement.prototype.removeAttribute,d=e.Symbol?e.Symbol():"__cachedPathData",f=e.Symbol?e.Symbol():"__cachedNormalizedPathData",U=function(e,t,n,a,i,o,l,r,s,u){var h,p,c,d,f,y=function(e,t,n){return{x:e*Math.cos(n)-t*Math.sin(n),y:e*Math.sin(n)+t*Math.cos(n)}},S=(h=l,Math.PI*h/180),m=[];if(u)p=u[0],c=u[1],d=u[2],f=u[3];else{var g=y(e,t,-S);e=g.x,t=g.y;var _=y(n,a,-S),v=(e-(n=_.x))/2,E=(t-(a=_.y))/2,x=v*v/(i*i)+E*E/(o*o);1120*Math.PI/180){var C=c,L=n,A=a;c=s&&p=Math.abs(n)?0<=t?I:L:0<=n?C:M))})),E.position_path!==x.position_path||E.position_lineStrokeWidth!==x.position_lineStrokeWidth||[0,1].some(function(e){return E.position_plugOverheadSE[e]!==x.position_plugOverheadSE[e]||(i=b[e],o=x.position_socketXYSE[e],i.x!==o.x||i.y!==o.y||i.socketId!==o.socketId)||(t=_[e],n=x.position_socketGravitySE[e],(a=null==t?"auto":Array.isArray(t)?"array":"number")!==(null==n?"auto":Array.isArray(n)?"array":"number")||("array"===a?t[0]!==n[0]||t[1]!==n[1]:t!==n));var t,n,a,i,o})){switch(u.pathList.baseVal=v=[],u.pathList.animVal=null,E.position_path){case A:v.push([O(b[0]),O(b[1])]);break;case V:t="number"==typeof _[0]&&0<_[0]||"number"==typeof _[1]&&0<_[1],o=Z*(t?-1:1),l=Math.atan2(b[1].y-b[0].y,b[1].x-b[0].x),r=-l+o,c=Math.PI-l-o,d=_e(b[0],b[1])/Math.sqrt(2)*U,S={x:b[0].x+Math.cos(r)*d,y:b[0].y+Math.sin(r)*d*-1},m={x:b[1].x+Math.cos(c)*d,y:b[1].y+Math.sin(c)*d*-1},v.push([O(b[0]),S,m,O(b[1])]);break;case P:case N:s=[_[0],E.position_path===N?0:_[1]],h=[],p=[],b.forEach(function(e,t){var n,a,i,o,l,r=s[t];Array.isArray(r)?n={x:r[0],y:r[1]}:"number"==typeof r?n=e.socketId===M?{x:0,y:-r}:e.socketId===I?{x:r,y:0}:e.socketId===C?{x:0,y:r}:{x:-r,y:0}:(a=b[t?0:1],o=0<(i=E.position_plugOverheadSE[t])?G+(DR?(E.position_lineStrokeWidth-R)*F:0),e.socketId===M?((l=(e.y-a.y)/2)=t.x:t.dirId===r?e.y>=t.y:e.x<=t.x}function y(e,t){return t.dirId===o||t.dirId===r?e.x===t.x:e.y===t.y}function S(e){return e[0]?{contain:0,notContain:1}:{contain:1,notContain:0}}function m(e,t,n){return Math.abs(t[n]-e[n])}function g(e,t,n){return"x"===n?e.x=H?g(h[t.notContain],h[t.contain],o[t.contain]):h[t.contain].dirId)):(i=[{x:h[0].x,y:h[0].y},{x:h[1].x,y:h[1].y}],u.forEach(function(e,t){var n=0===t?1:0,a=m(i[t],i[n],o[t]);aj&&(y[a]-ej&&(y[a]-ea.outlineMax&&(t=a.outlineMax),t*=2*a.outlineBase,v=We(m,_.plugOutline_strokeWidthSE,e,t)||v,v=We(m,_.plugOutline_inStrokeWidthSE,e,_.plugOutline_colorTraSE[e]?t-he/(_.line_strokeWidth/pe.lineSize)/g.plugSizeSE[e]*2:t/2)||v)}),v)),(t.faces||ee.line||ee.plug||ee.lineOutline||ee.plugOutline)&&(ee.faces=(b=(E=e).curStats,k=E.aplStats,w=E.events,O=!1,!b.line_altColor&&We(E,k,"line_color",x=b.line_color,w.apl_line_color)&&(E.lineFace.style.stroke=x,O=!0),We(E,k,"line_strokeWidth",x=b.line_strokeWidth,w.apl_line_strokeWidth)&&(E.lineShape.style.strokeWidth=x+"px",O=!0,(re||le)&&(Ae(E,E.lineShape),le&&(Ae(E,E.lineFace),Ae(E,E.lineMaskCaps)))),We(E,k,"lineOutline_enabled",x=b.lineOutline_enabled,w.apl_lineOutline_enabled)&&(E.lineOutlineFace.style.display=x?"inline":"none",O=!0),b.lineOutline_enabled&&(We(E,k,"lineOutline_color",x=b.lineOutline_color,w.apl_lineOutline_color)&&(E.lineOutlineFace.style.stroke=x,O=!0),We(E,k,"lineOutline_strokeWidth",x=b.lineOutline_strokeWidth,w.apl_lineOutline_strokeWidth)&&(E.lineOutlineMaskShape.style.strokeWidth=x+"px",O=!0,le&&(Ae(E,E.lineOutlineMaskCaps),Ae(E,E.lineOutlineFace))),We(E,k,"lineOutline_inStrokeWidth",x=b.lineOutline_inStrokeWidth,w.apl_lineOutline_inStrokeWidth)&&(E.lineMaskShape.style.strokeWidth=x+"px",O=!0,le&&(Ae(E,E.lineOutlineMaskCaps),Ae(E,E.lineOutlineFace)))),We(E,k,"plug_enabled",x=b.plug_enabled,w.apl_plug_enabled)&&(E.plugsFace.style.display=x?"inline":"none",O=!0),b.plug_enabled&&[0,1].forEach(function(n){var e=b.plug_plugSE[n],t=e!==ne?ae[ie[e]]:null,a=Ne(n,t);We(E,k.plug_enabledSE,n,x=b.plug_enabledSE[n],w.apl_plug_enabledSE)&&(E.plugsFace.style[a.prop]=x?"url(#"+E.plugMarkerIdSE[n]+")":"none",O=!0),b.plug_enabledSE[n]&&(We(E,k.plug_plugSE,n,e,w.apl_plug_plugSE)&&(E.plugFaceSE[n].href.baseVal="#"+t.elmId,Pe(E,E.plugMarkerSE[n],a.orient,t.bBox,E.svg,E.plugMarkerShapeSE[n],E.plugsFace),O=!0,re&&Ae(E,E.plugsFace)),We(E,k.plug_colorSE,n,x=b.plug_colorSE[n],w.apl_plug_colorSE)&&(E.plugFaceSE[n].style.fill=x,O=!0,(se||ue||le)&&!b.line_colorTra&&Ae(E,le?E.lineMaskCaps:E.capsMaskLine)),["markerWidth","markerHeight"].forEach(function(e){var t="plug_"+e+"SE";We(E,k[t],n,x=b[t][n],w["apl_"+t])&&(E.plugMarkerSE[n][e].baseVal.value=x,O=!0)}),We(E,k.plugOutline_enabledSE,n,x=b.plugOutline_enabledSE[n],w.apl_plugOutline_enabledSE)&&(x?(E.plugFaceSE[n].style.mask="url(#"+E.plugMaskIdSE[n]+")",E.plugOutlineFaceSE[n].style.display="inline"):(E.plugFaceSE[n].style.mask="none",E.plugOutlineFaceSE[n].style.display="none"),O=!0),b.plugOutline_enabledSE[n]&&(We(E,k.plugOutline_plugSE,n,e,w.apl_plugOutline_plugSE)&&(E.plugOutlineFaceSE[n].href.baseVal=E.plugMaskShapeSE[n].href.baseVal=E.plugOutlineMaskShapeSE[n].href.baseVal="#"+t.elmId,[E.plugMaskSE[n],E.plugOutlineMaskSE[n]].forEach(function(e){e.x.baseVal.value=t.bBox.left,e.y.baseVal.value=t.bBox.top,e.width.baseVal.value=t.bBox.width,e.height.baseVal.value=t.bBox.height}),O=!0),We(E,k.plugOutline_colorSE,n,x=b.plugOutline_colorSE[n],w.apl_plugOutline_colorSE)&&(E.plugOutlineFaceSE[n].style.fill=x,O=!0,le&&(Ae(E,E.lineMaskCaps),Ae(E,E.lineOutlineMaskCaps))),We(E,k.plugOutline_strokeWidthSE,n,x=b.plugOutline_strokeWidthSE[n],w.apl_plugOutline_strokeWidthSE)&&(E.plugOutlineMaskShapeSE[n].style.strokeWidth=x+"px",O=!0),We(E,k.plugOutline_inStrokeWidthSE,n,x=b.plugOutline_inStrokeWidthSE[n],w.apl_plugOutline_inStrokeWidthSE)&&(E.plugMaskShapeSE[n].style.strokeWidth=x+"px",O=!0)))}),O)),(t.position||ee.line||ee.plug)&&(ee.position=Fe(e)),(t.path||ee.position)&&(ee.path=(C=(M=e).curStats,L=M.aplStats,A=M.pathList.animVal||M.pathList.baseVal,V=C.path_edge,P=!1,A&&(V.x1=V.x2=A[0][0].x,V.y1=V.y2=A[0][0].y,C.path_pathData=I=we(A,function(e){e.xV.x2&&(V.x2=e.x),e.y>V.y2&&(V.y2=e.y)}),Me(I,L.path_pathData)&&(M.linePath.setPathData(I),L.path_pathData=I,P=!0,le?(Ae(M,M.plugsFace),Ae(M,M.lineMaskCaps)):re&&Ae(M,M.linePath),M.events.apl_path&&M.events.apl_path.forEach(function(e){e(M,I)}))),P)),ee.viewBox=(B=(N=e).curStats,R=N.aplStats,F=B.path_edge,G=B.viewBox_bBox,D=R.viewBox_bBox,z=N.svg.viewBox.baseVal,j=N.svg.style,H=!1,T=Math.max(B.line_strokeWidth/2,B.viewBox_plugBCircleSE[0]||0,B.viewBox_plugBCircleSE[1]||0),W={x1:F.x1-T,y1:F.y1-T,x2:F.x2+T,y2:F.y2+T},N.events.new_edge4viewBox&&N.events.new_edge4viewBox.forEach(function(e){e(N,W)}),G.x=B.lineMask_x=B.lineOutlineMask_x=B.maskBGRect_x=W.x1,G.y=B.lineMask_y=B.lineOutlineMask_y=B.maskBGRect_y=W.y1,G.width=W.x2-W.x1,G.height=W.y2-W.y1,["x","y","width","height"].forEach(function(e){var t;(t=G[e])!==D[e]&&(z[e]=D[e]=t,j[oe[e]]=t+("x"===e||"y"===e?N.bodyOffset[e]:0)+"px",H=!0)}),H),ee.mask=(Y=(U=e).curStats,X=U.aplStats,q=!1,Y.plug_enabled?[0,1].forEach(function(e){Y.capsMaskMarker_enabledSE[e]=Y.plug_enabledSE[e]&&Y.plug_colorTraSE[e]||Y.plugOutline_enabledSE[e]&&Y.plugOutline_colorTraSE[e]}):Y.capsMaskMarker_enabledSE[0]=Y.capsMaskMarker_enabledSE[1]=!1,Y.capsMaskMarker_enabled=Y.capsMaskMarker_enabledSE[0]||Y.capsMaskMarker_enabledSE[1],Y.lineMask_outlineMode=Y.lineOutline_enabled,Y.caps_enabled=Y.capsMaskMarker_enabled||Y.capsMaskAnchor_enabledSE[0]||Y.capsMaskAnchor_enabledSE[1],Y.lineMask_enabled=Y.caps_enabled||Y.lineMask_outlineMode,(Y.lineMask_enabled&&!Y.lineMask_outlineMode||Y.lineOutline_enabled)&&["x","y"].forEach(function(e){var t="maskBGRect_"+e;We(U,X,t,Z=Y[t])&&(U.maskBGRect[e].baseVal.value=Z,q=!0)}),We(U,X,"lineMask_enabled",Z=Y.lineMask_enabled)&&(U.lineFace.style.mask=Z?"url(#"+U.lineMaskId+")":"none",q=!0,ue&&Ae(U,U.lineMask)),Y.lineMask_enabled&&(We(U,X,"lineMask_outlineMode",Z=Y.lineMask_outlineMode)&&(Z?(U.lineMaskBG.style.display="none",U.lineMaskShape.style.display="inline"):(U.lineMaskBG.style.display="inline",U.lineMaskShape.style.display="none"),q=!0),["x","y"].forEach(function(e){var t="lineMask_"+e;We(U,X,t,Z=Y[t])&&(U.lineMask[e].baseVal.value=Z,q=!0)}),We(U,X,"caps_enabled",Z=Y.caps_enabled)&&(U.lineMaskCaps.style.display=U.lineOutlineMaskCaps.style.display=Z?"inline":"none",q=!0,ue&&Ae(U,U.capsMaskLine)),Y.caps_enabled&&([0,1].forEach(function(e){var t;We(U,X.capsMaskAnchor_enabledSE,e,Z=Y.capsMaskAnchor_enabledSE[e])&&(U.capsMaskAnchorSE[e].style.display=Z?"inline":"none",q=!0,ue&&Ae(U,U.lineMask)),Y.capsMaskAnchor_enabledSE[e]&&(Me(t=Y.capsMaskAnchor_pathDataSE[e],X.capsMaskAnchor_pathDataSE[e])&&(U.capsMaskAnchorSE[e].setPathData(t),X.capsMaskAnchor_pathDataSE[e]=t,q=!0),We(U,X.capsMaskAnchor_strokeWidthSE,e,Z=Y.capsMaskAnchor_strokeWidthSE[e])&&(U.capsMaskAnchorSE[e].style.strokeWidth=Z+"px",q=!0))}),We(U,X,"capsMaskMarker_enabled",Z=Y.capsMaskMarker_enabled)&&(U.capsMaskLine.style.display=Z?"inline":"none",q=!0),Y.capsMaskMarker_enabled&&[0,1].forEach(function(n){var e=Y.capsMaskMarker_plugSE[n],t=e!==ne?ae[ie[e]]:null,a=Ne(n,t);We(U,X.capsMaskMarker_enabledSE,n,Z=Y.capsMaskMarker_enabledSE[n])&&(U.capsMaskLine.style[a.prop]=Z?"url(#"+U.lineMaskMarkerIdSE[n]+")":"none",q=!0),Y.capsMaskMarker_enabledSE[n]&&(We(U,X.capsMaskMarker_plugSE,n,e)&&(U.capsMaskMarkerShapeSE[n].href.baseVal="#"+t.elmId,Pe(U,U.capsMaskMarkerSE[n],a.orient,t.bBox,U.svg,U.capsMaskMarkerShapeSE[n],U.capsMaskLine),q=!0,re&&(Ae(U,U.capsMaskLine),Ae(U,U.lineFace))),["markerWidth","markerHeight"].forEach(function(e){var t="capsMaskMarker_"+e+"SE";We(U,X[t],n,Z=Y[t][n])&&(U.capsMaskMarkerSE[n][e].baseVal.value=Z,q=!0)}))}))),Y.lineOutline_enabled&&["x","y"].forEach(function(e){var t="lineOutlineMask_"+e;We(U,X,t,Z=Y[t])&&(U.lineOutlineMask[e].baseVal.value=Z,q=!0)}),q),t.effect&&(J=(Q=e).curStats,$=Q.aplStats,Object.keys(te).forEach(function(e){var t=te[e],n=e+"_enabled",a=e+"_options",i=J[a];We(Q,$,n,K=J[n])?(K&&($[a]=de(i)),t[K?"init":"remove"](Q)):K&&ce(i,$[a])&&(t.remove(Q),$[n]=!0,$[a]=de(i),t.init(Q))})),(se||ue)&&ee.line&&!ee.path&&Ae(e,e.lineShape),se&&ee.plug&&!ee.line&&Ae(e,e.plugsFace),Ve(e)}function ze(e,t){return{duration:w(e.duration)&&0i.x2&&(i.x2=t.x2),t.y2>i.y2&&(i.y2=t.y2),["x","y"].forEach(function(e){var t,n="dropShadow_"+e;o[n]=t=i[e+"1"],We(a,l,n,t)&&(a.efc_dropShadow_elmFilter[e].baseVal.value=t)}))}}},Object.keys(te).forEach(function(e){var t=te[e],n=t.stats;n[e+"_enabled"]={iniValue:!1},n[e+"_options"]={hasProps:!0},t.anim&&(n[e+"_animOptions"]={},n[e+"_animId"]={})}),g={none:{defaultAnimOptions:{},init:function(e,t){var n=e.curStats;n.show_animId&&(c.remove(n.show_animId),n.show_animId=null),g.none.start(e,t)},start:function(e,t){g.none.stop(e,!0)},stop:function(e,t,n){var a=e.curStats;return n=null!=n?n:e.aplStats.show_on,a.show_inAnim=!1,t&&Ge(e,n),n?1:0}},fade:{defaultAnimOptions:{duration:300,timing:"linear"},init:function(n,e){var t=n.curStats,a=n.aplStats;t.show_animId&&c.remove(t.show_animId),t.show_animId=c.add(function(e){return e},function(e,t){t?g.fade.stop(n,!0):(n.svg.style.opacity=e+"",le&&(Ae(n,n.svg),Ve(n)))},a.show_animOptions.duration,1,a.show_animOptions.timing,null,!1),g.fade.start(n,e)},start:function(e,t){var n,a=e.curStats;a.show_inAnim&&(n=c.stop(a.show_animId)),Ge(e,1),a.show_inAnim=!0,c.start(a.show_animId,!e.aplStats.show_on,null!=t?t:n)},stop:function(e,t,n){var a,i=e.curStats;return n=null!=n?n:e.aplStats.show_on,a=i.show_inAnim?c.stop(i.show_animId):n?1:0,i.show_inAnim=!1,t&&(e.svg.style.opacity=n?"":"0",Ge(e,n)),a}},draw:{defaultAnimOptions:{duration:500,timing:[.58,0,.42,1]},init:function(n,e){var t=n.curStats,a=n.aplStats,l=n.pathList.baseVal,i=Oe(l),r=i.segsLen,s=i.lenAll;t.show_animId&&c.remove(t.show_animId),t.show_animId=c.add(function(e){var t,n,a,i,o=-1;if(0===e)n=[[l[0][0],l[0][0]]];else if(1===e)n=l;else{for(t=s*e,n=[];t>=r[++o];)n.push(l[o]),t-=r[o];t&&(2===(a=l[o]).length?n.push([a[0],ve(a[0],a[1],t/r[o])]):(i=xe(a[0],a[1],a[2],a[3],ke(a[0],a[1],a[2],a[3],t)),n.push([a[0],i.fromP1,i.fromP2,i])))}return n},function(e,t){t?g.draw.stop(n,!0):(n.pathList.animVal=e,De(n,{path:!0}))},a.show_animOptions.duration,1,a.show_animOptions.timing,null,!1),g.draw.start(n,e)},start:function(e,t){var n,a=e.curStats;a.show_inAnim&&(n=c.stop(a.show_animId)),Ge(e,1),a.show_inAnim=!0,Ie(e,"apl_position",g.draw.update),c.start(a.show_animId,!e.aplStats.show_on,null!=t?t:n)},stop:function(e,t,n){var a,i=e.curStats;return n=null!=n?n:e.aplStats.show_on,a=i.show_inAnim?c.stop(i.show_animId):n?1:0,i.show_inAnim=!1,t&&(e.pathList.animVal=n?null:[[e.pathList.baseVal[0][0],e.pathList.baseVal[0][0]]],De(e,{path:!0}),Ge(e,n)),a},update:function(e){Ce(e,"apl_position",g.draw.update),e.curStats.show_inAnim?g.draw.init(e,g.draw.stop(e)):e.aplStats.show_animOptions={}}}},function(){function r(n){return function(e){var t={};t[n]=e,this.setOptions(t)}}[["start","anchorSE",0],["end","anchorSE",1],["color","lineColor"],["size","lineSize"],["startSocketGravity","socketGravitySE",0],["endSocketGravity","socketGravitySE",1],["startPlugColor","plugColorSE",0],["endPlugColor","plugColorSE",1],["startPlugSize","plugSizeSE",0],["endPlugSize","plugSizeSE",1],["outline","lineOutlineEnabled"],["outlineColor","lineOutlineColor"],["outlineSize","lineOutlineSize"],["startPlugOutline","plugOutlineEnabledSE",0],["endPlugOutline","plugOutlineEnabledSE",1],["startPlugOutlineColor","plugOutlineColorSE",0],["endPlugOutlineColor","plugOutlineColorSE",1],["startPlugOutlineSize","plugOutlineSizeSE",0],["endPlugOutlineSize","plugOutlineSizeSE",1]].forEach(function(e){var t=e[0],n=e[1],a=e[2];Object.defineProperty(Ye.prototype,t,{get:function(){var e=null!=a?K[this._id].options[n][a]:n?K[this._id].options[n]:K[this._id].options[t];return null==e?x:de(e)},set:r(t),enumerable:!0})}),[["path",m],["startSocket",n,"socketSE",0],["endSocket",n,"socketSE",1],["startPlug",E,"plugSE",0],["endPlug",E,"plugSE",1]].forEach(function(e){var a=e[0],i=e[1],o=e[2],l=e[3];Object.defineProperty(Ye.prototype,a,{get:function(){var t,n=null!=l?K[this._id].options[o][l]:o?K[this._id].options[o]:K[this._id].options[a];return n?Object.keys(i).some(function(e){return i[e]===n&&(t=e,!0)})?t:new Error("It's broken"):x},set:r(a),enumerable:!0})}),Object.keys(te).forEach(function(n){var a=te[n];Object.defineProperty(Ye.prototype,n,{get:function(){var u,e,t=K[this._id].options[n];return k(t)?(u=t,e=a.optionsConf.reduce(function(e,t){var n,a=t[0],i=t[1],o=t[2],l=t[3],r=t[4],s=null!=r?u[l][r]:l?u[l]:u[i];return e[i]="id"===a?s?Object.keys(o).some(function(e){return o[e]===s&&(n=e,!0)})?n:new Error("It's broken"):x:null==s?x:de(s),e},{}),a.anim&&(e.animation=de(u.animation)),e):t},set:r(n),enumerable:!0})}),["startLabel","endLabel","middleLabel"].forEach(function(e,n){Object.defineProperty(Ye.prototype,e,{get:function(){var e=K[this._id],t=e.options;return t.labelSEM[n]&&!e.optionIsAttach.labelSEM[n]?$[t.labelSEM[n]._id].text:t.labelSEM[n]||""},set:r(e),enumerable:!0})})}(),Ye.prototype.setOptions=function(e){return Ze(K[this._id],e),this},Ye.prototype.position=function(){return De(K[this._id],{position:!0}),this},Ye.prototype.remove=function(){var t=K[this._id],n=t.curStats;Object.keys(te).forEach(function(e){var t=e+"_animId";n[t]&&c.remove(n[t])}),n.show_animId&&c.remove(n.show_animId),t.attachments.slice().forEach(function(e){Ue(t,e)}),t.baseWindow&&t.svg&&t.baseWindow.document.body.removeChild(t.svg),delete K[this._id]},Ye.prototype.show=function(e,t){return je(K[this._id],!0,e,t),this},Ye.prototype.hide=function(e,t){return je(K[this._id],!1,e,t),this},o=function(t){t&&$[t._id]&&(t.boundTargets.slice().forEach(function(e){Ue(e.props,t,!0)}),t.conf.remove&&t.conf.remove(t),delete $[t._id])},S=function(){function e(e,t){var n,a={conf:e,curStats:{},aplStats:{},boundTargets:[]},i={};e.argOptions.every(function(e){return!(!t.length||("string"==typeof e.type?typeof t[0]!==e.type:"function"!=typeof e.type||!e.type(t[0])))&&(i[e.optionName]=t.shift(),!0)}),n=t.length&&k(t[0])?de(t[0]):{},Object.keys(i).forEach(function(e){n[e]=i[e]}),e.stats&&(Te(a.curStats,e.stats),Te(a.aplStats,e.stats)),Object.defineProperty(this,"_id",{value:++ee}),Object.defineProperty(this,"isRemoved",{get:function(){return!$[this._id]}}),a._id=this._id,e.init&&!e.init(a,n)||($[this._id]=a)}return e.prototype.remove=function(){var t=this,n=$[t._id];n&&(n.boundTargets.slice().forEach(function(e){n.conf.removeOption(n,e)}),Le(function(){var e=$[t._id];e&&(console.error("LeaderLineAttachment was not removed by removeOption"),o(e))}))},e}(),window.LeaderLineAttachment=S,_=function(e,t){return e instanceof S&&(!(e.isRemoved||t&&$[e._id].conf.type!==t)||null)},y={pointAnchor:{type:"anchor",argOptions:[{optionName:"element",type:ye}],init:function(e,t){return e.element=y.pointAnchor.checkElement(t.element),e.x=y.pointAnchor.parsePercent(t.x,!0)||[.5,!0],e.y=y.pointAnchor.parsePercent(t.y,!0)||[.5,!0],!0},removeOption:function(e,t){var n=t.props,a={},i=e.element,o=n.options.anchorSE["start"===t.optionName?1:0];i===o&&(i=o===document.body?new S(y.pointAnchor,[i]):document.body),a[t.optionName]=i,Ze(n,a)},getBBoxNest:function(e,t){var n=ge(e.element,t.baseWindow),a=n.width,i=n.height;return n.width=n.height=0,n.left=n.right=n.left+e.x[0]*(e.x[1]?a:1),n.top=n.bottom=n.top+e.y[0]*(e.y[1]?i:1),n},parsePercent:function(e,t){var n,a,i=!1;return w(e)?a=e:"string"==typeof e&&(n=u.exec(e))&&n[2]&&(i=0!==(a=parseFloat(n[1])/100)),null!=a&&(t||0<=a)?[a,i]:null},checkElement:function(e){if(null==e)e=document.body;else if(!ye(e))throw new Error("`element` must be Element");return e}},areaAnchor:{type:"anchor",argOptions:[{optionName:"element",type:ye},{optionName:"shape",type:"string"}],stats:{color:{},strokeWidth:{},elementWidth:{},elementHeight:{},elementLeft:{},elementTop:{},pathListRel:{},bBoxRel:{},pathData:{},viewBoxBBox:{hasProps:!0},dashLen:{},dashGap:{}},init:function(i,e){var t,n,a,o=[];return i.element=y.pointAnchor.checkElement(e.element),"string"==typeof e.color&&(i.color=e.color.trim()),"string"==typeof e.fillColor&&(i.fill=e.fillColor.trim()),w(e.size)&&0<=e.size&&(i.size=e.size),e.dash&&(i.dash=!0,w(e.dash.len)&&0i.right&&(i.right=t),ni.bottom&&(i.bottom=n)):i={left:t,right:t,top:n,bottom:n},o?P.pathListRel.push([o,{x:t,y:n}]):P.pathListRel=[],o={x:t,y:n}}),P.pathListRel.push([]),e=P.strokeWidth/2,l=[{x:i.left-e,y:i.top-e},{x:i.right+e,y:i.bottom+e}],P.bBoxRel={left:l[0].x,top:l[0].y,right:l[1].x,bottom:l[1].y,width:l[1].x-l[0].x,height:l[1].y-l[0].y}}W.pathListRel=W.bBoxRel=!0}return(W.pathListRel||W.elementLeft||W.elementTop)&&(P.pathData=we(P.pathListRel,function(e){e.x+=a.left,e.y+=a.top})),We(t,N,"strokeWidth",n=P.strokeWidth)&&(t.path.style.strokeWidth=n+"px"),Me(n=P.pathData,N.pathData)&&(t.path.setPathData(n),N.pathData=n,W.pathData=!0),t.dash&&(!W.pathData&&(!W.strokeWidth||t.dashLen&&t.dashGap)||(P.dashLen=t.dashLen||2*P.strokeWidth,P.dashGap=t.dashGap||P.strokeWidth),W.dash=We(t,N,"dashLen",P.dashLen)||W.dash,W.dash=We(t,N,"dashGap",P.dashGap)||W.dash,W.dash&&(t.path.style.strokeDasharray=N.dashLen+","+N.dashGap)),C=P.viewBoxBBox,L=N.viewBoxBBox,A=t.svg.viewBox.baseVal,V=t.svg.style,C.x=P.bBoxRel.left+a.left,C.y=P.bBoxRel.top+a.top,C.width=P.bBoxRel.width,C.height=P.bBoxRel.height,["x","y","width","height"].forEach(function(e){(n=C[e])!==L[e]&&(A[e]=L[e]=n,V[oe[e]]=n+("x"===e||"y"===e?t.bodyOffset[e]:0)+"px")}),W.strokeWidth||W.pathListRel||W.bBoxRel}},mouseHoverAnchor:{type:"anchor",argOptions:[{optionName:"element",type:ye},{optionName:"showEffectName",type:"string"}],style:{backgroundImage:"url('data:image/svg+xml;charset=utf-8;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij48cG9seWdvbiBwb2ludHM9IjI0LDAgMCw4IDgsMTEgMCwxOSA1LDI0IDEzLDE2IDE2LDI0IiBmaWxsPSJjb3JhbCIvPjwvc3ZnPg==')",backgroundSize:"",backgroundRepeat:"no-repeat",backgroundColor:"#f8f881",cursor:"default"},hoverStyle:{backgroundImage:"none",backgroundColor:"#fadf8f"},padding:{top:1,right:15,bottom:1,left:2},minHeight:15,backgroundPosition:{right:2,top:2},backgroundSize:{width:12,height:12},dirKeys:[["top","Top"],["right","Right"],["bottom","Bottom"],["left","Left"]],init:function(a,i){var o,t,e,n,l,r,s,u,h,p,c,d=y.mouseHoverAnchor,f={};if(a.element=y.pointAnchor.checkElement(i.element),u=a.element,!((p=u.ownerDocument)&&(h=p.defaultView)&&h.HTMLElement&&u instanceof h.HTMLElement))throw new Error("`element` must be HTML element");return d.style.backgroundSize=d.backgroundSize.width+"px "+d.backgroundSize.height+"px",["style","hoverStyle"].forEach(function(e){var n=d[e];a[e]=Object.keys(n).reduce(function(e,t){return e[t]=n[t],e},{})}),"inline"===(o=a.element.ownerDocument.defaultView.getComputedStyle(a.element,"")).display?a.style.display="inline-block":"none"===o.display&&(a.style.display="block"),y.mouseHoverAnchor.dirKeys.forEach(function(e){var t=e[0],n="padding"+e[1];parseFloat(o[n])e.x2&&(e.x2=a.x2),a.y2>e.y2&&(e.y2=a.y2)},newText:function(e,t,n,a,i){var o,l,r,s,u,h;return(o=t.createElementNS(b,"text")).textContent=e,[o.x,o.y].forEach(function(e){var t=n.createSVGLength();t.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX,0),e.baseVal.initialize(t)}),"boolean"!=typeof f&&(f="paintOrder"in o.style),i&&!f?(r=t.createElementNS(b,"defs"),o.id=a,r.appendChild(o),(u=(l=t.createElementNS(b,"g")).appendChild(t.createElementNS(b,"use"))).href.baseVal="#"+a,(s=l.appendChild(t.createElementNS(b,"use"))).href.baseVal="#"+a,(h=u.style).strokeLinejoin="round",{elmPosition:o,styleText:o.style,styleFill:s.style,styleStroke:h,styleShow:l.style,elmsAppend:[r,l]}):(h=o.style,i&&(h.strokeLinejoin="round",h.paintOrder="stroke"),{elmPosition:o,styleText:h,styleFill:h,styleStroke:i?h:null,styleShow:h,elmsAppend:[o]})},getMidPoint:function(e,t){var n,a,i,o=Oe(e),l=o.segsLen,r=o.lenAll,s=-1;if((n=r/2+(t||0))<=0)return 2===(a=e[0]).length?ve(a[0],a[1],0):xe(a[0],a[1],a[2],a[3],0);if(r<=n)return 2===(a=e[e.length-1]).length?ve(a[0],a[1],1):xe(a[0],a[1],a[2],a[3],1);for(i=[];n>l[++s];)i.push(e[s]),n-=l[s];return 2===(a=e[s]).length?ve(a[0],a[1],n/l[s]):xe(a[0],a[1],a[2],a[3],ke(a[0],a[1],a[2],a[3],n))},initSvg:function(t,n){var e,a,i=y.captionLabel.newText(t.text,n.baseWindow.document,n.svg,v+"-captionLabel-"+t._id,t.outlineColor);["elmPosition","styleFill","styleShow","elmsAppend"].forEach(function(e){t[e]=i[e]}),t.isShown=!1,t.styleShow.visibility="hidden",y.captionLabel.textStyleProps.forEach(function(e){null!=t[e]&&(i.styleText[e]=t[e])}),i.elmsAppend.forEach(function(e){n.svg.appendChild(e)}),e=i.elmPosition.getBBox(),t.width=e.width,t.height=e.height,t.outlineColor&&(a=10<(a=e.height/9)?10:a<2?2:a,i.styleStroke.strokeWidth=a+"px",i.styleStroke.stroke=t.outlineColor),t.strokeWidth=a||0,Te(t.aplStats,y.captionLabel.stats),t.updateColor(n),t.refSocketXY?t.updateSocketXY(n):t.updatePath(n),ue&&De(n,{}),t.updateShow(n)},bind:function(e,t){var n=t.props;return e.color||Ie(n,"cur_line_color",e.updateColor),(e.refSocketXY="startLabel"===t.optionName||"endLabel"===t.optionName)?(e.socketIndex="startLabel"===t.optionName?0:1,Ie(n,"apl_position",e.updateSocketXY),e.offset||(Ie(n,"cur_attach_plugSideLenSE",e.updateSocketXY),Ie(n,"cur_line_strokeWidth",e.updateSocketXY))):Ie(n,"apl_path",e.updatePath),Ie(n,"svgShow",e.updateShow),ue&&Ie(n,"new_edge4viewBox",e.adjustEdge),y.captionLabel.initSvg(e,n),!0},unbind:function(e,t){var n=t.props;e.elmsAppend&&(e.elmsAppend.forEach(function(e){n.svg.removeChild(e)}),e.elmPosition=e.styleFill=e.styleShow=e.elmsAppend=null),Te(e.curStats,y.captionLabel.stats),Te(e.aplStats,y.captionLabel.stats),e.color||Ce(n,"cur_line_color",e.updateColor),e.refSocketXY?(Ce(n,"apl_position",e.updateSocketXY),e.offset||(Ce(n,"cur_attach_plugSideLenSE",e.updateSocketXY),Ce(n,"cur_line_strokeWidth",e.updateSocketXY))):Ce(n,"apl_path",e.updatePath),Ce(n,"svgShow",e.updateShow),ue&&(Ce(n,"new_edge4viewBox",e.adjustEdge),De(n,{}))},removeOption:function(e,t){var n=t.props,a={};a[t.optionName]="",Ze(n,a)},remove:function(t){t.boundTargets.length&&(console.error("LeaderLineAttachment was not unbound by remove"),t.boundTargets.forEach(function(e){y.captionLabel.unbind(t,e)}))}},pathLabel:{type:"label",argOptions:[{optionName:"text",type:"string"}],stats:{color:{},startOffset:{},pathData:{}},init:function(s,t){return"string"==typeof t.text&&(s.text=t.text.trim()),!!s.text&&("string"==typeof t.color&&(s.color=t.color.trim()),s.outlineColor="string"==typeof t.outlineColor?t.outlineColor.trim():"#fff",w(t.lineOffset)&&(s.lineOffset=t.lineOffset),y.captionLabel.textStyleProps.forEach(function(e){null!=t[e]&&(s[e]=t[e])}),s.updateColor=function(e){y.captionLabel.updateColor(s,e)},s.updatePath=function(e){var t,n=s.curStats,a=s.aplStats,i=e.curStats,o=e.pathList.animVal||e.pathList.baseVal;o&&(n.pathData=t=y.pathLabel.getOffsetPathData(o,i.line_strokeWidth/2+s.strokeWidth/2+s.height/4,1.25*s.height),Me(t,a.pathData)&&(s.elmPath.setPathData(t),a.pathData=t,s.bBox=s.elmPosition.getBBox(),s.updateStartOffset(e)))},s.updateStartOffset=function(e){var t,n,a,i,o=s.curStats,l=s.aplStats,r=e.curStats;o.pathData&&((2!==s.semIndex||s.lineOffset)&&(t=o.pathData.reduce(function(e,t){var n,a=t.values;switch(t.type){case"M":i={x:a[0],y:a[1]};break;case"L":n={x:a[0],y:a[1]},i&&(e+=_e(i,n)),i=n;break;case"C":n={x:a[4],y:a[5]},i&&(e+=be(i,{x:a[0],y:a[1]},{x:a[2],y:a[3]},n)),i=n}return e},0),a=0===s.semIndex?0:1===s.semIndex?t:t/2,2!==s.semIndex&&(n=Math.max(r.attach_plugBackLenSE[s.semIndex]||0,r.line_strokeWidth/2)+s.strokeWidth/2+s.height/4,a=(a+=0===s.semIndex?n:-n)<0?0:tx?((t=b.points)[1]=Ee(t[0],t[1],-x),b.len=_e(t[0],t[1])):(b.points=null,b.len=0),e.len>x+n?((t=e.points)[0]=Ee(t[1],t[0],-(x+n)),e.len=_e(t[0],t[1])):(e.points=null,e.len=0)),b=e):b=null}),k.reduce(function(t,e){var n=e.points;return n&&(a&&w(n[0],a)||t.push({type:"M",values:[n[0].x,n[0].y]}),"line"===e.type?t.push({type:"L",values:[n[1].x,n[1].y]}):(n.shift(),n.forEach(function(e){t.push({type:"L",values:[e.x,e.y]})})),a=n[n.length-1]),t},[])},newText:function(e,t,n,a){var i,o,l,r,s,u,h,p,c,d;return(r=(l=t.createElementNS(b,"defs")).appendChild(t.createElementNS(b,"path"))).id=i=n+"-path",(u=(s=t.createElementNS(b,"text")).appendChild(t.createElementNS(b,"textPath"))).href.baseVal="#"+i,u.startOffset.baseVal.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX,0),u.textContent=e,"boolean"!=typeof f&&(f="paintOrder"in s.style),a&&!f?(s.id=o=n+"-text",l.appendChild(s),(c=(h=t.createElementNS(b,"g")).appendChild(t.createElementNS(b,"use"))).href.baseVal="#"+o,(p=h.appendChild(t.createElementNS(b,"use"))).href.baseVal="#"+o,(d=c.style).strokeLinejoin="round",{elmPosition:s,elmPath:r,elmOffset:u,styleText:s.style,styleFill:p.style,styleStroke:d,styleShow:h.style,elmsAppend:[l,h]}):(d=s.style,a&&(d.strokeLinejoin="round",d.paintOrder="stroke"),{elmPosition:s,elmPath:r,elmOffset:u,styleText:d,styleFill:d,styleStroke:a?d:null,styleShow:d,elmsAppend:[l,s]})},initSvg:function(t,n){var e,a,i=y.pathLabel.newText(t.text,n.baseWindow.document,v+"-pathLabel-"+t._id,t.outlineColor);["elmPosition","elmPath","elmOffset","styleFill","styleShow","elmsAppend"].forEach(function(e){t[e]=i[e]}),t.isShown=!1,t.styleShow.visibility="hidden",y.captionLabel.textStyleProps.forEach(function(e){null!=t[e]&&(i.styleText[e]=t[e])}),i.elmsAppend.forEach(function(e){n.svg.appendChild(e)}),i.elmPath.setPathData([{type:"M",values:[0,100]},{type:"h",values:[100]}]),e=i.elmPosition.getBBox(),i.styleText.textAnchor=["start","end","middle"][t.semIndex],2!==t.semIndex||t.lineOffset||i.elmOffset.startOffset.baseVal.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE,50),t.height=e.height,t.outlineColor&&(a=10<(a=e.height/9)?10:a<2?2:a,i.styleStroke.strokeWidth=a+"px",i.styleStroke.stroke=t.outlineColor),t.strokeWidth=a||0,Te(t.aplStats,y.pathLabel.stats),t.updateColor(n),t.updatePath(n),t.updateStartOffset(n),ue&&De(n,{}),t.updateShow(n)},bind:function(e,t){var n=t.props;return e.color||Ie(n,"cur_line_color",e.updateColor),Ie(n,"cur_line_strokeWidth",e.updatePath),Ie(n,"apl_path",e.updatePath),e.semIndex="startLabel"===t.optionName?0:"endLabel"===t.optionName?1:2,(2!==e.semIndex||e.lineOffset)&&Ie(n,"cur_attach_plugBackLenSE",e.updateStartOffset),Ie(n,"svgShow",e.updateShow),ue&&Ie(n,"new_edge4viewBox",e.adjustEdge),y.pathLabel.initSvg(e,n),!0},unbind:function(e,t){var n=t.props;e.elmsAppend&&(e.elmsAppend.forEach(function(e){n.svg.removeChild(e)}),e.elmPosition=e.elmPath=e.elmOffset=e.styleFill=e.styleShow=e.elmsAppend=null),Te(e.curStats,y.pathLabel.stats),Te(e.aplStats,y.pathLabel.stats),e.color||Ce(n,"cur_line_color",e.updateColor),Ce(n,"cur_line_strokeWidth",e.updatePath),Ce(n,"apl_path",e.updatePath),(2!==e.semIndex||e.lineOffset)&&Ce(n,"cur_attach_plugBackLenSE",e.updateStartOffset),Ce(n,"svgShow",e.updateShow),ue&&(Ce(n,"new_edge4viewBox",e.adjustEdge),De(n,{}))},removeOption:function(e,t){var n=t.props,a={};a[t.optionName]="",Ze(n,a)},remove:function(t){t.boundTargets.length&&(console.error("LeaderLineAttachment was not unbound by remove"),t.boundTargets.forEach(function(e){y.pathLabel.unbind(t,e)}))}}},Object.keys(y).forEach(function(e){Ye[e]=function(){return new S(y[e],Array.prototype.slice.call(arguments))}}),Ye.positionByWindowResize=!0,window.addEventListener("resize",O.add(function(){Ye.positionByWindowResize&&Object.keys(K).forEach(function(e){De(K[e],{position:!0})})}),!1),Ye}();
diff --git a/assets/main.scss b/assets/main.scss
new file mode 100644
index 0000000..9f94b11
--- /dev/null
+++ b/assets/main.scss
@@ -0,0 +1,5 @@
+---
+# Only the main Sass file needs front matter (the dashes are enough)
+---
+
+@import "3scale";
diff --git a/assets/minima-social-icons.svg b/assets/minima-social-icons.svg
new file mode 100644
index 0000000..fa7399f
--- /dev/null
+++ b/assets/minima-social-icons.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/use.js b/assets/use.js
new file mode 100644
index 0000000..223c458
--- /dev/null
+++ b/assets/use.js
@@ -0,0 +1,28 @@
+let nav_use = document.getElementById('nav_use')
+let nav_install = document.getElementById('nav_install')
+let use = document.getElementById('use')
+let install = document.getElementById('install')
+
+let nav_use2use = new LeaderLine(
+ LeaderLine.pointAnchor(nav_use, {x: '-10%', y: '50%'}),
+ LeaderLine.pointAnchor(use, {x: '10%', y: 0 }),
+ {
+ color: '#FF7314',
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ //dash: {animation: false},
+ path: 'straight'
+ }
+);
+
+let nav_install2install = new LeaderLine(
+ LeaderLine.pointAnchor(nav_install, {x: '50%', y: '100%'}),
+ LeaderLine.pointAnchor(install, {x: '10%', y: 0 }),
+ {
+ color: '#FF7314',
+ startPlug: 'disc',
+ endPlug: 'arrow2',
+ //dash: {animation: false},
+ path: 'straight'
+ }
+);
diff --git a/contribute.md b/contribute.md
new file mode 100644
index 0000000..e5135d3
--- /dev/null
+++ b/contribute.md
@@ -0,0 +1,22 @@
+---
+layout: page
+title: Contribute
+heading: Contribute to grow
+permalink: /contribute
+order: 3
+---
+
+
+
+ Contribute
+ This project is driven by Red Hat but open to anyone for contributions of any kind.
+
+
+
+
diff --git a/favicon.ico b/favicon.ico
new file mode 100644
index 0000000..001e541
Binary files /dev/null and b/favicon.ico differ
diff --git a/grasp.md b/grasp.md
new file mode 100644
index 0000000..f02f9b5
--- /dev/null
+++ b/grasp.md
@@ -0,0 +1,85 @@
+---
+layout: page
+heading: Grasp the inner workings
+title: Grasp
+permalink: /grasp
+order: 2
+---
+
+
+
+
+
+
+
+
+
+
+
+
+ Listener accepts and enques requests to authorize and report
+ Worker performs background tasks off-loaded from the listener.
+ Rescheduler re-queues failed jobs.
+
+
+
+
+
+ authenticator
+ authorizer
+ reporter
+ internal API
+
+
+
+
+
+ API
+
+
+
+
+
+
+ Rails app to manage API(s) & developers through GUI & API
+ Accounts, Applications, Messages, Plans, Billing, Limits, Rules, Policies.
+ Create and nurture a developer portal
+
+
+
+
+ pisoni
+ services
+ plans (rules & limits)
+ apps (auth)
+ analytics
+ developer portal
+
+
+
+
diff --git a/index.md b/index.md
index 4b110eb..6ac0cfa 100644
--- a/index.md
+++ b/index.md
@@ -1,37 +1,95 @@
-## Welcome to GitHub Pages
+---
+# You don't need to edit this file, it's empty on purpose.
+# Edit theme's home layout instead if you wanna make some changes
+# See: https://jekyllrb.com/docs/themes/#overriding-theme-defaults
+layout: page
+title: 3scale API Management
+heading: Share , secure , control , analyze , and monetize your APIs.
+permalink: /
+---
-You can use the [editor on GitHub](https://github.com/3scale/3scale.github.io/edit/master/index.md) to maintain and preview the content for your website in Markdown files.
+
+
+
+
+ Developer Portal
+
+ Share your API's with the world, educate developers with interactive docs and empower them with a private area to manage their subscriptions, keys, and apps.
+
+
+
-Whenever you commit to this repository, GitHub Pages will run [Jekyll](https://jekyllrb.com/) to rebuild the pages in your site, from the content in your Markdown files.
+
+
+
+
+ API Authentication
+
+ Use one of the three different authentication patterns to secure access to your APIs.
+
+
+
-### Markdown
+
+
+
+
+ Plans, Rules & Limits
+
+ Control access to your APIs with plans, metrics, methods, rate limits and pricing rules.
+
+
+
-Markdown is a lightweight and easy-to-use syntax for styling your writing. It includes conventions for
+
+
+
+
+ Analytics
+
+ Analyse your API's usage through daily averages, top applications and response codes.
+
+
+
-```markdown
-Syntax highlighted code block
-
-# Header 1
-## Header 2
-### Header 3
-
-- Bulleted
-- List
-
-1. Numbered
-2. List
-
-**Bold** and _Italic_ and `Code` text
-
-[Link](url) and 
-```
-
-For more details see [GitHub Flavored Markdown](https://guides.github.com/features/mastering-markdown/).
-
-### Jekyll Themes
-
-Your Pages site will use the layout and styles from the Jekyll theme you have selected in your [repository settings](https://github.com/3scale/3scale.github.io/settings). The name of this theme is saved in the Jekyll `_config.yml` configuration file.
-
-### Support or Contact
-
-Having trouble with Pages? Check out our [documentation](https://help.github.com/categories/github-pages-basics/) or [contact support](https://github.com/contact) and we’ll help you sort it out.
+
+
+
+
+ Billing
+
+ Monetize your APIs through pricing rules, paid plans, automated billing and invoicing.
+
+
+
+
diff --git a/use.md b/use.md
new file mode 100644
index 0000000..cb28401
--- /dev/null
+++ b/use.md
@@ -0,0 +1,51 @@
+---
+layout: page
+title: Use
+permalink: /use
+order: 1
+heading: Use now,Install later
+---
+
+
+
+ Use Now
+
+ quick sign up for the saas
+ free plan
+ get a feel for the product
+
+
+
+
+
+
+ Install the full Monty on your laptop
+ Pre-requisite: Minishift .
+
+
+ # 1. Start Minishift with 6gb
+ minishift start --memory 6GB --cpus 2
+ # 2. Create a new application using a minimal 3scale template oc new-app \
+ --param WILDCARD_DOMAIN="$(minishift ip).nip.io" \
+ --param AMP_RELEASE=2.4.0 \
+ -f https://red.ht/2HdoRPB
+ # 3. Sign in to 3scale with Username:admin
+and get password from the terminal output (look for ADMIN_PASSWORD). https://3scale-admin.$(minishift ip).nip.io/
+
+
+ More details in this gist .
+
+
+ Install individual components for evaluation or development purposes
+
+
+
+
+
+
+
+