~evanj/cms

5ea155bcf5f48d777fb2e6b6d66d34e60119d24e — Evan J 2 months ago 276ecdc
Feat(dynamic): Dynamic content pages have been added (rather than
hardcoded HTML. This is Skipper dog fooding itself (I.E. Skipper
now makes requests to itself to pull content for these dynamic pages).
This commit also adds initial support for an "official" Skipper Go API.
This is nice as the API satisfies interfaces Skipper itself uses
internally (E.G. m/content, m/value).
23 files changed, 434 insertions(+), 305 deletions(-)

M cms.go
M internal/c/doc/doc.go
A internal/c/dynamic/dynamic.go
D internal/internal.go
D internal/internal_test.go
M internal/v/html/_footer.html
M internal/v/html/_header.html
D internal/v/html/contact.html
D internal/v/html/doc.html
R internal/v/html/{faq.html => dynamic.html}
D internal/v/html/privacy.html
D internal/v/html/terms.html
D internal/v/html/tour.html
M internal/v/tmpls_embed.go
M internal/v/v.go
M main.go
M makefile
D pkg/pkg.go
D pkg/pkg_test.go
A pkg/skipper/api/api.go
A pkg/skipper/api/api_test.go
A pkg/skipper/skipper.go
A pkg/skipper/skipper_test.go
M cms.go => cms.go +9 -2
@@ 14,12 14,20 @@ import (
type App struct {
	log *log.Logger

	dynamicHandler http.Handler

	// NOTE: Concurrent read (only) is OK. This is never wrote (but defined on
	// server startup).
	handlers map[string]http.Handler
}

func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path == "/favicon.ico" {
		// TODO: Handle favicon.
		http.NotFound(w, r)
		return
	}

	parts := strings.Split(r.URL.Path, "/")
	if len(parts) < 2 {
		http.NotFound(w, r)


@@ 33,8 41,7 @@ func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) {

	h, ok := a.handlers[namespace]
	if !ok {
		http.NotFound(w, r)
		return
		h = a.dynamicHandler
	}

	a.handleWithRetry(w, r, h)

M internal/c/doc/doc.go => internal/c/doc/doc.go +3 -7
@@ 12,15 12,11 @@ import (
	"git.sr.ht/~evanj/cms/internal/v"
)

// TODO: Consolidate this with dynamic?
// TODO: rename doc to something else?
var pages = map[string]*template.Template{
	"/page/doc":     v.MustParse("html/doc.html"),
	"/page/faq":     v.MustParse("html/faq.html"),
	"/page/terms":   v.MustParse("html/terms.html"),
	"/page/privacy": v.MustParse("html/privacy.html"),
	"/page/contact": v.MustParse("html/contact.html"),
	"/page/billing": v.MustParse("html/billing.html"),
	"/page/stripe":  v.MustParse("html/stripe.html"),
	"/page/tour":    v.MustParse("html/tour.html"),
	"/page/billing": v.MustParse("html/billing.html"),
}

type Doc struct {

A internal/c/dynamic/dynamic.go => internal/c/dynamic/dynamic.go +47 -0
@@ 0,0 1,47 @@
package dynamic

import (
	"context"
	"errors"
	"log"
	"net/http"
	"strings"

	"git.sr.ht/~evanj/cms/internal/c"
	"git.sr.ht/~evanj/cms/internal/m/content"
	"git.sr.ht/~evanj/cms/internal/v"
)

var (
	fieldToSearchBy = "slug"
	tmpl            = v.MustParse("html/dynamic.html")
)

type Dynamic struct {
	*c.Controller
	log *log.Logger
	api SkipperAPI
	ct  int
}

type SkipperAPI interface {
	QueryContentByField(ctx context.Context, contentTypeID int, field, query string) (content.Content, error)
}

func New(c *c.Controller, log *log.Logger, api SkipperAPI, contenttype int) Dynamic {
	return Dynamic{c, log, api, contenttype}
}

func (d Dynamic) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	q := strings.Trim(r.URL.Path, "/")
	c, err := d.api.QueryContentByField(r.Context(), d.ct, fieldToSearchBy, q)
	if err != nil {
		d.log.Println(err)
		d.Error(w, r, http.StatusNotFound, errors.New("failed to find requested content"))
		return
	}

	d.HTML(w, r, tmpl, map[string]interface{}{
		"Content": c,
	})
}

D internal/internal.go => internal/internal.go +0 -6
@@ 1,6 0,0 @@
// internal may only be imported by git.sr.ht/~evanj/cms
// m - models
// v - views
// c - controllers
// s - services
package internal

D internal/internal_test.go => internal/internal_test.go +0 -1
@@ 1,1 0,0 @@
package internal_test

M internal/v/html/_footer.html => internal/v/html/_footer.html +6 -6
@@ 59,12 59,12 @@
          {{else}}
            <li><a class='text-muted' href='/#pricing'>Pricing</a></li>
          {{end}}
          <li><a class='text-muted' href='/page/tour'>Tour</a></li>
          <li><a class='text-muted' href='/page/doc'>Docs</a></li>
          <li><a class="text-muted" href="/page/faq">FAQ</a></li>
          <li><a class="text-muted" href="/page/terms">Terms</a></li>
          <li><a class="text-muted" href="/page/privacy">Privacy</a></li>
          <li><a class="text-muted" href="/page/contact">Contact</a></li>
          <li><a class='text-muted' href='/tour'>Tour</a></li>
          <li><a class='text-muted' href='/doc'>Docs</a></li>
          <li><a class="text-muted" href="/faq">FAQ</a></li>
          <li><a class="text-muted" href="/terms">Terms</a></li>
          <li><a class="text-muted" href="/privacy">Privacy</a></li>
          <li><a class="text-muted" href="/contact">Contact</a></li>
        </ul>
      </div>
    </div>

M internal/v/html/_header.html => internal/v/html/_header.html +2 -2
@@ 52,8 52,8 @@
          <li class='nav-item'><a class='nav-link' href='/#login'>Login</a></li>
          <li class='nav-item'><a class='nav-link' href='/#pricing'>Pricing</a></li>
        {{ end}}
        <li class='nav-item'><a class='nav-link' href='/page/tour'>Tour</a></li>
        <li class='nav-item'><a class='nav-link' href='/page/doc'>Docs</a></li>
        <li class='nav-item'><a class='nav-link' href='/tour'>Tour</a></li>
        <li class='nav-item'><a class='nav-link' href='/doc'>Docs</a></li>
      </ul>
    </div>
  </nav>

D internal/v/html/contact.html => internal/v/html/contact.html +0 -28
@@ 1,28 0,0 @@
<!DOCTYPE html>
<html lang=en>
<head>
  {{ template "html/_head.html" }}
  <title>Skipper CMS | Contact</title>
</head>
<body class='page bg-light'>
  <style>{{ template "css/main.css" }}</style>
  <main>
    {{ template "html/_header.html" $ }}
    <div class="pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center">
      <h1 class="display-4">Contact</h1>
    </div>
    <div class='container'>
      <div class='row'>
        <div class="col-12 offset-0 col-lg-8 offset-lg-2">
          Hi. My name is Evan. I'm the only soul currently working on Skipper
          CMS. If you need someone to contact I'm that someone. You can reach me
          at me AT evanjon DOT es or via Twitter, 
          <a href='https://twitter.com/minieggs40'>@minieggs40</a>. Caoi!
        </div>
      </div>
    </div>
    {{ template "html/_footer.html" $ }}
  </main>
  {{ template "html/_scripts.html" }}
</body>
</html>

D internal/v/html/doc.html => internal/v/html/doc.html +0 -139
@@ 1,139 0,0 @@
<!DOCTYPE html>
<html lang=en>
<head>
  {{ template "html/_head.html" }}
  <title>Skipper CMS | Docs</title>
</head>
<body class='page bg-light'>
  <style>{{ template "css/main.css" }}</style>
  <main>
    {{ template "html/_header.html" $ }}
    <div class="pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center">
      <h1 class="display-4">API Documentation</h1>
    </div>
    <div class='container'>
      <div class='row'>
        <div class="col-12 offset-0 col-lg-8 offset-lg-2">
          <h2>Concepts</h2>
          <p>CMS has five entities:</p>
          <ul>
            <li>Users</li>
            <li>Spaces</li>
            <li>Content Types</li>
            <li>Web Hooks</li>
            <li>Contents </li>
          </ul>
          <p>Users can be associated with many spaces. Spaces can be associated with
          many users. It's a many-to-many relationship. A space is a "backend"
          for the content of a single application. For example, a space
          represents a single website or a single mobile application.</p>
          <p>A space can "own" many content types, one-to-many.</p>
          <p>A content types is a taxonomy of content. For example, if you're familiar
          with the content management system WordPress, a content type here is akin to
          categories, tags, posts, or pages on WordPress.</p>
          <p>A content type "owns" many content instances, one-to-many.</p>
          <p>This is where CMS begins to differ from many other content management
          systems and content management infrastructures. In CMS concepts such as
          categories, tags, posts, and pages are on the same hierarchy. Where in other
          content management systems, such as WordPress, categories and tags exist on
          a level above posts and pages.</p>
          <p>Another very important distinctions: CMS does not provide you a rigid set
          of content types. You define content types and within content you define
          their relation to other contents. Meaning: if you choose to create a
          WordPress type heirarchy in CMS you would define the content types pages and
          posts that would have two fields: a category field which would be a
          Reference field type and a tags field which would be a ReferenceList field
          type. You would then create your two additional content types,
          categories and tags, then when creating content under pages and posts,
          you would choose what they are referencing.</p>
          <p>This is the biggest feature of CMS for me: arbitrarily many and
          arbitrarily deep connections from one content instance to another
          content instance or list of content instances. Creating content in
          CMS <mark>should not restrict your data model.</mark></p>
          <p>Web hooks are used when you want your application to respond to
          content within CMS under your space being created, updated, and
          deleted on the fly. For doing any cache breaking or other you may want to do within
          your application.</p>
          <h2>Using the API</h2>
          <p>Before diving into the API I suggest you poke around the user
          interace and test drive creating spaces, content types, and contents. To
          get a feel for the above concepts described.</p>
          <p>You'll also need an account to interact with the following APIs.
          The APIs use basic authentication for client applications. Sign ups
          are available to anyone but CMS is currently in a <mark>limited public
          alpha</mark>. Meaning: all your data is automatically deleted on a 15
          minute interval. CMS currently doesn't have any way to fight abuse.
          Once CMS' story on fighting abuse has been improved CMS will be moved
          into beta or general availability. If this is an inconvenience I urge
          you to look into self-hosting CMS. All you need is read access to the
          repository (which you already have), a Go compiler, and a MySQL
          database.</p>
          <h3>Spaces API</h3>
          <p>Five methods are available to the Spaces API.</p>
          <ul>
            <li>POST: Create a Space.</li>
            <li>GET: Retrieving a Space.</li>
            <li>PATCH: Update a Space.</li>
            <li>DELETE: Remove a Space.</li>
            <li>PUT: Copy a Space.</li>
          </ul>
          <h4>POST: Create a Space.</h4>
          <pre><code>curl -s -u "$cmsuser:$cmspass" https://cms.evanjon.es/space
          -X POST -F name="cURL test" -F desc="Some description here"</code></pre>
          <p>You'll be returned JSON that will have a redirectURL. The ID of the
          created space will be inside. You'll use the space ID to GET, PATCH,
          DELETE, and PUT the space.</p>
          <h4>GET: Retrieving a Space.</h4>
          <pre><code>curl -s -u "$cmsuser:$cmspass" https://cms.evanjon.es/space
          -X GET -F space=29</code></pre>
          <p>When you GET a Space you'll also retreive a paginated list of
          Content Types under the Space. The API returns JSON. Under the key
          "ContentTypes" you'll see a few more key/values: "ContentTypeList",
          "ContentTypeListMore", and "ContentTypeListBefore". Use the query
          parameter "?before=$ID" on your GET request to retrieve the next page
          of results, to use in conjunction with "ContentTypeListBefore".
          If another page of content type results exists
          "ContentTypeListMore" will state so with its boolean value.</p>
          <h4>PATCH: Update a Space.</h4>
          <pre><code>curl -s -u "$cmsuser:$cmspass" https://cms.evanjon.es/space
          -X PATCH -F space=29 -F name="cURL test (update)"</code></pre>
          <h4>DELETE: Remove a Space.</h4>
          <pre><code>curl -s -u "$cmsuser:$cmspass" https://cms.evanjon.es/space
          -X DELETE -F space=29</code></pre>
          <h4>PUT: Copy a Space.</h4>
          <pre><code>curl -s -u "$cmsuser:$cmspass" https://cms.evanjon.es/space
          -X PUT -F space=30 -F name="cURL test copy" -F desc="This is a copied space"</code></pre>
          <p>Please note: copying a space copies <mark>all</mark> of the space's
          content types and content instances.</p>
          <h3>Content Types API</h3>
          <p>Four methods are available to the Content Types API.</p>
          <ul>
            <li>POST: Create a Content Type.</li>
            <li>GET: Retrieving a Content Type.</li>
            <li>PATCH: Update a Content Type.</li>
            <li>DELETE: Remove a Content Type.</li>
          </ul>
          <h3>Web Hooks API</h3>
          <p>Four methods are available to the Web Hooks API.</p>
          <ul>
            <li>POST: Create a Web Hook.</li>
            <li>GET: Retrieving a Web Hook.</li>
            <li>PATCH: Update a Web Hook.</li>
            <li>DELETE: Remove a Web Hook.</li>
          </ul>
          <h3>Content API</h3>
          <p>Four methods are available to the Content API.</p>
          <ul>
            <li>POST: Create a Content.</li>
            <li>GET: Retrieving a Content.</li>
            <li>PATCH: Update a Content.</li>
            <li>DELETE: Remove a Content.</li>
          </ul>
        </div>
      </div>
    </div>
    {{ template "html/_footer.html" $ }}
  </main>
  {{ template "html/_scripts.html" }}
</body>
</html>

R internal/v/html/faq.html => internal/v/html/dynamic.html +7 -5
@@ 2,19 2,21 @@
<html lang=en>
<head>
  {{ template "html/_head.html" }}
  <title>Skipper CMS | FAQ</title>
  <title>Skipper CMS | {{(.Content.MustValueByName "name").Value}}</title>
</head>
<body class='page bg-light'>
  <style>{{ template "css/main.css" }}</style>
  <main>
    {{ template "html/_header.html" $ }}
    <div class="pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center">
      <h1 class="display-4">FAQ</h1>
      <h1 class="display-4">{{(.Content.MustValueByName "name").Value}}</h1>
    </div>
    <div class='container'>
      <div class='row'>
    <div class="container">
      <div class="row">
        <div class="col-12 offset-0 col-lg-8 offset-lg-2">
          TODO
          <article>
            {{(.Content.MustValueByName "desc").Value | html}}
          </article>
        </div>
      </div>
    </div>

D internal/v/html/privacy.html => internal/v/html/privacy.html +0 -25
@@ 1,25 0,0 @@
<!DOCTYPE html>
<html lang=en>
<head>
  {{ template "html/_head.html" }}
  <title>Skipper CMS | Privacy</title>
</head>
<body class='page bg-light'>
  <style>{{ template "css/main.css" }}</style>
  <main>
    {{ template "html/_header.html" $ }}
    <div class="pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center">
      <h1 class="display-4">Privacy</h1>
    </div>
    <div class='container'>
      <div class='row'>
        <div class="col-12 offset-0 col-lg-8 offset-lg-2">
          TODO
        </div>
      </div>
    </div>
    {{ template "html/_footer.html" $ }}
  </main>
  {{ template "html/_scripts.html" }}
</body>
</html>

D internal/v/html/terms.html => internal/v/html/terms.html +0 -25
@@ 1,25 0,0 @@
<!DOCTYPE html>
<html lang=en>
<head>
  {{ template "html/_head.html" }}
  <title>Skipper CMS | Terms</title>
</head>
<body class='page bg-light'>
  <style>{{ template "css/main.css" }}</style>
  <main>
    {{ template "html/_header.html" $ }}
    <div class="pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center">
      <h1 class="display-4">Terms</h1>
    </div>
    <div class='container'>
      <div class='row'>
        <div class="col-12 offset-0 col-lg-8 offset-lg-2">
          TODO
        </div>
      </div>
    </div>
    {{ template "html/_footer.html" $ }}
  </main>
  {{ template "html/_scripts.html" }}
</body>
</html>

D internal/v/html/tour.html => internal/v/html/tour.html +0 -25
@@ 1,25 0,0 @@
<!DOCTYPE html>
<html lang=en>
<head>
  {{ template "html/_head.html" }}
  <title>Skipper CMS | Tour</title>
</head>
<body class='page bg-light'>
  <style>{{ template "css/main.css" }}</style>
  <main>
    {{ template "html/_header.html" $ }}
    <div class="pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center">
      <h1 class="display-4">Tour</h1>
    </div>
    <div class='container'>
      <div class='row'>
        <div class="col-12 offset-0 col-lg-8 offset-lg-2">
          TODO
        </div>
      </div>
    </div>
    {{ template "html/_footer.html" $ }}
  </main>
  {{ template "html/_scripts.html" }}
</body>
</html>

M internal/v/tmpls_embed.go => internal/v/tmpls_embed.go +3 -13
@@ 20,25 20,21 @@ func init() {

	tmpls["css/mvp.css"] = tostring("OnJvb3QgewogICAgLS1ib3JkZXItcmFkaXVzOiA1cHg7CiAgICAtLWJveC1zaGFkb3c6IDJweCAycHggMTBweDsKICAgIC0tY29sb3I6ICMxMThiZWU7CiAgICAtLWNvbG9yLWFjY2VudDogIzExOGJlZTBiOwogICAgLS1jb2xvci1iZzogI2ZmZjsKICAgIC0tY29sb3ItYmctc2Vjb25kYXJ5OiAjZTllOWU5OwogICAgLS1jb2xvci1zZWNvbmRhcnk6ICM5MjBkZTk7CiAgICAtLWNvbG9yLXNlY29uZGFyeS1hY2NlbnQ6ICM5MjBkZTkwYjsKICAgIC0tY29sb3Itc2hhZG93OiAjZjRmNGY0OwogICAgLS1jb2xvci10ZXh0OiAjMDAwOwogICAgLS1jb2xvci10ZXh0LXNlY29uZGFyeTogIzk5OTsKICAgIC0taG92ZXItYnJpZ2h0bmVzczogMS4yOwogICAgLS1qdXN0aWZ5LWltcG9ydGFudDogY2VudGVyOwogICAgLS1qdXN0aWZ5LW5vcm1hbDogbGVmdDsKICAgIC0tbGluZS1oZWlnaHQ6IDE1MCU7CiAgICAtLXdpZHRoLWNhcmQ6IDI4NXB4OwogICAgLS13aWR0aC1jYXJkLW1lZGl1bTogNDYwcHg7CiAgICAtLXdpZHRoLWNhcmQtd2lkZTogODAwcHg7CiAgICAtLXdpZHRoLWNvbnRlbnQ6IDEwODBweDsKfQoKLyogTVZQLmNzcyB2MS4wIC0gYnkgQW5keSBCcmV3ZXIgKi8KCi8qIExheW91dCAqLwphcnRpY2xlIGFzaWRlIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbG9yLXNlY29uZGFyeS1hY2NlbnQpOwogICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB2YXIoLS1jb2xvci1zZWNvbmRhcnkpOwogICAgcGFkZGluZzogMC4wMXJlbSAwLjhyZW07Cn0KCmJvZHkgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29sb3ItYmcpOwogICAgY29sb3I6IHZhcigtLWNvbG9yLXRleHQpOwogICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgIlNlZ29lIFVJIiwgUm9ib3RvLCBPeHlnZW4tU2FucywgVWJ1bnR1LCBDYW50YXJlbGwsICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgICBsaW5lLWhlaWdodDogdmFyKC0tbGluZS1oZWlnaHQpOwogICAgbWFyZ2luOiAwOwogICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgcGFkZGluZzogMXJlbSAwOwp9Cgpmb290ZXIsCmhlYWRlciwKbWFpbiB7CiAgICBtYXJnaW46IDAgYXV0bzsKICAgIG1heC13aWR0aDogdmFyKC0td2lkdGgtY29udGVudCk7CiAgICBwYWRkaW5nOiAycmVtIDFyZW07Cn0KCmhyIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWJnLXNlY29uZGFyeSk7CiAgICBib3JkZXI6IG5vbmU7CiAgICBoZWlnaHQ6IDFweDsKICAgIG1hcmdpbjogNHJlbSAwOwp9CgpzZWN0aW9uIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHZhcigtLWp1c3RpZnktaW1wb3J0YW50KTsKfQoKc2VjdGlvbiBhc2lkZSB7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jb2xvci1iZy1zZWNvbmRhcnkpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyLXJhZGl1cyk7CiAgICBib3gtc2hhZG93OiB2YXIoLS1ib3gtc2hhZG93KSB2YXIoLS1jb2xvci1zaGFkb3cpOwogICAgbWFyZ2luOiAxcmVtOwogICAgcGFkZGluZzogMS4yNXJlbTsKICAgIHdpZHRoOiB2YXIoLS13aWR0aC1jYXJkKTsKfQoKc2VjdGlvbiBhc2lkZTpob3ZlciB7CiAgICBib3gtc2hhZG93OiB2YXIoLS1ib3gtc2hhZG93KSB2YXIoLS1jb2xvci1iZy1zZWNvbmRhcnkpOwp9CgpzZWN0aW9uIGFzaWRlIGltZyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7Cn0KCi8qIEhlYWRlcnMgKi8KYXJ0aWNsZSBoZWFkZXIsCmRpdiBoZWFkZXIsCm1haW4gaGVhZGVyIHsKICAgIHBhZGRpbmctdG9wOiAwOwp9CgpoZWFkZXIgewogICAgdGV4dC1hbGlnbjogdmFyKC0tanVzdGlmeS1pbXBvcnRhbnQpOwp9CgpoZWFkZXIgYSBiLApoZWFkZXIgYSBlbSwKaGVhZGVyIGEgaSwKaGVhZGVyIGEgc3Ryb25nIHsKICAgIG1hcmdpbi1sZWZ0OiAxcmVtOwogICAgbWFyZ2luLXJpZ2h0OiAxcmVtOwp9CgpoZWFkZXIgbmF2IGltZyB7CiAgICBtYXJnaW46IDFyZW0gMDsKfQoKc2VjdGlvbiBoZWFkZXIgewogICAgcGFkZGluZy10b3A6IDA7CiAgICB3aWR0aDogMTAwJTsKfQoKLyogTmF2ICovCm5hdiB7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZGlzcGxheTogZmxleDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgbWFyZ2luLWJvdHRvbTogN3JlbTsKfQoKbmF2IHVsIHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBwYWRkaW5nOiAwOwp9CgpuYXYgdWwgbGkgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgbWFyZ2luOiAwIDAuNXJlbTsKfQoKLyogVHlwb2dyYXBoeSAqLwpjb2RlIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIG1hcmdpbjogMCAwLjFyZW07CiAgICBwYWRkaW5nOiAwcmVtIDAuNXJlbTsKfQoKY29kZSwKc2FtcCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1hY2NlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbG9yLXRleHQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyLXJhZGl1cyk7CiAgICB0ZXh0LWFsaWduOiB2YXIoLS1qdXN0aWZ5LW5vcm1hbCk7Cn0KCmgxLApoMiwKaDMsCmg0LApoNSwKaDYgewogICAgbGluZS1oZWlnaHQ6IHZhcigtLWxpbmUtaGVpZ2h0KTsKfQoKbWFyayB7CiAgICBwYWRkaW5nOiAwLjFyZW07Cn0KCm9sIGxpLAp1bCBsaSB7CiAgICBwYWRkaW5nOiAwLjJyZW0gMDsKfQoKcCB7CiAgICBtYXJnaW46IDAuNzVyZW0gMDsKICAgIHBhZGRpbmc6IDA7Cn0KCnNhbXAgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBtYXJnaW46IDFyZW0gMDsKICAgIG1heC13aWR0aDogdmFyKC0td2lkdGgtY2FyZC13aWRlKTsKICAgIHBhZGRpbmc6IDFyZW07Cn0KCnNtYWxsIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xvci10ZXh0LXNlY29uZGFyeSk7Cn0KCnN1cCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1zZWNvbmRhcnkpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyLXJhZGl1cyk7CiAgICBjb2xvcjogdmFyKC0tY29sb3ItYmcpOwogICAgZm9udC1zaXplOiB4eC1zbWFsbDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbWFyZ2luOiAwLjJyZW07CiAgICBwYWRkaW5nOiAwLjJyZW0gMC4zcmVtOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdG9wOiAtMnB4Owp9CgovKiBMaW5rcyAqLwphIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xvci1zZWNvbmRhcnkpOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCmE6aG92ZXIgewogICAgZmlsdGVyOiBicmlnaHRuZXNzKHZhcigtLWhvdmVyLWJyaWdodG5lc3MpKTsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgphIGIsCmEgZW0sCmEgaSwKYSBzdHJvbmcsCmJ1dHRvbiB7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXItcmFkaXVzKTsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGZvbnQtc2l6ZTogbWVkaXVtOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBtYXJnaW46IDEuNXJlbSAwIDAuNXJlbSAwOwogICAgcGFkZGluZzogMXJlbSAycmVtOwp9CgppbnB1dFt0eXBlPXN1Ym1pdF06aG92ZXIsCmJ1dHRvbjpob3ZlciB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmaWx0ZXI6IGJyaWdodG5lc3ModmFyKC0taG92ZXItYnJpZ2h0bmVzcykpOwp9CgphIGIsCmEgc3Ryb25nLAppbnB1dFt0eXBlPXN1Ym1pdF0sCmJ1dHRvbiB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvcik7CiAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1jb2xvcik7CiAgICBjb2xvcjogdmFyKC0tY29sb3ItYmcpOwp9CgphIGVtLAphIGkgewogICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tY29sb3IpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyLXJhZGl1cyk7CiAgICBjb2xvcjogdmFyKC0tY29sb3IpOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZzogMXJlbSAycmVtOwp9CgovKiBJbWFnZXMgKi8KZmlndXJlIHsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCmZpZ3VyZSBmaWdjYXB0aW9uIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xvci10ZXh0LXNlY29uZGFyeSk7Cn0KCi8qIEZvcm1zICovCmZvcm0gewogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY29sb3ItYmctc2Vjb25kYXJ5KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlci1yYWRpdXMpOwogICAgYm94LXNoYWRvdzogdmFyKC0tYm94LXNoYWRvdykgdmFyKC0tY29sb3Itc2hhZG93KTsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgbWF4LXdpZHRoOiB2YXIoLS13aWR0aC1jYXJkLXdpZGUpOwogICAgbWluLXdpZHRoOiB2YXIoLS13aWR0aC1jYXJkKTsKICAgIHBhZGRpbmc6IDEuNXJlbTsKICAgIHRleHQtYWxpZ246IHZhcigtLWp1c3RpZnktbm9ybWFsKTsKfQoKZm9ybSBoZWFkZXIgewogICAgbWFyZ2luOiAxLjVyZW0gMDsKICAgIHBhZGRpbmc6IDEuNXJlbSAwOwp9CgppbnB1dCwKbGFiZWwsCnNlbGVjdCwKdGV4dGFyZWEgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmb250LXNpemU6IGluaGVyaXQ7CiAgICBtYXgtd2lkdGg6IHZhcigtLXdpZHRoLWNhcmQtd2lkZSk7Cn0KCmlucHV0LApzZWxlY3QsCnRleHRhcmVhIHsKICAgIG1hcmdpbi1ib3R0b206IDFyZW07Cn0KCmlucHV0LApzZWxlY3QsCnRleHRhcmVhIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbG9yLWJnLXNlY29uZGFyeSk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXItcmFkaXVzKTsKICAgIHBhZGRpbmc6IDAuNHJlbSAwLjhyZW07Cn0KCmxhYmVsIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbWFyZ2luLWJvdHRvbTogMC4ycmVtOwp9CgovKiBUYWJsZXMgKi8KdGFibGUgewogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY29sb3ItYmctc2Vjb25kYXJ5KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlci1yYWRpdXMpOwogICAgYm9yZGVyLXNwYWNpbmc6IDA7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcGFkZGluZzogMDsKfQoKdGFibGUgdGQsCnRhYmxlIHRoLAp0YWJsZSB0ciB7CiAgICBwYWRkaW5nOiAwLjRyZW0gMC44cmVtOwogICAgdGV4dC1hbGlnbjogdmFyKC0tanVzdGlmeS1pbXBvcnRhbnQpOwp9Cgp0YWJsZSB0aGVhZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvcik7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyLXJhZGl1cyk7CiAgICBjb2xvcjogdmFyKC0tY29sb3ItYmcpOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKfQoKdGFibGUgdGhlYWQgdGg6Zmlyc3QtY2hpbGQgewogICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogdmFyKC0tYm9yZGVyLXJhZGl1cyk7Cn0KCnRhYmxlIHRoZWFkIHRoOmxhc3QtY2hpbGQgewogICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IHZhcigtLWJvcmRlci1yYWRpdXMpOwp9Cgp0YWJsZSB0aGVhZCB0aDpmaXJzdC1jaGlsZCwKdGFibGUgdHIgdGQ6Zmlyc3QtY2hpbGQgewogICAgdGV4dC1hbGlnbjogdmFyKC0tanVzdGlmeS1ub3JtYWwpOwp9CgovKiBRdW90ZXMgKi8KYmxvY2txdW90ZSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZvbnQtc2l6ZTogeC1sYXJnZTsKICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1saW5lLWhlaWdodCk7CiAgICBtYXJnaW46IDFyZW0gYXV0bzsKICAgIG1heC13aWR0aDogdmFyKC0td2lkdGgtY2FyZC1tZWRpdW0pOwogICAgcGFkZGluZzogMS41cmVtIDFyZW07CiAgICB0ZXh0LWFsaWduOiB2YXIoLS1qdXN0aWZ5LWltcG9ydGFudCk7Cn0KCmJsb2NrcXVvdGUgZm9vdGVyIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xvci10ZXh0LXNlY29uZGFyeSk7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZvbnQtc2l6ZTogc21hbGw7CiAgICBsaW5lLWhlaWdodDogdmFyKC0tbGluZS1oZWlnaHQpOwogICAgcGFkZGluZzogMS41cmVtIDA7Cn0KCi8qIEN1c3RvbSBzdHlsZXMgKi8K")

	tmpls["html/_footer.html"] = tostring("PGRpdiBjbGFzcz1jb250YWluZXI+CiAgPGZvb3RlciBjbGFzcz0icHQtNCBteS1tZC01IHB0LW1kLTUgYm9yZGVyLXRvcCI+CiAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICA8ZGl2IGNsYXNzPSJjb2wtNiBjb2wtbWQtMyBvZmZzZXQtbWQtMyB0ZXh0LW1kLXJpZ2h0Ij4KICAgICAgICA8aDU+TmF2aWdhdGlvbjwvaDU+CiAgICAgICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIHRleHQtc21hbGwiPgogICAgICAgICAge3sgaWYgLlNwYWNlIH19CiAgICAgICAgICA8bGk+PGEgY2xhc3M9J3RleHQtbXV0ZWQnIGhyZWY9Jy8nPkhvbWU8L2E+PC9saT4KICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAge3sgaWYgLkNvbnRlbnRUeXBlIH19CiAgICAgICAgICA8bGk+PGEgY2xhc3M9J3RleHQtbXV0ZWQnIGhyZWY9Jy9zcGFjZS97eyAuU3BhY2UuSUQgfX0nPnt7IC5TcGFjZS5OYW1lIH19PC9hPjwvbGk+CiAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgIHt7IGlmIC5Ib29rIH19CiAgICAgICAgICA8bGk+PGEgY2xhc3M9J3RleHQtbXV0ZWQnIGhyZWY9Jy9zcGFjZS97eyAuU3BhY2UuSUQgfX0nPnt7IC5TcGFjZS5OYW1lIH19PC9hPjwvbGk+CiAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgIHt7IGlmIC5Db250ZW50IH19CiAgICAgICAgICA8bGk+PGEgY2xhc3M9J3RleHQtbXV0ZWQnIGhyZWY9Jy9jb250ZW50dHlwZS97eyAuU3BhY2UuSUR9fS97eyAuQ29udGVudFR5cGUuSUQgfX0nPnt7IC5Db250ZW50VHlwZS5OYW1lIH19PC9hPjwvbGk+CiAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgIHt7IGlmIGFuZCAuU3BhY2UgKG5vdCAuQ29udGVudFR5cGUpIChub3QgLkhvb2spIH19CiAgICAgICAgICAgIDxsaT48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjY29weU1vZGFsIiBjbGFzcz0ndGV4dC1tdXRlZCcgaHJlZj0nIyc+Q29weTwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI3VwZGF0ZU1vZGFsIiBjbGFzcz0ndGV4dC1tdXRlZCcgaHJlZj0nIyc+VXBkYXRlPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjZGVsZXRlTW9kYWwiIGNsYXNzPSd0ZXh0LW11dGVkJyBocmVmPScjJz5EZWxldGU8L2E+PC9saT4KICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAge3sgaWYgYW5kIC5Db250ZW50VHlwZSAobm90IC5Db250ZW50KSB9fQogICAgICAgICAgICA8bGk+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI3VwZGF0ZU1vZGFsIiBjbGFzcz0ndGV4dC1tdXRlZCcgaHJlZj0nIyc+VXBkYXRlPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjZGVsZXRlTW9kYWwiIGNsYXNzPSd0ZXh0LW11dGVkJyBocmVmPScjJz5EZWxldGU8L2E+PC9saT4KICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAge3sgaWYgLkNvbnRlbnQgfX0KICAgICAgICAgICAgPGxpPjxpbnB1dCB0eXBlPXN1Ym1pdCBjbGFzcz0idGV4dC1kZWNvcmF0aW9uLW5vbmUgbS0wIHAtMCBidG4gYnRuLWxpbmsgdGV4dC1tdXRlZCBib3JkZXItMCIgdmFsdWU9U2F2ZSAvPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjZGVsZXRlTW9kYWwiIGNsYXNzPSd0ZXh0LW11dGVkJyBocmVmPScjJz5EZWxldGU8L2E+PC9saT4KICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAge3sgaWYgLkhvb2sgfX0KICAgICAgICAgICAgPGxpPjxhIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNkZWxldGVNb2RhbCIgY2xhc3M9J3RleHQtbXV0ZWQnIGhyZWY9JyMnPkRlbGV0ZTwvYT48L2xpPgogICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICB7eyBpZiAuVXNlciB9fQogICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvdXNlci9sb2dvdXQnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9c3VibWl0IGNsYXNzPSJ0ZXh0LWRlY29yYXRpb24tbm9uZSBtLTAgcC0wIGJ0biBidG4tbGluayB0ZXh0LW11dGVkIGJvcmRlci0wIiB2YWx1ZT1Mb2dvdXQgLz4KICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIHt7aWYgYW5kIC5Vc2VyICguVXNlciB8IHBhaWQpfX0KICAgICAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjaW52aXRlTW9kYWwiIGNsYXNzPSd0ZXh0LW11dGVkJyBocmVmPScjJz5JbnZpdGU8L2E+PC9saT4KICAgICAgICAgICAge3tlbmR9fQogICAgICAgICAgICA8bGk+PGEgY2xhc3M9J3RleHQtbXV0ZWQnIGhyZWY9Jy9wYWdlL2JpbGxpbmcnPkJpbGxpbmc8L2E+PC9saT4KICAgICAgICAgIHt7IGVsc2UgfX0KICAgICAgICAgICAgPGxpPjxhIGNsYXNzPSd0ZXh0LW11dGVkJyBocmVmPScvJz5Ib21lPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBjbGFzcz0ndGV4dC1tdXRlZCcgaHJlZj0nLyNzaWdudXAnPlNpZ251cDwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgY2xhc3M9J3RleHQtbXV0ZWQnIGhyZWY9Jy8jbG9naW4nPkxvZ2luPC9hPjwvbGk+CiAgICAgICAgICB7eyBlbmR9fQogICAgICAgICAgPGxpPjxhIGNsYXNzPSd0ZXh0LW11dGVkJyBocmVmPScvL2dpdC5zci5odC9+ZXZhbmovY21zJz5Tb3VyY2U8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBjbGFzcz0ndGV4dC1tdXRlZCcgaHJlZj0nLy9naXQuc3IuaHQvfmV2YW5qL2Ntcy90cmVlL21hc3Rlci9MSUNFTlNFJz5MaWNlbnNlPC9hPjwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbC02IGNvbC1tZC0zIj4KICAgICAgICA8aDU+UmVzb3VyY2VzPC9oNT4KICAgICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQgdGV4dC1zbWFsbCI+CiAgICAgICAgICB7e2lmIC5Vc2VyfX0KICAgICAgICAgICAgPGxpPjxhIGNsYXNzPSd0ZXh0LW11dGVkJyBocmVmPScvcGFnZS9iaWxsaW5nJz5CaWxsaW5nPC9hPjwvbGk+CiAgICAgICAgICB7e2Vsc2V9fQogICAgICAgICAgICA8bGk+PGEgY2xhc3M9J3RleHQtbXV0ZWQnIGhyZWY9Jy8jcHJpY2luZyc+UHJpY2luZzwvYT48L2xpPgogICAgICAgICAge3tlbmR9fQogICAgICAgICAgPGxpPjxhIGNsYXNzPSd0ZXh0LW11dGVkJyBocmVmPScvcGFnZS90b3VyJz5Ub3VyPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgY2xhc3M9J3RleHQtbXV0ZWQnIGhyZWY9Jy9wYWdlL2RvYyc+RG9jczwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGNsYXNzPSJ0ZXh0LW11dGVkIiBocmVmPSIvcGFnZS9mYXEiPkZBUTwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGNsYXNzPSJ0ZXh0LW11dGVkIiBocmVmPSIvcGFnZS90ZXJtcyI+VGVybXM8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBjbGFzcz0idGV4dC1tdXRlZCIgaHJlZj0iL3BhZ2UvcHJpdmFjeSI+UHJpdmFjeTwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGNsYXNzPSJ0ZXh0LW11dGVkIiBocmVmPSIvcGFnZS9jb250YWN0Ij5Db250YWN0PC9hPjwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9cm93PgogICAgICA8cCBjbGFzcz0ndGV4dC1tdXRlZCB0ZXh0LWNlbnRlciBtdC01IHctMTAwIHRleHQtdHJ1bmNhdGUgb3ZlcmZsb3ctaGlkZGVuJz52Lnt7LkJ1aWxkfX08L3A+CiAgICA8L2Rpdj4KICA8L2Zvb3Rlcj4KPC9kaXY+Cgp7e2lmIGFuZCAuVXNlciAoLlVzZXIgfCBwYWlkKX19Cjxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2ludml0ZScgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9bWV0aG9kIHZhbHVlPVBPU1QgLz4KICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1tZXRob2QgdmFsdWU9Int7LlVzZXIuT3JnLklEfX0iIC8+CiAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9Imludml0ZU1vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJleGFtcGxlTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlIj4KICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJleGFtcGxlTW9kYWxMYWJlbCI+SW52aXRlIHNvbWVvbmUgdG8geW91ciBzcGFjZShzKTwvaDU+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICA8cD5XZSdsbCBnZW5lcmF0ZSBhIHNwZWNpYWwgbGluayBmb3IgeW91LiBTZW5kIHRoaXMgdG8geW91ciBmcmllbmQsIAogICAgICAgICAgY293b3JrZXIsIG9yIHdob2V2ZXIhPC9wPgogICAgICAgICAgPHA+VGhlIGludml0ZSB3aWxsIG9ubHkgYmUgYWN0aXZlIGZvciBvbmUgaG91ci48L3A+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdmb3JtLWdyb3VwIHJvdyc+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9J2NvbC0xMic+CiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1yb2xlPlVzZXIncyBkZXNpcmVkIHJvbGU8L2xhYmVsPgogICAgICAgICAgICAgIDxzZWxlY3QgaWQ9cm9sZSBjbGFzcz0idy0xMDAgZm9ybS1jb250cm9sIiBuYW1lPXJvbGUgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPlJvbGU8L29wdGlvbj4KICAgICAgICAgICAgICAgIHt7cmFuZ2UgLlJvbGVzfX0KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Int7Lk5hbWV9fSI+e3suTmFtZX19PC9vcHRpb24+CiAgICAgICAgICAgICAgICB7e2VuZH19CiAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R288L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC9mb3JtPgp7e2VuZH19Cgp7e2lmIC5BfX0KPGltZyBzdHlsZT0ncG9zaXRpb246IGZpeGVkOyBib3R0b206IDA7IHJpZ2h0OiAwOycgc3JjPSIvL3NraXBwZXJjbXMuZ29hdGNvdW50ZXIuY29tL2NvdW50P3A9e3suQS5QYXRofX17e2lmIC5BLlJlZmVycmVyfX0mcj17ey5BLlJlZmVycmVyfX17e2VuZH19JnJuZD17ey5BLlJORH19Ij4Ke3tlbmR9fQo=")
	tmpls["html/_footer.html"] = tostring("PGRpdiBjbGFzcz1jb250YWluZXI+CiAgPGZvb3RlciBjbGFzcz0icHQtNCBteS1tZC01IHB0LW1kLTUgYm9yZGVyLXRvcCI+CiAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICA8ZGl2IGNsYXNzPSJjb2wtNiBjb2wtbWQtMyBvZmZzZXQtbWQtMyB0ZXh0LW1kLXJpZ2h0Ij4KICAgICAgICA8aDU+TmF2aWdhdGlvbjwvaDU+CiAgICAgICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIHRleHQtc21hbGwiPgogICAgICAgICAge3sgaWYgLlNwYWNlIH19CiAgICAgICAgICA8bGk+PGEgY2xhc3M9J3RleHQtbXV0ZWQnIGhyZWY9Jy8nPkhvbWU8L2E+PC9saT4KICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAge3sgaWYgLkNvbnRlbnRUeXBlIH19CiAgICAgICAgICA8bGk+PGEgY2xhc3M9J3RleHQtbXV0ZWQnIGhyZWY9Jy9zcGFjZS97eyAuU3BhY2UuSUQgfX0nPnt7IC5TcGFjZS5OYW1lIH19PC9hPjwvbGk+CiAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgIHt7IGlmIC5Ib29rIH19CiAgICAgICAgICA8bGk+PGEgY2xhc3M9J3RleHQtbXV0ZWQnIGhyZWY9Jy9zcGFjZS97eyAuU3BhY2UuSUQgfX0nPnt7IC5TcGFjZS5OYW1lIH19PC9hPjwvbGk+CiAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgIHt7IGlmIC5Db250ZW50IH19CiAgICAgICAgICA8bGk+PGEgY2xhc3M9J3RleHQtbXV0ZWQnIGhyZWY9Jy9jb250ZW50dHlwZS97eyAuU3BhY2UuSUR9fS97eyAuQ29udGVudFR5cGUuSUQgfX0nPnt7IC5Db250ZW50VHlwZS5OYW1lIH19PC9hPjwvbGk+CiAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgIHt7IGlmIGFuZCAuU3BhY2UgKG5vdCAuQ29udGVudFR5cGUpIChub3QgLkhvb2spIH19CiAgICAgICAgICAgIDxsaT48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjY29weU1vZGFsIiBjbGFzcz0ndGV4dC1tdXRlZCcgaHJlZj0nIyc+Q29weTwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI3VwZGF0ZU1vZGFsIiBjbGFzcz0ndGV4dC1tdXRlZCcgaHJlZj0nIyc+VXBkYXRlPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjZGVsZXRlTW9kYWwiIGNsYXNzPSd0ZXh0LW11dGVkJyBocmVmPScjJz5EZWxldGU8L2E+PC9saT4KICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAge3sgaWYgYW5kIC5Db250ZW50VHlwZSAobm90IC5Db250ZW50KSB9fQogICAgICAgICAgICA8bGk+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI3VwZGF0ZU1vZGFsIiBjbGFzcz0ndGV4dC1tdXRlZCcgaHJlZj0nIyc+VXBkYXRlPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjZGVsZXRlTW9kYWwiIGNsYXNzPSd0ZXh0LW11dGVkJyBocmVmPScjJz5EZWxldGU8L2E+PC9saT4KICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAge3sgaWYgLkNvbnRlbnQgfX0KICAgICAgICAgICAgPGxpPjxpbnB1dCB0eXBlPXN1Ym1pdCBjbGFzcz0idGV4dC1kZWNvcmF0aW9uLW5vbmUgbS0wIHAtMCBidG4gYnRuLWxpbmsgdGV4dC1tdXRlZCBib3JkZXItMCIgdmFsdWU9U2F2ZSAvPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjZGVsZXRlTW9kYWwiIGNsYXNzPSd0ZXh0LW11dGVkJyBocmVmPScjJz5EZWxldGU8L2E+PC9saT4KICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAge3sgaWYgLkhvb2sgfX0KICAgICAgICAgICAgPGxpPjxhIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNkZWxldGVNb2RhbCIgY2xhc3M9J3RleHQtbXV0ZWQnIGhyZWY9JyMnPkRlbGV0ZTwvYT48L2xpPgogICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICB7eyBpZiAuVXNlciB9fQogICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvdXNlci9sb2dvdXQnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9c3VibWl0IGNsYXNzPSJ0ZXh0LWRlY29yYXRpb24tbm9uZSBtLTAgcC0wIGJ0biBidG4tbGluayB0ZXh0LW11dGVkIGJvcmRlci0wIiB2YWx1ZT1Mb2dvdXQgLz4KICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIHt7aWYgYW5kIC5Vc2VyICguVXNlciB8IHBhaWQpfX0KICAgICAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjaW52aXRlTW9kYWwiIGNsYXNzPSd0ZXh0LW11dGVkJyBocmVmPScjJz5JbnZpdGU8L2E+PC9saT4KICAgICAgICAgICAge3tlbmR9fQogICAgICAgICAgICA8bGk+PGEgY2xhc3M9J3RleHQtbXV0ZWQnIGhyZWY9Jy9wYWdlL2JpbGxpbmcnPkJpbGxpbmc8L2E+PC9saT4KICAgICAgICAgIHt7IGVsc2UgfX0KICAgICAgICAgICAgPGxpPjxhIGNsYXNzPSd0ZXh0LW11dGVkJyBocmVmPScvJz5Ib21lPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBjbGFzcz0ndGV4dC1tdXRlZCcgaHJlZj0nLyNzaWdudXAnPlNpZ251cDwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgY2xhc3M9J3RleHQtbXV0ZWQnIGhyZWY9Jy8jbG9naW4nPkxvZ2luPC9hPjwvbGk+CiAgICAgICAgICB7eyBlbmR9fQogICAgICAgICAgPGxpPjxhIGNsYXNzPSd0ZXh0LW11dGVkJyBocmVmPScvL2dpdC5zci5odC9+ZXZhbmovY21zJz5Tb3VyY2U8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBjbGFzcz0ndGV4dC1tdXRlZCcgaHJlZj0nLy9naXQuc3IuaHQvfmV2YW5qL2Ntcy90cmVlL21hc3Rlci9MSUNFTlNFJz5MaWNlbnNlPC9hPjwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbC02IGNvbC1tZC0zIj4KICAgICAgICA8aDU+UmVzb3VyY2VzPC9oNT4KICAgICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQgdGV4dC1zbWFsbCI+CiAgICAgICAgICB7e2lmIC5Vc2VyfX0KICAgICAgICAgICAgPGxpPjxhIGNsYXNzPSd0ZXh0LW11dGVkJyBocmVmPScvcGFnZS9iaWxsaW5nJz5CaWxsaW5nPC9hPjwvbGk+CiAgICAgICAgICB7e2Vsc2V9fQogICAgICAgICAgICA8bGk+PGEgY2xhc3M9J3RleHQtbXV0ZWQnIGhyZWY9Jy8jcHJpY2luZyc+UHJpY2luZzwvYT48L2xpPgogICAgICAgICAge3tlbmR9fQogICAgICAgICAgPGxpPjxhIGNsYXNzPSd0ZXh0LW11dGVkJyBocmVmPScvdG91cic+VG91cjwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGNsYXNzPSd0ZXh0LW11dGVkJyBocmVmPScvZG9jJz5Eb2NzPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgY2xhc3M9InRleHQtbXV0ZWQiIGhyZWY9Ii9mYXEiPkZBUTwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGNsYXNzPSJ0ZXh0LW11dGVkIiBocmVmPSIvdGVybXMiPlRlcm1zPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgY2xhc3M9InRleHQtbXV0ZWQiIGhyZWY9Ii9wcml2YWN5Ij5Qcml2YWN5PC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgY2xhc3M9InRleHQtbXV0ZWQiIGhyZWY9Ii9jb250YWN0Ij5Db250YWN0PC9hPjwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9cm93PgogICAgICA8cCBjbGFzcz0ndGV4dC1tdXRlZCB0ZXh0LWNlbnRlciBtdC01IHctMTAwIHRleHQtdHJ1bmNhdGUgb3ZlcmZsb3ctaGlkZGVuJz52Lnt7LkJ1aWxkfX08L3A+CiAgICA8L2Rpdj4KICA8L2Zvb3Rlcj4KPC9kaXY+Cgp7e2lmIGFuZCAuVXNlciAoLlVzZXIgfCBwYWlkKX19Cjxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2ludml0ZScgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9bWV0aG9kIHZhbHVlPVBPU1QgLz4KICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1tZXRob2QgdmFsdWU9Int7LlVzZXIuT3JnLklEfX0iIC8+CiAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9Imludml0ZU1vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJleGFtcGxlTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlIj4KICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJleGFtcGxlTW9kYWxMYWJlbCI+SW52aXRlIHNvbWVvbmUgdG8geW91ciBzcGFjZShzKTwvaDU+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICA8cD5XZSdsbCBnZW5lcmF0ZSBhIHNwZWNpYWwgbGluayBmb3IgeW91LiBTZW5kIHRoaXMgdG8geW91ciBmcmllbmQsIAogICAgICAgICAgY293b3JrZXIsIG9yIHdob2V2ZXIhPC9wPgogICAgICAgICAgPHA+VGhlIGludml0ZSB3aWxsIG9ubHkgYmUgYWN0aXZlIGZvciBvbmUgaG91ci48L3A+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdmb3JtLWdyb3VwIHJvdyc+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9J2NvbC0xMic+CiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1yb2xlPlVzZXIncyBkZXNpcmVkIHJvbGU8L2xhYmVsPgogICAgICAgICAgICAgIDxzZWxlY3QgaWQ9cm9sZSBjbGFzcz0idy0xMDAgZm9ybS1jb250cm9sIiBuYW1lPXJvbGUgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPlJvbGU8L29wdGlvbj4KICAgICAgICAgICAgICAgIHt7cmFuZ2UgLlJvbGVzfX0KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Int7Lk5hbWV9fSI+e3suTmFtZX19PC9vcHRpb24+CiAgICAgICAgICAgICAgICB7e2VuZH19CiAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R288L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC9mb3JtPgp7e2VuZH19Cgp7e2lmIC5BfX0KPGltZyBzdHlsZT0ncG9zaXRpb246IGZpeGVkOyBib3R0b206IDA7IHJpZ2h0OiAwOycgc3JjPSIvL3NraXBwZXJjbXMuZ29hdGNvdW50ZXIuY29tL2NvdW50P3A9e3suQS5QYXRofX17e2lmIC5BLlJlZmVycmVyfX0mcj17ey5BLlJlZmVycmVyfX17e2VuZH19JnJuZD17ey5BLlJORH19Ij4Ke3tlbmR9fQo=")

	tmpls["html/_head.html"] = tostring("PG1ldGEgY2hhcnNldD0ndXRmLTgnPgo8bWV0YSBuYW1lPSd2aWV3cG9ydCcgY29udGVudD0nd2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEnPgo8bGluayByZWw9J2ljb24nIHR5cGU9J2ltYWdlL3gtaWNvbicgaHJlZj0naHR0cHM6Ly9mYXZpY29uLmV2YW5qb24uZXMvMC8xMDUvMjE3LzMyL2Zhdmljb24uaWNvJyAvPgo8bGluayByZWw9J3N0eWxlc2hlZXQnIGhyZWY9Jy9zdGF0aWMvY3NzL2Jvb3RzdHJhcC5taW4uY3NzJyAvPgo=")

	tmpls["html/_header.html"] = tostring("PGhlYWRlciBjbGFzcz0nYmctcHJpbWFyeSc+CiAgPG5hdiBjbGFzcz0nY29udGFpbmVyIG5hdmJhciBuYXZiYXItZXhwYW5kLWxnIG5hdmJhci1kYXJrJz4KICAgIDxhIGNsYXNzPSduYXZiYXItYnJhbmQnIGhyZWY9Jy8nPgogICAgICA8aW1nIHdpZHRoPTUwIGhlaWdodD01MCBzcmM9Jy9zdGF0aWMvaW1nL2xvZ28td2hpdGUuc3ZnJz4KICAgICAgPHNwYW4gY2xhc3M9J2Qtbm9uZSBkLWxnLWlubGluZSc+U2tpcHBlciBDTVM8L3NwYW4+CiAgICA8L2E+CiAgICA8YnV0dG9uIGNsYXNzPSduYXZiYXItdG9nZ2xlcicgdHlwZT0nYnV0dG9uJyBkYXRhLXRvZ2dsZT0nY29sbGFwc2UnIGRhdGEtdGFyZ2V0PScjbmF2YmFyU3VwcG9ydGVkQ29udGVudCcgYXJpYS1jb250cm9scz0nbmF2YmFyU3VwcG9ydGVkQ29udGVudCcgYXJpYS1leHBhbmRlZD0nZmFsc2UnIGFyaWEtbGFiZWw9J1RvZ2dsZSBuYXZpZ2F0aW9uJz4KICAgICAgPHNwYW4gY2xhc3M9J25hdmJhci10b2dnbGVyLWljb24nPjwvc3Bhbj4KICAgIDwvYnV0dG9uPgogICAgPGRpdiBjbGFzcz0nY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlJyBpZD0nbmF2YmFyU3VwcG9ydGVkQ29udGVudCc+CiAgICAgIDx1bCBjbGFzcz0nbmF2YmFyLW5hdiBtbC1hdXRvJz4KICAgICAgICB7eyBpZiAuU3BhY2UgfX0KICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy8nPkhvbWU8L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuQ29udGVudFR5cGUgfX0KICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy9zcGFjZS97eyAuU3BhY2UuSUQgfX0nPnt7IC5TcGFjZS5OYW1lIH19PC9hPjwvbGk+CiAgICAgICAge3sgZW5kIH19CiAgICAgICAge3sgaWYgLkhvb2sgfX0KICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy9zcGFjZS97eyAuU3BhY2UuSUQgfX0nPnt7IC5TcGFjZS5OYW1lIH19PC9hPjwvbGk+CiAgICAgICAge3sgZW5kIH19CiAgICAgICAge3sgaWYgLkNvbnRlbnQgfX0KICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy9jb250ZW50dHlwZS97eyAuU3BhY2UuSUR9fS97eyAuQ29udGVudFR5cGUuSUQgfX0nPnt7IC5Db250ZW50VHlwZS5OYW1lIH19PC9hPjwvbGk+CiAgICAgICAge3sgZW5kIH19CiAgICAgICAge3sgaWYgYW5kIC5TcGFjZSAobm90IC5Db250ZW50VHlwZSkgKG5vdCAuSG9vaykgfX0KICAgICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNjb3B5TW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+Q29weTwvYT48L2xpPgogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI3VwZGF0ZU1vZGFsIiBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9JyMnPlVwZGF0ZTwvYT48L2xpPgogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2RlbGV0ZU1vZGFsIiBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9JyMnPkRlbGV0ZTwvYT48L2xpPgogICAgICAgIHt7IGVuZCB9fQogICAgICAgIHt7IGlmIGFuZCAuQ29udGVudFR5cGUgKG5vdCAuQ29udGVudCkgfX0KICAgICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiN1cGRhdGVNb2RhbCIgY2xhc3M9J25hdi1saW5rJyBocmVmPScjJz5VcGRhdGU8L2E+PC9saT4KICAgICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNkZWxldGVNb2RhbCIgY2xhc3M9J25hdi1saW5rJyBocmVmPScjJz5EZWxldGU8L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuQ29udGVudCB9fQogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGlucHV0IHR5cGU9c3VibWl0IGNsYXNzPSJidG4gYnRuLWxpbmsgbmF2LWxpbmsgYm9yZGVyLTAiIHZhbHVlPVNhdmUgLz48L2xpPgogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2RlbGV0ZU1vZGFsIiBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9JyMnPkRlbGV0ZTwvYT48L2xpPgogICAgICAgIHt7IGVuZCB9fQogICAgICAgIHt7IGlmIC5Ib29rIH19CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjZGVsZXRlTW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+RGVsZXRlPC9hPjwvbGk+CiAgICAgICAge3sgZW5kIH19CiAgICAgICAge3sgaWYgLlVzZXIgfX0KICAgICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPgogICAgICAgICAgICA8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jy91c2VyL2xvZ291dCcgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9c3VibWl0IGNsYXNzPSJidG4gYnRuLWxpbmsgbmF2LWxpbmsgYm9yZGVyLTAiIHZhbHVlPUxvZ291dCAvPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICA8L2xpPgogICAgICAgICAge3tpZiBhbmQgLlVzZXIgKC5Vc2VyIHwgcGFpZCl9fQogICAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjaW52aXRlTW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+SW52aXRlPC9hPjwvbGk+CiAgICAgICAgICB7e2VuZH19CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy9wYWdlL2JpbGxpbmcnPkJpbGxpbmc8L2E+PC9saT4KICAgICAgICB7eyBlbHNlIH19CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy8jc2lnbnVwJz5TaWdudXA8L2E+PC9saT4KICAgICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nLyNsb2dpbic+TG9naW48L2E+PC9saT4KICAgICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nLyNwcmljaW5nJz5QcmljaW5nPC9hPjwvbGk+CiAgICAgICAge3sgZW5kfX0KICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy9wYWdlL3RvdXInPlRvdXI8L2E+PC9saT4KICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy9wYWdlL2RvYyc+RG9jczwvYT48L2xpPgogICAgICA8L3VsPgogICAgPC9kaXY+CiAgPC9uYXY+CjwvaGVhZGVyPgo=")
	tmpls["html/_header.html"] = tostring("PGhlYWRlciBjbGFzcz0nYmctcHJpbWFyeSc+CiAgPG5hdiBjbGFzcz0nY29udGFpbmVyIG5hdmJhciBuYXZiYXItZXhwYW5kLWxnIG5hdmJhci1kYXJrJz4KICAgIDxhIGNsYXNzPSduYXZiYXItYnJhbmQnIGhyZWY9Jy8nPgogICAgICA8aW1nIHdpZHRoPTUwIGhlaWdodD01MCBzcmM9Jy9zdGF0aWMvaW1nL2xvZ28td2hpdGUuc3ZnJz4KICAgICAgPHNwYW4gY2xhc3M9J2Qtbm9uZSBkLWxnLWlubGluZSc+U2tpcHBlciBDTVM8L3NwYW4+CiAgICA8L2E+CiAgICA8YnV0dG9uIGNsYXNzPSduYXZiYXItdG9nZ2xlcicgdHlwZT0nYnV0dG9uJyBkYXRhLXRvZ2dsZT0nY29sbGFwc2UnIGRhdGEtdGFyZ2V0PScjbmF2YmFyU3VwcG9ydGVkQ29udGVudCcgYXJpYS1jb250cm9scz0nbmF2YmFyU3VwcG9ydGVkQ29udGVudCcgYXJpYS1leHBhbmRlZD0nZmFsc2UnIGFyaWEtbGFiZWw9J1RvZ2dsZSBuYXZpZ2F0aW9uJz4KICAgICAgPHNwYW4gY2xhc3M9J25hdmJhci10b2dnbGVyLWljb24nPjwvc3Bhbj4KICAgIDwvYnV0dG9uPgogICAgPGRpdiBjbGFzcz0nY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlJyBpZD0nbmF2YmFyU3VwcG9ydGVkQ29udGVudCc+CiAgICAgIDx1bCBjbGFzcz0nbmF2YmFyLW5hdiBtbC1hdXRvJz4KICAgICAgICB7eyBpZiAuU3BhY2UgfX0KICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy8nPkhvbWU8L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuQ29udGVudFR5cGUgfX0KICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy9zcGFjZS97eyAuU3BhY2UuSUQgfX0nPnt7IC5TcGFjZS5OYW1lIH19PC9hPjwvbGk+CiAgICAgICAge3sgZW5kIH19CiAgICAgICAge3sgaWYgLkhvb2sgfX0KICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy9zcGFjZS97eyAuU3BhY2UuSUQgfX0nPnt7IC5TcGFjZS5OYW1lIH19PC9hPjwvbGk+CiAgICAgICAge3sgZW5kIH19CiAgICAgICAge3sgaWYgLkNvbnRlbnQgfX0KICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy9jb250ZW50dHlwZS97eyAuU3BhY2UuSUR9fS97eyAuQ29udGVudFR5cGUuSUQgfX0nPnt7IC5Db250ZW50VHlwZS5OYW1lIH19PC9hPjwvbGk+CiAgICAgICAge3sgZW5kIH19CiAgICAgICAge3sgaWYgYW5kIC5TcGFjZSAobm90IC5Db250ZW50VHlwZSkgKG5vdCAuSG9vaykgfX0KICAgICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNjb3B5TW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+Q29weTwvYT48L2xpPgogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI3VwZGF0ZU1vZGFsIiBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9JyMnPlVwZGF0ZTwvYT48L2xpPgogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2RlbGV0ZU1vZGFsIiBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9JyMnPkRlbGV0ZTwvYT48L2xpPgogICAgICAgIHt7IGVuZCB9fQogICAgICAgIHt7IGlmIGFuZCAuQ29udGVudFR5cGUgKG5vdCAuQ29udGVudCkgfX0KICAgICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiN1cGRhdGVNb2RhbCIgY2xhc3M9J25hdi1saW5rJyBocmVmPScjJz5VcGRhdGU8L2E+PC9saT4KICAgICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNkZWxldGVNb2RhbCIgY2xhc3M9J25hdi1saW5rJyBocmVmPScjJz5EZWxldGU8L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuQ29udGVudCB9fQogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGlucHV0IHR5cGU9c3VibWl0IGNsYXNzPSJidG4gYnRuLWxpbmsgbmF2LWxpbmsgYm9yZGVyLTAiIHZhbHVlPVNhdmUgLz48L2xpPgogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2RlbGV0ZU1vZGFsIiBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9JyMnPkRlbGV0ZTwvYT48L2xpPgogICAgICAgIHt7IGVuZCB9fQogICAgICAgIHt7IGlmIC5Ib29rIH19CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjZGVsZXRlTW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+RGVsZXRlPC9hPjwvbGk+CiAgICAgICAge3sgZW5kIH19CiAgICAgICAge3sgaWYgLlVzZXIgfX0KICAgICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPgogICAgICAgICAgICA8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jy91c2VyL2xvZ291dCcgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9c3VibWl0IGNsYXNzPSJidG4gYnRuLWxpbmsgbmF2LWxpbmsgYm9yZGVyLTAiIHZhbHVlPUxvZ291dCAvPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICA8L2xpPgogICAgICAgICAge3tpZiBhbmQgLlVzZXIgKC5Vc2VyIHwgcGFpZCl9fQogICAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjaW52aXRlTW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+SW52aXRlPC9hPjwvbGk+CiAgICAgICAgICB7e2VuZH19CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy9wYWdlL2JpbGxpbmcnPkJpbGxpbmc8L2E+PC9saT4KICAgICAgICB7eyBlbHNlIH19CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy8jc2lnbnVwJz5TaWdudXA8L2E+PC9saT4KICAgICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nLyNsb2dpbic+TG9naW48L2E+PC9saT4KICAgICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nLyNwcmljaW5nJz5QcmljaW5nPC9hPjwvbGk+CiAgICAgICAge3sgZW5kfX0KICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy90b3VyJz5Ub3VyPC9hPjwvbGk+CiAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgY2xhc3M9J25hdi1saW5rJyBocmVmPScvZG9jJz5Eb2NzPC9hPjwvbGk+CiAgICAgIDwvdWw+CiAgICA8L2Rpdj4KICA8L25hdj4KPC9oZWFkZXI+Cg==")

	tmpls["html/_scripts.html"] = tostring("PHNjcmlwdCBzcmM9Jy9zdGF0aWMvanMvcG9wcGVyLm1pbi5qcyc+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPScvc3RhdGljL2pzL2Jvb3RzdHJhcC5taW4uanMnPjwvc2NyaXB0Pgo=")

	tmpls["html/billing.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPlNraXBwZXIgQ01TIHwgQmlsbGluZzwvdGl0bGU+CjwvaGVhZD4KPGJvZHkgY2xhc3M9J3BhZ2UgYmctbGlnaHQnPgogIDxzdHlsZT57eyB0ZW1wbGF0ZSAiY3NzL21haW4uY3NzIiB9fTwvc3R5bGU+CiAgPG1haW4+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZGVyLmh0bWwiICQgfX0KICAgIDxkaXYgY2xhc3M9InByaWNpbmctaGVhZGVyIHB4LTMgcHktMyBwdC1tZC01IHBiLW1kLTQgbXgtYXV0byB0ZXh0LWNlbnRlciI+CiAgICAgIDxoMSBjbGFzcz0iZGlzcGxheS00Ij5CaWxsaW5nPC9oMT4KICAgIDwvZGl2PgogICAge3tpZiAuVXNlcn19CiAgICAgIDxkaXYgY2xhc3M9J2NvbnRhaW5lcic+CiAgICAgICAgPGRpdiBjbGFzcz0ncm93Jz4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC0xMiBjb2wtbWQtNiBvZmZzZXQtbWQtMyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9J3RleHQtY2VudGVyJz4KICAgICAgICAgICAgICB7e2lmIC5Vc2VyLkhhc0VtYWlsfX0KICAgICAgICAgICAgICA8cD5VcGRhdGUgeW91ciBlbWFpbC48L3A+CiAgICAgICAgICAgICAge3tlbHNlfX0KICAgICAgICAgICAgICA8cD5TZXQgeW91ciBlbWFpbCBpbiBjYXNlIHlvdSBnZXQgbG9ja2VkIG91dCBvZiB5b3VyIGFjY291bnQuPC9wPgogICAgICAgICAgICAgIHt7ZW5kfX0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0nL3VzZXIvdXBkYXRlL2VtYWlsJyBtZXRob2Q9UE9TVCBjbGFzcz0nbWItNSc+CiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1lbWFpbD5FbWFpbDwvbGFiZWw+CiAgICAgICAgICAgICAgPGlucHV0IGlkPWVtYWlsIG5hbWU9ZW1haWwgdHlwZT1lbWFpbCBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHJlcXVpcmVkIHt7aWYgLlVzZXIuSGFzRW1haWx9fXZhbHVlPSJ7ey5Vc2VyLkVtYWlsfX0ie3tlbmR9fT4KICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R288L2J1dHRvbj4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSd0ZXh0LWNlbnRlcic+CiAgICAgICAgICAgICAgPHA+VXBkYXRlIHlvdXIgcGFzc3dvcmQuPC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPScvdXNlci91cGRhdGUvcGFzc3dvcmQnIG1ldGhvZD1QT1NUIGNsYXNzPSdtYi01Jz4KICAgICAgICAgICAgICA8bGFiZWwgZm9yPWN1cnJlbnQgPkN1cnJlbnQgUGFzc3dvcmQ8L2xhYmVsPgogICAgICAgICAgICAgIDxpbnB1dCBpZD1jdXJyZW50IG5hbWU9Y3VycmVudCB0eXBlPXBhc3N3b3JkIGNsYXNzPSJtYi0zIGZvcm0tY29udHJvbCIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1wYXNzd29yZD5OZXcgUGFzc3dvcmQ8L2xhYmVsPgogICAgICAgICAgICAgIDxpbnB1dCBpZD1wYXNzd29yZCBuYW1lPXBhc3N3b3JkIHR5cGU9cGFzc3dvcmQgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiByZXF1aXJlZD4KICAgICAgICAgICAgICA8bGFiZWwgZm9yPXZlcmlmeT5WZXJpZnk8L2xhYmVsPgogICAgICAgICAgICAgIDxpbnB1dCBpZD12ZXJpZnkgbmFtZT12ZXJpZnkgdHlwZT1wYXNzd29yZCBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHJlcXVpcmVkPgogICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5HbzwvYnV0dG9uPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIHt7aWYgLlVzZXIgfCBwYWlkfX0KICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249Jy91c2VyL2NhbmNlbC9iaWxsaW5nJyBtZXRob2Q9UE9TVCBjbGFzcz0idGV4dC1jZW50ZXIiPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9J21iLTUnPkNhbmNlbCB5b3VyIHt7LlVzZXIuT3JnLlRpZXIuTmFtZX19IHN1YnNjcmlwdGlvbi48L3A+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkLWlubGluZS1ibG9jayI+CiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXRpZXIgdmFsdWU9Int7LlVzZXIuT3JnLlRpZXIuTmFtZX19IiAvPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkIG1iLTQgc2hhZG93LXNtIj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ibXktMCBmb250LXdlaWdodC1ub3JtYWwiPnt7LlVzZXIuT3JnLlRpZXIuTmFtZX19PC9oND4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtYm9keSI+CiAgICAgICAgICAgICAgICAgICAgPGgxIGNsYXNzPSJjYXJkLXRpdGxlIHByaWNpbmctY2FyZC10aXRsZSI+e3suVXNlci5PcmcuVGllci5QcmljZX19IDxzbWFsbCBjbGFzcz0idGV4dC1tdXRlZCI+LyB7ey5Vc2VyLk9yZy5UaWVyLlRpbWVVbml0fX08L3NtYWxsPjwvaDE+CiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIG10LTMgbWItNCI+CiAgICAgICAgICAgICAgICAgICAgICB7e3JhbmdlIC5Vc2VyLk9yZy5UaWVyLk9wdHN9fQogICAgICAgICAgICAgICAgICAgICAgICA8bGk+e3suVGV4dH19PC9saT4KICAgICAgICAgICAgICAgICAgICAgIHt7ZW5kfX0KICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IHctMTAwIj5DYW5jZWw8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIHt7ZWxzZX19CiAgICAgICAgICAgICAgPHAgY2xhc3M9J3RleHQtY2VudGVyIG1iLTUnPlVwZ3JhZGUgdG8gYSBwYWlkIHRpZXIuPGJyPkdldCBtb3JlIGFjY2Vzcy48L3A+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93IHJvdy1jb2xzLTEgcm93LWNvbHMtbWQtMiByb3ctY29scy1sZy0yIG1iLTUgdGV4dC1jZW50ZXIiPgogICAgICAgICAgICAgICAge3tyYW5nZSAuVGllcnN9fQogICAgICAgICAgICAgICAgICB7e2lmIG5vdCAoLnxpc0ZyZWUpfX0KICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249Jy91c2VyL3VwZGF0ZS9iaWxsaW5nJyBtZXRob2Q9UE9TVCBjbGFzcz0iY29sIj4KICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXRpZXIgdmFsdWU9Int7Lk5hbWV9fSIgLz4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQgbWItNCBzaGFkb3ctc20iPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im15LTAgZm9udC13ZWlnaHQtbm9ybWFsIj57ey5OYW1lfX08L2g0PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8aDEgY2xhc3M9ImNhcmQtdGl0bGUgcHJpY2luZy1jYXJkLXRpdGxlIj57ey5QcmljZX19IDxzbWFsbCBjbGFzcz0idGV4dC1tdXRlZCI+LyB7ey5UaW1lVW5pdH19PC9zbWFsbD48L2gxPgogICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQgbXQtMyBtYi00Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICB7e3JhbmdlIC5PcHRzfX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT57ey5UZXh0fX08L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZW5kfX0KICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkgdy0xMDAiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIHt7ZW5kfX0KICAgICAgICAgICAgICAgIHt7ZW5kfX0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAge3tlbmR9fQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAge3tlbHNlfX0KICAgICAgPGRpdiBjbGFzcz0nY29udGFpbmVyJz4KICAgICAgICA8ZGl2IGNsYXNzPSdyb3cnPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sLTEyIj4KICAgICAgICAgICAgPGgxPk9vcHM8L2gxPgogICAgICAgICAgICA8cD5Tb3JyeSwgb3VyIGRldmVsb3BlcnMgYXJlIGxhenkuIFRoaXMgc2hvdWxkIHJlYWxseSByZWRpcmVjdCB5b3UuPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAge3tlbmR9fQogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiAkIH19CiAgPC9tYWluPgogIHt7IHRlbXBsYXRlICJodG1sL19zY3JpcHRzLmh0bWwiIH19CjwvYm9keT4KPC9odG1sPgo=")

	tmpls["html/contact.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPlNraXBwZXIgQ01TIHwgQ29udGFjdDwvdGl0bGU+CjwvaGVhZD4KPGJvZHkgY2xhc3M9J3BhZ2UgYmctbGlnaHQnPgogIDxzdHlsZT57eyB0ZW1wbGF0ZSAiY3NzL21haW4uY3NzIiB9fTwvc3R5bGU+CiAgPG1haW4+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZGVyLmh0bWwiICQgfX0KICAgIDxkaXYgY2xhc3M9InByaWNpbmctaGVhZGVyIHB4LTMgcHktMyBwdC1tZC01IHBiLW1kLTQgbXgtYXV0byB0ZXh0LWNlbnRlciI+CiAgICAgIDxoMSBjbGFzcz0iZGlzcGxheS00Ij5Db250YWN0PC9oMT4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0nY29udGFpbmVyJz4KICAgICAgPGRpdiBjbGFzcz0ncm93Jz4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMTIgb2Zmc2V0LTAgY29sLWxnLTggb2Zmc2V0LWxnLTIiPgogICAgICAgICAgSGkuIE15IG5hbWUgaXMgRXZhbi4gSSdtIHRoZSBvbmx5IHNvdWwgY3VycmVudGx5IHdvcmtpbmcgb24gU2tpcHBlcgogICAgICAgICAgQ01TLiBJZiB5b3UgbmVlZCBzb21lb25lIHRvIGNvbnRhY3QgSSdtIHRoYXQgc29tZW9uZS4gWW91IGNhbiByZWFjaCBtZQogICAgICAgICAgYXQgbWUgQVQgZXZhbmpvbiBET1QgZXMgb3IgdmlhIFR3aXR0ZXIsIAogICAgICAgICAgPGEgaHJlZj0naHR0cHM6Ly90d2l0dGVyLmNvbS9taW5pZWdnczQwJz5AbWluaWVnZ3M0MDwvYT4uIENhb2khCiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9fZm9vdGVyLmh0bWwiICQgfX0KICA8L21haW4+CiAge3sgdGVtcGxhdGUgImh0bWwvX3NjcmlwdHMuaHRtbCIgfX0KPC9ib2R5Pgo8L2h0bWw+Cg==")

	tmpls["html/content.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPlNraXBwZXIgQ01TIHwge3sgLlNwYWNlLk5hbWUgfX0gfCB7eyAuQ29udGVudFR5cGUuTmFtZSB9fSB8IHt7ICguQ29udGVudC5NdXN0VmFsdWVCeU5hbWUgIm5hbWUiKS5WYWx1ZSB9fTwvdGl0bGU+CjwvaGVhZD4KPGJvZHkgY2xhc3M9J2NvbnRlbnQgYmctbGlnaHQnPgogIDxzdHlsZT57eyB0ZW1wbGF0ZSAiY3NzL21haW4uY3NzIiB9fTwvc3R5bGU+CiAgPG1haW4+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZGVyLmh0bWwiICQgfX0KICAgIDxkaXYgY2xhc3M9InByaWNpbmctaGVhZGVyIHB4LTMgcHktMyBwdC1tZC01IHBiLW1kLTQgbXgtYXV0byB0ZXh0LWNlbnRlciI+CiAgICAgIDxoMSBjbGFzcz0iZGlzcGxheS00Ij57eyAoLkNvbnRlbnQuTXVzdFZhbHVlQnlOYW1lICJuYW1lIikuVmFsdWUgfX08L2gxPgogICAgPC9kaXY+CiAgICA8YXJ0aWNsZSBjbGFzcz0nY29udGFpbmVyJz4KICAgICAgPGRpdiBjbGFzcz0ncm93Jz4KICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtMTIgY29sLWxnLTggb2Zmc2V0LWxnLTInPgogICAgICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvY29udGVudCcgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPW1ldGhvZCB2YWx1ZT1QQVRDSCAvPgogICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1zcGFjZSB2YWx1ZT0ie3sgLlNwYWNlLklEIH19IiAvPgogICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1jb250ZW50dHlwZSB2YWx1ZT0ie3sgLkNvbnRlbnRUeXBlLklEIH19IiAvPgogICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1jb250ZW50IHZhbHVlPSJ7eyAuQ29udGVudC5JRCB9fSIgLz4KCiAgICAgICAgICAgIHt7IHJhbmdlICRpbmRleCwgJGl0ZW0gOj0gLkNvbnRlbnRUeXBlLkZpZWxkcyB9fQogICAgICAgICAgICAgIHt7ICR2YWwgOj0gJC5Db250ZW50Lk11c3RWYWx1ZUJ5TmFtZSAoICRpdGVtLk5hbWUgKSB9fQoKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdmb3JtLWdyb3VwJz4KICAgICAgICAgICAgICB7eyBpZiAkdmFsIH19IAogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19Ij57eyB0aXRsZSAkdmFsLk5hbWUgfX08L2xhYmVsPgoKICAgICAgICAgICAgICAgIHt7IGlmIGVxICR2YWwuVHlwZSAiU3RyaW5nU21hbGwiIH19CiAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iZm9ybS1jb250cm9sIiB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIHZhbHVlPSJ7eyAkdmFsLlZhbHVlIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBwbGFjZWhvbGRlcj0ie3sgJHZhbC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAge3sgZW5kIH19CgogICAgICAgICAgICAgICAge3sgaWYgZXEgJHZhbC5UeXBlICJTdHJpbmdCaWciIH19CiAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz0iZm9ybS1jb250cm9sIiB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIHBsYWNlaG9sZGVyPSJ7eyAkdmFsLk5hbWUgfX0iPnt7ICR2YWwuVmFsdWUgfX08L3RleHRhcmVhPgogICAgICAgICAgICAgICAge3sgZW5kIH19CgogICAgICAgICAgICAgICAge3sgaWYgZXEgJHZhbC5UeXBlICJJbnB1dEhUTUwiIH19CiAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz0iZm9ybS1jb250cm9sIGlucHV0LWh0bWwiIHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgdmFsdWU9Int7ICR2YWwuVmFsdWUgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIHBsYWNlaG9sZGVyPSJ7eyAkdmFsLk5hbWUgfX0iPnt7ICR2YWwuVmFsdWUgfX08L3RleHRhcmVhPgogICAgICAgICAgICAgICAge3sgZW5kIH19CgogICAgICAgICAgICAgICAge3sgaWYgZXEgJHZhbC5UeXBlICJJbnB1dE1hcmtkb3duIiB9fQogICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1tYXJrZG93biIge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiB2YWx1ZT0ie3sgJHZhbC5WYWx1ZSB9fSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgcGxhY2Vob2xkZXI9Int7ICR2YWwuTmFtZSB9fSI+e3sgJHZhbC5WYWx1ZSB9fTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAgICB7eyBpZiBlcSAkdmFsLlR5cGUgIkZpbGUiIH19CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZmlsZSBtYi0zIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBuYW1lPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIGlkPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIHZhbHVlPSJ7eyAkdmFsLlZhbHVlIH19IiByZXF1aXJlZCBtdWx0aXBsZT1mYWxzZSB0eXBlPSJmaWxlIiBjbGFzcz0iZm9ybS1maWxlLWlucHV0Ij4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tZmlsZS1sYWJlbCIgZm9yPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iPgogICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZvcm0tZmlsZS10ZXh0Ij5DaG9vc2UgZmlsZS4uLjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmb3JtLWZpbGUtYnV0dG9uIj5Ccm93c2U8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAgICB7eyBpZiBlcSAkdmFsLlR5cGUgIkRhdGUiIH19CiAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iZm9ybS1jb250cm9sIiB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIHZhbHVlPSJ7eyAkdmFsLlZhbHVlIH19IiByZXF1aXJlZCB0eXBlPWRhdGUgbmFtZT0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBwbGFjZWhvbGRlcj0ie3sgJHZhbC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAge3sgZW5kIH19CgogICAgICAgICAgICAgICAge3sgaWYgZXEgJHZhbC5UeXBlICJSZWZlcmVuY2UiIH19CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J3JlZi1tb2RhbCc+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgY2xhc3M9J291dHB1dC1yZWYnIHJlcXVpcmVkIHR5cGU9aGlkZGVuIHZhbHVlPSJ7eyAkdmFsLlZhbHVlIH19IiBuYW1lPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUR9fSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI21vZGFsX3ZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1yZWYgdy1hdXRvIiB0eXBlPWJ1dHRvbiB2YWx1ZT0ie3sgaWYgICR2YWwuUmVmTmFtZSB9fXt7ICR2YWwuUmVmTmFtZSB9fXt7IGVsc2UgfX1PcGVue3sgZW5kfX0iLz4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJtb2RhbF92YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIGRhdGEtZm9jdXM9ImZhbHNlIiBjbGFzcz0ibW9kYWwgZmFkZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0icmVmTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIj5GaW5kIENvbnRlbnQgZm9yIFJlZmVyZW5jZTwvaDU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3MtaW5uZXI9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nbW9kYWwtYm9keSBvdmVyZmxvdy1pbml0aWFsJz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0nZC1ibG9jayc+Q29udGVudCBUeXBlPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0nbWItMyBmb3JtLWNvbnRyb2wgaW5wdXQtY29udGVudHR5cGUnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IENvbnRlbnQgVHlwZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0nZC1ibG9jayc+Q29udGVudCBOYW1lPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBkaXNhYmxlZCBjbGFzcz0nbWItMyBmb3JtLWNvbnRyb2wgaW5wdXQtY29udGVudCcgdHlwZT10ZXh0IHBsYWNlaG9sZGVyPSdTZWFyY2ggYnkgQ29udGVudCBOYW1lJyAvPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1jbGVhciI+Q2xlYXI8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBkYXRhLWRpc21pc3MtaW5uZXI9Im1vZGFsIj5HbzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxICR2YWwuVHlwZSAiUmVmZXJlbmNlTGlzdCIgfX0KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ncmVmLW1vZGFsIHJlZi1saXN0Jz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBjbGFzcz0nb3V0cHV0LXJlZicgcmVxdWlyZWQgdHlwZT1oaWRkZW4gdmFsdWU9Int7ICR2YWwuVmFsdWUgfX0iIG5hbWU9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI21vZGFsX3ZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1yZWYgdy1hdXRvIiB0eXBlPWJ1dHRvbiB2YWx1ZT0ie3sgaWYgICR2YWwuUmVmTGlzdE5hbWVzIH19e3sgJHZhbC5SZWZMaXN0TmFtZXMgfX17eyBlbHNlIH19T3Blbnt7IGVuZH19Ii8+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibW9kYWxfdmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBkYXRhLWZvY3VzPSJmYWxzZSIgY2xhc3M9Im1vZGFsIGZhZGUiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9InJlZk1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSI+RmluZCBDb250ZW50IGZvciBSZWZlcmVuY2UgTGlzdDwvaDU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3MtaW5uZXI9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nbW9kYWwtYm9keSBvdmVyZmxvdy1pbml0aWFsJz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0nZC1ibG9jayc+Q29udGVudCBUeXBlPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0nbWItMyBmb3JtLWNvbnRyb2wgaW5wdXQtY29udGVudHR5cGUnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IENvbnRlbnQgVHlwZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0nZC1ibG9jayc+Q29udGVudCBOYW1lPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBkaXNhYmxlZCBjbGFzcz0nbWItMyBmb3JtLWNvbnRyb2wgaW5wdXQtY29udGVudCcgdHlwZT10ZXh0IHBsYWNlaG9sZGVyPSdTZWFyY2ggYnkgQ29udGVudCBOYW1lJyAvPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1jbGVhciI+Q2xlYXI8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBkYXRhLWRpc21pc3MtaW5uZXI9Im1vZGFsIj5HbzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWItMyI+PC9kaXY+CiAgICAgICAgICAgICAge3sgZWxzZSB9fQogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0idmFsdWVfdXBkYXRlX3t7IC5UeXBlIH19LXt7IC5OYW1lIH19Ij57eyB0aXRsZSAuTmFtZSB9fTwvbGFiZWw+CgogICAgICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIlN0cmluZ1NtYWxsIiB9fQogICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY29udHJvbCIge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHBsYWNlaG9sZGVyPSJ7eyAuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJTdHJpbmdCaWciIH19CiAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz0iZm9ybS1jb250cm9sIiB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IC5OYW1lIH19IiA+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJJbnB1dEhUTUwiIH19CiAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz0iZm9ybS1jb250cm9sIGlucHV0LWh0bWwiIHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgLk5hbWUgfX0iID48L3RleHRhcmVhPgogICAgICAgICAgICAgICAge3sgZW5kIH19CgogICAgICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIklucHV0TWFya2Rvd24iIH19CiAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz0iZm9ybS1jb250cm9sIGlucHV0LW1hcmtkb3duIiB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IC5OYW1lIH19IiA+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJGaWxlIiB9fQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWZpbGUgbWItMyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIG11bHRpcGxlPWZhbHNlIHR5cGU9ImZpbGUiIGNsYXNzPSJmb3JtLWZpbGUtaW5wdXQiPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1maWxlLWxhYmVsIiBmb3I9InZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuTmFtZSB9fSI+CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZm9ybS1maWxlLXRleHQiPkNob29zZSBmaWxlLi4uPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZvcm0tZmlsZS1idXR0b24iPkJyb3dzZTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJEYXRlIiB9fQogICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY29udHJvbCIge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCB0eXBlPWRhdGUgbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHBsYWNlaG9sZGVyPSJ7eyAuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJSZWZlcmVuY2UiIH19CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J3JlZi1tb2RhbCc+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgY2xhc3M9J291dHB1dC1yZWYnIHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjbW9kYWxfdmFsdWVfdXBkYXRlX3t7IC5UeXBlIH19LXt7IC5JRCB9fSIgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1yZWYgdy1hdXRvIiB0eXBlPWJ1dHRvbiB2YWx1ZT1PcGVuIC8+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibW9kYWxfdmFsdWVfdXBkYXRlX3t7IC5UeXBlIH19LXt7IC5JRCB9fSIgZGF0YS1mb2N1cz0iZmFsc2UiIGNsYXNzPSJtb2RhbCBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJyZWZNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiPkZpbmQgQ29udGVudCBmb3IgUmVmZXJlbmNlPC9oNT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcy1pbm5lcj0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdtb2RhbC1ib2R5IG92ZXJmbG93LWluaXRpYWwnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSdkLWJsb2NrJz5Db250ZW50IFR5cGU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSdtYi0zIGZvcm0tY29udHJvbCBpbnB1dC1jb250ZW50dHlwZScgdHlwZT10ZXh0IHBsYWNlaG9sZGVyPSdTZWFyY2ggYnkgQ29udGVudCBUeXBlJyAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSdkLWJsb2NrJz5Db250ZW50IE5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGRpc2FibGVkIGNsYXNzPSdtYi0zIGZvcm0tY29udHJvbCBpbnB1dC1jb250ZW50JyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBDb250ZW50IE5hbWUnIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLWNsZWFyIj5DbGVhcjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIGRhdGEtZGlzbWlzcy1pbm5lcj0ibW9kYWwiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAge3sgZW5kIH19CgogICAgICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIlJlZmVyZW5jZUxpc3QiIH19CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J3JlZi1tb2RhbCByZWYtbGlzdCc+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgY2xhc3M9J291dHB1dC1yZWYnIHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjbW9kYWxfdmFsdWVfdXBkYXRlX3t7IC5UeXBlIH19LXt7IC5JRCB9fSIgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1yZWYgdy1hdXRvIiB0eXBlPWJ1dHRvbiB2YWx1ZT1PcGVuIC8+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibW9kYWxfdmFsdWVfdXBkYXRlX3t7IC5UeXBlIH19LXt7IC5JRCB9fSIgZGF0YS1mb2N1cz0iZmFsc2UiIGNsYXNzPSJtb2RhbCBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJyZWZNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiPkZpbmQgQ29udGVudCBmb3IgUmVmZXJlbmNlIExpc3Q8L2g1PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzLWlubmVyPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWJvZHkgb3ZlcmZsb3ctaW5pdGlhbCc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9J2QtYmxvY2snPkNvbnRlbnQgVHlwZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnR0eXBlJyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBDb250ZW50IFR5cGUnIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9J2QtYmxvY2snPkNvbnRlbnQgTmFtZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGlzYWJsZWQgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnQnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IENvbnRlbnQgTmFtZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSBidG4tY2xlYXIiPkNsZWFyPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSIgZGF0YS1kaXNtaXNzLWlubmVyPSJtb2RhbCI+R288L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ncmVmLW1vZGFsJz4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWItMyI+PC9kaXY+CiAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIHt7IGVuZH19CiAgICAgICAgICAgIDxkaXYgY2xhc3M9J2QtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTMnPgogICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5TYXZlPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9mb3JtPgoKICAgICAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2NvbnRlbnQnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1tZXRob2QgdmFsdWU9REVMRVRFIC8+CiAgICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPXNwYWNlIHZhbHVlPSJ7eyAuU3BhY2UuSUQgfX0iIC8+CiAgICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPWNvbnRlbnR0eXBlIHZhbHVlPSJ7eyAuQ29udGVudFR5cGUuSUQgfX0iIC8+CiAgICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPWNvbnRlbnQgdmFsdWU9Int7IC5Db250ZW50LklEIH19IiAvPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iZGVsZXRlTW9kYWwiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9ImRlbGV0ZU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImRlbGV0ZU1vZGFsTGFiZWwiPkRlbGV0ZSB7eyAoLkNvbnRlbnQuTXVzdFZhbHVlQnlOYW1lICJuYW1lIikuVmFsdWUgfX08L2g1PgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5HbzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZm9ybT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2FydGljbGU+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9fZm9vdGVyLmh0bWwiICQgfX0KICA8L21haW4+CiAge3sgdGVtcGxhdGUgImh0bWwvX3NjcmlwdHMuaHRtbCIgfX0KICA8c2NyaXB0IHNyYz0iL3N0YXRpYy9qcy90aW55bWNlLm1pbi5qcyI+PC9zY3JpcHQ+CiAgPHNjcmlwdCBzcmM9Jy9zdGF0aWMvanMvYXV0b2NvbXBsZXRlLm1pbi5qcyc+PC9zY3JpcHQ+CiAgPHNjcmlwdD57eyB0ZW1wbGF0ZSAianMvbWFpbi5qcyIgJCB9fTwvc2NyaXB0PgogIDxzY3JpcHQ+e3sgdGVtcGxhdGUgImpzL2NvbnRlbnQuanMiICQgfX08L3NjcmlwdD4KPC9ib2R5PgoKPC9odG1sPgo=")

	tmpls["html/contenttype.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+Cgo8aGVhZD4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZC5odG1sIiB9fQogIDx0aXRsZT5Ta2lwcGVyIENNUyB8IHt7IC5TcGFjZS5OYW1lIH19IHwge3sgLkNvbnRlbnRUeXBlLk5hbWUgfX08L3RpdGxlPgo8L2hlYWQ+Cgo8Ym9keSBjbGFzcz0nY29udGVudHR5cGUgYmctbGlnaHQnPgogIDxzdHlsZT57eyB0ZW1wbGF0ZSAiY3NzL21haW4uY3NzIiB9fTwvc3R5bGU+CiAgPG1haW4+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZGVyLmh0bWwiICQgfX0KICAgIDxkaXYgY2xhc3M9InByaWNpbmctaGVhZGVyIHB4LTMgcHktMyBwdC1tZC01IHBiLW1kLTQgbXgtYXV0byB0ZXh0LWNlbnRlciI+CiAgICAgIDxoMSBjbGFzcz0iZGlzcGxheS00Ij57ey5Db250ZW50VHlwZS5OYW1lfX08L2gxPgogICAgPC9kaXY+CiAgICA8YXJ0aWNsZT4KICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvY29udGVudHR5cGUnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPW1ldGhvZCB2YWx1ZT1ERUxFVEUgLz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1zcGFjZSB2YWx1ZT0ie3sgLlNwYWNlLklEIH19IiAvPgogICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPWNvbnRlbnR0eXBlIHZhbHVlPSJ7eyAuQ29udGVudFR5cGUuSUQgfX0iIC8+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9ImRlbGV0ZU1vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJkZWxldGVNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImRlbGV0ZU1vZGFsTGFiZWwiPkRlbGV0ZSB7ey5Db250ZW50VHlwZS5OYW1lfX08L2g1PgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZm9ybT4KCiAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2NvbnRlbnQnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPW1ldGhvZCB2YWx1ZT1QT1NUIC8+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9c3BhY2UgdmFsdWU9Int7IC5TcGFjZS5JRCB9fSIgLz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1jb250ZW50dHlwZSB2YWx1ZT0ie3sgLkNvbnRlbnRUeXBlLklEIH19IiAvPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJjcmVhdGVNb2RhbCIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0iY3JlYXRlTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtbGcgbW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJjcmVhdGVNb2RhbExhYmVsIj5DcmVhdGUgYSBuZXcge3suQ29udGVudFR5cGUuTmFtZX19IGNvbnRlbnQ8L2g1PgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgogICAgICAgICAgICAgICAge3sgcmFuZ2UgJGluZGV4IDo9IC5Db250ZW50VHlwZS5GaWVsZHMgfX0KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nZm9ybS1ncm91cCBtYi0zJz4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iPnt7dGl0bGUgLk5hbWV9fTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIlN0cmluZ1NtYWxsIiB9fQogICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IHRpdGxlIC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJTdHJpbmdCaWciIH19CiAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCIgaWQ9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgdGl0bGUgLk5hbWUgfX0iID48L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJJbnB1dEhUTUwiIH19CiAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1odG1sIiBpZD0iY3JlYXRlLXt7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHBsYWNlaG9sZGVyPSJ7eyB0aXRsZSAuTmFtZSB9fSIgPjwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIklucHV0TWFya2Rvd24iIH19CiAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1tYXJrZG93biIgaWQ9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgdGl0bGUgLk5hbWUgfX0iID48L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJGaWxlIiB9fQogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1maWxlIG1iLTMiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIG11bHRpcGxlPWZhbHNlIGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9ImZpbGUiIGNsYXNzPSJmb3JtLWZpbGUtaW5wdXQiIGlkPSJpbnB1dEdyb3VwRmlsZUFkZG9ue3sgJGluZGV4IH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJmb3JtLWZpbGUtbGFiZWwiIGZvcj0iaW5wdXRHcm91cEZpbGVBZGRvbnt7ICRpbmRleCB9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZvcm0tZmlsZS10ZXh0Ij5DaG9vc2UgZmlsZS4uLjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZm9ybS1maWxlLWJ1dHRvbiI+QnJvd3NlPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIkRhdGUiIH19CiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY29udHJvbCIgaWQ9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcmVxdWlyZWQgdHlwZT1kYXRlIG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgdGl0bGUgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIlJlZmVyZW5jZSIgfX0KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J3JlZi1tb2RhbCc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iY3JlYXRlLXt7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBjbGFzcz0nb3V0cHV0LXJlZicgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjcmVmLW1vZGFsLXt7IC5UeXBlIH19LXt7IC5JRCB9fSIgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1yZWYgdy1hdXRvIiB0eXBlPWJ1dHRvbiB2YWx1ZT1PcGVuIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1mb2N1cz0iZmFsc2UiIGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0icmVmLW1vZGFsLXt7IC5UeXBlIH19LXt7IC5JRCB9fSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0icmVmTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9InJlZi1tb2RhbC1sYWJlbC17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSI+RmluZCBDb250ZW50IGZvciBSZWZlcmVuY2U8L2g1PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcy1pbm5lcj0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nbW9kYWwtYm9keSBvdmVyZmxvdy1pbml0aWFsJz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSdzZWFyY2gtY3Qte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0nIGNsYXNzPSdkLWJsb2NrJz5Db250ZW50IFR5cGU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0nc2VhcmNoLWN0LXt7IC5UeXBlIH19LXt7IC5OYW1lIH19JyBjbGFzcz0nbWItMyBmb3JtLWNvbnRyb2wgaW5wdXQtY29udGVudHR5cGUnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IENvbnRlbnQgVHlwZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSdzZWFyY2gtYy17eyAuVHlwZSB9fS17eyAuTmFtZSB9fScgY2xhc3M9J2QtYmxvY2snPkNvbnRlbnQgTmFtZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSdzZWFyY2gtYy17eyAuVHlwZSB9fS17eyAuTmFtZSB9fScgZGlzYWJsZWQgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnQnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IENvbnRlbnQgTmFtZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSBidG4tY2xlYXIiPkNsZWFyPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIGRhdGEtZGlzbWlzcy1pbm5lcj0ibW9kYWwiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIlJlZmVyZW5jZUxpc3QiIH19CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdyZWYtbW9kYWwgcmVmLWxpc3QnPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgY2xhc3M9J291dHB1dC1yZWYnIHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI3JlZi1tb2RhbC17eyAuVHlwZSB9fS17eyAuSUQgfX0iIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtcmVmIHctYXV0byIgdHlwZT1idXR0b24gdmFsdWU9T3BlbiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtZm9jdXM9ImZhbHNlIiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9InJlZi1tb2RhbC17eyAuVHlwZSB9fS17eyAuSUQgfX0iIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9InJlZk1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJyZWYtbW9kYWwtbGFiZWwte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iPkZpbmQgQ29udGVudCBmb3IgUmVmZXJlbmNlIExpc3Q8L2g1PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcy1pbm5lcj0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nbW9kYWwtYm9keSBvdmVyZmxvdy1pbml0aWFsJz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSdzZWFyY2gtY3Qte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0nIGNsYXNzPSdkLWJsb2NrJz5Db250ZW50IFR5cGU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0nc2VhcmNoLWN0LXt7IC5UeXBlIH19LXt7IC5OYW1lIH19JyBjbGFzcz0nbWItMyBmb3JtLWNvbnRyb2wgaW5wdXQtY29udGVudHR5cGUnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IENvbnRlbnQgVHlwZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSdzZWFyY2gtYy17eyAuVHlwZSB9fS17eyAuTmFtZSB9fScgY2xhc3M9J2QtYmxvY2snPkNvbnRlbnQgTmFtZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSdzZWFyY2gtYy17eyAuVHlwZSB9fS17eyAuTmFtZSB9fScgZGlzYWJsZWQgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnQnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IENvbnRlbnQgTmFtZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSBidG4tY2xlYXIiPkNsZWFyPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIGRhdGEtZGlzbWlzcy1pbm5lcj0ibW9kYWwiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R288L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9mb3JtPgoKICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvY29udGVudHR5cGUnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPW1ldGhvZCB2YWx1ZT1QQVRDSCAvPgogICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPXNwYWNlIHZhbHVlPSJ7eyAuU3BhY2UuSUQgfX0iIC8+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9Y29udGVudHR5cGUgdmFsdWU9Int7IC5Db250ZW50VHlwZS5JRCB9fSIgLz4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0idXBkYXRlTW9kYWwiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9IlVwZGF0ZSB7ey5Db250ZW50VHlwZS5OYW1lfX0iIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctc2Nyb2xsYWJsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIiBpZD0iY29udGVudHR5cGVNb2RhbExhYmVsIj5VcGRhdGUge3suQ29udGVudFR5cGUuTmFtZX19PC9oNT4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImNvbnRlbnR0eXBlTmFtZSI+TmFtZTwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgdmFsdWU9Int7LkNvbnRlbnRUeXBlLk5hbWV9fSIgbmFtZT1uYW1lIHR5cGU9dGV4dCBpZD0iY29udGVudHR5cGVOYW1lIiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJOYW1lIiByZXF1aXJlZD4KICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgIHt7IHJhbmdlICRpbmRleCwgJGl0ZW0gOj0gLkNvbnRlbnRUeXBlLkZpZWxkcyB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxICRpbmRleCAwIH19CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSdmaXJzdC1maWVsZHNldCcgY2xhc3M9J2NvbnRhaW5lci1mbHVpZCBweC0wIG1iLTMnPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJmaWVsZHNldEZpcnN0Ij5GaWVsZHM8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT0iZmllbGRfdXBkYXRlX2lkX3t7IGluYyAkaW5kZXggfX0iIHZhbHVlPSJ7eyAuSUQgfX0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHJlYWRvbmx5PSJyZWFkb25seSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9ImZpZWxkX3VwZGF0ZV9uYW1lX3t7IGluYyAkaW5kZXggfX0iIHZhbHVlPSJ7eyAuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nZm9ybS1ncm91cCByb3cnPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2NvbC02Jz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9InctMTAwIGZvcm0tY29udHJvbCIgdmFsdWU9Int7IC5UeXBlIH19IiByZWFkb25seT0icmVhZG9ubHkiIHJlcXVpcmVkIG5hbWU9ImZpZWxkX3VwZGF0ZV90eXBlX3t7IGluYyAkaW5kZXggfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPkZpZWxkIFR5cGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBzZWxlY3RlZCB2YWx1ZT0iU3RyaW5nU21hbGwiPlN0cmluZyBTbWFsbDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJTdHJpbmdCaWciPlN0cmluZyBCaWc8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iSW5wdXRIVE1MIj5IVE1MPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IklucHV0TWFya2Rvd24iPk1hcmtkb3duPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IkZpbGUiPkZpbGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iRGF0ZSI+RGF0ZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJSZWZlcmVuY2UiPlJlZmVyZW5jZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJSZWZlcmVuY2VMaXN0Ij5SZWZlcmVuY2VMaXN0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtNic+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSd3LTEwMCBidG4gYnRuLXByaW1hcnknIGRpc2FibGVkIHR5cGU9YnV0dG9uPlJlbW92ZSBGaWVsZDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIHt7IGVsc2UgfX0KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2NvbnRhaW5lci1mbHVpZCBweC0wIG1iLTMnPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT0iZmllbGRfdXBkYXRlX2lkX3t7IGluYyAkaW5kZXggfX0iIHZhbHVlPSJ7eyAuSUQgfX0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJmaWVsZF91cGRhdGVfbmFtZV97eyBpbmMgJGluZGV4IH19IiB2YWx1ZT0ie3sgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAgcm93Jz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtNic+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJ3LTEwMCBmb3JtLWNvbnRyb2wiIHZhbHVlPSJ7eyAuVHlwZSB9fSIgcmVhZG9ubHk9InJlYWRvbmx5IiByZXF1aXJlZCBuYW1lPSJmaWVsZF91cGRhdGVfdHlwZV97eyBpbmMgJGluZGV4IH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT5GaWVsZCBUeXBlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIlN0cmluZ1NtYWxsIiB9fSAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJTdHJpbmdTbWFsbCI+U3RyaW5nIFNtYWxsPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIlN0cmluZ0JpZyIgfX0gICAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJTdHJpbmdCaWciPlN0cmluZyBCaWc8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB7eyBpZiBlcSAuVHlwZSAiSW5wdXRIVE1MIiB9fSAgICAgc2VsZWN0ZWQge3sgZWxzZSB9fSBkaXNhYmxlZCB7eyBlbmQgfX0gdmFsdWU9IklucHV0SFRNTCI+SFRNTDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHt7IGlmIGVxIC5UeXBlICJJbnB1dE1hcmtkb3duIiB9fSBzZWxlY3RlZCB7eyBlbHNlIH19IGRpc2FibGVkIHt7IGVuZCB9fSB2YWx1ZT0iSW5wdXRNYXJrZG93biI+TWFya2Rvd248L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB7eyBpZiBlcSAuVHlwZSAiRmlsZSIgfX0gICAgICAgICAgc2VsZWN0ZWQge3sgZWxzZSB9fSBkaXNhYmxlZCB7eyBlbmQgfX0gdmFsdWU9IkZpbGUiPkZpbGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB7eyBpZiBlcSAuVHlwZSAiRGF0ZSIgfX0gICAgICAgICAgc2VsZWN0ZWQge3sgZWxzZSB9fSBkaXNhYmxlZCB7eyBlbmQgfX0gdmFsdWU9IkRhdGUiPkRhdGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB7eyBpZiBlcSAuVHlwZSAiUmVmZXJlbmNlIiB9fSAgICAgc2VsZWN0ZWQge3sgZWxzZSB9fSBkaXNhYmxlZCB7eyBlbmQgfX0gdmFsdWU9IlJlZmVyZW5jZSI+UmVmZXJlbmNlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIlJlZmVyZW5jZUxpc3QiIH19IHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJSZWZlcmVuY2VMaXN0Ij5SZWZlcmVuY2VMaXN0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtNic+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSd3LTEwMCBidG4gYnRuLXByaW1hcnkgYnRuLXJlbW92ZScgdHlwZT1idXR0b24+UmVtb3ZlIEZpZWxkPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGEgaHJlZj0nIycgY2xhc3M9J2J0biBidG4tbGluaycgaWQ9J2FkZC1maWVsZGJ0bic+QWRkIEFub3RoZXIgRmllbGQ8L2E+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R288L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9mb3JtPgoKICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSdyb3cnPgogICAgICAgICAgPGRpdiBjbGFzcz0nb2Zmc2V0LWxnLTMgY29sLWxnLTYnPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJteS0zIHAtMyBiZy13aGl0ZSByb3VuZGVkIHNoYWRvdy1zbSI+CiAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9ImQtYmxvY2sgdGV4dC1yaWdodCBmbG9hdC1yaWdodCIgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2NyZWF0ZU1vZGFsIj4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyI+Q3JlYXRlIGEgbmV3IGNvbnRlbnQ8L2E+CiAgICAgICAgICAgICAgICA8L3NtYWxsPgogICAgICAgICAgICAgICAgPGg2IGNsYXNzPSJib3JkZXItYm90dG9tIGJvcmRlci1ncmF5IHBiLTIgbWItMCI+WW91ciB7ey5Db250ZW50VHlwZS5OYW1lfX0gY29udGVudDwvaDY+CiAgICAgICAgICAgICAge3sgaWYgLkNvbnRlbnRMaXN0Lkxpc3QgfX0KICAgICAgICAgICAgICAgIHt7IHJhbmdlIC5Db250ZW50TGlzdC5MaXN0IH19CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZWRpYSB0ZXh0LW11dGVkIHB0LTMiPgogICAgICAgICAgICAgICAgICA8YSBocmVmPScvY29udGVudC97eyAkLlNwYWNlLklEIH19L3t7ICQuQ29udGVudFR5cGUuSUQgfX0ve3sgLklEIH19JyAgY2xhc3M9ImQtYmxvY2sgbWVkaWEtYm9keSBwYi0zIG1iLTAgc21hbGwgbGgtMTI1IGJvcmRlci1ib3R0b20gYm9yZGVyLWdyYXkiPgogICAgICAgICAgICAgICAgICAgIDxzdHJvbmcgY2xhc3M9ImQtYmxvY2sgdGV4dC1ncmF5LWRhcmsiPgogICAgICAgICAgICAgICAgICAgICAge3sgKC5NdXN0VmFsdWVCeU5hbWUgIm5hbWUiKS5WYWx1ZSB9fQogICAgICAgICAgICAgICAgICAgIDwvc3Ryb25nPgogICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAge3sgaWYgLkNvbnRlbnRMaXN0Lk1vcmUgfX0KICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz0iZC1ibG9jayB0ZXh0LXJpZ2h0IG10LTMiPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIvY29udGVudHR5cGUve3sgLlNwYWNlLklEIH19L3t7IC5Db250ZW50VHlwZS5JRCB9fT9iZWZvcmU9e3sgLkNvbnRlbnRMaXN0LkJlZm9yZSB9fSI+TG9hZCBtb3JlPC9hPgogICAgICAgICAgICAgICAgPC9zbWFsbD4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgIHt7IGVsc2UgfX0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im10LTMgYWxlcnQgYWxlcnQtcHJpbWFyeSIgcm9sZT0iYWxlcnQiPgogICAgICAgICAgICAgICAgICBZb3UgaGF2ZW4ndCBjcmVhdGVkIGFueSBjb250ZW50IHlldC4gCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2FydGljbGU+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9fZm9vdGVyLmh0bWwiICQgfX0KICA8L21haW4+CiAge3sgdGVtcGxhdGUgImh0bWwvX3NjcmlwdHMuaHRtbCIgfX0KICA8c2NyaXB0IHNyYz0nL3N0YXRpYy9qcy90aW55bWNlLm1pbi5qcyc+PC9zY3JpcHQ+CiAgPHNjcmlwdCBzcmM9Jy9zdGF0aWMvanMvYXV0b2NvbXBsZXRlLm1pbi5qcyc+PC9zY3JpcHQ+CiAgPHNjcmlwdD57eyB0ZW1wbGF0ZSAianMvbWFpbi5qcyIgJCB9fTwvc2NyaXB0PgogIDxzY3JpcHQ+e3sgdGVtcGxhdGUgImpzL3NwYWNlLmpzIiAkIH19PC9zY3JpcHQ+CiAgPHNjcmlwdD57eyB0ZW1wbGF0ZSAianMvY29udGVudC5qcyIgJCB9fTwvc2NyaXB0Pgo8L2JvZHk+Cgo8L2h0bWw+Cg==")

	tmpls["html/doc.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPlNraXBwZXIgQ01TIHwgRG9jczwvdGl0bGU+CjwvaGVhZD4KPGJvZHkgY2xhc3M9J3BhZ2UgYmctbGlnaHQnPgogIDxzdHlsZT57eyB0ZW1wbGF0ZSAiY3NzL21haW4uY3NzIiB9fTwvc3R5bGU+CiAgPG1haW4+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZGVyLmh0bWwiICQgfX0KICAgIDxkaXYgY2xhc3M9InByaWNpbmctaGVhZGVyIHB4LTMgcHktMyBwdC1tZC01IHBiLW1kLTQgbXgtYXV0byB0ZXh0LWNlbnRlciI+CiAgICAgIDxoMSBjbGFzcz0iZGlzcGxheS00Ij5BUEkgRG9jdW1lbnRhdGlvbjwvaDE+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9J2NvbnRhaW5lcic+CiAgICAgIDxkaXYgY2xhc3M9J3Jvdyc+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sLTEyIG9mZnNldC0wIGNvbC1sZy04IG9mZnNldC1sZy0yIj4KICAgICAgICAgIDxoMj5Db25jZXB0czwvaDI+CiAgICAgICAgICA8cD5DTVMgaGFzIGZpdmUgZW50aXRpZXM6PC9wPgogICAgICAgICAgPHVsPgogICAgICAgICAgICA8bGk+VXNlcnM8L2xpPgogICAgICAgICAgICA8bGk+U3BhY2VzPC9saT4KICAgICAgICAgICAgPGxpPkNvbnRlbnQgVHlwZXM8L2xpPgogICAgICAgICAgICA8bGk+V2ViIEhvb2tzPC9saT4KICAgICAgICAgICAgPGxpPkNvbnRlbnRzIDwvbGk+CiAgICAgICAgICA8L3VsPgogICAgICAgICAgPHA+VXNlcnMgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBtYW55IHNwYWNlcy4gU3BhY2VzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGgKICAgICAgICAgIG1hbnkgdXNlcnMuIEl0J3MgYSBtYW55LXRvLW1hbnkgcmVsYXRpb25zaGlwLiBBIHNwYWNlIGlzIGEgImJhY2tlbmQiCiAgICAgICAgICBmb3IgdGhlIGNvbnRlbnQgb2YgYSBzaW5nbGUgYXBwbGljYXRpb24uIEZvciBleGFtcGxlLCBhIHNwYWNlCiAgICAgICAgICByZXByZXNlbnRzIGEgc2luZ2xlIHdlYnNpdGUgb3IgYSBzaW5nbGUgbW9iaWxlIGFwcGxpY2F0aW9uLjwvcD4KICAgICAgICAgIDxwPkEgc3BhY2UgY2FuICJvd24iIG1hbnkgY29udGVudCB0eXBlcywgb25lLXRvLW1hbnkuPC9wPgogICAgICAgICAgPHA+QSBjb250ZW50IHR5cGVzIGlzIGEgdGF4b25vbXkgb2YgY29udGVudC4gRm9yIGV4YW1wbGUsIGlmIHlvdSdyZSBmYW1pbGlhcgogICAgICAgICAgd2l0aCB0aGUgY29udGVudCBtYW5hZ2VtZW50IHN5c3RlbSBXb3JkUHJlc3MsIGEgY29udGVudCB0eXBlIGhlcmUgaXMgYWtpbiB0bwogICAgICAgICAgY2F0ZWdvcmllcywgdGFncywgcG9zdHMsIG9yIHBhZ2VzIG9uIFdvcmRQcmVzcy48L3A+CiAgICAgICAgICA8cD5BIGNvbnRlbnQgdHlwZSAib3ducyIgbWFueSBjb250ZW50IGluc3RhbmNlcywgb25lLXRvLW1hbnkuPC9wPgogICAgICAgICAgPHA+VGhpcyBpcyB3aGVyZSBDTVMgYmVnaW5zIHRvIGRpZmZlciBmcm9tIG1hbnkgb3RoZXIgY29udGVudCBtYW5hZ2VtZW50CiAgICAgICAgICBzeXN0ZW1zIGFuZCBjb250ZW50IG1hbmFnZW1lbnQgaW5mcmFzdHJ1Y3R1cmVzLiBJbiBDTVMgY29uY2VwdHMgc3VjaCBhcwogICAgICAgICAgY2F0ZWdvcmllcywgdGFncywgcG9zdHMsIGFuZCBwYWdlcyBhcmUgb24gdGhlIHNhbWUgaGllcmFyY2h5LiBXaGVyZSBpbiBvdGhlcgogICAgICAgICAgY29udGVudCBtYW5hZ2VtZW50IHN5c3RlbXMsIHN1Y2ggYXMgV29yZFByZXNzLCBjYXRlZ29yaWVzIGFuZCB0YWdzIGV4aXN0IG9uCiAgICAgICAgICBhIGxldmVsIGFib3ZlIHBvc3RzIGFuZCBwYWdlcy48L3A+CiAgICAgICAgICA8cD5Bbm90aGVyIHZlcnkgaW1wb3J0YW50IGRpc3RpbmN0aW9uczogQ01TIGRvZXMgbm90IHByb3ZpZGUgeW91IGEgcmlnaWQgc2V0CiAgICAgICAgICBvZiBjb250ZW50IHR5cGVzLiBZb3UgZGVmaW5lIGNvbnRlbnQgdHlwZXMgYW5kIHdpdGhpbiBjb250ZW50IHlvdSBkZWZpbmUKICAgICAgICAgIHRoZWlyIHJlbGF0aW9uIHRvIG90aGVyIGNvbnRlbnRzLiBNZWFuaW5nOiBpZiB5b3UgY2hvb3NlIHRvIGNyZWF0ZSBhCiAgICAgICAgICBXb3JkUHJlc3MgdHlwZSBoZWlyYXJjaHkgaW4gQ01TIHlvdSB3b3VsZCBkZWZpbmUgdGhlIGNvbnRlbnQgdHlwZXMgcGFnZXMgYW5kCiAgICAgICAgICBwb3N0cyB0aGF0IHdvdWxkIGhhdmUgdHdvIGZpZWxkczogYSBjYXRlZ29yeSBmaWVsZCB3aGljaCB3b3VsZCBiZSBhCiAgICAgICAgICBSZWZlcmVuY2UgZmllbGQgdHlwZSBhbmQgYSB0YWdzIGZpZWxkIHdoaWNoIHdvdWxkIGJlIGEgUmVmZXJlbmNlTGlzdCBmaWVsZAogICAgICAgICAgdHlwZS4gWW91IHdvdWxkIHRoZW4gY3JlYXRlIHlvdXIgdHdvIGFkZGl0aW9uYWwgY29udGVudCB0eXBlcywKICAgICAgICAgIGNhdGVnb3JpZXMgYW5kIHRhZ3MsIHRoZW4gd2hlbiBjcmVhdGluZyBjb250ZW50IHVuZGVyIHBhZ2VzIGFuZCBwb3N0cywKICAgICAgICAgIHlvdSB3b3VsZCBjaG9vc2Ugd2hhdCB0aGV5IGFyZSByZWZlcmVuY2luZy48L3A+CiAgICAgICAgICA8cD5UaGlzIGlzIHRoZSBiaWdnZXN0IGZlYXR1cmUgb2YgQ01TIGZvciBtZTogYXJiaXRyYXJpbHkgbWFueSBhbmQKICAgICAgICAgIGFyYml0cmFyaWx5IGRlZXAgY29ubmVjdGlvbnMgZnJvbSBvbmUgY29udGVudCBpbnN0YW5jZSB0byBhbm90aGVyCiAgICAgICAgICBjb250ZW50IGluc3RhbmNlIG9yIGxpc3Qgb2YgY29udGVudCBpbnN0YW5jZXMuIENyZWF0aW5nIGNvbnRlbnQgaW4KICAgICAgICAgIENNUyA8bWFyaz5zaG91bGQgbm90IHJlc3RyaWN0IHlvdXIgZGF0YSBtb2RlbC48L21hcms+PC9wPgogICAgICAgICAgPHA+V2ViIGhvb2tzIGFyZSB1c2VkIHdoZW4geW91IHdhbnQgeW91ciBhcHBsaWNhdGlvbiB0byByZXNwb25kIHRvCiAgICAgICAgICBjb250ZW50IHdpdGhpbiBDTVMgdW5kZXIgeW91ciBzcGFjZSBiZWluZyBjcmVhdGVkLCB1cGRhdGVkLCBhbmQKICAgICAgICAgIGRlbGV0ZWQgb24gdGhlIGZseS4gRm9yIGRvaW5nIGFueSBjYWNoZSBicmVha2luZyBvciBvdGhlciB5b3UgbWF5IHdhbnQgdG8gZG8gd2l0aGluCiAgICAgICAgICB5b3VyIGFwcGxpY2F0aW9uLjwvcD4KICAgICAgICAgIDxoMj5Vc2luZyB0aGUgQVBJPC9oMj4KICAgICAgICAgIDxwPkJlZm9yZSBkaXZpbmcgaW50byB0aGUgQVBJIEkgc3VnZ2VzdCB5b3UgcG9rZSBhcm91bmQgdGhlIHVzZXIKICAgICAgICAgIGludGVyYWNlIGFuZCB0ZXN0IGRyaXZlIGNyZWF0aW5nIHNwYWNlcywgY29udGVudCB0eXBlcywgYW5kIGNvbnRlbnRzLiBUbwogICAgICAgICAgZ2V0IGEgZmVlbCBmb3IgdGhlIGFib3ZlIGNvbmNlcHRzIGRlc2NyaWJlZC48L3A+CiAgICAgICAgICA8cD5Zb3UnbGwgYWxzbyBuZWVkIGFuIGFjY291bnQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgZm9sbG93aW5nIEFQSXMuCiAgICAgICAgICBUaGUgQVBJcyB1c2UgYmFzaWMgYXV0aGVudGljYXRpb24gZm9yIGNsaWVudCBhcHBsaWNhdGlvbnMuIFNpZ24gdXBzCiAgICAgICAgICBhcmUgYXZhaWxhYmxlIHRvIGFueW9uZSBidXQgQ01TIGlzIGN1cnJlbnRseSBpbiBhIDxtYXJrPmxpbWl0ZWQgcHVibGljCiAgICAgICAgICBhbHBoYTwvbWFyaz4uIE1lYW5pbmc6IGFsbCB5b3VyIGRhdGEgaXMgYXV0b21hdGljYWxseSBkZWxldGVkIG9uIGEgMTUKICAgICAgICAgIG1pbnV0ZSBpbnRlcnZhbC4gQ01TIGN1cnJlbnRseSBkb2Vzbid0IGhhdmUgYW55IHdheSB0byBmaWdodCBhYnVzZS4KICAgICAgICAgIE9uY2UgQ01TJyBzdG9yeSBvbiBmaWdodGluZyBhYnVzZSBoYXMgYmVlbiBpbXByb3ZlZCBDTVMgd2lsbCBiZSBtb3ZlZAogICAgICAgICAgaW50byBiZXRhIG9yIGdlbmVyYWwgYXZhaWxhYmlsaXR5LiBJZiB0aGlzIGlzIGFuIGluY29udmVuaWVuY2UgSSB1cmdlCiAgICAgICAgICB5b3UgdG8gbG9vayBpbnRvIHNlbGYtaG9zdGluZyBDTVMuIEFsbCB5b3UgbmVlZCBpcyByZWFkIGFjY2VzcyB0byB0aGUKICAgICAgICAgIHJlcG9zaXRvcnkgKHdoaWNoIHlvdSBhbHJlYWR5IGhhdmUpLCBhIEdvIGNvbXBpbGVyLCBhbmQgYSBNeVNRTAogICAgICAgICAgZGF0YWJhc2UuPC9wPgogICAgICAgICAgPGgzPlNwYWNlcyBBUEk8L2gzPgogICAgICAgICAgPHA+Rml2ZSBtZXRob2RzIGFyZSBhdmFpbGFibGUgdG8gdGhlIFNwYWNlcyBBUEkuPC9wPgogICAgICAgICAgPHVsPgogICAgICAgICAgICA8bGk+UE9TVDogQ3JlYXRlIGEgU3BhY2UuPC9saT4KICAgICAgICAgICAgPGxpPkdFVDogUmV0cmlldmluZyBhIFNwYWNlLjwvbGk+CiAgICAgICAgICAgIDxsaT5QQVRDSDogVXBkYXRlIGEgU3BhY2UuPC9saT4KICAgICAgICAgICAgPGxpPkRFTEVURTogUmVtb3ZlIGEgU3BhY2UuPC9saT4KICAgICAgICAgICAgPGxpPlBVVDogQ29weSBhIFNwYWNlLjwvbGk+CiAgICAgICAgICA8L3VsPgogICAgICAgICAgPGg0PlBPU1Q6IENyZWF0ZSBhIFNwYWNlLjwvaDQ+CiAgICAgICAgICA8cHJlPjxjb2RlPmN1cmwgLXMgLXUgIiRjbXN1c2VyOiRjbXNwYXNzIiBodHRwczovL2Ntcy5ldmFuam9uLmVzL3NwYWNlCiAgICAgICAgICAtWCBQT1NUIC1GIG5hbWU9ImNVUkwgdGVzdCIgLUYgZGVzYz0iU29tZSBkZXNjcmlwdGlvbiBoZXJlIjwvY29kZT48L3ByZT4KICAgICAgICAgIDxwPllvdSdsbCBiZSByZXR1cm5lZCBKU09OIHRoYXQgd2lsbCBoYXZlIGEgcmVkaXJlY3RVUkwuIFRoZSBJRCBvZiB0aGUKICAgICAgICAgIGNyZWF0ZWQgc3BhY2Ugd2lsbCBiZSBpbnNpZGUuIFlvdSdsbCB1c2UgdGhlIHNwYWNlIElEIHRvIEdFVCwgUEFUQ0gsCiAgICAgICAgICBERUxFVEUsIGFuZCBQVVQgdGhlIHNwYWNlLjwvcD4KICAgICAgICAgIDxoND5HRVQ6IFJldHJpZXZpbmcgYSBTcGFjZS48L2g0PgogICAgICAgICAgPHByZT48Y29kZT5jdXJsIC1zIC11ICIkY21zdXNlcjokY21zcGFzcyIgaHR0cHM6Ly9jbXMuZXZhbmpvbi5lcy9zcGFjZQogICAgICAgICAgLVggR0VUIC1GIHNwYWNlPTI5PC9jb2RlPjwvcHJlPgogICAgICAgICAgPHA+V2hlbiB5b3UgR0VUIGEgU3BhY2UgeW91J2xsIGFsc28gcmV0cmVpdmUgYSBwYWdpbmF0ZWQgbGlzdCBvZgogICAgICAgICAgQ29udGVudCBUeXBlcyB1bmRlciB0aGUgU3BhY2UuIFRoZSBBUEkgcmV0dXJucyBKU09OLiBVbmRlciB0aGUga2V5CiAgICAgICAgICAiQ29udGVudFR5cGVzIiB5b3UnbGwgc2VlIGEgZmV3IG1vcmUga2V5L3ZhbHVlczogIkNvbnRlbnRUeXBlTGlzdCIsCiAgICAgICAgICAiQ29udGVudFR5cGVMaXN0TW9yZSIsIGFuZCAiQ29udGVudFR5cGVMaXN0QmVmb3JlIi4gVXNlIHRoZSBxdWVyeQogICAgICAgICAgcGFyYW1ldGVyICI/YmVmb3JlPSRJRCIgb24geW91ciBHRVQgcmVxdWVzdCB0byByZXRyaWV2ZSB0aGUgbmV4dCBwYWdlCiAgICAgICAgICBvZiByZXN1bHRzLCB0byB1c2UgaW4gY29uanVuY3Rpb24gd2l0aCAiQ29udGVudFR5cGVMaXN0QmVmb3JlIi4KICAgICAgICAgIElmIGFub3RoZXIgcGFnZSBvZiBjb250ZW50IHR5cGUgcmVzdWx0cyBleGlzdHMKICAgICAgICAgICJDb250ZW50VHlwZUxpc3RNb3JlIiB3aWxsIHN0YXRlIHNvIHdpdGggaXRzIGJvb2xlYW4gdmFsdWUuPC9wPgogICAgICAgICAgPGg0PlBBVENIOiBVcGRhdGUgYSBTcGFjZS48L2g0PgogICAgICAgICAgPHByZT48Y29kZT5jdXJsIC1zIC11ICIkY21zdXNlcjokY21zcGFzcyIgaHR0cHM6Ly9jbXMuZXZhbmpvbi5lcy9zcGFjZQogICAgICAgICAgLVggUEFUQ0ggLUYgc3BhY2U9MjkgLUYgbmFtZT0iY1VSTCB0ZXN0ICh1cGRhdGUpIjwvY29kZT48L3ByZT4KICAgICAgICAgIDxoND5ERUxFVEU6IFJlbW92ZSBhIFNwYWNlLjwvaDQ+CiAgICAgICAgICA8cHJlPjxjb2RlPmN1cmwgLXMgLXUgIiRjbXN1c2VyOiRjbXNwYXNzIiBodHRwczovL2Ntcy5ldmFuam9uLmVzL3NwYWNlCiAgICAgICAgICAtWCBERUxFVEUgLUYgc3BhY2U9Mjk8L2NvZGU+PC9wcmU+CiAgICAgICAgICA8aDQ+UFVUOiBDb3B5IGEgU3BhY2UuPC9oND4KICAgICAgICAgIDxwcmU+PGNvZGU+Y3VybCAtcyAtdSAiJGNtc3VzZXI6JGNtc3Bhc3MiIGh0dHBzOi8vY21zLmV2YW5qb24uZXMvc3BhY2UKICAgICAgICAgIC1YIFBVVCAtRiBzcGFjZT0zMCAtRiBuYW1lPSJjVVJMIHRlc3QgY29weSIgLUYgZGVzYz0iVGhpcyBpcyBhIGNvcGllZCBzcGFjZSI8L2NvZGU+PC9wcmU+CiAgICAgICAgICA8cD5QbGVhc2Ugbm90ZTogY29weWluZyBhIHNwYWNlIGNvcGllcyA8bWFyaz5hbGw8L21hcms+IG9mIHRoZSBzcGFjZSdzCiAgICAgICAgICBjb250ZW50IHR5cGVzIGFuZCBjb250ZW50IGluc3RhbmNlcy48L3A+CiAgICAgICAgICA8aDM+Q29udGVudCBUeXBlcyBBUEk8L2gzPgogICAgICAgICAgPHA+Rm91ciBtZXRob2RzIGFyZSBhdmFpbGFibGUgdG8gdGhlIENvbnRlbnQgVHlwZXMgQVBJLjwvcD4KICAgICAgICAgIDx1bD4KICAgICAgICAgICAgPGxpPlBPU1Q6IENyZWF0ZSBhIENvbnRlbnQgVHlwZS48L2xpPgogICAgICAgICAgICA8bGk+R0VUOiBSZXRyaWV2aW5nIGEgQ29udGVudCBUeXBlLjwvbGk+CiAgICAgICAgICAgIDxsaT5QQVRDSDogVXBkYXRlIGEgQ29udGVudCBUeXBlLjwvbGk+CiAgICAgICAgICAgIDxsaT5ERUxFVEU6IFJlbW92ZSBhIENvbnRlbnQgVHlwZS48L2xpPgogICAgICAgICAgPC91bD4KICAgICAgICAgIDxoMz5XZWIgSG9va3MgQVBJPC9oMz4KICAgICAgICAgIDxwPkZvdXIgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIHRvIHRoZSBXZWIgSG9va3MgQVBJLjwvcD4KICAgICAgICAgIDx1bD4KICAgICAgICAgICAgPGxpPlBPU1Q6IENyZWF0ZSBhIFdlYiBIb29rLjwvbGk+CiAgICAgICAgICAgIDxsaT5HRVQ6IFJldHJpZXZpbmcgYSBXZWIgSG9vay48L2xpPgogICAgICAgICAgICA8bGk+UEFUQ0g6IFVwZGF0ZSBhIFdlYiBIb29rLjwvbGk+CiAgICAgICAgICAgIDxsaT5ERUxFVEU6IFJlbW92ZSBhIFdlYiBIb29rLjwvbGk+CiAgICAgICAgICA8L3VsPgogICAgICAgICAgPGgzPkNvbnRlbnQgQVBJPC9oMz4KICAgICAgICAgIDxwPkZvdXIgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIHRvIHRoZSBDb250ZW50IEFQSS48L3A+CiAgICAgICAgICA8dWw+CiAgICAgICAgICAgIDxsaT5QT1NUOiBDcmVhdGUgYSBDb250ZW50LjwvbGk+CiAgICAgICAgICAgIDxsaT5HRVQ6IFJldHJpZXZpbmcgYSBDb250ZW50LjwvbGk+CiAgICAgICAgICAgIDxsaT5QQVRDSDogVXBkYXRlIGEgQ29udGVudC48L2xpPgogICAgICAgICAgICA8bGk+REVMRVRFOiBSZW1vdmUgYSBDb250ZW50LjwvbGk+CiAgICAgICAgICA8L3VsPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiAkIH19CiAgPC9tYWluPgogIHt7IHRlbXBsYXRlICJodG1sL19zY3JpcHRzLmh0bWwiIH19CjwvYm9keT4KPC9odG1sPgo=")

	tmpls["html/faq.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPlNraXBwZXIgQ01TIHwgRkFRPC90aXRsZT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0ncGFnZSBiZy1saWdodCc+CiAgPHN0eWxlPnt7IHRlbXBsYXRlICJjc3MvbWFpbi5jc3MiIH19PC9zdHlsZT4KICA8bWFpbj4KICAgIHt7IHRlbXBsYXRlICJodG1sL19oZWFkZXIuaHRtbCIgJCB9fQogICAgPGRpdiBjbGFzcz0icHJpY2luZy1oZWFkZXIgcHgtMyBweS0zIHB0LW1kLTUgcGItbWQtNCBteC1hdXRvIHRleHQtY2VudGVyIj4KICAgICAgPGgxIGNsYXNzPSJkaXNwbGF5LTQiPkZBUTwvaDE+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9J2NvbnRhaW5lcic+CiAgICAgIDxkaXYgY2xhc3M9J3Jvdyc+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sLTEyIG9mZnNldC0wIGNvbC1sZy04IG9mZnNldC1sZy0yIj4KICAgICAgICAgIFRPRE8KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIHt7IHRlbXBsYXRlICJodG1sL19mb290ZXIuaHRtbCIgJCB9fQogIDwvbWFpbj4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9fc2NyaXB0cy5odG1sIiB9fQo8L2JvZHk+CjwvaHRtbD4K")
	tmpls["html/dynamic.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPlNraXBwZXIgQ01TIHwge3soLkNvbnRlbnQuTXVzdFZhbHVlQnlOYW1lICJuYW1lIikuVmFsdWV9fTwvdGl0bGU+CjwvaGVhZD4KPGJvZHkgY2xhc3M9J3BhZ2UgYmctbGlnaHQnPgogIDxzdHlsZT57eyB0ZW1wbGF0ZSAiY3NzL21haW4uY3NzIiB9fTwvc3R5bGU+CiAgPG1haW4+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZGVyLmh0bWwiICQgfX0KICAgIDxkaXYgY2xhc3M9InByaWNpbmctaGVhZGVyIHB4LTMgcHktMyBwdC1tZC01IHBiLW1kLTQgbXgtYXV0byB0ZXh0LWNlbnRlciI+CiAgICAgIDxoMSBjbGFzcz0iZGlzcGxheS00Ij57eyguQ29udGVudC5NdXN0VmFsdWVCeU5hbWUgIm5hbWUiKS5WYWx1ZX19PC9oMT4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMTIgb2Zmc2V0LTAgY29sLWxnLTggb2Zmc2V0LWxnLTIiPgogICAgICAgICAgPGFydGljbGU+CiAgICAgICAgICAgIHt7KC5Db250ZW50Lk11c3RWYWx1ZUJ5TmFtZSAiZGVzYyIpLlZhbHVlIHwgaHRtbH19CiAgICAgICAgICA8L2FydGljbGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9fZm9vdGVyLmh0bWwiICQgfX0KICA8L21haW4+CiAge3sgdGVtcGxhdGUgImh0bWwvX3NjcmlwdHMuaHRtbCIgfX0KPC9ib2R5Pgo8L2h0bWw+Cg==")

	tmpls["html/hook.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPlNraXBwZXIgQ01TIHwge3sgLlNwYWNlLk5hbWUgfX0gfCB7eyAuSG9vay5VUkwgfX08L3RpdGxlPgo8L2hlYWQ+Cjxib2R5IGNsYXNzPSdob29rIGJnLWxpZ2h0Jz4KICA8c3R5bGU+e3sgdGVtcGxhdGUgImNzcy9tYWluLmNzcyIgfX08L3N0eWxlPgogIDxtYWluPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2hlYWRlci5odG1sIiAkIH19CiAgICA8ZGl2IGNsYXNzPSJwcmljaW5nLWhlYWRlciBweC0zIHB5LTMgcHQtbWQtNSBwYi1tZC00IG14LWF1dG8gdGV4dC1jZW50ZXIiPgogICAgICA8aDEgY2xhc3M9ImRpc3BsYXktNCI+e3sgLkhvb2suVVJMIH19PC9oMT4KICAgIDwvZGl2PgogICAgPGFydGljbGUgY2xhc3M9Y29udGFpbmVyPgogICAgICA8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jy9ob29rJyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1tZXRob2QgdmFsdWU9REVMRVRFIC8+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9c3BhY2UgdmFsdWU9Int7IC5TcGFjZS5JRCB9fSIgLz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1ob29rIHZhbHVlPSJ7eyAuSG9vay5JRCB9fSIgLz4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iZGVsZXRlTW9kYWwiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9ImRlbGV0ZU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctc2Nyb2xsYWJsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIiBpZD0iZGVsZXRlTW9kYWxMYWJlbCI+RGVsZXRlIHt7IC5Ib29rLlVSTCB9fTwvaDU+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R288L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9mb3JtPgogICAgPC9kaXY+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9fZm9vdGVyLmh0bWwiICQgfX0KICA8L21haW4+CiAge3sgdGVtcGxhdGUgImh0bWwvX3NjcmlwdHMuaHRtbCIgfX0KICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9tYWluLmpzIiAkIH19PC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPgo=")



@@ 46,18 42,12 @@ func init() {

	tmpls["html/invite.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPlNraXBwZXIgQ01TIHwgSW52aXRlPC90aXRsZT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0ncGFnZSBiZy1saWdodCc+CiAgPHN0eWxlPnt7IHRlbXBsYXRlICJjc3MvbWFpbi5jc3MiIH19PC9zdHlsZT4KICA8bWFpbj4KICAgIHt7IHRlbXBsYXRlICJodG1sL19oZWFkZXIuaHRtbCIgJCB9fQogICAge3tpZiAuVXNlcn19CiAgICA8ZGl2IGNsYXNzPSJwcmljaW5nLWhlYWRlciBweC0zIHB5LTMgcHQtbWQtNSBwYi1tZC00IG14LWF1dG8gdGV4dC1jZW50ZXIiPgogICAgICA8aDEgY2xhc3M9ImRpc3BsYXktNCI+SW52aXRlczwvaDE+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9J2NvbnRhaW5lcic+CiAgICAgIDxkaXYgY2xhc3M9J3Jvdyc+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sLTEyIGNvbC1tZC02IG9mZnNldC1tZC0zIGNvbC1sZy00IG9mZnNldC1sZy00Ij4KICAgICAgICAgIHt7aWYgLkludml0ZXN9fQogICAgICAgICAgICB7e3JhbmdlICRrZXksICR2YWwgOj0gLkludml0ZXN9fQogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQgbWItNCBzaGFkb3ctc20gZmxleC1maWxsIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtYm9keSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9J2NvcHkte3ska2V5fX0nIGNsYXNzPSd0ZXh0LXRydW5jYXRlIG1iLTMnPgogICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vY21zLmV2YW5qb24uZXMvaW52aXRlL3t7JHZhbC5Ub2tlbn19CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEtY2xpcGJvYXJkLXRhcmdldD0iI2NvcHkte3ska2V5fX0iIGNsYXNzPSJidG4gYnRuLWxnIGJ0bi1wcmltYXJ5IGJ0bi1ibG9jayI+Q29weTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIHt7ZW5kfX0KICAgICAgICAgIHt7ZWxzZX19CiAgICAgICAgICA8cCBjbGFzcz0ndy0xMDAgdGV4dC1jZW50ZXInPk5vIGludml0ZXMuPC9wPgogICAgICAgICAge3tlbmR9fQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAge3tlbHNlfX0KICAgIDxkaXYgY2xhc3M9InByaWNpbmctaGVhZGVyIHB4LTMgcHktMyBwdC1tZC01IHBiLW1kLTQgbXgtYXV0byB0ZXh0LWNlbnRlciI+CiAgICAgIDxoMSBjbGFzcz0iZGlzcGxheS00Ij5Zb3UndmUgYmVlbiBpbnZpdGVkPC9oMT4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0nY29udGFpbmVyJz4KICAgICAgPGRpdiBjbGFzcz0ncm93Jz4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMTIgY29sLW1kLTYgb2Zmc2V0LW1kLTMgY29sLWxnLTQgb2Zmc2V0LWxnLTQgZC1mbGV4Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQgbWItNCBzaGFkb3ctc20gZmxleC1maWxsIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1oZWFkZXIiPgogICAgICAgICAgICAgIDxoNCBjbGFzcz0ibXktMCBmb250LXdlaWdodC1ub3JtYWwiPlNpZ251cDwvaDQ+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWJvZHkiPgogICAgICAgICAgICAgIDxmb3JtIGlkPSdzaWdudXAnIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2ludml0ZScgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1tZXRob2QgdmFsdWU9UEFUQ0ggLz4KICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPWludml0ZSB0eXBlPWhpZGRlbiB2YWx1ZT0ie3suSW52aXRlfX0iIHJlcXVpcmVkPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic2lnbnVwSW5wdXRVc2VybmFtZSIgY2xhc3M9InNyLW9ubHkiPlVzZXJuYW1lPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPXVzZXJuYW1lIHR5cGU9InRleHQiIGlkPSJzaWdudXBJbnB1dFVzZXJuYW1lIiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJVc2VybmFtZSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzaWdudXBJbnB1dFBhc3N3b3JkIiBjbGFzcz0ic3Itb25seSI+UGFzc3dvcmQ8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9cGFzc3dvcmQgdHlwZT0icGFzc3dvcmQiIGlkPSJzaWdudXBJbnB1dFBhc3N3b3JkIiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJQYXNzd29yZCIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzaWdudXBJbnB1dFZlcmlmeSIgY2xhc3M9InNyLW9ubHkiPkNvbmZpcm0gUGFzc3dvcmQ8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9dmVyaWZ5IHR5cGU9InBhc3N3b3JkIiBpZD0ic2lnbnVwSW5wdXRWZXJpZnkiIGNsYXNzPSJtYi0zIGZvcm0tY29udHJvbCIgcGxhY2Vob2xkZXI9IkNvbmZpcm0gUGFzc3dvcmQiIHJlcXVpcmVkPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1sZyBidG4tcHJpbWFyeSBidG4tYmxvY2siIHR5cGU9InN1Ym1pdCI+R288L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICB7e2VuZH19CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9fZm9vdGVyLmh0bWwiICQgfX0KICA8L21haW4+CiAgPHNjcmlwdCBzcmM9Jy9zdGF0aWMvanMvY2xpcGJvYXJkLmpzJz48L3NjcmlwdD4KICA8c2NyaXB0PihmdW5jdGlvbigpe25ldyBDbGlwYm9hcmRKUygnYnV0dG9uW2RhdGEtY2xpcGJvYXJkLXRhcmdldF0nKX0pKCk7PC9zY3JpcHQ+CiAge3sgdGVtcGxhdGUgImh0bWwvX3NjcmlwdHMuaHRtbCIgfX0KPC9ib2R5Pgo8L2h0bWw+Cg==")

	tmpls["html/privacy.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPlNraXBwZXIgQ01TIHwgUHJpdmFjeTwvdGl0bGU+CjwvaGVhZD4KPGJvZHkgY2xhc3M9J3BhZ2UgYmctbGlnaHQnPgogIDxzdHlsZT57eyB0ZW1wbGF0ZSAiY3NzL21haW4uY3NzIiB9fTwvc3R5bGU+CiAgPG1haW4+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZGVyLmh0bWwiICQgfX0KICAgIDxkaXYgY2xhc3M9InByaWNpbmctaGVhZGVyIHB4LTMgcHktMyBwdC1tZC01IHBiLW1kLTQgbXgtYXV0byB0ZXh0LWNlbnRlciI+CiAgICAgIDxoMSBjbGFzcz0iZGlzcGxheS00Ij5Qcml2YWN5PC9oMT4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0nY29udGFpbmVyJz4KICAgICAgPGRpdiBjbGFzcz0ncm93Jz4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMTIgb2Zmc2V0LTAgY29sLWxnLTggb2Zmc2V0LWxnLTIiPgogICAgICAgICAgVE9ETwogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiAkIH19CiAgPC9tYWluPgogIHt7IHRlbXBsYXRlICJodG1sL19zY3JpcHRzLmh0bWwiIH19CjwvYm9keT4KPC9odG1sPgo=")

	tmpls["html/redirect.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPlNraXBwZXIgQ01TPC90aXRsZT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0naW5kZXggYmctbGlnaHQnPgogIDxzdHlsZT57eyB0ZW1wbGF0ZSAiY3NzL21haW4uY3NzIiB9fTwvc3R5bGU+CiAgPG1haW4+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZGVyLmh0bWwiICQgfX0KICAgIDxkaXYgY2xhc3M9InByaWNpbmctaGVhZGVyIHB4LTMgcHktMyBwdC1tZC01IHBiLW1kLTQgbXgtYXV0byB0ZXh0LWNlbnRlciI+CiAgICAgIDxoMSBjbGFzcz0iZGlzcGxheS00Ij5SZWRpcmVjdGluZy4uLjwvaDE+CiAgICA8L2Rpdj4KICAgIHt7IHRlbXBsYXRlICJodG1sL19mb290ZXIuaHRtbCIgJCB9fQogIDwvbWFpbj4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9fc2NyaXB0cy5odG1sIiB9fQogIDxzY3JpcHQ+KGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe2xvY2F0aW9uLmhyZWY9Int7LlVSTH19Ijt9LDUwMCk7fSkoKTs8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==")

	tmpls["html/space.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPlNraXBwZXIgQ01TIHwge3sgLlNwYWNlLk5hbWUgfX08L3RpdGxlPgo8L2hlYWQ+Cjxib2R5IGNsYXNzPSdzcGFjZSBiZy1saWdodCc+CiAgPHN0eWxlPnt7IHRlbXBsYXRlICJjc3MvbWFpbi5jc3MiIH19PC9zdHlsZT4KICA8bWFpbj4KICAgIHt7IHRlbXBsYXRlICJodG1sL19oZWFkZXIuaHRtbCIgJCB9fQogICAgPGRpdiBjbGFzcz0icHJpY2luZy1oZWFkZXIgcHgtMyBweS0zIHB0LW1kLTUgcGItbWQtNCBteC1hdXRvIHRleHQtY2VudGVyIj4KICAgICAgPGgxIGNsYXNzPSJkaXNwbGF5LTQiPnt7LlNwYWNlLk5hbWV9fTwvaDE+CiAgICAgIDxwIGNsYXNzPSJsZWFkIj57ey5TcGFjZS5EZXNjfX08L3A+CiAgICA8L2Rpdj4KICAgIDxhcnRpY2xlPgogICAgICA8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jy9jb250ZW50dHlwZScgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9bWV0aG9kIHZhbHVlPVBPU1QgLz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1zcGFjZSB2YWx1ZT0ie3sgLlNwYWNlLklEIH19IiAvPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJjcmVhdGUtY29udGVudHR5cGUiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9IkNyZWF0ZSBhIG5ldyBjb250ZW50IHR5cGUgbW9kYWwuIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImNvbnRlbnR0eXBlTW9kYWxMYWJlbCI+Q3JlYXRlIGEgbmV3IGNvbnRlbnQgdHlwZTwvaDU+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjb250ZW50dHlwZU5hbWUiPk5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9bmFtZSB0eXBlPXRleHQgaWQ9ImNvbnRlbnR0eXBlTmFtZSIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iTmFtZSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSdmaXJzdC1maWVsZHNldCcgY2xhc3M9J2NvbnRhaW5lci1mbHVpZCBweC0wIG1iLTMnPgogICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJmaWVsZHNldEZpcnN0Ij5GaWVsZHM8L2xhYmVsPgogICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9ImZpZWxkc2V0Rmlyc3QiIGNsYXNzPSJtYi0zIGZvcm0tY29udHJvbCIgcmVhZG9ubHk9InJlYWRvbmx5IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0iZmllbGRfbmFtZV8xIiB2YWx1ZT0ibmFtZSIgLz4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nZm9ybS1ncm91cCByb3cnPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2NvbC02Jz4KICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9InctMTAwIGZvcm0tY29udHJvbCIgcmVhZG9ubHk9InJlYWRvbmx5IiByZXF1aXJlZCBuYW1lPSJmaWVsZF90eXBlXzEiPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPkZpZWxkIFR5cGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBzZWxlY3RlZCB2YWx1ZT0iU3RyaW5nU21hbGwiPlN0cmluZyBTbWFsbDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJTdHJpbmdCaWciPlN0cmluZyBCaWc8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iSW5wdXRIVE1MIj5IVE1MPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IklucHV0TWFya2Rvd24iPk1hcmtkb3duPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IkZpbGUiPkZpbGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iRGF0ZSI+RGF0ZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJSZWZlcmVuY2UiPlJlZmVyZW5jZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJSZWZlcmVuY2VMaXN0Ij5SZWZlcmVuY2VMaXN0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtNic+CiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSd3LTEwMCBidG4gYnRuLXByaW1hcnknIGRpc2FibGVkIHR5cGU9YnV0dG9uPlJlbW92ZSBGaWVsZDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGEgaHJlZj0nIycgY2xhc3M9J2J0biBidG4tbGluaycgaWQ9J2FkZC1maWVsZGJ0bic+QWRkIEFub3RoZXIgRmllbGQ8L2E+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R288L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9mb3JtPgoKICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvaG9vaycgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9bWV0aG9kIHZhbHVlPVBPU1QgLz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1zcGFjZSB2YWx1ZT0ie3sgLlNwYWNlLklEIH19IiAvPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJob29rTW9kYWwiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9Imhvb2tNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9Imhvb2tNb2RhbExhYmVsIj5DcmVhdGUgYSBuZXcgaG9vazwvaDU+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJob29rVVJMIj5VUkw8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9dXJsIHR5cGU9dXJsIGlkPSJob29rVVJMIiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJNdXN0IGVudGVyIGZ1bGwgVVJMIG9mIHRhcmdldCIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R288L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9mb3JtPgoKICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvc3BhY2UnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPW1ldGhvZCB2YWx1ZT1QVVQgLz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1zcGFjZSB2YWx1ZT0ie3sgLlNwYWNlLklEIH19IiAvPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJjb3B5TW9kYWwiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9ImNvcHlNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImNvcHlNb2RhbExhYmVsIj5Db3B5IHt7LlNwYWNlLk5hbWV9fTwvaDU+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzcGFjZU5hbWUiPk5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9bmFtZSB0eXBlPXRleHQgaWQ9InNwYWNlTmFtZSIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iTmFtZSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzcGFjZURlc2MiPkRlc2NyaXB0aW9uPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPWRlc2MgdHlwZT10ZXh0IGlkPSJzcGFjZURlc2MiIGNsYXNzPSJtYi0zIGZvcm0tY29udHJvbCIgcGxhY2Vob2xkZXI9IkRlc2NyaXB0aW9uIiByZXF1aXJlZD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5HbzwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Zvcm0+CgogICAgICA8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jy9zcGFjZScgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9bWV0aG9kIHZhbHVlPVBBVENIIC8+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9c3BhY2UgdmFsdWU9Int7IC5TcGFjZS5JRCB9fSIgLz4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0idXBkYXRlTW9kYWwiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9InVwZGF0ZU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctc2Nyb2xsYWJsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIiBpZD0idXBkYXRlTW9kYWxMYWJlbCI+VXBkYXRlIHt7LlNwYWNlLk5hbWV9fTwvaDU+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzcGFjZU5hbWUiPk5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IHZhbHVlPSJ7eyAuU3BhY2UuTmFtZSB9fSIgbmFtZT1uYW1lIHR5cGU9dGV4dCBpZD0ic3BhY2VOYW1lIiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJOYW1lIiByZXF1aXJlZD4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InNwYWNlRGVzYyI+RGVzY3JpcHRpb248L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IHZhbHVlPSJ7eyAuU3BhY2UuRGVzYyB9fSIgbmFtZT1kZXNjIHR5cGU9dGV4dCBpZD0ic3BhY2VEZXNjIiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJEZXNjcmlwdGlvbiIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R288L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9mb3JtPgogICAgICAKICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvc3BhY2UnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPW1ldGhvZCB2YWx1ZT1ERUxFVEUgLz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1zcGFjZSB2YWx1ZT0ie3sgLlNwYWNlLklEIH19IiAvPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJkZWxldGVNb2RhbCIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0iZGVsZXRlTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJkZWxldGVNb2RhbExhYmVsIj5EZWxldGUge3suU3BhY2UuTmFtZX19PC9oNT4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5HbzwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Zvcm0+CgogICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgIDxkaXYgY2xhc3M9J3Jvdyc+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtbGctNic+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im15LTMgcC0zIGJnLXdoaXRlIHJvdW5kZWQgc2hhZG93LXNtIj4KICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz0iZC1ibG9jayB0ZXh0LXJpZ2h0IGZsb2F0LXJpZ2h0IiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjY3JlYXRlLWNvbnRlbnR0eXBlIj4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyI+Q3JlYXRlIGEgbmV3IGNvbnRlbnQgdHlwZTwvYT4KICAgICAgICAgICAgICAgIDwvc21hbGw+CiAgICAgICAgICAgICAgPGg2IGNsYXNzPSJib3JkZXItYm90dG9tIGJvcmRlci1ncmF5IHBiLTIgbWItMCI+WW91ciBjb250ZW50IHR5cGVzPC9oNj4KICAgICAgICAgICAgICB7eyBpZiAuQ29udGVudFR5cGVzLkxpc3QgfX0KICAgICAgICAgICAgICAgIHt7IHJhbmdlIC5Db250ZW50VHlwZXMuTGlzdCB9fQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVkaWEgdGV4dC1tdXRlZCBwdC0zIj4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0nL2NvbnRlbnR0eXBlL3t7ICQuU3BhY2UuSUQgfX0ve3sgLklEIH19JyAgY2xhc3M9ImQtYmxvY2sgbWVkaWEtYm9keSBwYi0zIG1iLTAgc21hbGwgbGgtMTI1IGJvcmRlci1ib3R0b20gYm9yZGVyLWdyYXkiPgogICAgICAgICAgICAgICAgICAgIDxzdHJvbmcgY2xhc3M9ImQtYmxvY2sgdGV4dC1ncmF5LWRhcmsiPnt7IC5OYW1lIH19PC9zdHJvbmc+CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgICB7eyBpZiAuQ29udGVudFR5cGVzLk1vcmUgfX0KICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz0iZC1ibG9jayB0ZXh0LXJpZ2h0IG10LTMiPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIvc3BhY2Uve3sgLlNwYWNlLklEIH19P2JlZm9yZWN0PXt7IC5Db250ZW50VHlwZXMuQmVmb3JlIH19Ij5Mb2FkIG1vcmU8L2E+CiAgICAgICAgICAgICAgICA8L3NtYWxsPgogICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAge3sgZWxzZSB9fQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibXQtMyBhbGVydCBhbGVydC1wcmltYXJ5IiByb2xlPSJhbGVydCI+CiAgICAgICAgICAgICAgICAgIFlvdSBoYXZlbid0IGNyZWF0ZWQgYW55IGNvbnRlbnQgdHlwZXMgeWV0LiAKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0nY29sLWxnLTYnPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJteS0zIHAtMyBiZy13aGl0ZSByb3VuZGVkIHNoYWRvdy1zbSI+CiAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9ImQtYmxvY2sgdGV4dC1yaWdodCBmbG9hdC1yaWdodCIgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2hvb2tNb2RhbCI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPkNyZWF0ZSBhIG5ldyB3ZWJob29rPC9hPgogICAgICAgICAgICAgICAgPC9zbWFsbD4KICAgICAgICAgICAgICA8aDYgY2xhc3M9ImJvcmRlci1ib3R0b20gYm9yZGVyLWdyYXkgcGItMiBtYi0wIj5Zb3VyIHdlYmhvb2tzPC9oNj4KICAgICAgICAgICAgICB7eyBpZiAuSG9va3MuTGlzdCB9fQogICAgICAgICAgICAgICAge3sgcmFuZ2UgLkhvb2tzLkxpc3QgfX0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lZGlhIHRleHQtbXV0ZWQgcHQtMyI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9ob29rL3t7ICQuU3BhY2UuSUQgfX0ve3sgLklEIH19JyAgY2xhc3M9ImQtYmxvY2sgbWVkaWEtYm9keSBwYi0zIG1iLTAgc21hbGwgbGgtMTI1IGJvcmRlci1ib3R0b20gYm9yZGVyLWdyYXkiPgogICAgICAgICAgICAgICAgICAgIDxzdHJvbmcgY2xhc3M9ImQtYmxvY2sgdGV4dC1ncmF5LWRhcmsiPnt7IC5VUkwgfX08L3N0cm9uZz4KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgIHt7IGlmIC5Ib29rcy5Nb3JlIH19CiAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9ImQtYmxvY2sgdGV4dC1yaWdodCBtdC0zIj4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL3NwYWNlL3t7IC5TcGFjZS5JRCB9fT9iZWZvcmVob29rPXt7IC5Ib29rcy5CZWZvcmUgfX0iPkxvYWQgbW9yZTwvYT4KICAgICAgICAgICAgICAgIDwvc21hbGw+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICB7eyBlbHNlIH19CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtdC0zIGFsZXJ0IGFsZXJ0LXByaW1hcnkiIHJvbGU9ImFsZXJ0Ij4KICAgICAgICAgICAgICAgICAgWW91IGhhdmVuJ3QgY3JlYXRlZCBhbnkgd2ViaG9va3MgeWV0LiAKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICA8L2FydGljbGU+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9fZm9vdGVyLmh0bWwiICQgfX0KICA8L21haW4+CiAge3sgdGVtcGxhdGUgImh0bWwvX3NjcmlwdHMuaHRtbCIgfX0KICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9tYWluLmpzIiAkIH19PC9zY3JpcHQ+CiAgPHNjcmlwdD57eyB0ZW1wbGF0ZSAianMvc3BhY2UuanMiICQgfX08L3NjcmlwdD4KPC9ib2R5PgoKPC9odG1sPgo=")

	tmpls["html/stripe.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPlNraXBwZXIgQ01TIHwgRG9jczwvdGl0bGU+CjwvaGVhZD4KPGJvZHkgY2xhc3M9J3BhZ2UgYmctbGlnaHQnPgogIDxzdHlsZT57eyB0ZW1wbGF0ZSAiY3NzL21haW4uY3NzIiB9fTwvc3R5bGU+CiAgPG1haW4+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZGVyLmh0bWwiICQgfX0KICAgIDxkaXYgY2xhc3M9InByaWNpbmctaGVhZGVyIHB4LTMgcHktMyBwdC1tZC01IHBiLW1kLTQgbXgtYXV0byB0ZXh0LWNlbnRlciI+CiAgICAgIDxoMSBjbGFzcz0iZGlzcGxheS00Ij5Qcm9jZXNzaW5nLi4uPC9oMT4KICAgIDwvZGl2PgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiAkIH19CiAgPC9tYWluPgogIHt7IHRlbXBsYXRlICJodG1sL19zY3JpcHRzLmh0bWwiIH19CiAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vanMuc3RyaXBlLmNvbS92My8iPjwvc2NyaXB0PgogIDxzY3JpcHQ+CiAgICAoZnVuY3Rpb24oKSB7IAogICAgICB2YXIgc3RyaXBlID0gU3RyaXBlKCd7ey5TdHJpcGVQS319Jyk7CiAgICAgIHZhciBjaGVja291dEJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGVja291dC1idXR0b24nKTsKICAgICAgc3RyaXBlLnJlZGlyZWN0VG9DaGVja291dCh7CiAgICAgICAgc2Vzc2lvbklkOiAne3suU3RyaXBlQ2hlY2tvdXRTZXNzaW9uSUR9fScKICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KQogICAgICAgIGFsZXJ0KHJlc3VsdC5lcnJvci5tZXNzYWdlKTsKICAgICAgfSk7CiAgICB9KSgpOwogIDwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K")

	tmpls["html/terms.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPlNraXBwZXIgQ01TIHwgVGVybXM8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5IGNsYXNzPSdwYWdlIGJnLWxpZ2h0Jz4KICA8c3R5bGU+e3sgdGVtcGxhdGUgImNzcy9tYWluLmNzcyIgfX08L3N0eWxlPgogIDxtYWluPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2hlYWRlci5odG1sIiAkIH19CiAgICA8ZGl2IGNsYXNzPSJwcmljaW5nLWhlYWRlciBweC0zIHB5LTMgcHQtbWQtNSBwYi1tZC00IG14LWF1dG8gdGV4dC1jZW50ZXIiPgogICAgICA8aDEgY2xhc3M9ImRpc3BsYXktNCI+VGVybXM8L2gxPgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSdjb250YWluZXInPgogICAgICA8ZGl2IGNsYXNzPSdyb3cnPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbC0xMiBvZmZzZXQtMCBjb2wtbGctOCBvZmZzZXQtbGctMiI+CiAgICAgICAgICBUT0RPCiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9fZm9vdGVyLmh0bWwiICQgfX0KICA8L21haW4+CiAge3sgdGVtcGxhdGUgImh0bWwvX3NjcmlwdHMuaHRtbCIgfX0KPC9ib2R5Pgo8L2h0bWw+Cg==")

	tmpls["html/tour.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPlNraXBwZXIgQ01TIHwgVG91cjwvdGl0bGU+CjwvaGVhZD4KPGJvZHkgY2xhc3M9J3BhZ2UgYmctbGlnaHQnPgogIDxzdHlsZT57eyB0ZW1wbGF0ZSAiY3NzL21haW4uY3NzIiB9fTwvc3R5bGU+CiAgPG1haW4+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZGVyLmh0bWwiICQgfX0KICAgIDxkaXYgY2xhc3M9InByaWNpbmctaGVhZGVyIHB4LTMgcHktMyBwdC1tZC01IHBiLW1kLTQgbXgtYXV0byB0ZXh0LWNlbnRlciI+CiAgICAgIDxoMSBjbGFzcz0iZGlzcGxheS00Ij5Ub3VyPC9oMT4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0nY29udGFpbmVyJz4KICAgICAgPGRpdiBjbGFzcz0ncm93Jz4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMTIgb2Zmc2V0LTAgY29sLWxnLTggb2Zmc2V0LWxnLTIiPgogICAgICAgICAgVE9ETwogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiAkIH19CiAgPC9tYWluPgogIHt7IHRlbXBsYXRlICJodG1sL19zY3JpcHRzLmh0bWwiIH19CjwvYm9keT4KPC9odG1sPgo=")

	tmpls["js/bootstrap.js"] = tostring("LyohCiAgKiBCb290c3RyYXAgdjUuMC4wLWFscGhhMSAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLykKICAqIENvcHlyaWdodCAyMDExLTIwMjAgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycykKICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKQogICovCiFmdW5jdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZShyZXF1aXJlKCJwb3BwZXIuanMiKSk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJwb3BwZXIuanMiXSxlKToodD10fHxzZWxmKS5ib290c3RyYXA9ZSh0LlBvcHBlcil9KHRoaXMsKGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpPWVbbl07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLmtleSxpKX19ZnVuY3Rpb24gbih0LG4saSl7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksaSYmZSh0LGkpLHR9ZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9ZnVuY3Rpb24gbyh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKGk9aS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4saSl9cmV0dXJuIG59ZnVuY3Rpb24gcyh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9vKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aSh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6byhPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH10PXQmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJkZWZhdWx0Iik/dC5kZWZhdWx0OnQ7dmFyIHIsYSxsLGMsdT1mdW5jdGlvbih0KXtkb3t0Kz1NYXRoLmZsb29yKDFlNipNYXRoLnJhbmRvbSgpKX13aGlsZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KSk7cmV0dXJuIHR9LGg9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGFyZ2V0Iik7aWYoIWV8fCIjIj09PWUpe3ZhciBuPXQuZ2V0QXR0cmlidXRlKCJocmVmIik7ZT1uJiYiIyIhPT1uP24udHJpbSgpOm51bGx9cmV0dXJuIGV9LGY9ZnVuY3Rpb24odCl7dmFyIGU9aCh0KTtyZXR1cm4gZSYmZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlKT9lOm51bGx9LGQ9ZnVuY3Rpb24odCl7dmFyIGU9aCh0KTtyZXR1cm4gZT9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUpOm51bGx9LGc9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIDA7dmFyIGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUodCksbj1lLnRyYW5zaXRpb25EdXJhdGlvbixpPWUudHJhbnNpdGlvbkRlbGF5LG89cGFyc2VGbG9hdChuKSxzPXBhcnNlRmxvYXQoaSk7cmV0dXJuIG98fHM/KG49bi5zcGxpdCgiLCIpWzBdLGk9aS5zcGxpdCgiLCIpWzBdLDFlMyoocGFyc2VGbG9hdChuKStwYXJzZUZsb2F0KGkpKSk6MH0scD1mdW5jdGlvbih0KXt0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJ0cmFuc2l0aW9uZW5kIikpfSxtPWZ1bmN0aW9uKHQpe3JldHVybih0WzBdfHx0KS5ub2RlVHlwZX0sXz1mdW5jdGlvbih0LGUpe3ZhciBuPSExLGk9ZSs1O3QuYWRkRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsKGZ1bmN0aW9uIGUoKXtuPSEwLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsZSl9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtufHxwKHQpfSksaSl9LHY9ZnVuY3Rpb24odCxlLG4pe09iamVjdC5rZXlzKG4pLmZvckVhY2goKGZ1bmN0aW9uKGkpe3ZhciBvLHM9bltpXSxyPWVbaV0sYT1yJiZtKHIpPyJlbGVtZW50IjpudWxsPT0obz1yKT8iIitvOnt9LnRvU3RyaW5nLmNhbGwobykubWF0Y2goL1xzKFthLXpdKykvaSlbMV0udG9Mb3dlckNhc2UoKTtpZighbmV3IFJlZ0V4cChzKS50ZXN0KGEpKXRocm93IG5ldyBFcnJvcih0LnRvVXBwZXJDYXNlKCkrJzogT3B0aW9uICInK2krJyIgcHJvdmlkZWQgdHlwZSAiJythKyciIGJ1dCBleHBlY3RlZCB0eXBlICInK3MrJyIuJyl9KSl9LGI9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuITE7aWYodC5zdHlsZSYmdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc3R5bGUpe3ZhciBlPWdldENvbXB1dGVkU3R5bGUodCksbj1nZXRDb21wdXRlZFN0eWxlKHQucGFyZW50Tm9kZSk7cmV0dXJuIm5vbmUiIT09ZS5kaXNwbGF5JiYibm9uZSIhPT1uLmRpc3BsYXkmJiJoaWRkZW4iIT09ZS52aXNpYmlsaXR5fXJldHVybiExfSx5PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7fX0sdz1mdW5jdGlvbih0KXtyZXR1cm4gdC5vZmZzZXRIZWlnaHR9LEU9ZnVuY3Rpb24oKXt2YXIgdD13aW5kb3cualF1ZXJ5O3JldHVybiB0JiYhZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoImRhdGEtbm8tanF1ZXJ5Iik/dDpudWxsfSxrPShyPXt9LGE9MSx7c2V0OmZ1bmN0aW9uKHQsZSxuKXt2b2lkIDA9PT10LmtleSYmKHQua2V5PXtrZXk6ZSxpZDphfSxhKyspLHJbdC5rZXkuaWRdPW59LGdldDpmdW5jdGlvbih0LGUpe2lmKCF0fHx2b2lkIDA9PT10LmtleSlyZXR1cm4gbnVsbDt2YXIgbj10LmtleTtyZXR1cm4gbi5rZXk9PT1lP3Jbbi5pZF06bnVsbH0sZGVsZXRlOmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09dC5rZXkpe3ZhciBuPXQua2V5O24ua2V5PT09ZSYmKGRlbGV0ZSByW24uaWRdLGRlbGV0ZSB0LmtleSl9fX0pLFQ9ZnVuY3Rpb24odCxlLG4pe2suc2V0KHQsZSxuKX0sTD1mdW5jdGlvbih0LGUpe3JldHVybiBrLmdldCh0LGUpfSxDPWZ1bmN0aW9uKHQsZSl7ay5kZWxldGUodCxlKX0sQT1FbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLFM9RWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvcixPPShsPW5ldyBDdXN0b21FdmVudCgiQm9vdHN0cmFwIix7Y2FuY2VsYWJsZTohMH0pLChjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5hZGRFdmVudExpc3RlbmVyKCJCb290c3RyYXAiLChmdW5jdGlvbigpe3JldHVybiBudWxsfSkpLGwucHJldmVudERlZmF1bHQoKSxjLmRpc3BhdGNoRXZlbnQobCksbC5kZWZhdWx0UHJldmVudGVkKSxEPS86c2NvcGVcYi87KGZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3QucXVlcnlTZWxlY3RvckFsbCgiOnNjb3BlICoiKX1jYXRjaCh0KXtyZXR1cm4hMX1yZXR1cm4hMH0pKCl8fChBPWZ1bmN0aW9uKHQpe2lmKCFELnRlc3QodCkpcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KTt2YXIgZT1Cb29sZWFuKHRoaXMuaWQpO2V8fCh0aGlzLmlkPXUoInNjb3BlIikpO3ZhciBuPW51bGw7dHJ5e3Q9dC5yZXBsYWNlKEQsIiMiK3RoaXMuaWQpLG49dGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfWZpbmFsbHl7ZXx8dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImlkIil9cmV0dXJuIG59LFM9ZnVuY3Rpb24odCl7aWYoIUQudGVzdCh0KSlyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpO3ZhciBlPUEuY2FsbCh0aGlzLHQpO3JldHVybiB2b2lkIDAhPT1lWzBdP2VbMF06bnVsbH0pO3ZhciBJPUUoKSxOPS9bXi5dKig/PVwuLiopXC58LiovLGo9L1wuLiovLFA9Lzo6XGQrJC8seD17fSxSPTEsSD17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LEI9WyJjbGljayIsImRibGNsaWNrIiwibW91c2V1cCIsIm1vdXNlZG93biIsImNvbnRleHRtZW51IiwibW91c2V3aGVlbCIsIkRPTU1vdXNlU2Nyb2xsIiwibW91c2VvdmVyIiwibW91c2VvdXQiLCJtb3VzZW1vdmUiLCJzZWxlY3RzdGFydCIsInNlbGVjdGVuZCIsImtleWRvd24iLCJrZXlwcmVzcyIsImtleXVwIiwib3JpZW50YXRpb25jaGFuZ2UiLCJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIiwidG91Y2hlbmQiLCJ0b3VjaGNhbmNlbCIsInBvaW50ZXJkb3duIiwicG9pbnRlcm1vdmUiLCJwb2ludGVydXAiLCJwb2ludGVybGVhdmUiLCJwb2ludGVyY2FuY2VsIiwiZ2VzdHVyZXN0YXJ0IiwiZ2VzdHVyZWNoYW5nZSIsImdlc3R1cmVlbmQiLCJmb2N1cyIsImJsdXIiLCJjaGFuZ2UiLCJyZXNldCIsInNlbGVjdCIsInN1Ym1pdCIsImZvY3VzaW4iLCJmb2N1c291dCIsImxvYWQiLCJ1bmxvYWQiLCJiZWZvcmV1bmxvYWQiLCJyZXNpemUiLCJtb3ZlIiwiRE9NQ29udGVudExvYWRlZCIsInJlYWR5c3RhdGVjaGFuZ2UiLCJlcnJvciIsImFib3J0Iiwic2Nyb2xsIl07ZnVuY3Rpb24gTSh0LGUpe3JldHVybiBlJiZlKyI6OiIrUisrfHx0LnVpZEV2ZW50fHxSKyt9ZnVuY3Rpb24gUSh0KXt2YXIgZT1NKHQpO3JldHVybiB0LnVpZEV2ZW50PWUseFtlXT14W2VdfHx7fSx4W2VdfWZ1bmN0aW9uIFUodCxlLG4pe3ZvaWQgMD09PW4mJihuPW51bGwpO2Zvcih2YXIgaT1PYmplY3Qua2V5cyh0KSxvPTAscz1pLmxlbmd0aDtvPHM7bysrKXt2YXIgcj10W2lbb11dO2lmKHIub3JpZ2luYWxIYW5kbGVyPT09ZSYmci5kZWxlZ2F0aW9uU2VsZWN0b3I9PT1uKXJldHVybiByfXJldHVybiBudWxsfWZ1bmN0aW9uIEYodCxlLG4pe3ZhciBpPSJzdHJpbmciPT10eXBlb2YgZSxvPWk/bjplLHM9dC5yZXBsYWNlKGosIiIpLHI9SFtzXTtyZXR1cm4gciYmKHM9ciksQi5pbmRleE9mKHMpPi0xfHwocz10KSxbaSxvLHNdfWZ1bmN0aW9uIFcodCxlLG4saSxvKXtpZigic3RyaW5nIj09dHlwZW9mIGUmJnQpe258fChuPWksaT1udWxsKTt2YXIgcz1GKGUsbixpKSxyPXNbMF0sYT1zWzFdLGw9c1syXSxjPVEodCksdT1jW2xdfHwoY1tsXT17fSksaD1VKHUsYSxyP246bnVsbCk7aWYoaCloLm9uZU9mZj1oLm9uZU9mZiYmbztlbHNle3ZhciBmPU0oYSxlLnJlcGxhY2UoTiwiIikpLGQ9cj9mdW5jdGlvbih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uIGkobyl7Zm9yKHZhciBzPXQucXVlcnlTZWxlY3RvckFsbChlKSxyPW8udGFyZ2V0O3ImJnIhPT10aGlzO3I9ci5wYXJlbnROb2RlKWZvcih2YXIgYT1zLmxlbmd0aDthLS07KWlmKHNbYV09PT1yKXJldHVybiBpLm9uZU9mZiYmcS5vZmYodCxvLnR5cGUsbiksbi5hcHBseShyLFtvXSk7cmV0dXJuIG51bGx9fSh0LG4saSk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24gbihpKXtyZXR1cm4gbi5vbmVPZmYmJnEub2ZmKHQsaS50eXBlLGUpLGUuYXBwbHkodCxbaV0pfX0odCxuKTtkLmRlbGVnYXRpb25TZWxlY3Rvcj1yP246bnVsbCxkLm9yaWdpbmFsSGFuZGxlcj1hLGQub25lT2ZmPW8sZC51aWRFdmVudD1mLHVbZl09ZCx0LmFkZEV2ZW50TGlzdGVuZXIobCxkLHIpfX19ZnVuY3Rpb24gVih0LGUsbixpLG8pe3ZhciBzPVUoZVtuXSxpLG8pO3MmJih0LnJlbW92ZUV2ZW50TGlzdGVuZXIobixzLEJvb2xlYW4obykpLGRlbGV0ZSBlW25dW3MudWlkRXZlbnRdKX12YXIgcT17b246ZnVuY3Rpb24odCxlLG4saSl7Vyh0LGUsbixpLCExKX0sb25lOmZ1bmN0aW9uKHQsZSxuLGkpe1codCxlLG4saSwhMCl9LG9mZjpmdW5jdGlvbih0LGUsbixpKXtpZigic3RyaW5nIj09dHlwZW9mIGUmJnQpe3ZhciBvPUYoZSxuLGkpLHM9b1swXSxyPW9bMV0sYT1vWzJdLGw9YSE9PWUsYz1RKHQpLHU9Ii4iPT09ZS5jaGFyQXQoMCk7aWYodm9pZCAwPT09cil7dSYmT2JqZWN0LmtleXMoYykuZm9yRWFjaCgoZnVuY3Rpb24obil7IWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciBvPWVbbl18fHt9O09iamVjdC5rZXlzKG8pLmZvckVhY2goKGZ1bmN0aW9uKHMpe2lmKHMuaW5kZXhPZihpKT4tMSl7dmFyIHI9b1tzXTtWKHQsZSxuLHIub3JpZ2luYWxIYW5kbGVyLHIuZGVsZWdhdGlvblNlbGVjdG9yKX19KSl9KHQsYyxuLGUuc2xpY2UoMSkpfSkpO3ZhciBoPWNbYV18fHt9O09iamVjdC5rZXlzKGgpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPW4ucmVwbGFjZShQLCIiKTtpZighbHx8ZS5pbmRleE9mKGkpPi0xKXt2YXIgbz1oW25dO1YodCxjLGEsby5vcmlnaW5hbEhhbmRsZXIsby5kZWxlZ2F0aW9uU2VsZWN0b3IpfX0pKX1lbHNle2lmKCFjfHwhY1thXSlyZXR1cm47Vih0LGMsYSxyLHM/bjpudWxsKX19fSx0cmlnZ2VyOmZ1bmN0aW9uKHQsZSxuKXtpZigic3RyaW5nIiE9dHlwZW9mIGV8fCF0KXJldHVybiBudWxsO3ZhciBpLG89ZS5yZXBsYWNlKGosIiIpLHM9ZSE9PW8scj1CLmluZGV4T2Yobyk+LTEsYT0hMCxsPSEwLGM9ITEsdT1udWxsO3JldHVybiBzJiZJJiYoaT1JLkV2ZW50KGUsbiksSSh0KS50cmlnZ2VyKGkpLGE9IWkuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSxsPSFpLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCksYz1pLmlzRGVmYXVsdFByZXZlbnRlZCgpKSxyPyh1PWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIikpLmluaXRFdmVudChvLGEsITApOnU9bmV3IEN1c3RvbUV2ZW50KGUse2J1YmJsZXM6YSxjYW5jZWxhYmxlOiEwfSksdm9pZCAwIT09biYmT2JqZWN0LmtleXMobikuZm9yRWFjaCgoZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHUsdCx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5bdF19fSl9KSksYyYmKHUucHJldmVudERlZmF1bHQoKSxPfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodSwiZGVmYXVsdFByZXZlbnRlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiEwfX0pKSxsJiZ0LmRpc3BhdGNoRXZlbnQodSksdS5kZWZhdWx0UHJldmVudGVkJiZ2b2lkIDAhPT1pJiZpLnByZXZlbnREZWZhdWx0KCksdX19LHo9ImFsZXJ0IixLPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9lbGVtZW50PXQsdGhpcy5fZWxlbWVudCYmVCh0LCJicy5hbGVydCIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUuY2xvc2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZWxlbWVudDt0JiYoZT10aGlzLl9nZXRSb290RWxlbWVudCh0KSk7dmFyIG49dGhpcy5fdHJpZ2dlckNsb3NlRXZlbnQoZSk7bnVsbD09PW58fG4uZGVmYXVsdFByZXZlbnRlZHx8dGhpcy5fcmVtb3ZlRWxlbWVudChlKX0sZS5kaXNwb3NlPWZ1bmN0aW9uKCl7Qyh0aGlzLl9lbGVtZW50LCJicy5hbGVydCIpLHRoaXMuX2VsZW1lbnQ9bnVsbH0sZS5fZ2V0Um9vdEVsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGQodCl8fHQuY2xvc2VzdCgiLmFsZXJ0Iil9LGUuX3RyaWdnZXJDbG9zZUV2ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBxLnRyaWdnZXIodCwiY2xvc2UuYnMuYWxlcnQiKX0sZS5fcmVtb3ZlRWxlbWVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKHQuY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJmYWRlIikpe3ZhciBuPWcodCk7cS5vbmUodCwidHJhbnNpdGlvbmVuZCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX2Rlc3Ryb3lFbGVtZW50KHQpfSkpLF8odCxuKX1lbHNlIHRoaXMuX2Rlc3Ryb3lFbGVtZW50KHQpfSxlLl9kZXN0cm95RWxlbWVudD1mdW5jdGlvbih0KXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSxxLnRyaWdnZXIodCwiY2xvc2VkLmJzLmFsZXJ0Iil9LHQualF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49TCh0aGlzLCJicy5hbGVydCIpO258fChuPW5ldyB0KHRoaXMpKSwiY2xvc2UiPT09ZSYmbltlXSh0aGlzKX0pKX0sdC5oYW5kbGVEaXNtaXNzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtlJiZlLnByZXZlbnREZWZhdWx0KCksdC5jbG9zZSh0aGlzKX19LHQuZ2V0SW5zdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIEwodCwiYnMuYWxlcnQiKX0sbih0LG51bGwsW3trZXk6IlZFUlNJT04iLGdldDpmdW5jdGlvbigpe3JldHVybiI1LjAuMC1hbHBoYTEifX1dKSx0fSgpO3Eub24oZG9jdW1lbnQsImNsaWNrLmJzLmFsZXJ0LmRhdGEtYXBpIiwnW2RhdGEtZGlzbWlzcz0iYWxlcnQiXScsSy5oYW5kbGVEaXNtaXNzKG5ldyBLKSk7dmFyIFg9RSgpO2lmKFgpe3ZhciBZPVguZm5bel07WC5mblt6XT1LLmpRdWVyeUludGVyZmFjZSxYLmZuW3pdLkNvbnN0cnVjdG9yPUssWC5mblt6XS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIFguZm5bel09WSxLLmpRdWVyeUludGVyZmFjZX19dmFyICQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX2VsZW1lbnQ9dCxUKHQsImJzLmJ1dHRvbiIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUudG9nZ2xlPWZ1bmN0aW9uKCl7dGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtcHJlc3NlZCIsdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCJhY3RpdmUiKSl9LGUuZGlzcG9zZT1mdW5jdGlvbigpe0ModGhpcy5fZWxlbWVudCwiYnMuYnV0dG9uIiksdGhpcy5fZWxlbWVudD1udWxsfSx0LmpRdWVyeUludGVyZmFjZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciBuPUwodGhpcywiYnMuYnV0dG9uIik7bnx8KG49bmV3IHQodGhpcykpLCJ0b2dnbGUiPT09ZSYmbltlXSgpfSkpfSx0LmdldEluc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBMKHQsImJzLmJ1dHRvbiIpfSxuKHQsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjUuMC4wLWFscGhhMSJ9fV0pLHR9KCk7cS5vbihkb2N1bWVudCwiY2xpY2suYnMuYnV0dG9uLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJidXR0b24iXScsKGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKTt2YXIgZT10LnRhcmdldC5jbG9zZXN0KCdbZGF0YS10b2dnbGU9ImJ1dHRvbiJdJyksbj1MKGUsImJzLmJ1dHRvbiIpO258fChuPW5ldyAkKGUpKSxuLnRvZ2dsZSgpfSkpO3ZhciBHPUUoKTtpZihHKXt2YXIgWj1HLmZuLmJ1dHRvbjtHLmZuLmJ1dHRvbj0kLmpRdWVyeUludGVyZmFjZSxHLmZuLmJ1dHRvbi5Db25zdHJ1Y3Rvcj0kLEcuZm4uYnV0dG9uLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gRy5mbi5idXR0b249WiwkLmpRdWVyeUludGVyZmFjZX19ZnVuY3Rpb24gSih0KXtyZXR1cm4idHJ1ZSI9PT10fHwiZmFsc2UiIT09dCYmKHQ9PT1OdW1iZXIodCkudG9TdHJpbmcoKT9OdW1iZXIodCk6IiI9PT10fHwibnVsbCI9PT10P251bGw6dCl9ZnVuY3Rpb24gdHQodCl7cmV0dXJuIHQucmVwbGFjZSgvW0EtWl0vZywoZnVuY3Rpb24odCl7cmV0dXJuIi0iK3QudG9Mb3dlckNhc2UoKX0pKX12YXIgZXQ9e3NldERhdGFBdHRyaWJ1dGU6ZnVuY3Rpb24odCxlLG4pe3Quc2V0QXR0cmlidXRlKCJkYXRhLSIrdHQoZSksbil9LHJlbW92ZURhdGFBdHRyaWJ1dGU6ZnVuY3Rpb24odCxlKXt0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS0iK3R0KGUpKX0sZ2V0RGF0YUF0dHJpYnV0ZXM6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJue307dmFyIGU9cyh7fSx0LmRhdGFzZXQpO3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChmdW5jdGlvbih0KXtlW3RdPUooZVt0XSl9KSksZX0sZ2V0RGF0YUF0dHJpYnV0ZTpmdW5jdGlvbih0LGUpe3JldHVybiBKKHQuZ2V0QXR0cmlidXRlKCJkYXRhLSIrdHQoZSkpKX0sb2Zmc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3RvcDplLnRvcCtkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCxsZWZ0OmUubGVmdCtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnR9fSxwb3NpdGlvbjpmdW5jdGlvbih0KXtyZXR1cm57dG9wOnQub2Zmc2V0VG9wLGxlZnQ6dC5vZmZzZXRMZWZ0fX0sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24odCxlKXt0JiYodC5jbGFzc0xpc3QuY29udGFpbnMoZSk/dC5jbGFzc0xpc3QucmVtb3ZlKGUpOnQuY2xhc3NMaXN0LmFkZChlKSl9fSxudD17bWF0Y2hlczpmdW5jdGlvbih0LGUpe3JldHVybiB0Lm1hdGNoZXMoZSl9LGZpbmQ6ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSwobj1bXSkuY29uY2F0LmFwcGx5KG4sQS5jYWxsKGUsdCkpfSxmaW5kT25lOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCksUy5jYWxsKGUsdCl9LGNoaWxkcmVuOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT0obj1bXSkuY29uY2F0LmFwcGx5KG4sdC5jaGlsZHJlbik7cmV0dXJuIGkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5tYXRjaGVzKGUpfSkpfSxwYXJlbnRzOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdLGk9dC5wYXJlbnROb2RlO2kmJmkubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmMyE9PWkubm9kZVR5cGU7KXRoaXMubWF0Y2hlcyhpLGUpJiZuLnB1c2goaSksaT1pLnBhcmVudE5vZGU7cmV0dXJuIG59LHByZXY6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO247KXtpZihuLm1hdGNoZXMoZSkpcmV0dXJuW25dO249bi5wcmV2aW91c0VsZW1lbnRTaWJsaW5nfXJldHVybltdfSxuZXh0OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubmV4dEVsZW1lbnRTaWJsaW5nO247KXtpZih0aGlzLm1hdGNoZXMobixlKSlyZXR1cm5bbl07bj1uLm5leHRFbGVtZW50U2libGluZ31yZXR1cm5bXX19LGl0PSJjYXJvdXNlbCIsb3Q9Ii5icy5jYXJvdXNlbCIsc3Q9e2ludGVydmFsOjVlMyxrZXlib2FyZDohMCxzbGlkZTohMSxwYXVzZToiaG92ZXIiLHdyYXA6ITAsdG91Y2g6ITB9LHJ0PXtpbnRlcnZhbDoiKG51bWJlcnxib29sZWFuKSIsa2V5Ym9hcmQ6ImJvb2xlYW4iLHNsaWRlOiIoYm9vbGVhbnxzdHJpbmcpIixwYXVzZToiKHN0cmluZ3xib29sZWFuKSIsd3JhcDoiYm9vbGVhbiIsdG91Y2g6ImJvb2xlYW4ifSxhdD17VE9VQ0g6InRvdWNoIixQRU46InBlbiJ9LGx0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMuX2l0ZW1zPW51bGwsdGhpcy5faW50ZXJ2YWw9bnVsbCx0aGlzLl9hY3RpdmVFbGVtZW50PW51bGwsdGhpcy5faXNQYXVzZWQ9ITEsdGhpcy5faXNTbGlkaW5nPSExLHRoaXMudG91Y2hUaW1lb3V0PW51bGwsdGhpcy50b3VjaFN0YXJ0WD0wLHRoaXMudG91Y2hEZWx0YVg9MCx0aGlzLl9jb25maWc9dGhpcy5fZ2V0Q29uZmlnKGUpLHRoaXMuX2VsZW1lbnQ9dCx0aGlzLl9pbmRpY2F0b3JzRWxlbWVudD1udC5maW5kT25lKCIuY2Fyb3VzZWwtaW5kaWNhdG9ycyIsdGhpcy5fZWxlbWVudCksdGhpcy5fdG91Y2hTdXBwb3J0ZWQ9Im9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cz4wLHRoaXMuX3BvaW50ZXJFdmVudD1Cb29sZWFuKHdpbmRvdy5Qb2ludGVyRXZlbnQpLHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCksVCh0LCJicy5jYXJvdXNlbCIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUubmV4dD1mdW5jdGlvbigpe3RoaXMuX2lzU2xpZGluZ3x8dGhpcy5fc2xpZGUoIm5leHQiKX0sZS5uZXh0V2hlblZpc2libGU9ZnVuY3Rpb24oKXshZG9jdW1lbnQuaGlkZGVuJiZiKHRoaXMuX2VsZW1lbnQpJiZ0aGlzLm5leHQoKX0sZS5wcmV2PWZ1bmN0aW9uKCl7dGhpcy5faXNTbGlkaW5nfHx0aGlzLl9zbGlkZSgicHJldiIpfSxlLnBhdXNlPWZ1bmN0aW9uKHQpe3R8fCh0aGlzLl9pc1BhdXNlZD0hMCksbnQuZmluZE9uZSgiLmNhcm91c2VsLWl0ZW0tbmV4dCwgLmNhcm91c2VsLWl0ZW0tcHJldiIsdGhpcy5fZWxlbWVudCkmJihwKHRoaXMuX2VsZW1lbnQpLHRoaXMuY3ljbGUoITApKSxjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKSx0aGlzLl9pbnRlcnZhbD1udWxsfSxlLmN5Y2xlPWZ1bmN0aW9uKHQpe3R8fCh0aGlzLl9pc1BhdXNlZD0hMSksdGhpcy5faW50ZXJ2YWwmJihjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKSx0aGlzLl9pbnRlcnZhbD1udWxsKSx0aGlzLl9jb25maWcmJnRoaXMuX2NvbmZpZy5pbnRlcnZhbCYmIXRoaXMuX2lzUGF1c2VkJiYodGhpcy5faW50ZXJ2YWw9c2V0SW50ZXJ2YWwoKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZT90aGlzLm5leHRXaGVuVmlzaWJsZTp0aGlzLm5leHQpLmJpbmQodGhpcyksdGhpcy5fY29uZmlnLmludGVydmFsKSl9LGUudG89ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLl9hY3RpdmVFbGVtZW50PW50LmZpbmRPbmUoIi5hY3RpdmUuY2Fyb3VzZWwtaXRlbSIsdGhpcy5fZWxlbWVudCk7dmFyIG49dGhpcy5fZ2V0SXRlbUluZGV4KHRoaXMuX2FjdGl2ZUVsZW1lbnQpO2lmKCEodD50aGlzLl9pdGVtcy5sZW5ndGgtMXx8dDwwKSlpZih0aGlzLl9pc1NsaWRpbmcpcS5vbmUodGhpcy5fZWxlbWVudCwic2xpZC5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGUudG8odCl9KSk7ZWxzZXtpZihuPT09dClyZXR1cm4gdGhpcy5wYXVzZSgpLHZvaWQgdGhpcy5jeWNsZSgpO3ZhciBpPXQ+bj8ibmV4dCI6InByZXYiO3RoaXMuX3NsaWRlKGksdGhpcy5faXRlbXNbdF0pfX0sZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cS5vZmYodGhpcy5fZWxlbWVudCxvdCksQyh0aGlzLl9lbGVtZW50LCJicy5jYXJvdXNlbCIpLHRoaXMuX2l0ZW1zPW51bGwsdGhpcy5fY29uZmlnPW51bGwsdGhpcy5fZWxlbWVudD1udWxsLHRoaXMuX2ludGVydmFsPW51bGwsdGhpcy5faXNQYXVzZWQ9bnVsbCx0aGlzLl9pc1NsaWRpbmc9bnVsbCx0aGlzLl9hY3RpdmVFbGVtZW50PW51bGwsdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQ9bnVsbH0sZS5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiB0PXMocyh7fSxzdCksdCksdihpdCx0LHJ0KSx0fSxlLl9oYW5kbGVTd2lwZT1mdW5jdGlvbigpe3ZhciB0PU1hdGguYWJzKHRoaXMudG91Y2hEZWx0YVgpO2lmKCEodDw9NDApKXt2YXIgZT10L3RoaXMudG91Y2hEZWx0YVg7dGhpcy50b3VjaERlbHRhWD0wLGU+MCYmdGhpcy5wcmV2KCksZTwwJiZ0aGlzLm5leHQoKX19LGUuX2FkZEV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9jb25maWcua2V5Ym9hcmQmJnEub24odGhpcy5fZWxlbWVudCwia2V5ZG93bi5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKGUpe3JldHVybiB0Ll9rZXlkb3duKGUpfSkpLCJob3ZlciI9PT10aGlzLl9jb25maWcucGF1c2UmJihxLm9uKHRoaXMuX2VsZW1lbnQsIm1vdXNlZW50ZXIuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbihlKXtyZXR1cm4gdC5wYXVzZShlKX0pKSxxLm9uKHRoaXMuX2VsZW1lbnQsIm1vdXNlbGVhdmUuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbihlKXtyZXR1cm4gdC5jeWNsZShlKX0pKSksdGhpcy5fY29uZmlnLnRvdWNoJiZ0aGlzLl90b3VjaFN1cHBvcnRlZCYmdGhpcy5fYWRkVG91Y2hFdmVudExpc3RlbmVycygpfSxlLl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWZ1bmN0aW9uKGUpe3QuX3BvaW50ZXJFdmVudCYmYXRbZS5wb2ludGVyVHlwZS50b1VwcGVyQ2FzZSgpXT90LnRvdWNoU3RhcnRYPWUuY2xpZW50WDp0Ll9wb2ludGVyRXZlbnR8fCh0LnRvdWNoU3RhcnRYPWUudG91Y2hlc1swXS5jbGllbnRYKX0sbj1mdW5jdGlvbihlKXt0Ll9wb2ludGVyRXZlbnQmJmF0W2UucG9pbnRlclR5cGUudG9VcHBlckNhc2UoKV0mJih0LnRvdWNoRGVsdGFYPWUuY2xpZW50WC10LnRvdWNoU3RhcnRYKSx0Ll9oYW5kbGVTd2lwZSgpLCJob3ZlciI9PT10Ll9jb25maWcucGF1c2UmJih0LnBhdXNlKCksdC50b3VjaFRpbWVvdXQmJmNsZWFyVGltZW91dCh0LnRvdWNoVGltZW91dCksdC50b3VjaFRpbWVvdXQ9c2V0VGltZW91dCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuY3ljbGUoZSl9KSw1MDArdC5fY29uZmlnLmludGVydmFsKSl9O250LmZpbmQoIi5jYXJvdXNlbC1pdGVtIGltZyIsdGhpcy5fZWxlbWVudCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cS5vbih0LCJkcmFnc3RhcnQuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbih0KXtyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpfSkpfSkpLHRoaXMuX3BvaW50ZXJFdmVudD8ocS5vbih0aGlzLl9lbGVtZW50LCJwb2ludGVyZG93bi5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfSkpLHEub24odGhpcy5fZWxlbWVudCwicG9pbnRlcnVwLmJzLmNhcm91c2VsIiwoZnVuY3Rpb24odCl7cmV0dXJuIG4odCl9KSksdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJwb2ludGVyLWV2ZW50IikpOihxLm9uKHRoaXMuX2VsZW1lbnQsInRvdWNoc3RhcnQuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbih0KXtyZXR1cm4gZSh0KX0pKSxxLm9uKHRoaXMuX2VsZW1lbnQsInRvdWNobW92ZS5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlKXtlLnRvdWNoZXMmJmUudG91Y2hlcy5sZW5ndGg+MT90LnRvdWNoRGVsdGFYPTA6dC50b3VjaERlbHRhWD1lLnRvdWNoZXNbMF0uY2xpZW50WC10LnRvdWNoU3RhcnRYfShlKX0pKSxxLm9uKHRoaXMuX2VsZW1lbnQsInRvdWNoZW5kLmJzLmNhcm91c2VsIiwoZnVuY3Rpb24odCl7cmV0dXJuIG4odCl9KSkpfSxlLl9rZXlkb3duPWZ1bmN0aW9uKHQpe2lmKCEvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KHQudGFyZ2V0LnRhZ05hbWUpKXN3aXRjaCh0LmtleSl7Y2FzZSJBcnJvd0xlZnQiOnQucHJldmVudERlZmF1bHQoKSx0aGlzLnByZXYoKTticmVhaztjYXNlIkFycm93UmlnaHQiOnQucHJldmVudERlZmF1bHQoKSx0aGlzLm5leHQoKX19LGUuX2dldEl0ZW1JbmRleD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faXRlbXM9dCYmdC5wYXJlbnROb2RlP250LmZpbmQoIi5jYXJvdXNlbC1pdGVtIix0LnBhcmVudE5vZGUpOltdLHRoaXMuX2l0ZW1zLmluZGV4T2YodCl9LGUuX2dldEl0ZW1CeURpcmVjdGlvbj1mdW5jdGlvbih0LGUpe3ZhciBuPSJuZXh0Ij09PXQsaT0icHJldiI9PT10LG89dGhpcy5fZ2V0SXRlbUluZGV4KGUpLHM9dGhpcy5faXRlbXMubGVuZ3RoLTE7aWYoKGkmJjA9PT1vfHxuJiZvPT09cykmJiF0aGlzLl9jb25maWcud3JhcClyZXR1cm4gZTt2YXIgcj0obysoInByZXYiPT09dD8tMToxKSkldGhpcy5faXRlbXMubGVuZ3RoO3JldHVybi0xPT09cj90aGlzLl9pdGVtc1t0aGlzLl9pdGVtcy5sZW5ndGgtMV06dGhpcy5faXRlbXNbcl19LGUuX3RyaWdnZXJTbGlkZUV2ZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fZ2V0SXRlbUluZGV4KHQpLGk9dGhpcy5fZ2V0SXRlbUluZGV4KG50LmZpbmRPbmUoIi5hY3RpdmUuY2Fyb3VzZWwtaXRlbSIsdGhpcy5fZWxlbWVudCkpO3JldHVybiBxLnRyaWdnZXIodGhpcy5fZWxlbWVudCwic2xpZGUuYnMuY2Fyb3VzZWwiLHtyZWxhdGVkVGFyZ2V0OnQsZGlyZWN0aW9uOmUsZnJvbTppLHRvOm59KX0sZS5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudD1mdW5jdGlvbih0KXtpZih0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCl7Zm9yKHZhciBlPW50LmZpbmQoIi5hY3RpdmUiLHRoaXMuX2luZGljYXRvcnNFbGVtZW50KSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKTt2YXIgaT10aGlzLl9pbmRpY2F0b3JzRWxlbWVudC5jaGlsZHJlblt0aGlzLl9nZXRJdGVtSW5kZXgodCldO2kmJmkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIil9fSxlLl9zbGlkZT1mdW5jdGlvbih0LGUpe3ZhciBuLGksbyxzPXRoaXMscj1udC5maW5kT25lKCIuYWN0aXZlLmNhcm91c2VsLWl0ZW0iLHRoaXMuX2VsZW1lbnQpLGE9dGhpcy5fZ2V0SXRlbUluZGV4KHIpLGw9ZXx8ciYmdGhpcy5fZ2V0SXRlbUJ5RGlyZWN0aW9uKHQsciksYz10aGlzLl9nZXRJdGVtSW5kZXgobCksdT1Cb29sZWFuKHRoaXMuX2ludGVydmFsKTtpZigibmV4dCI9PT10PyhuPSJjYXJvdXNlbC1pdGVtLWxlZnQiLGk9ImNhcm91c2VsLWl0ZW0tbmV4dCIsbz0ibGVmdCIpOihuPSJjYXJvdXNlbC1pdGVtLXJpZ2h0IixpPSJjYXJvdXNlbC1pdGVtLXByZXYiLG89InJpZ2h0IiksbCYmbC5jbGFzc0xpc3QuY29udGFpbnMoImFjdGl2ZSIpKXRoaXMuX2lzU2xpZGluZz0hMTtlbHNlIGlmKCF0aGlzLl90cmlnZ2VyU2xpZGVFdmVudChsLG8pLmRlZmF1bHRQcmV2ZW50ZWQmJnImJmwpe2lmKHRoaXMuX2lzU2xpZGluZz0hMCx1JiZ0aGlzLnBhdXNlKCksdGhpcy5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChsKSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygic2xpZGUiKSl7bC5jbGFzc0xpc3QuYWRkKGkpLHcobCksci5jbGFzc0xpc3QuYWRkKG4pLGwuY2xhc3NMaXN0LmFkZChuKTt2YXIgaD1wYXJzZUludChsLmdldEF0dHJpYnV0ZSgiZGF0YS1pbnRlcnZhbCIpLDEwKTtoPyh0aGlzLl9jb25maWcuZGVmYXVsdEludGVydmFsPXRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWx8fHRoaXMuX2NvbmZpZy5pbnRlcnZhbCx0aGlzLl9jb25maWcuaW50ZXJ2YWw9aCk6dGhpcy5fY29uZmlnLmludGVydmFsPXRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWx8fHRoaXMuX2NvbmZpZy5pbnRlcnZhbDt2YXIgZj1nKHIpO3Eub25lKHIsInRyYW5zaXRpb25lbmQiLChmdW5jdGlvbigpe2wuY2xhc3NMaXN0LnJlbW92ZShuLGkpLGwuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIiksci5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiLGksbikscy5faXNTbGlkaW5nPSExLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cS50cmlnZ2VyKHMuX2VsZW1lbnQsInNsaWQuYnMuY2Fyb3VzZWwiLHtyZWxhdGVkVGFyZ2V0OmwsZGlyZWN0aW9uOm8sZnJvbTphLHRvOmN9KX0pLDApfSkpLF8ocixmKX1lbHNlIHIuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIiksbC5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKSx0aGlzLl9pc1NsaWRpbmc9ITEscS50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsInNsaWQuYnMuY2Fyb3VzZWwiLHtyZWxhdGVkVGFyZ2V0OmwsZGlyZWN0aW9uOm8sZnJvbTphLHRvOmN9KTt1JiZ0aGlzLmN5Y2xlKCl9fSx0LmNhcm91c2VsSW50ZXJmYWNlPWZ1bmN0aW9uKGUsbil7dmFyIGk9TChlLCJicy5jYXJvdXNlbCIpLG89cyhzKHt9LHN0KSxldC5nZXREYXRhQXR0cmlidXRlcyhlKSk7Im9iamVjdCI9PXR5cGVvZiBuJiYobz1zKHMoe30sbyksbikpO3ZhciByPSJzdHJpbmciPT10eXBlb2Ygbj9uOm8uc2xpZGU7aWYoaXx8KGk9bmV3IHQoZSxvKSksIm51bWJlciI9PXR5cGVvZiBuKWkudG8obik7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIHIpe2lmKHZvaWQgMD09PWlbcl0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK3IrJyInKTtpW3JdKCl9ZWxzZSBvLmludGVydmFsJiZvLnJpZGUmJihpLnBhdXNlKCksaS5jeWNsZSgpKX0sdC5qUXVlcnlJbnRlcmZhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXt0LmNhcm91c2VsSW50ZXJmYWNlKHRoaXMsZSl9KSl9LHQuZGF0YUFwaUNsaWNrSGFuZGxlcj1mdW5jdGlvbihlKXt2YXIgbj1kKHRoaXMpO2lmKG4mJm4uY2xhc3NMaXN0LmNvbnRhaW5zKCJjYXJvdXNlbCIpKXt2YXIgaT1zKHMoe30sZXQuZ2V0RGF0YUF0dHJpYnV0ZXMobikpLGV0LmdldERhdGFBdHRyaWJ1dGVzKHRoaXMpKSxvPXRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLXRvIik7byYmKGkuaW50ZXJ2YWw9ITEpLHQuY2Fyb3VzZWxJbnRlcmZhY2UobixpKSxvJiZMKG4sImJzLmNhcm91c2VsIikudG8obyksZS5wcmV2ZW50RGVmYXVsdCgpfX0sdC5nZXRJbnN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gTCh0LCJicy5jYXJvdXNlbCIpfSxuKHQsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjUuMC4wLWFscGhhMSJ9fSx7a2V5OiJEZWZhdWx0IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gc3R9fV0pLHR9KCk7cS5vbihkb2N1bWVudCwiY2xpY2suYnMuY2Fyb3VzZWwuZGF0YS1hcGkiLCJbZGF0YS1zbGlkZV0sIFtkYXRhLXNsaWRlLXRvXSIsbHQuZGF0YUFwaUNsaWNrSGFuZGxlcikscS5vbih3aW5kb3csImxvYWQuYnMuY2Fyb3VzZWwuZGF0YS1hcGkiLChmdW5jdGlvbigpe2Zvcih2YXIgdD1udC5maW5kKCdbZGF0YS1yaWRlPSJjYXJvdXNlbCJdJyksZT0wLG49dC5sZW5ndGg7ZTxuO2UrKylsdC5jYXJvdXNlbEludGVyZmFjZSh0W2VdLEwodFtlXSwiYnMuY2Fyb3VzZWwiKSl9KSk7dmFyIGN0PUUoKTtpZihjdCl7dmFyIHV0PWN0LmZuW2l0XTtjdC5mbltpdF09bHQualF1ZXJ5SW50ZXJmYWNlLGN0LmZuW2l0XS5Db25zdHJ1Y3Rvcj1sdCxjdC5mbltpdF0ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBjdC5mbltpdF09dXQsbHQualF1ZXJ5SW50ZXJmYWNlfX12YXIgaHQ9ImNvbGxhcHNlIixmdD17dG9nZ2xlOiEwLHBhcmVudDoiIn0sZHQ9e3RvZ2dsZToiYm9vbGVhbiIscGFyZW50OiIoc3RyaW5nfGVsZW1lbnQpIn0sZ3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5faXNUcmFuc2l0aW9uaW5nPSExLHRoaXMuX2VsZW1lbnQ9dCx0aGlzLl9jb25maWc9dGhpcy5fZ2V0Q29uZmlnKGUpLHRoaXMuX3RyaWdnZXJBcnJheT1udC5maW5kKCdbZGF0YS10b2dnbGU9ImNvbGxhcHNlIl1baHJlZj0iIycrdC5pZCsnIl0sW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdW2RhdGEtdGFyZ2V0PSIjJyt0LmlkKyciXScpO2Zvcih2YXIgbj1udC5maW5kKCdbZGF0YS10b2dnbGU9ImNvbGxhcHNlIl0nKSxpPTAsbz1uLmxlbmd0aDtpPG87aSsrKXt2YXIgcz1uW2ldLHI9ZihzKSxhPW50LmZpbmQocikuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9KSk7bnVsbCE9PXImJmEubGVuZ3RoJiYodGhpcy5fc2VsZWN0b3I9cix0aGlzLl90cmlnZ2VyQXJyYXkucHVzaChzKSl9dGhpcy5fcGFyZW50PXRoaXMuX2NvbmZpZy5wYXJlbnQ/dGhpcy5fZ2V0UGFyZW50KCk6bnVsbCx0aGlzLl9jb25maWcucGFyZW50fHx0aGlzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3ModGhpcy5fZWxlbWVudCx0aGlzLl90cmlnZ2VyQXJyYXkpLHRoaXMuX2NvbmZpZy50b2dnbGUmJnRoaXMudG9nZ2xlKCksVCh0LCJicy5jb2xsYXBzZSIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUudG9nZ2xlPWZ1bmN0aW9uKCl7dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKT90aGlzLmhpZGUoKTp0aGlzLnNob3coKX0sZS5zaG93PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZighdGhpcy5faXNUcmFuc2l0aW9uaW5nJiYhdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7dmFyIG4saTt0aGlzLl9wYXJlbnQmJjA9PT0obj1udC5maW5kKCIuc2hvdywgLmNvbGxhcHNpbmciLHRoaXMuX3BhcmVudCkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUuX2NvbmZpZy5wYXJlbnQ/dC5nZXRBdHRyaWJ1dGUoImRhdGEtcGFyZW50Iik9PT1lLl9jb25maWcucGFyZW50OnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJjb2xsYXBzZSIpfSkpKS5sZW5ndGgmJihuPW51bGwpO3ZhciBvPW50LmZpbmRPbmUodGhpcy5fc2VsZWN0b3IpO2lmKG4pe3ZhciBzPW4uZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gbyE9PXR9KSk7aWYoKGk9c1swXT9MKHNbMF0sImJzLmNvbGxhcHNlIik6bnVsbCkmJmkuX2lzVHJhbnNpdGlvbmluZylyZXR1cm59aWYoIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJzaG93LmJzLmNvbGxhcHNlIikuZGVmYXVsdFByZXZlbnRlZCl7biYmbi5mb3JFYWNoKChmdW5jdGlvbihlKXtvIT09ZSYmdC5jb2xsYXBzZUludGVyZmFjZShlLCJoaWRlIiksaXx8VChlLCJicy5jb2xsYXBzZSIsbnVsbCl9KSk7dmFyIHI9dGhpcy5fZ2V0RGltZW5zaW9uKCk7dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJjb2xsYXBzZSIpLHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgiY29sbGFwc2luZyIpLHRoaXMuX2VsZW1lbnQuc3R5bGVbcl09MCx0aGlzLl90cmlnZ2VyQXJyYXkubGVuZ3RoJiZ0aGlzLl90cmlnZ2VyQXJyYXkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJjb2xsYXBzZWQiKSx0LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsITApfSkpLHRoaXMuc2V0VHJhbnNpdGlvbmluZyghMCk7dmFyIGE9InNjcm9sbCIrKHJbMF0udG9VcHBlckNhc2UoKStyLnNsaWNlKDEpKSxsPWcodGhpcy5fZWxlbWVudCk7cS5vbmUodGhpcy5fZWxlbWVudCwidHJhbnNpdGlvbmVuZCIsKGZ1bmN0aW9uKCl7ZS5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJjb2xsYXBzaW5nIiksZS5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJjb2xsYXBzZSIsInNob3ciKSxlLl9lbGVtZW50LnN0eWxlW3JdPSIiLGUuc2V0VHJhbnNpdGlvbmluZyghMSkscS50cmlnZ2VyKGUuX2VsZW1lbnQsInNob3duLmJzLmNvbGxhcHNlIil9KSksXyh0aGlzLl9lbGVtZW50LGwpLHRoaXMuX2VsZW1lbnQuc3R5bGVbcl09dGhpcy5fZWxlbWVudFthXSsicHgifX19LGUuaGlkZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoIXRoaXMuX2lzVHJhbnNpdGlvbmluZyYmdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSYmIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJoaWRlLmJzLmNvbGxhcHNlIikuZGVmYXVsdFByZXZlbnRlZCl7dmFyIGU9dGhpcy5fZ2V0RGltZW5zaW9uKCk7dGhpcy5fZWxlbWVudC5zdHlsZVtlXT10aGlzLl9lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2VdKyJweCIsdyh0aGlzLl9lbGVtZW50KSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoImNvbGxhcHNpbmciKSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoImNvbGxhcHNlIiwic2hvdyIpO3ZhciBuPXRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGg7aWYobj4wKWZvcih2YXIgaT0wO2k8bjtpKyspe3ZhciBvPXRoaXMuX3RyaWdnZXJBcnJheVtpXSxzPWQobyk7cyYmIXMuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikmJihvLmNsYXNzTGlzdC5hZGQoImNvbGxhcHNlZCIpLG8uc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIiwhMSkpfXRoaXMuc2V0VHJhbnNpdGlvbmluZyghMCk7dGhpcy5fZWxlbWVudC5zdHlsZVtlXT0iIjt2YXIgcj1nKHRoaXMuX2VsZW1lbnQpO3Eub25lKHRoaXMuX2VsZW1lbnQsInRyYW5zaXRpb25lbmQiLChmdW5jdGlvbigpe3Quc2V0VHJhbnNpdGlvbmluZyghMSksdC5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJjb2xsYXBzaW5nIiksdC5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJjb2xsYXBzZSIpLHEudHJpZ2dlcih0Ll9lbGVtZW50LCJoaWRkZW4uYnMuY29sbGFwc2UiKX0pKSxfKHRoaXMuX2VsZW1lbnQscil9fSxlLnNldFRyYW5zaXRpb25pbmc9ZnVuY3Rpb24odCl7dGhpcy5faXNUcmFuc2l0aW9uaW5nPXR9LGUuZGlzcG9zZT1mdW5jdGlvbigpe0ModGhpcy5fZWxlbWVudCwiYnMuY29sbGFwc2UiKSx0aGlzLl9jb25maWc9bnVsbCx0aGlzLl9wYXJlbnQ9bnVsbCx0aGlzLl9lbGVtZW50PW51bGwsdGhpcy5fdHJpZ2dlckFycmF5PW51bGwsdGhpcy5faXNUcmFuc2l0aW9uaW5nPW51bGx9LGUuX2dldENvbmZpZz1mdW5jdGlvbih0KXtyZXR1cm4odD1zKHMoe30sZnQpLHQpKS50b2dnbGU9Qm9vbGVhbih0LnRvZ2dsZSksdihodCx0LGR0KSx0fSxlLl9nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoIndpZHRoIik/IndpZHRoIjoiaGVpZ2h0In0sZS5fZ2V0UGFyZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuX2NvbmZpZy5wYXJlbnQ7bShlKT92b2lkIDA9PT1lLmpxdWVyeSYmdm9pZCAwPT09ZVswXXx8KGU9ZVswXSk6ZT1udC5maW5kT25lKGUpO3ZhciBuPSdbZGF0YS10b2dnbGU9ImNvbGxhcHNlIl1bZGF0YS1wYXJlbnQ9IicrZSsnIl0nO3JldHVybiBudC5maW5kKG4sZSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49ZChlKTt0Ll9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MobixbZV0pfSkpLGV9LGUuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcz1mdW5jdGlvbih0LGUpe2lmKHQpe3ZhciBuPXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93Iik7ZS5sZW5ndGgmJmUuZm9yRWFjaCgoZnVuY3Rpb24odCl7bj90LmNsYXNzTGlzdC5yZW1vdmUoImNvbGxhcHNlZCIpOnQuY2xhc3NMaXN0LmFkZCgiY29sbGFwc2VkIiksdC5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLG4pfSkpfX0sdC5jb2xsYXBzZUludGVyZmFjZT1mdW5jdGlvbihlLG4pe3ZhciBpPUwoZSwiYnMuY29sbGFwc2UiKSxvPXMocyhzKHt9LGZ0KSxldC5nZXREYXRhQXR0cmlidXRlcyhlKSksIm9iamVjdCI9PXR5cGVvZiBuJiZuP246e30pO2lmKCFpJiZvLnRvZ2dsZSYmInN0cmluZyI9PXR5cGVvZiBuJiYvc2hvd3xoaWRlLy50ZXN0KG4pJiYoby50b2dnbGU9ITEpLGl8fChpPW5ldyB0KGUsbykpLCJzdHJpbmciPT10eXBlb2Ygbil7aWYodm9pZCAwPT09aVtuXSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrbisnIicpO2lbbl0oKX19LHQualF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dC5jb2xsYXBzZUludGVyZmFjZSh0aGlzLGUpfSkpfSx0LmdldEluc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBMKHQsImJzLmNvbGxhcHNlIil9LG4odCxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBmdH19XSksdH0oKTtxLm9uKGRvY3VtZW50LCJjbGljay5icy5jb2xsYXBzZS5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZT0iY29sbGFwc2UiXScsKGZ1bmN0aW9uKHQpeyJBIj09PXQudGFyZ2V0LnRhZ05hbWUmJnQucHJldmVudERlZmF1bHQoKTt2YXIgZT1ldC5nZXREYXRhQXR0cmlidXRlcyh0aGlzKSxuPWYodGhpcyk7bnQuZmluZChuKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbixpPUwodCwiYnMuY29sbGFwc2UiKTtpPyhudWxsPT09aS5fcGFyZW50JiYic3RyaW5nIj09dHlwZW9mIGUucGFyZW50JiYoaS5fY29uZmlnLnBhcmVudD1lLnBhcmVudCxpLl9wYXJlbnQ9aS5fZ2V0UGFyZW50KCkpLG49InRvZ2dsZSIpOm49ZSxndC5jb2xsYXBzZUludGVyZmFjZSh0LG4pfSkpfSkpO3ZhciBwdD1FKCk7aWYocHQpe3ZhciBtdD1wdC5mbltodF07cHQuZm5baHRdPWd0LmpRdWVyeUludGVyZmFjZSxwdC5mbltodF0uQ29uc3RydWN0b3I9Z3QscHQuZm5baHRdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gcHQuZm5baHRdPW10LGd0LmpRdWVyeUludGVyZmFjZX19dmFyIF90PSJkcm9wZG93biIsdnQ9bmV3IFJlZ0V4cCgiQXJyb3dVcHxBcnJvd0Rvd258RXNjYXBlIiksYnQ9e29mZnNldDowLGZsaXA6ITAsYm91bmRhcnk6InNjcm9sbFBhcmVudCIscmVmZXJlbmNlOiJ0b2dnbGUiLGRpc3BsYXk6ImR5bmFtaWMiLHBvcHBlckNvbmZpZzpudWxsfSx5dD17b2Zmc2V0OiIobnVtYmVyfHN0cmluZ3xmdW5jdGlvbikiLGZsaXA6ImJvb2xlYW4iLGJvdW5kYXJ5OiIoc3RyaW5nfGVsZW1lbnQpIixyZWZlcmVuY2U6IihzdHJpbmd8ZWxlbWVudCkiLGRpc3BsYXk6InN0cmluZyIscG9wcGVyQ29uZmlnOiIobnVsbHxvYmplY3QpIn0sd3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsZSl7dGhpcy5fZWxlbWVudD10LHRoaXMuX3BvcHBlcj1udWxsLHRoaXMuX2NvbmZpZz10aGlzLl9nZXRDb25maWcoZSksdGhpcy5fbWVudT10aGlzLl9nZXRNZW51RWxlbWVudCgpLHRoaXMuX2luTmF2YmFyPXRoaXMuX2RldGVjdE5hdmJhcigpLHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCksVCh0LCJicy5kcm9wZG93biIsdGhpcyl9dmFyIGk9ZS5wcm90b3R5cGU7cmV0dXJuIGkudG9nZ2xlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2VsZW1lbnQuZGlzYWJsZWQmJiF0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygiZGlzYWJsZWQiKSl7dmFyIHQ9dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKTtlLmNsZWFyTWVudXMoKSx0fHx0aGlzLnNob3coKX19LGkuc2hvdz1mdW5jdGlvbigpe2lmKCEodGhpcy5fZWxlbWVudC5kaXNhYmxlZHx8dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoImRpc2FibGVkIil8fHRoaXMuX21lbnUuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpKXt2YXIgbj1lLmdldFBhcmVudEZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpLGk9e3JlbGF0ZWRUYXJnZXQ6dGhpcy5fZWxlbWVudH07aWYoIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJzaG93LmJzLmRyb3Bkb3duIixpKS5kZWZhdWx0UHJldmVudGVkKXtpZighdGhpcy5faW5OYXZiYXIpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQm9vdHN0cmFwJ3MgZHJvcGRvd25zIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpIik7dmFyIG89dGhpcy5fZWxlbWVudDsicGFyZW50Ij09PXRoaXMuX2NvbmZpZy5yZWZlcmVuY2U/bz1uOm0odGhpcy5fY29uZmlnLnJlZmVyZW5jZSkmJihvPXRoaXMuX2NvbmZpZy5yZWZlcmVuY2Usdm9pZCAwIT09dGhpcy5fY29uZmlnLnJlZmVyZW5jZS5qcXVlcnkmJihvPXRoaXMuX2NvbmZpZy5yZWZlcmVuY2VbMF0pKSwic2Nyb2xsUGFyZW50IiE9PXRoaXMuX2NvbmZpZy5ib3VuZGFyeSYmbi5jbGFzc0xpc3QuYWRkKCJwb3NpdGlvbi1zdGF0aWMiKSx0aGlzLl9wb3BwZXI9bmV3IHQobyx0aGlzLl9tZW51LHRoaXMuX2dldFBvcHBlckNvbmZpZygpKX12YXIgcztpZigib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmIW4uY2xvc2VzdCgiLm5hdmJhci1uYXYiKSkocz1bXSkuY29uY2F0LmFwcGx5KHMsZG9jdW1lbnQuYm9keS5jaGlsZHJlbikuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHEub24odCwibW91c2VvdmVyIixudWxsLChmdW5jdGlvbigpe30pKX0pKTt0aGlzLl9lbGVtZW50LmZvY3VzKCksdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLCEwKSxldC50b2dnbGVDbGFzcyh0aGlzLl9tZW51LCJzaG93IiksZXQudG9nZ2xlQ2xhc3ModGhpcy5fZWxlbWVudCwic2hvdyIpLHEudHJpZ2dlcihuLCJzaG93bi5icy5kcm9wZG93biIsaSl9fX0saS5oaWRlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2VsZW1lbnQuZGlzYWJsZWQmJiF0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygiZGlzYWJsZWQiKSYmdGhpcy5fbWVudS5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7dmFyIHQ9ZS5nZXRQYXJlbnRGcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KSxuPXtyZWxhdGVkVGFyZ2V0OnRoaXMuX2VsZW1lbnR9O3EudHJpZ2dlcih0LCJoaWRlLmJzLmRyb3Bkb3duIixuKS5kZWZhdWx0UHJldmVudGVkfHwodGhpcy5fcG9wcGVyJiZ0aGlzLl9wb3BwZXIuZGVzdHJveSgpLGV0LnRvZ2dsZUNsYXNzKHRoaXMuX21lbnUsInNob3ciKSxldC50b2dnbGVDbGFzcyh0aGlzLl9lbGVtZW50LCJzaG93IikscS50cmlnZ2VyKHQsImhpZGRlbi5icy5kcm9wZG93biIsbikpfX0saS5kaXNwb3NlPWZ1bmN0aW9uKCl7Qyh0aGlzLl9lbGVtZW50LCJicy5kcm9wZG93biIpLHEub2ZmKHRoaXMuX2VsZW1lbnQsIi5icy5kcm9wZG93biIpLHRoaXMuX2VsZW1lbnQ9bnVsbCx0aGlzLl9tZW51PW51bGwsdGhpcy5fcG9wcGVyJiYodGhpcy5fcG9wcGVyLmRlc3Ryb3koKSx0aGlzLl9wb3BwZXI9bnVsbCl9LGkudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5faW5OYXZiYXI9dGhpcy5fZGV0ZWN0TmF2YmFyKCksdGhpcy5fcG9wcGVyJiZ0aGlzLl9wb3BwZXIuc2NoZWR1bGVVcGRhdGUoKX0saS5fYWRkRXZlbnRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3Eub24odGhpcy5fZWxlbWVudCwiY2xpY2suYnMuZHJvcGRvd24iLChmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKSx0LnRvZ2dsZSgpfSkpfSxpLl9nZXRDb25maWc9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9cyhzKHMoe30sdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0KSxldC5nZXREYXRhQXR0cmlidXRlcyh0aGlzLl9lbGVtZW50KSksdCksdihfdCx0LHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpLHR9LGkuX2dldE1lbnVFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIG50Lm5leHQodGhpcy5fZWxlbWVudCwiLmRyb3Bkb3duLW1lbnUiKVswXX0saS5fZ2V0UGxhY2VtZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLGU9ImJvdHRvbS1zdGFydCI7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJkcm9wdXAiKT8oZT0idG9wLXN0YXJ0Iix0aGlzLl9tZW51LmNsYXNzTGlzdC5jb250YWlucygiZHJvcGRvd24tbWVudS1yaWdodCIpJiYoZT0idG9wLWVuZCIpKTp0LmNsYXNzTGlzdC5jb250YWlucygiZHJvcHJpZ2h0Iik/ZT0icmlnaHQtc3RhcnQiOnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJkcm9wbGVmdCIpP2U9ImxlZnQtc3RhcnQiOnRoaXMuX21lbnUuY2xhc3NMaXN0LmNvbnRhaW5zKCJkcm9wZG93bi1tZW51LXJpZ2h0IikmJihlPSJib3R0b20tZW5kIiksZX0saS5fZGV0ZWN0TmF2YmFyPWZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5fZWxlbWVudC5jbG9zZXN0KCIubmF2YmFyIikpfSxpLl9nZXRPZmZzZXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9e307cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX2NvbmZpZy5vZmZzZXQ/ZS5mbj1mdW5jdGlvbihlKXtyZXR1cm4gZS5vZmZzZXRzPXMocyh7fSxlLm9mZnNldHMpLHQuX2NvbmZpZy5vZmZzZXQoZS5vZmZzZXRzLHQuX2VsZW1lbnQpfHx7fSksZX06ZS5vZmZzZXQ9dGhpcy5fY29uZmlnLm9mZnNldCxlfSxpLl9nZXRQb3BwZXJDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD17cGxhY2VtZW50OnRoaXMuX2dldFBsYWNlbWVudCgpLG1vZGlmaWVyczp7b2Zmc2V0OnRoaXMuX2dldE9mZnNldCgpLGZsaXA6e2VuYWJsZWQ6dGhpcy5fY29uZmlnLmZsaXB9LHByZXZlbnRPdmVyZmxvdzp7Ym91bmRhcmllc0VsZW1lbnQ6dGhpcy5fY29uZmlnLmJvdW5kYXJ5fX19O3JldHVybiJzdGF0aWMiPT09dGhpcy5fY29uZmlnLmRpc3BsYXkmJih0Lm1vZGlmaWVycy5hcHBseVN0eWxlPXtlbmFibGVkOiExfSkscyhzKHt9LHQpLHRoaXMuX2NvbmZpZy5wb3BwZXJDb25maWcpfSxlLmRyb3Bkb3duSW50ZXJmYWNlPWZ1bmN0aW9uKHQsbil7dmFyIGk9TCh0LCJicy5kcm9wZG93biIpO2lmKGl8fChpPW5ldyBlKHQsIm9iamVjdCI9PXR5cGVvZiBuP246bnVsbCkpLCJzdHJpbmciPT10eXBlb2Ygbil7aWYodm9pZCAwPT09aVtuXSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrbisnIicpO2lbbl0oKX19LGUualF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7ZS5kcm9wZG93bkludGVyZmFjZSh0aGlzLHQpfSkpfSxlLmNsZWFyTWVudXM9ZnVuY3Rpb24odCl7aWYoIXR8fDIhPT10LmJ1dHRvbiYmKCJrZXl1cCIhPT10LnR5cGV8fCJUYWIiPT09dC5rZXkpKWZvcih2YXIgbj1udC5maW5kKCdbZGF0YS10b2dnbGU9ImRyb3Bkb3duIl0nKSxpPTAsbz1uLmxlbmd0aDtpPG87aSsrKXt2YXIgcz1lLmdldFBhcmVudEZyb21FbGVtZW50KG5baV0pLHI9TChuW2ldLCJicy5kcm9wZG93biIpLGE9e3JlbGF0ZWRUYXJnZXQ6bltpXX07aWYodCYmImNsaWNrIj09PXQudHlwZSYmKGEuY2xpY2tFdmVudD10KSxyKXt2YXIgbD1yLl9tZW51O2lmKG5baV0uY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpaWYoISh0JiYoImNsaWNrIj09PXQudHlwZSYmL2lucHV0fHRleHRhcmVhL2kudGVzdCh0LnRhcmdldC50YWdOYW1lKXx8ImtleXVwIj09PXQudHlwZSYmIlRhYiI9PT10LmtleSkmJmwuY29udGFpbnModC50YXJnZXQpKSlpZighcS50cmlnZ2VyKHMsImhpZGUuYnMuZHJvcGRvd24iLGEpLmRlZmF1bHRQcmV2ZW50ZWQpe3ZhciBjO2lmKCJvbnRvdWNoc3RhcnQiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KShjPVtdKS5jb25jYXQuYXBwbHkoYyxkb2N1bWVudC5ib2R5LmNoaWxkcmVuKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gcS5vZmYodCwibW91c2VvdmVyIixudWxsLChmdW5jdGlvbigpe30pKX0pKTtuW2ldLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsImZhbHNlIiksci5fcG9wcGVyJiZyLl9wb3BwZXIuZGVzdHJveSgpLGwuY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLG5baV0uY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLHEudHJpZ2dlcihzLCJoaWRkZW4uYnMuZHJvcGRvd24iLGEpfX19fSxlLmdldFBhcmVudEZyb21FbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVybiBkKHQpfHx0LnBhcmVudE5vZGV9LGUuZGF0YUFwaUtleWRvd25IYW5kbGVyPWZ1bmN0aW9uKHQpe2lmKCEoL2lucHV0fHRleHRhcmVhL2kudGVzdCh0LnRhcmdldC50YWdOYW1lKT8iU3BhY2UiPT09dC5rZXl8fCJFc2NhcGUiIT09dC5rZXkmJigiQXJyb3dEb3duIiE9PXQua2V5JiYiQXJyb3dVcCIhPT10LmtleXx8dC50YXJnZXQuY2xvc2VzdCgiLmRyb3Bkb3duLW1lbnUiKSk6IXZ0LnRlc3QodC5rZXkpKSYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLCF0aGlzLmRpc2FibGVkJiYhdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoImRpc2FibGVkIikpKXt2YXIgbj1lLmdldFBhcmVudEZyb21FbGVtZW50KHRoaXMpLGk9dGhpcy5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKTtpZigiRXNjYXBlIj09PXQua2V5KXJldHVybih0aGlzLm1hdGNoZXMoJ1tkYXRhLXRvZ2dsZT0iZHJvcGRvd24iXScpP3RoaXM6bnQucHJldih0aGlzLCdbZGF0YS10b2dnbGU9ImRyb3Bkb3duIl0nKVswXSkuZm9jdXMoKSx2b2lkIGUuY2xlYXJNZW51cygpO2lmKGkmJiJTcGFjZSIhPT10LmtleSl7dmFyIG89bnQuZmluZCgiLmRyb3Bkb3duLW1lbnUgLmRyb3Bkb3duLWl0ZW06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCkiLG4pLmZpbHRlcihiKTtpZihvLmxlbmd0aCl7dmFyIHM9by5pbmRleE9mKHQudGFyZ2V0KTsiQXJyb3dVcCI9PT10LmtleSYmcz4wJiZzLS0sIkFycm93RG93biI9PT10LmtleSYmczxvLmxlbmd0aC0xJiZzKyssb1tzPS0xPT09cz8wOnNdLmZvY3VzKCl9fWVsc2UgZS5jbGVhck1lbnVzKCl9fSxlLmdldEluc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBMKHQsImJzLmRyb3Bkb3duIil9LG4oZSxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBidH19LHtrZXk6IkRlZmF1bHRUeXBlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geXR9fV0pLGV9KCk7cS5vbihkb2N1bWVudCwia2V5ZG93bi5icy5kcm9wZG93bi5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZT0iZHJvcGRvd24iXScsd3QuZGF0YUFwaUtleWRvd25IYW5kbGVyKSxxLm9uKGRvY3VtZW50LCJrZXlkb3duLmJzLmRyb3Bkb3duLmRhdGEtYXBpIiwiLmRyb3Bkb3duLW1lbnUiLHd0LmRhdGFBcGlLZXlkb3duSGFuZGxlcikscS5vbihkb2N1bWVudCwiY2xpY2suYnMuZHJvcGRvd24uZGF0YS1hcGkiLHd0LmNsZWFyTWVudXMpLHEub24oZG9jdW1lbnQsImtleXVwLmJzLmRyb3Bkb3duLmRhdGEtYXBpIix3dC5jbGVhck1lbnVzKSxxLm9uKGRvY3VtZW50LCJjbGljay5icy5kcm9wZG93bi5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZT0iZHJvcGRvd24iXScsKGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLHd0LmRyb3Bkb3duSW50ZXJmYWNlKHRoaXMsInRvZ2dsZSIpfSkpLHEub24oZG9jdW1lbnQsImNsaWNrLmJzLmRyb3Bkb3duLmRhdGEtYXBpIiwiLmRyb3Bkb3duIGZvcm0iLChmdW5jdGlvbih0KXtyZXR1cm4gdC5zdG9wUHJvcGFnYXRpb24oKX0pKTt2YXIgRXQ9RSgpO2lmKEV0KXt2YXIga3Q9RXQuZm5bX3RdO0V0LmZuW190XT13dC5qUXVlcnlJbnRlcmZhY2UsRXQuZm5bX3RdLkNvbnN0cnVjdG9yPXd0LEV0LmZuW190XS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIEV0LmZuW190XT1rdCx3dC5qUXVlcnlJbnRlcmZhY2V9fXZhciBUdD17YmFja2Ryb3A6ITAsa2V5Ym9hcmQ6ITAsZm9jdXM6ITAsc2hvdzohMH0sTHQ9e2JhY2tkcm9wOiIoYm9vbGVhbnxzdHJpbmcpIixrZXlib2FyZDoiYm9vbGVhbiIsZm9jdXM6ImJvb2xlYW4iLHNob3c6ImJvb2xlYW4ifSxDdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl9jb25maWc9dGhpcy5fZ2V0Q29uZmlnKGUpLHRoaXMuX2VsZW1lbnQ9dCx0aGlzLl9kaWFsb2c9bnQuZmluZE9uZSgiLm1vZGFsLWRpYWxvZyIsdCksdGhpcy5fYmFja2Ryb3A9bnVsbCx0aGlzLl9pc1Nob3duPSExLHRoaXMuX2lzQm9keU92ZXJmbG93aW5nPSExLHRoaXMuX2lnbm9yZUJhY2tkcm9wQ2xpY2s9ITEsdGhpcy5faXNUcmFuc2l0aW9uaW5nPSExLHRoaXMuX3Njcm9sbGJhcldpZHRoPTAsVCh0LCJicy5tb2RhbCIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUudG9nZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pc1Nob3duP3RoaXMuaGlkZSgpOnRoaXMuc2hvdyh0KX0sZS5zaG93PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoIXRoaXMuX2lzU2hvd24mJiF0aGlzLl9pc1RyYW5zaXRpb25pbmcpe3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJmYWRlIikmJih0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITApO3ZhciBuPXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJzaG93LmJzLm1vZGFsIix7cmVsYXRlZFRhcmdldDp0fSk7dGhpcy5faXNTaG93bnx8bi5kZWZhdWx0UHJldmVudGVkfHwodGhpcy5faXNTaG93bj0hMCx0aGlzLl9jaGVja1Njcm9sbGJhcigpLHRoaXMuX3NldFNjcm9sbGJhcigpLHRoaXMuX2FkanVzdERpYWxvZygpLHRoaXMuX3NldEVzY2FwZUV2ZW50KCksdGhpcy5fc2V0UmVzaXplRXZlbnQoKSxxLm9uKHRoaXMuX2VsZW1lbnQsImNsaWNrLmRpc21pc3MuYnMubW9kYWwiLCdbZGF0YS1kaXNtaXNzPSJtb2RhbCJdJywoZnVuY3Rpb24odCl7cmV0dXJuIGUuaGlkZSh0KX0pKSxxLm9uKHRoaXMuX2RpYWxvZywibW91c2Vkb3duLmRpc21pc3MuYnMubW9kYWwiLChmdW5jdGlvbigpe3Eub25lKGUuX2VsZW1lbnQsIm1vdXNldXAuZGlzbWlzcy5icy5tb2RhbCIsKGZ1bmN0aW9uKHQpe3QudGFyZ2V0PT09ZS5fZWxlbWVudCYmKGUuX2lnbm9yZUJhY2tkcm9wQ2xpY2s9ITApfSkpfSkpLHRoaXMuX3Nob3dCYWNrZHJvcCgoZnVuY3Rpb24oKXtyZXR1cm4gZS5fc2hvd0VsZW1lbnQodCl9KSkpfX0sZS5oaWRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoKHQmJnQucHJldmVudERlZmF1bHQoKSx0aGlzLl9pc1Nob3duJiYhdGhpcy5faXNUcmFuc2l0aW9uaW5nKSYmIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJoaWRlLmJzLm1vZGFsIikuZGVmYXVsdFByZXZlbnRlZCl7dGhpcy5faXNTaG93bj0hMTt2YXIgbj10aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygiZmFkZSIpO2lmKG4mJih0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITApLHRoaXMuX3NldEVzY2FwZUV2ZW50KCksdGhpcy5fc2V0UmVzaXplRXZlbnQoKSxxLm9mZihkb2N1bWVudCwiZm9jdXNpbi5icy5tb2RhbCIpLHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLHEub2ZmKHRoaXMuX2VsZW1lbnQsImNsaWNrLmRpc21pc3MuYnMubW9kYWwiKSxxLm9mZih0aGlzLl9kaWFsb2csIm1vdXNlZG93bi5kaXNtaXNzLmJzLm1vZGFsIiksbil7dmFyIGk9Zyh0aGlzLl9lbGVtZW50KTtxLm9uZSh0aGlzLl9lbGVtZW50LCJ0cmFuc2l0aW9uZW5kIiwoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2hpZGVNb2RhbCh0KX0pKSxfKHRoaXMuX2VsZW1lbnQsaSl9ZWxzZSB0aGlzLl9oaWRlTW9kYWwoKX19LGUuZGlzcG9zZT1mdW5jdGlvbigpe1t3aW5kb3csdGhpcy5fZWxlbWVudCx0aGlzLl9kaWFsb2ddLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBxLm9mZih0LCIuYnMubW9kYWwiKX0pKSxxLm9mZihkb2N1bWVudCwiZm9jdXNpbi5icy5tb2RhbCIpLEModGhpcy5fZWxlbWVudCwiYnMubW9kYWwiKSx0aGlzLl9jb25maWc9bnVsbCx0aGlzLl9lbGVtZW50PW51bGwsdGhpcy5fZGlhbG9nPW51bGwsdGhpcy5fYmFja2Ryb3A9bnVsbCx0aGlzLl9pc1Nob3duPW51bGwsdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmc9bnVsbCx0aGlzLl9pZ25vcmVCYWNrZHJvcENsaWNrPW51bGwsdGhpcy5faXNUcmFuc2l0aW9uaW5nPW51bGwsdGhpcy5fc2Nyb2xsYmFyV2lkdGg9bnVsbH0sZS5oYW5kbGVVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl9hZGp1c3REaWFsb2coKX0sZS5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiB0PXMocyh7fSxUdCksdCksdigibW9kYWwiLHQsTHQpLHR9LGUuX3Nob3dFbGVtZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygiZmFkZSIpLGk9bnQuZmluZE9uZSgiLm1vZGFsLWJvZHkiLHRoaXMuX2RpYWxvZyk7dGhpcy5fZWxlbWVudC5wYXJlbnROb2RlJiZ0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERXx8ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KSx0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKSx0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1tb2RhbCIsITApLHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCJyb2xlIiwiZGlhbG9nIiksdGhpcy5fZWxlbWVudC5zY3JvbGxUb3A9MCxpJiYoaS5zY3JvbGxUb3A9MCksbiYmdyh0aGlzLl9lbGVtZW50KSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoInNob3ciKSx0aGlzLl9jb25maWcuZm9jdXMmJnRoaXMuX2VuZm9yY2VGb2N1cygpO3ZhciBvPWZ1bmN0aW9uKCl7ZS5fY29uZmlnLmZvY3VzJiZlLl9lbGVtZW50LmZvY3VzKCksZS5faXNUcmFuc2l0aW9uaW5nPSExLHEudHJpZ2dlcihlLl9lbGVtZW50LCJzaG93bi5icy5tb2RhbCIse3JlbGF0ZWRUYXJnZXQ6dH0pfTtpZihuKXt2YXIgcz1nKHRoaXMuX2RpYWxvZyk7cS5vbmUodGhpcy5fZGlhbG9nLCJ0cmFuc2l0aW9uZW5kIixvKSxfKHRoaXMuX2RpYWxvZyxzKX1lbHNlIG8oKX0sZS5fZW5mb3JjZUZvY3VzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztxLm9mZihkb2N1bWVudCwiZm9jdXNpbi5icy5tb2RhbCIpLHEub24oZG9jdW1lbnQsImZvY3VzaW4uYnMubW9kYWwiLChmdW5jdGlvbihlKXtkb2N1bWVudD09PWUudGFyZ2V0fHx0Ll9lbGVtZW50PT09ZS50YXJnZXR8fHQuX2VsZW1lbnQuY29udGFpbnMoZS50YXJnZXQpfHx0Ll9lbGVtZW50LmZvY3VzKCl9KSl9LGUuX3NldEVzY2FwZUV2ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9pc1Nob3duP3Eub24odGhpcy5fZWxlbWVudCwia2V5ZG93bi5kaXNtaXNzLmJzLm1vZGFsIiwoZnVuY3Rpb24oZSl7dC5fY29uZmlnLmtleWJvYXJkJiYiRXNjYXBlIj09PWUua2V5PyhlLnByZXZlbnREZWZhdWx0KCksdC5oaWRlKCkpOnQuX2NvbmZpZy5rZXlib2FyZHx8IkVzY2FwZSIhPT1lLmtleXx8dC5fdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbigpfSkpOnEub2ZmKHRoaXMuX2VsZW1lbnQsImtleWRvd24uZGlzbWlzcy5icy5tb2RhbCIpfSxlLl9zZXRSZXNpemVFdmVudD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5faXNTaG93bj9xLm9uKHdpbmRvdywicmVzaXplLmJzLm1vZGFsIiwoZnVuY3Rpb24oKXtyZXR1cm4gdC5fYWRqdXN0RGlhbG9nKCl9KSk6cS5vZmYod2luZG93LCJyZXNpemUuYnMubW9kYWwiKX0sZS5faGlkZU1vZGFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsITApLHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJhcmlhLW1vZGFsIiksdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKSx0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITEsdGhpcy5fc2hvd0JhY2tkcm9wKChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgibW9kYWwtb3BlbiIpLHQuX3Jlc2V0QWRqdXN0bWVudHMoKSx0Ll9yZXNldFNjcm9sbGJhcigpLHEudHJpZ2dlcih0Ll9lbGVtZW50LCJoaWRkZW4uYnMubW9kYWwiKX0pKX0sZS5fcmVtb3ZlQmFja2Ryb3A9ZnVuY3Rpb24oKXt0aGlzLl9iYWNrZHJvcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2JhY2tkcm9wKSx0aGlzLl9iYWNrZHJvcD1udWxsfSxlLl9zaG93QmFja2Ryb3A9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJmYWRlIik/ImZhZGUiOiIiO2lmKHRoaXMuX2lzU2hvd24mJnRoaXMuX2NvbmZpZy5iYWNrZHJvcCl7aWYodGhpcy5fYmFja2Ryb3A9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fYmFja2Ryb3AuY2xhc3NOYW1lPSJtb2RhbC1iYWNrZHJvcCIsbiYmdGhpcy5fYmFja2Ryb3AuY2xhc3NMaXN0LmFkZChuKSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2JhY2tkcm9wKSxxLm9uKHRoaXMuX2VsZW1lbnQsImNsaWNrLmRpc21pc3MuYnMubW9kYWwiLChmdW5jdGlvbih0KXtlLl9pZ25vcmVCYWNrZHJvcENsaWNrP2UuX2lnbm9yZUJhY2tkcm9wQ2xpY2s9ITE6dC50YXJnZXQ9PT10LmN1cnJlbnRUYXJnZXQmJmUuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKX0pKSxuJiZ3KHRoaXMuX2JhY2tkcm9wKSx0aGlzLl9iYWNrZHJvcC5jbGFzc0xpc3QuYWRkKCJzaG93IiksIW4pcmV0dXJuIHZvaWQgdCgpO3ZhciBpPWcodGhpcy5fYmFja2Ryb3ApO3Eub25lKHRoaXMuX2JhY2tkcm9wLCJ0cmFuc2l0aW9uZW5kIix0KSxfKHRoaXMuX2JhY2tkcm9wLGkpfWVsc2UgaWYoIXRoaXMuX2lzU2hvd24mJnRoaXMuX2JhY2tkcm9wKXt0aGlzLl9iYWNrZHJvcC5jbGFzc0xpc3QucmVtb3ZlKCJzaG93Iik7dmFyIG89ZnVuY3Rpb24oKXtlLl9yZW1vdmVCYWNrZHJvcCgpLHQoKX07aWYodGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoImZhZGUiKSl7dmFyIHM9Zyh0aGlzLl9iYWNrZHJvcCk7cS5vbmUodGhpcy5fYmFja2Ryb3AsInRyYW5zaXRpb25lbmQiLG8pLF8odGhpcy5fYmFja2Ryb3Ascyl9ZWxzZSBvKCl9ZWxzZSB0KCl9LGUuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKCJzdGF0aWMiPT09dGhpcy5fY29uZmlnLmJhY2tkcm9wKXtpZihxLnRyaWdnZXIodGhpcy5fZWxlbWVudCwiaGlkZVByZXZlbnRlZC5icy5tb2RhbCIpLmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuO3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgibW9kYWwtc3RhdGljIik7dmFyIGU9Zyh0aGlzLl9lbGVtZW50KTtxLm9uZSh0aGlzLl9lbGVtZW50LCJ0cmFuc2l0aW9uZW5kIiwoZnVuY3Rpb24oKXt0Ll9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoIm1vZGFsLXN0YXRpYyIpfSkpLF8odGhpcy5fZWxlbWVudCxlKSx0aGlzLl9lbGVtZW50LmZvY3VzKCl9ZWxzZSB0aGlzLmhpZGUoKX0sZS5fYWRqdXN0RGlhbG9nPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQ+ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDshdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcmJnQmJih0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0PXRoaXMuX3Njcm9sbGJhcldpZHRoKyJweCIpLHRoaXMuX2lzQm9keU92ZXJmbG93aW5nJiYhdCYmKHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0PXRoaXMuX3Njcm9sbGJhcldpZHRoKyJweCIpfSxlLl9yZXNldEFkanVzdG1lbnRzPWZ1bmN0aW9uKCl7dGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdD0iIix0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodD0iIn0sZS5fY2hlY2tTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuX2lzQm9keU92ZXJmbG93aW5nPU1hdGgucm91bmQodC5sZWZ0K3QucmlnaHQpPHdpbmRvdy5pbm5lcldpZHRoLHRoaXMuX3Njcm9sbGJhcldpZHRoPXRoaXMuX2dldFNjcm9sbGJhcldpZHRoKCl9LGUuX3NldFNjcm9sbGJhcj1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYodGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcpe250LmZpbmQoIi5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AiKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLnN0eWxlLnBhZGRpbmdSaWdodCxpPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpWyJwYWRkaW5nLXJpZ2h0Il07ZXQuc2V0RGF0YUF0dHJpYnV0ZShlLCJwYWRkaW5nLXJpZ2h0IixuKSxlLnN0eWxlLnBhZGRpbmdSaWdodD1wYXJzZUZsb2F0KGkpK3QuX3Njcm9sbGJhcldpZHRoKyJweCJ9KSksbnQuZmluZCgiLnN0aWNreS10b3AiKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLnN0eWxlLm1hcmdpblJpZ2h0LGk9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSlbIm1hcmdpbi1yaWdodCJdO2V0LnNldERhdGFBdHRyaWJ1dGUoZSwibWFyZ2luLXJpZ2h0IixuKSxlLnN0eWxlLm1hcmdpblJpZ2h0PXBhcnNlRmxvYXQoaSktdC5fc2Nyb2xsYmFyV2lkdGgrInB4In0pKTt2YXIgZT1kb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCxuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpWyJwYWRkaW5nLXJpZ2h0Il07ZXQuc2V0RGF0YUF0dHJpYnV0ZShkb2N1bWVudC5ib2R5LCJwYWRkaW5nLXJpZ2h0IixlKSxkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1wYXJzZUZsb2F0KG4pK3RoaXMuX3Njcm9sbGJhcldpZHRoKyJweCJ9ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJtb2RhbC1vcGVuIil9LGUuX3Jlc2V0U2Nyb2xsYmFyPWZ1bmN0aW9uKCl7bnQuZmluZCgiLmZpeGVkLXRvcCwgLmZpeGVkLWJvdHRvbSwgLmlzLWZpeGVkLCAuc3RpY2t5LXRvcCIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPWV0LmdldERhdGFBdHRyaWJ1dGUodCwicGFkZGluZy1yaWdodCIpO3ZvaWQgMCE9PWUmJihldC5yZW1vdmVEYXRhQXR0cmlidXRlKHQsInBhZGRpbmctcmlnaHQiKSx0LnN0eWxlLnBhZGRpbmdSaWdodD1lKX0pKSxudC5maW5kKCIuc3RpY2t5LXRvcCIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPWV0LmdldERhdGFBdHRyaWJ1dGUodCwibWFyZ2luLXJpZ2h0Iik7dm9pZCAwIT09ZSYmKGV0LnJlbW92ZURhdGFBdHRyaWJ1dGUodCwibWFyZ2luLXJpZ2h0IiksdC5zdHlsZS5tYXJnaW5SaWdodD1lKX0pKTt2YXIgdD1ldC5nZXREYXRhQXR0cmlidXRlKGRvY3VtZW50LmJvZHksInBhZGRpbmctcmlnaHQiKTt2b2lkIDA9PT10P2RvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PSIiOihldC5yZW1vdmVEYXRhQXR0cmlidXRlKGRvY3VtZW50LmJvZHksInBhZGRpbmctcmlnaHQiKSxkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD10KX0sZS5fZ2V0U2Nyb2xsYmFyV2lkdGg9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTmFtZT0ibW9kYWwtc2Nyb2xsYmFyLW1lYXN1cmUiLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodCk7dmFyIGU9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aC10LmNsaWVudFdpZHRoO3JldHVybiBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHQpLGV9LHQualF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXt2YXIgaT1MKHRoaXMsImJzLm1vZGFsIiksbz1zKHMocyh7fSxUdCksZXQuZ2V0RGF0YUF0dHJpYnV0ZXModGhpcykpLCJvYmplY3QiPT10eXBlb2YgZSYmZT9lOnt9KTtpZihpfHwoaT1uZXcgdCh0aGlzLG8pKSwic3RyaW5nIj09dHlwZW9mIGUpe2lmKHZvaWQgMD09PWlbZV0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK2UrJyInKTtpW2VdKG4pfWVsc2Ugby5zaG93JiZpLnNob3cobil9KSl9LHQuZ2V0SW5zdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIEwodCwiYnMubW9kYWwiKX0sbih0LG51bGwsW3trZXk6IlZFUlNJT04iLGdldDpmdW5jdGlvbigpe3JldHVybiI1LjAuMC1hbHBoYTEifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFR0fX1dKSx0fSgpO3Eub24oZG9jdW1lbnQsImNsaWNrLmJzLm1vZGFsLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJtb2RhbCJdJywoZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWQodGhpcyk7IkEiIT09dGhpcy50YWdOYW1lJiYiQVJFQSIhPT10aGlzLnRhZ05hbWV8fHQucHJldmVudERlZmF1bHQoKSxxLm9uZShuLCJzaG93LmJzLm1vZGFsIiwoZnVuY3Rpb24odCl7dC5kZWZhdWx0UHJldmVudGVkfHxxLm9uZShuLCJoaWRkZW4uYnMubW9kYWwiLChmdW5jdGlvbigpe2IoZSkmJmUuZm9jdXMoKX0pKX0pKTt2YXIgaT1MKG4sImJzLm1vZGFsIik7aWYoIWkpe3ZhciBvPXMocyh7fSxldC5nZXREYXRhQXR0cmlidXRlcyhuKSksZXQuZ2V0RGF0YUF0dHJpYnV0ZXModGhpcykpO2k9bmV3IEN0KG4sbyl9aS5zaG93KHRoaXMpfSkpO3ZhciBBdD1FKCk7aWYoQXQpe3ZhciBTdD1BdC5mbi5tb2RhbDtBdC5mbi5tb2RhbD1DdC5qUXVlcnlJbnRlcmZhY2UsQXQuZm4ubW9kYWwuQ29uc3RydWN0b3I9Q3QsQXQuZm4ubW9kYWwubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBBdC5mbi5tb2RhbD1TdCxDdC5qUXVlcnlJbnRlcmZhY2V9fXZhciBPdD1bImJhY2tncm91bmQiLCJjaXRlIiwiaHJlZiIsIml0ZW10eXBlIiwibG9uZ2Rlc2MiLCJwb3N0ZXIiLCJzcmMiLCJ4bGluazpocmVmIl0sRHQ9L14oPzooPzpodHRwcz98bWFpbHRvfGZ0cHx0ZWx8ZmlsZSk6fFteIyYvOj9dKig/OlsjLz9dfCQpKS9naSxJdD0vXmRhdGE6KD86aW1hZ2VcLyg/OmJtcHxnaWZ8anBlZ3xqcGd8cG5nfHRpZmZ8d2VicCl8dmlkZW9cLyg/Om1wZWd8bXA0fG9nZ3x3ZWJtKXxhdWRpb1wvKD86bXAzfG9nYXxvZ2d8b3B1cykpO2Jhc2U2NCxbXGQrL2Etel0rPSokL2ksTnQ9eyIqIjpbImNsYXNzIiwiZGlyIiwiaWQiLCJsYW5nIiwicm9sZSIsL15hcmlhLVtcdy1dKiQvaV0sYTpbInRhcmdldCIsImhyZWYiLCJ0aXRsZSIsInJlbCJdLGFyZWE6W10sYjpbXSxicjpbXSxjb2w6W10sY29kZTpbXSxkaXY6W10sZW06W10saHI6W10saDE6W10saDI6W10saDM6W10saDQ6W10saDU6W10saDY6W10saTpbXSxpbWc6WyJzcmMiLCJzcmNzZXQiLCJhbHQiLCJ0aXRsZSIsIndpZHRoIiwiaGVpZ2h0Il0sbGk6W10sb2w6W10scDpbXSxwcmU6W10sczpbXSxzbWFsbDpbXSxzcGFuOltdLHN1YjpbXSxzdXA6W10sc3Ryb25nOltdLHU6W10sdWw6W119O2Z1bmN0aW9uIGp0KHQsZSxuKXt2YXIgaTtpZighdC5sZW5ndGgpcmV0dXJuIHQ7aWYobiYmImZ1bmN0aW9uIj09dHlwZW9mIG4pcmV0dXJuIG4odCk7Zm9yKHZhciBvPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsInRleHQvaHRtbCIpLHM9T2JqZWN0LmtleXMoZSkscj0oaT1bXSkuY29uY2F0LmFwcGx5KGksby5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoIioiKSksYT1mdW5jdGlvbih0LG4pe3ZhciBpLG89clt0XSxhPW8ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZigtMT09PXMuaW5kZXhPZihhKSlyZXR1cm4gby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pLCJjb250aW51ZSI7dmFyIGw9KGk9W10pLmNvbmNhdC5hcHBseShpLG8uYXR0cmlidXRlcyksYz1bXS5jb25jYXQoZVsiKiJdfHxbXSxlW2FdfHxbXSk7bC5mb3JFYWNoKChmdW5jdGlvbih0KXsoZnVuY3Rpb24odCxlKXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoLTEhPT1lLmluZGV4T2YobikpcmV0dXJuLTE9PT1PdC5pbmRleE9mKG4pfHxCb29sZWFuKHQubm9kZVZhbHVlLm1hdGNoKER0KXx8dC5ub2RlVmFsdWUubWF0Y2goSXQpKTtmb3IodmFyIGk9ZS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgUmVnRXhwfSkpLG89MCxzPWkubGVuZ3RoO288cztvKyspaWYobi5tYXRjaChpW29dKSlyZXR1cm4hMDtyZXR1cm4hMX0pKHQsYyl8fG8ucmVtb3ZlQXR0cmlidXRlKHQubm9kZU5hbWUpfSkpfSxsPTAsYz1yLmxlbmd0aDtsPGM7bCsrKWEobCk7cmV0dXJuIG8uYm9keS5pbm5lckhUTUx9dmFyIFB0PSJ0b29sdGlwIix4dD1uZXcgUmVnRXhwKCIoXnxcXHMpYnMtdG9vbHRpcFxcUysiLCJnIiksUnQ9WyJzYW5pdGl6ZSIsIndoaXRlTGlzdCIsInNhbml0aXplRm4iXSxIdD17YW5pbWF0aW9uOiJib29sZWFuIix0ZW1wbGF0ZToic3RyaW5nIix0aXRsZToiKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKSIsdHJpZ2dlcjoic3RyaW5nIixkZWxheToiKG51bWJlcnxvYmplY3QpIixodG1sOiJib29sZWFuIixzZWxlY3RvcjoiKHN0cmluZ3xib29sZWFuKSIscGxhY2VtZW50OiIoc3RyaW5nfGZ1bmN0aW9uKSIsb2Zmc2V0OiIobnVtYmVyfHN0cmluZ3xmdW5jdGlvbikiLGNvbnRhaW5lcjoiKHN0cmluZ3xlbGVtZW50fGJvb2xlYW4pIixmYWxsYmFja1BsYWNlbWVudDoiKHN0cmluZ3xhcnJheSkiLGJvdW5kYXJ5OiIoc3RyaW5nfGVsZW1lbnQpIixzYW5pdGl6ZToiYm9vbGVhbiIsc2FuaXRpemVGbjoiKG51bGx8ZnVuY3Rpb24pIix3aGl0ZUxpc3Q6Im9iamVjdCIscG9wcGVyQ29uZmlnOiIobnVsbHxvYmplY3QpIn0sQnQ9e0FVVE86ImF1dG8iLFRPUDoidG9wIixSSUdIVDoicmlnaHQiLEJPVFRPTToiYm90dG9tIixMRUZUOiJsZWZ0In0sTXQ9e2FuaW1hdGlvbjohMCx0ZW1wbGF0ZTonPGRpdiBjbGFzcz0idG9vbHRpcCIgcm9sZT0idG9vbHRpcCI+PGRpdiBjbGFzcz0idG9vbHRpcC1hcnJvdyI+PC9kaXY+PGRpdiBjbGFzcz0idG9vbHRpcC1pbm5lciI+PC9kaXY+PC9kaXY+Jyx0cmlnZ2VyOiJob3ZlciBmb2N1cyIsdGl0bGU6IiIsZGVsYXk6MCxodG1sOiExLHNlbGVjdG9yOiExLHBsYWNlbWVudDoidG9wIixvZmZzZXQ6MCxjb250YWluZXI6ITEsZmFsbGJhY2tQbGFjZW1lbnQ6ImZsaXAiLGJvdW5kYXJ5OiJzY3JvbGxQYXJlbnQiLHNhbml0aXplOiEwLHNhbml0aXplRm46bnVsbCx3aGl0ZUxpc3Q6TnQscG9wcGVyQ29uZmlnOm51bGx9LFF0PXtISURFOiJoaWRlLmJzLnRvb2x0aXAiLEhJRERFTjoiaGlkZGVuLmJzLnRvb2x0aXAiLFNIT1c6InNob3cuYnMudG9vbHRpcCIsU0hPV046InNob3duLmJzLnRvb2x0aXAiLElOU0VSVEVEOiJpbnNlcnRlZC5icy50b29sdGlwIixDTElDSzoiY2xpY2suYnMudG9vbHRpcCIsRk9DVVNJTjoiZm9jdXNpbi5icy50b29sdGlwIixGT0NVU09VVDoiZm9jdXNvdXQuYnMudG9vbHRpcCIsTU9VU0VFTlRFUjoibW91c2VlbnRlci5icy50b29sdGlwIixNT1VTRUxFQVZFOiJtb3VzZWxlYXZlLmJzLnRvb2x0aXAifSxVdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSxuKXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoIkJvb3RzdHJhcCdzIHRvb2x0aXBzIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpIik7dGhpcy5faXNFbmFibGVkPSEwLHRoaXMuX3RpbWVvdXQ9MCx0aGlzLl9ob3ZlclN0YXRlPSIiLHRoaXMuX2FjdGl2ZVRyaWdnZXI9e30sdGhpcy5fcG9wcGVyPW51bGwsdGhpcy5lbGVtZW50PWUsdGhpcy5jb25maWc9dGhpcy5fZ2V0Q29uZmlnKG4pLHRoaXMudGlwPW51bGwsdGhpcy5fc2V0TGlzdGVuZXJzKCksVChlLHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVksdGhpcyl9dmFyIGk9ZS5wcm90b3R5cGU7cmV0dXJuIGkuZW5hYmxlPWZ1bmN0aW9uKCl7dGhpcy5faXNFbmFibGVkPSEwfSxpLmRpc2FibGU9ZnVuY3Rpb24oKXt0aGlzLl9pc0VuYWJsZWQ9ITF9LGkudG9nZ2xlRW5hYmxlZD1mdW5jdGlvbigpe3RoaXMuX2lzRW5hYmxlZD0hdGhpcy5faXNFbmFibGVkfSxpLnRvZ2dsZT1mdW5jdGlvbih0KXtpZih0aGlzLl9pc0VuYWJsZWQpaWYodCl7dmFyIGU9dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSxuPUwodC50YXJnZXQsZSk7bnx8KG49bmV3IHRoaXMuY29uc3RydWN0b3IodC50YXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSksVCh0LnRhcmdldCxlLG4pKSxuLl9hY3RpdmVUcmlnZ2VyLmNsaWNrPSFuLl9hY3RpdmVUcmlnZ2VyLmNsaWNrLG4uX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKT9uLl9lbnRlcihudWxsLG4pOm4uX2xlYXZlKG51bGwsbil9ZWxzZXtpZih0aGlzLmdldFRpcEVsZW1lbnQoKS5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSlyZXR1cm4gdm9pZCB0aGlzLl9sZWF2ZShudWxsLHRoaXMpO3RoaXMuX2VudGVyKG51bGwsdGhpcyl9fSxpLmRpc3Bvc2U9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCksQyh0aGlzLmVsZW1lbnQsdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSkscS5vZmYodGhpcy5lbGVtZW50LHRoaXMuY29uc3RydWN0b3IuRVZFTlRfS0VZKSxxLm9mZih0aGlzLmVsZW1lbnQuY2xvc2VzdCgiLm1vZGFsIiksImhpZGUuYnMubW9kYWwiLHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpLHRoaXMudGlwJiZ0aGlzLnRpcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMudGlwKSx0aGlzLl9pc0VuYWJsZWQ9bnVsbCx0aGlzLl90aW1lb3V0PW51bGwsdGhpcy5faG92ZXJTdGF0ZT1udWxsLHRoaXMuX2FjdGl2ZVRyaWdnZXI9bnVsbCx0aGlzLl9wb3BwZXImJnRoaXMuX3BvcHBlci5kZXN0cm95KCksdGhpcy5fcG9wcGVyPW51bGwsdGhpcy5lbGVtZW50PW51bGwsdGhpcy5jb25maWc9bnVsbCx0aGlzLnRpcD1udWxsfSxpLnNob3c9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKCJub25lIj09PXRoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5KXRocm93IG5ldyBFcnJvcigiUGxlYXNlIHVzZSBzaG93IG9uIHZpc2libGUgZWxlbWVudHMiKTtpZih0aGlzLmlzV2l0aENvbnRlbnQoKSYmdGhpcy5faXNFbmFibGVkKXt2YXIgbj1xLnRyaWdnZXIodGhpcy5lbGVtZW50LHRoaXMuY29uc3RydWN0b3IuRXZlbnQuU0hPVyksaT1mdW5jdGlvbiB0KGUpe2lmKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoU2hhZG93KXJldHVybiBudWxsO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldFJvb3ROb2RlKXt2YXIgbj1lLmdldFJvb3ROb2RlKCk7cmV0dXJuIG4gaW5zdGFuY2VvZiBTaGFkb3dSb290P246bnVsbH1yZXR1cm4gZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q/ZTplLnBhcmVudE5vZGU/dChlLnBhcmVudE5vZGUpOm51bGx9KHRoaXMuZWxlbWVudCksbz1udWxsPT09aT90aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnModGhpcy5lbGVtZW50KTppLmNvbnRhaW5zKHRoaXMuZWxlbWVudCk7aWYobi5kZWZhdWx0UHJldmVudGVkfHwhbylyZXR1cm47dmFyIHM9dGhpcy5nZXRUaXBFbGVtZW50KCkscj11KHRoaXMuY29uc3RydWN0b3IuTkFNRSk7cy5zZXRBdHRyaWJ1dGUoImlkIixyKSx0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IixyKSx0aGlzLnNldENvbnRlbnQoKSx0aGlzLmNvbmZpZy5hbmltYXRpb24mJnMuY2xhc3NMaXN0LmFkZCgiZmFkZSIpO3ZhciBhPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmNvbmZpZy5wbGFjZW1lbnQ/dGhpcy5jb25maWcucGxhY2VtZW50LmNhbGwodGhpcyxzLHRoaXMuZWxlbWVudCk6dGhpcy5jb25maWcucGxhY2VtZW50LGw9dGhpcy5fZ2V0QXR0YWNobWVudChhKTt0aGlzLl9hZGRBdHRhY2htZW50Q2xhc3MobCk7dmFyIGMsaD10aGlzLl9nZXRDb250YWluZXIoKTtpZihUKHMsdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSx0aGlzKSx0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnModGhpcy50aXApfHxoLmFwcGVuZENoaWxkKHMpLHEudHJpZ2dlcih0aGlzLmVsZW1lbnQsdGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5JTlNFUlRFRCksdGhpcy5fcG9wcGVyPW5ldyB0KHRoaXMuZWxlbWVudCxzLHRoaXMuX2dldFBvcHBlckNvbmZpZyhsKSkscy5jbGFzc0xpc3QuYWRkKCJzaG93IiksIm9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKGM9W10pLmNvbmNhdC5hcHBseShjLGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3Eub24odCwibW91c2VvdmVyIiwoZnVuY3Rpb24oKXt9KSl9KSk7dmFyIGY9ZnVuY3Rpb24oKXtlLmNvbmZpZy5hbmltYXRpb24mJmUuX2ZpeFRyYW5zaXRpb24oKTt2YXIgdD1lLl9ob3ZlclN0YXRlO2UuX2hvdmVyU3RhdGU9bnVsbCxxLnRyaWdnZXIoZS5lbGVtZW50LGUuY29uc3RydWN0b3IuRXZlbnQuU0hPV04pLCJvdXQiPT09dCYmZS5fbGVhdmUobnVsbCxlKX07aWYodGhpcy50aXAuY2xhc3NMaXN0LmNvbnRhaW5zKCJmYWRlIikpe3ZhciBkPWcodGhpcy50aXApO3Eub25lKHRoaXMudGlwLCJ0cmFuc2l0aW9uZW5kIixmKSxfKHRoaXMudGlwLGQpfWVsc2UgZigpfX0saS5oaWRlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuZ2V0VGlwRWxlbWVudCgpLG49ZnVuY3Rpb24oKXsic2hvdyIhPT10Ll9ob3ZlclN0YXRlJiZlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSx0Ll9jbGVhblRpcENsYXNzKCksdC5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIpLHEudHJpZ2dlcih0LmVsZW1lbnQsdC5jb25zdHJ1Y3Rvci5FdmVudC5ISURERU4pLHQuX3BvcHBlci5kZXN0cm95KCl9O2lmKCFxLnRyaWdnZXIodGhpcy5lbGVtZW50LHRoaXMuY29uc3RydWN0b3IuRXZlbnQuSElERSkuZGVmYXVsdFByZXZlbnRlZCl7dmFyIGk7aWYoZS5jbGFzc0xpc3QucmVtb3ZlKCJzaG93IiksIm9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKGk9W10pLmNvbmNhdC5hcHBseShpLGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBxLm9mZih0LCJtb3VzZW92ZXIiLHkpfSkpO2lmKHRoaXMuX2FjdGl2ZVRyaWdnZXIuY2xpY2s9ITEsdGhpcy5fYWN0aXZlVHJpZ2dlci5mb2N1cz0hMSx0aGlzLl9hY3RpdmVUcmlnZ2VyLmhvdmVyPSExLHRoaXMudGlwLmNsYXNzTGlzdC5jb250YWlucygiZmFkZSIpKXt2YXIgbz1nKGUpO3Eub25lKGUsInRyYW5zaXRpb25lbmQiLG4pLF8oZSxvKX1lbHNlIG4oKTt0aGlzLl9ob3ZlclN0YXRlPSIifX0saS51cGRhdGU9ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5fcG9wcGVyJiZ0aGlzLl9wb3BwZXIuc2NoZWR1bGVVcGRhdGUoKX0saS5pc1dpdGhDb250ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5nZXRUaXRsZSgpKX0saS5nZXRUaXBFbGVtZW50PWZ1bmN0aW9uKCl7aWYodGhpcy50aXApcmV0dXJuIHRoaXMudGlwO3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiB0LmlubmVySFRNTD10aGlzLmNvbmZpZy50ZW1wbGF0ZSx0aGlzLnRpcD10LmNoaWxkcmVuWzBdLHRoaXMudGlwfSxpLnNldENvbnRlbnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFRpcEVsZW1lbnQoKTt0aGlzLnNldEVsZW1lbnRDb250ZW50KG50LmZpbmRPbmUoIi50b29sdGlwLWlubmVyIix0KSx0aGlzLmdldFRpdGxlKCkpLHQuY2xhc3NMaXN0LnJlbW92ZSgiZmFkZSIsInNob3ciKX0saS5zZXRFbGVtZW50Q29udGVudD1mdW5jdGlvbih0LGUpe2lmKG51bGwhPT10KXJldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbShlKT8oZS5qcXVlcnkmJihlPWVbMF0pLHZvaWQodGhpcy5jb25maWcuaHRtbD9lLnBhcmVudE5vZGUhPT10JiYodC5pbm5lckhUTUw9IiIsdC5hcHBlbmRDaGlsZChlKSk6dC50ZXh0Q29udGVudD1lLnRleHRDb250ZW50KSk6dm9pZCh0aGlzLmNvbmZpZy5odG1sPyh0aGlzLmNvbmZpZy5zYW5pdGl6ZSYmKGU9anQoZSx0aGlzLmNvbmZpZy53aGl0ZUxpc3QsdGhpcy5jb25maWcuc2FuaXRpemVGbikpLHQuaW5uZXJIVE1MPWUpOnQudGV4dENvbnRlbnQ9ZSl9LGkuZ2V0VGl0bGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXRpdGxlIik7cmV0dXJuIHR8fCh0PSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmNvbmZpZy50aXRsZT90aGlzLmNvbmZpZy50aXRsZS5jYWxsKHRoaXMuZWxlbWVudCk6dGhpcy5jb25maWcudGl0bGUpLHR9LGkuX2dldFBvcHBlckNvbmZpZz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiBzKHMoe30se3BsYWNlbWVudDp0LG1vZGlmaWVyczp7b2Zmc2V0OnRoaXMuX2dldE9mZnNldCgpLGZsaXA6e2JlaGF2aW9yOnRoaXMuY29uZmlnLmZhbGxiYWNrUGxhY2VtZW50fSxhcnJvdzp7ZWxlbWVudDoiLiIrdGhpcy5jb25zdHJ1Y3Rvci5OQU1FKyItYXJyb3cifSxwcmV2ZW50T3ZlcmZsb3c6e2JvdW5kYXJpZXNFbGVtZW50OnRoaXMuY29uZmlnLmJvdW5kYXJ5fX0sb25DcmVhdGU6ZnVuY3Rpb24odCl7dC5vcmlnaW5hbFBsYWNlbWVudCE9PXQucGxhY2VtZW50JiZlLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UodCl9LG9uVXBkYXRlOmZ1bmN0aW9uKHQpe3JldHVybiBlLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UodCl9fSksdGhpcy5jb25maWcucG9wcGVyQ29uZmlnKX0saS5fYWRkQXR0YWNobWVudENsYXNzPWZ1bmN0aW9uKHQpe3RoaXMuZ2V0VGlwRWxlbWVudCgpLmNsYXNzTGlzdC5hZGQoImJzLXRvb2x0aXAtIit0KX0saS5fZ2V0T2Zmc2V0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXt9O3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmNvbmZpZy5vZmZzZXQ/ZS5mbj1mdW5jdGlvbihlKXtyZXR1cm4gZS5vZmZzZXRzPXMocyh7fSxlLm9mZnNldHMpLHQuY29uZmlnLm9mZnNldChlLm9mZnNldHMsdC5lbGVtZW50KXx8e30pLGV9OmUub2Zmc2V0PXRoaXMuY29uZmlnLm9mZnNldCxlfSxpLl9nZXRDb250YWluZXI9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuY29uZmlnLmNvbnRhaW5lcj9kb2N1bWVudC5ib2R5Om0odGhpcy5jb25maWcuY29udGFpbmVyKT90aGlzLmNvbmZpZy5jb250YWluZXI6bnQuZmluZE9uZSh0aGlzLmNvbmZpZy5jb250YWluZXIpfSxpLl9nZXRBdHRhY2htZW50PWZ1bmN0aW9uKHQpe3JldHVybiBCdFt0LnRvVXBwZXJDYXNlKCldfSxpLl9zZXRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuY29uZmlnLnRyaWdnZXIuc3BsaXQoIiAiKS5mb3JFYWNoKChmdW5jdGlvbihlKXtpZigiY2xpY2siPT09ZSlxLm9uKHQuZWxlbWVudCx0LmNvbnN0cnVjdG9yLkV2ZW50LkNMSUNLLHQuY29uZmlnLnNlbGVjdG9yLChmdW5jdGlvbihlKXtyZXR1cm4gdC50b2dnbGUoZSl9KSk7ZWxzZSBpZigibWFudWFsIiE9PWUpe3ZhciBuPSJob3ZlciI9PT1lP3QuY29uc3RydWN0b3IuRXZlbnQuTU9VU0VFTlRFUjp0LmNvbnN0cnVjdG9yLkV2ZW50LkZPQ1VTSU4saT0iaG92ZXIiPT09ZT90LmNvbnN0cnVjdG9yLkV2ZW50Lk1PVVNFTEVBVkU6dC5jb25zdHJ1Y3Rvci5FdmVudC5GT0NVU09VVDtxLm9uKHQuZWxlbWVudCxuLHQuY29uZmlnLnNlbGVjdG9yLChmdW5jdGlvbihlKXtyZXR1cm4gdC5fZW50ZXIoZSl9KSkscS5vbih0LmVsZW1lbnQsaSx0LmNvbmZpZy5zZWxlY3RvciwoZnVuY3Rpb24oZSl7cmV0dXJuIHQuX2xlYXZlKGUpfSkpfX0pKSx0aGlzLl9oaWRlTW9kYWxIYW5kbGVyPWZ1bmN0aW9uKCl7dC5lbGVtZW50JiZ0LmhpZGUoKX0scS5vbih0aGlzLmVsZW1lbnQuY2xvc2VzdCgiLm1vZGFsIiksImhpZGUuYnMubW9kYWwiLHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpLHRoaXMuY29uZmlnLnNlbGVjdG9yP3RoaXMuY29uZmlnPXMocyh7fSx0aGlzLmNvbmZpZykse30se3RyaWdnZXI6Im1hbnVhbCIsc2VsZWN0b3I6IiJ9KTp0aGlzLl9maXhUaXRsZSgpfSxpLl9maXhUaXRsZT1mdW5jdGlvbigpe3ZhciB0PXR5cGVvZiB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXRpdGxlIik7KHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoInRpdGxlIil8fCJzdHJpbmciIT09dCkmJih0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXRpdGxlIix0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpfHwiIiksdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgidGl0bGUiLCIiKSl9LGkuX2VudGVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTsoZT1lfHxMKHQudGFyZ2V0LG4pKXx8KGU9bmV3IHRoaXMuY29uc3RydWN0b3IodC50YXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSksVCh0LnRhcmdldCxuLGUpKSx0JiYoZS5fYWN0aXZlVHJpZ2dlclsiZm9jdXNpbiI9PT10LnR5cGU/ImZvY3VzIjoiaG92ZXIiXT0hMCksZS5nZXRUaXBFbGVtZW50KCkuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93Iil8fCJzaG93Ij09PWUuX2hvdmVyU3RhdGU/ZS5faG92ZXJTdGF0ZT0ic2hvdyI6KGNsZWFyVGltZW91dChlLl90aW1lb3V0KSxlLl9ob3ZlclN0YXRlPSJzaG93IixlLmNvbmZpZy5kZWxheSYmZS5jb25maWcuZGVsYXkuc2hvdz9lLl90aW1lb3V0PXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7InNob3ciPT09ZS5faG92ZXJTdGF0ZSYmZS5zaG93KCl9KSxlLmNvbmZpZy5kZWxheS5zaG93KTplLnNob3coKSl9LGkuX2xlYXZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTsoZT1lfHxMKHQudGFyZ2V0LG4pKXx8KGU9bmV3IHRoaXMuY29uc3RydWN0b3IodC50YXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSksVCh0LnRhcmdldCxuLGUpKSx0JiYoZS5fYWN0aXZlVHJpZ2dlclsiZm9jdXNvdXQiPT09dC50eXBlPyJmb2N1cyI6ImhvdmVyIl09ITEpLGUuX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKXx8KGNsZWFyVGltZW91dChlLl90aW1lb3V0KSxlLl9ob3ZlclN0YXRlPSJvdXQiLGUuY29uZmlnLmRlbGF5JiZlLmNvbmZpZy5kZWxheS5oaWRlP2UuX3RpbWVvdXQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXsib3V0Ij09PWUuX2hvdmVyU3RhdGUmJmUuaGlkZSgpfSksZS5jb25maWcuZGVsYXkuaGlkZSk6ZS5oaWRlKCkpfSxpLl9pc1dpdGhBY3RpdmVUcmlnZ2VyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX2FjdGl2ZVRyaWdnZXIpaWYodGhpcy5fYWN0aXZlVHJpZ2dlclt0XSlyZXR1cm4hMDtyZXR1cm4hMX0saS5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3ZhciBlPWV0LmdldERhdGFBdHRyaWJ1dGVzKHRoaXMuZWxlbWVudCk7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpey0xIT09UnQuaW5kZXhPZih0KSYmZGVsZXRlIGVbdF19KSksdCYmIm9iamVjdCI9PXR5cGVvZiB0LmNvbnRhaW5lciYmdC5jb250YWluZXIuanF1ZXJ5JiYodC5jb250YWluZXI9dC5jb250YWluZXJbMF0pLCJudW1iZXIiPT10eXBlb2YodD1zKHMocyh7fSx0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHQpLGUpLCJvYmplY3QiPT10eXBlb2YgdCYmdD90Ont9KSkuZGVsYXkmJih0LmRlbGF5PXtzaG93OnQuZGVsYXksaGlkZTp0LmRlbGF5fSksIm51bWJlciI9PXR5cGVvZiB0LnRpdGxlJiYodC50aXRsZT10LnRpdGxlLnRvU3RyaW5nKCkpLCJudW1iZXIiPT10eXBlb2YgdC5jb250ZW50JiYodC5jb250ZW50PXQuY29udGVudC50b1N0cmluZygpKSx2KFB0LHQsdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0VHlwZSksdC5zYW5pdGl6ZSYmKHQudGVtcGxhdGU9anQodC50ZW1wbGF0ZSx0LndoaXRlTGlzdCx0LnNhbml0aXplRm4pKSx0fSxpLl9nZXREZWxlZ2F0ZUNvbmZpZz1mdW5jdGlvbigpe3ZhciB0PXt9O2lmKHRoaXMuY29uZmlnKWZvcih2YXIgZSBpbiB0aGlzLmNvbmZpZyl0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRbZV0hPT10aGlzLmNvbmZpZ1tlXSYmKHRbZV09dGhpcy5jb25maWdbZV0pO3JldHVybiB0fSxpLl9jbGVhblRpcENsYXNzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRUaXBFbGVtZW50KCksZT10LmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5tYXRjaCh4dCk7bnVsbCE9PWUmJmUubGVuZ3RoPjAmJmUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCl9KSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuY2xhc3NMaXN0LnJlbW92ZShlKX0pKX0saS5faGFuZGxlUG9wcGVyUGxhY2VtZW50Q2hhbmdlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5zdGFuY2U7dGhpcy50aXA9ZS5wb3BwZXIsdGhpcy5fY2xlYW5UaXBDbGFzcygpLHRoaXMuX2FkZEF0dGFjaG1lbnRDbGFzcyh0aGlzLl9nZXRBdHRhY2htZW50KHQucGxhY2VtZW50KSl9LGkuX2ZpeFRyYW5zaXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFRpcEVsZW1lbnQoKSxlPXRoaXMuY29uZmlnLmFuaW1hdGlvbjtudWxsPT09dC5nZXRBdHRyaWJ1dGUoIngtcGxhY2VtZW50IikmJih0LmNsYXNzTGlzdC5yZW1vdmUoImZhZGUiKSx0aGlzLmNvbmZpZy5hbmltYXRpb249ITEsdGhpcy5oaWRlKCksdGhpcy5zaG93KCksdGhpcy5jb25maWcuYW5pbWF0aW9uPWUpfSxlLmpRdWVyeUludGVyZmFjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciBuPUwodGhpcywiYnMudG9vbHRpcCIpLGk9Im9iamVjdCI9PXR5cGVvZiB0JiZ0O2lmKChufHwhL2Rpc3Bvc2V8aGlkZS8udGVzdCh0KSkmJihufHwobj1uZXcgZSh0aGlzLGkpKSwic3RyaW5nIj09dHlwZW9mIHQpKXtpZih2b2lkIDA9PT1uW3RdKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJyt0KyciJyk7blt0XSgpfX0pKX0sZS5nZXRJbnN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gTCh0LCJicy50b29sdGlwIil9LG4oZSxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBNdH19LHtrZXk6Ik5BTUUiLGdldDpmdW5jdGlvbigpe3JldHVybiBQdH19LHtrZXk6IkRBVEFfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iYnMudG9vbHRpcCJ9fSx7a2V5OiJFdmVudCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF0fX0se2tleToiRVZFTlRfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iLmJzLnRvb2x0aXAifX0se2tleToiRGVmYXVsdFR5cGUiLGdldDpmdW5jdGlvbigpe3JldHVybiBIdH19XSksZX0oKSxGdD1FKCk7aWYoRnQpe3ZhciBXdD1GdC5mbltQdF07RnQuZm5bUHRdPVV0LmpRdWVyeUludGVyZmFjZSxGdC5mbltQdF0uQ29uc3RydWN0b3I9VXQsRnQuZm5bUHRdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gRnQuZm5bUHRdPVd0LFV0LmpRdWVyeUludGVyZmFjZX19dmFyIFZ0PSJwb3BvdmVyIixxdD1uZXcgUmVnRXhwKCIoXnxcXHMpYnMtcG9wb3ZlclxcUysiLCJnIiksenQ9cyhzKHt9LFV0LkRlZmF1bHQpLHt9LHtwbGFjZW1lbnQ6InJpZ2h0Iix0cmlnZ2VyOiJjbGljayIsY29udGVudDoiIix0ZW1wbGF0ZTonPGRpdiBjbGFzcz0icG9wb3ZlciIgcm9sZT0idG9vbHRpcCI+PGRpdiBjbGFzcz0icG9wb3Zlci1hcnJvdyI+PC9kaXY+PGgzIGNsYXNzPSJwb3BvdmVyLWhlYWRlciI+PC9oMz48ZGl2IGNsYXNzPSJwb3BvdmVyLWJvZHkiPjwvZGl2PjwvZGl2Pid9KSxLdD1zKHMoe30sVXQuRGVmYXVsdFR5cGUpLHt9LHtjb250ZW50OiIoc3RyaW5nfGVsZW1lbnR8ZnVuY3Rpb24pIn0pLFh0PXtISURFOiJoaWRlLmJzLnBvcG92ZXIiLEhJRERFTjoiaGlkZGVuLmJzLnBvcG92ZXIiLFNIT1c6InNob3cuYnMucG9wb3ZlciIsU0hPV046InNob3duLmJzLnBvcG92ZXIiLElOU0VSVEVEOiJpbnNlcnRlZC5icy5wb3BvdmVyIixDTElDSzoiY2xpY2suYnMucG9wb3ZlciIsRk9DVVNJTjoiZm9jdXNpbi5icy5wb3BvdmVyIixGT0NVU09VVDoiZm9jdXNvdXQuYnMucG9wb3ZlciIsTU9VU0VFTlRFUjoibW91c2VlbnRlci5icy5wb3BvdmVyIixNT1VTRUxFQVZFOiJtb3VzZWxlYXZlLmJzLnBvcG92ZXIifSxZdD1mdW5jdGlvbih0KXt2YXIgZSxpO2Z1bmN0aW9uIG8oKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9aT10LChlPW8pLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGkucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUuX19wcm90b19fPWk7dmFyIHM9by5wcm90b3R5cGU7cmV0dXJuIHMuaXNXaXRoQ29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRpdGxlKCl8fHRoaXMuX2dldENvbnRlbnQoKX0scy5zZXRDb250ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRUaXBFbGVtZW50KCk7dGhpcy5zZXRFbGVtZW50Q29udGVudChudC5maW5kT25lKCIucG9wb3Zlci1oZWFkZXIiLHQpLHRoaXMuZ2V0VGl0bGUoKSk7dmFyIGU9dGhpcy5fZ2V0Q29udGVudCgpOyJmdW5jdGlvbiI9PXR5cGVvZiBlJiYoZT1lLmNhbGwodGhpcy5lbGVtZW50KSksdGhpcy5zZXRFbGVtZW50Q29udGVudChudC5maW5kT25lKCIucG9wb3Zlci1ib2R5Iix0KSxlKSx0LmNsYXNzTGlzdC5yZW1vdmUoImZhZGUiLCJzaG93Iil9LHMuX2FkZEF0dGFjaG1lbnRDbGFzcz1mdW5jdGlvbih0KXt0aGlzLmdldFRpcEVsZW1lbnQoKS5jbGFzc0xpc3QuYWRkKCJicy1wb3BvdmVyLSIrdCl9LHMuX2dldENvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1jb250ZW50Iil8fHRoaXMuY29uZmlnLmNvbnRlbnR9LHMuX2NsZWFuVGlwQ2xhc3M9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFRpcEVsZW1lbnQoKSxlPXQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLm1hdGNoKHF0KTtudWxsIT09ZSYmZS5sZW5ndGg+MCYmZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0oKX0pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gdC5jbGFzc0xpc3QucmVtb3ZlKGUpfSkpfSxvLmpRdWVyeUludGVyZmFjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciBlPUwodGhpcywiYnMucG9wb3ZlciIpLG49Im9iamVjdCI9PXR5cGVvZiB0P3Q6bnVsbDtpZigoZXx8IS9kaXNwb3NlfGhpZGUvLnRlc3QodCkpJiYoZXx8KGU9bmV3IG8odGhpcyxuKSxUKHRoaXMsImJzLnBvcG92ZXIiLGUpKSwic3RyaW5nIj09dHlwZW9mIHQpKXtpZih2b2lkIDA9PT1lW3RdKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJyt0KyciJyk7ZVt0XSgpfX0pKX0sby5nZXRJbnN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gTCh0LCJicy5wb3BvdmVyIil9LG4obyxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiB6dH19LHtrZXk6Ik5BTUUiLGdldDpmdW5jdGlvbigpe3JldHVybiBWdH19LHtrZXk6IkRBVEFfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iYnMucG9wb3ZlciJ9fSx7a2V5OiJFdmVudCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFh0fX0se2tleToiRVZFTlRfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iLmJzLnBvcG92ZXIifX0se2tleToiRGVmYXVsdFR5cGUiLGdldDpmdW5jdGlvbigpe3JldHVybiBLdH19XSksb30oVXQpLCR0PUUoKTtpZigkdCl7dmFyIEd0PSR0LmZuW1Z0XTskdC5mbltWdF09WXQualF1ZXJ5SW50ZXJmYWNlLCR0LmZuW1Z0XS5Db25zdHJ1Y3Rvcj1ZdCwkdC5mbltWdF0ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiAkdC5mbltWdF09R3QsWXQualF1ZXJ5SW50ZXJmYWNlfX12YXIgWnQ9InNjcm9sbHNweSIsSnQ9e29mZnNldDoxMCxtZXRob2Q6ImF1dG8iLHRhcmdldDoiIn0sdGU9e29mZnNldDoibnVtYmVyIixtZXRob2Q6InN0cmluZyIsdGFyZ2V0OiIoc3RyaW5nfGVsZW1lbnQpIn0sZWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dmFyIG49dGhpczt0aGlzLl9lbGVtZW50PXQsdGhpcy5fc2Nyb2xsRWxlbWVudD0iQk9EWSI9PT10LnRhZ05hbWU/d2luZG93OnQsdGhpcy5fY29uZmlnPXRoaXMuX2dldENvbmZpZyhlKSx0aGlzLl9zZWxlY3Rvcj10aGlzLl9jb25maWcudGFyZ2V0KyIgLm5hdi1saW5rLCIrdGhpcy5fY29uZmlnLnRhcmdldCsiIC5saXN0LWdyb3VwLWl0ZW0sIit0aGlzLl9jb25maWcudGFyZ2V0KyIgLmRyb3Bkb3duLWl0ZW0iLHRoaXMuX29mZnNldHM9W10sdGhpcy5fdGFyZ2V0cz1bXSx0aGlzLl9hY3RpdmVUYXJnZXQ9bnVsbCx0aGlzLl9zY3JvbGxIZWlnaHQ9MCxxLm9uKHRoaXMuX3Njcm9sbEVsZW1lbnQsInNjcm9sbC5icy5zY3JvbGxzcHkiLChmdW5jdGlvbih0KXtyZXR1cm4gbi5fcHJvY2Vzcyh0KX0pKSx0aGlzLnJlZnJlc2goKSx0aGlzLl9wcm9jZXNzKCksVCh0LCJicy5zY3JvbGxzcHkiLHRoaXMpfXZhciBlPXQucHJvdG90eXBlO3JldHVybiBlLnJlZnJlc2g9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fc2Nyb2xsRWxlbWVudD09PXRoaXMuX3Njcm9sbEVsZW1lbnQud2luZG93PyJvZmZzZXQiOiJwb3NpdGlvbiIsbj0iYXV0byI9PT10aGlzLl9jb25maWcubWV0aG9kP2U6dGhpcy5fY29uZmlnLm1ldGhvZCxpPSJwb3NpdGlvbiI9PT1uP3RoaXMuX2dldFNjcm9sbFRvcCgpOjA7dGhpcy5fb2Zmc2V0cz1bXSx0aGlzLl90YXJnZXRzPVtdLHRoaXMuX3Njcm9sbEhlaWdodD10aGlzLl9nZXRTY3JvbGxIZWlnaHQoKSxudC5maW5kKHRoaXMuX3NlbGVjdG9yKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlLG89Zih0KTtpZihvJiYoZT1udC5maW5kT25lKG8pKSxlKXt2YXIgcz1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKHMud2lkdGh8fHMuaGVpZ2h0KXJldHVybltldFtuXShlKS50b3AraSxvXX1yZXR1cm4gbnVsbH0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF0tZVswXX0pKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0Ll9vZmZzZXRzLnB1c2goZVswXSksdC5fdGFyZ2V0cy5wdXNoKGVbMV0pfSkpfSxlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtDKHRoaXMuX2VsZW1lbnQsImJzLnNjcm9sbHNweSIpLHEub2ZmKHRoaXMuX3Njcm9sbEVsZW1lbnQsIi5icy5zY3JvbGxzcHkiKSx0aGlzLl9lbGVtZW50PW51bGwsdGhpcy5fc2Nyb2xsRWxlbWVudD1udWxsLHRoaXMuX2NvbmZpZz1udWxsLHRoaXMuX3NlbGVjdG9yPW51bGwsdGhpcy5fb2Zmc2V0cz1udWxsLHRoaXMuX3RhcmdldHM9bnVsbCx0aGlzLl9hY3RpdmVUYXJnZXQ9bnVsbCx0aGlzLl9zY3JvbGxIZWlnaHQ9bnVsbH0sZS5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciIT10eXBlb2YodD1zKHMoe30sSnQpLCJvYmplY3QiPT10eXBlb2YgdCYmdD90Ont9KSkudGFyZ2V0JiZtKHQudGFyZ2V0KSl7dmFyIGU9dC50YXJnZXQuaWQ7ZXx8KGU9dShadCksdC50YXJnZXQuaWQ9ZSksdC50YXJnZXQ9IiMiK2V9cmV0dXJuIHYoWnQsdCx0ZSksdH0sZS5fZ2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQ9PT13aW5kb3c/dGhpcy5fc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldDp0aGlzLl9zY3JvbGxFbGVtZW50LnNjcm9sbFRvcH0sZS5fZ2V0U2Nyb2xsSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQuc2Nyb2xsSGVpZ2h0fHxNYXRoLm1heChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0KX0sZS5fZ2V0T2Zmc2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQ9PT13aW5kb3c/d2luZG93LmlubmVySGVpZ2h0OnRoaXMuX3Njcm9sbEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0fSxlLl9wcm9jZXNzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0U2Nyb2xsVG9wKCkrdGhpcy5fY29uZmlnLm9mZnNldCxlPXRoaXMuX2dldFNjcm9sbEhlaWdodCgpLG49dGhpcy5fY29uZmlnLm9mZnNldCtlLXRoaXMuX2dldE9mZnNldEhlaWdodCgpO2lmKHRoaXMuX3Njcm9sbEhlaWdodCE9PWUmJnRoaXMucmVmcmVzaCgpLHQ+PW4pe3ZhciBpPXRoaXMuX3RhcmdldHNbdGhpcy5fdGFyZ2V0cy5sZW5ndGgtMV07dGhpcy5fYWN0aXZlVGFyZ2V0IT09aSYmdGhpcy5fYWN0aXZhdGUoaSl9ZWxzZXtpZih0aGlzLl9hY3RpdmVUYXJnZXQmJnQ8dGhpcy5fb2Zmc2V0c1swXSYmdGhpcy5fb2Zmc2V0c1swXT4wKXJldHVybiB0aGlzLl9hY3RpdmVUYXJnZXQ9bnVsbCx2b2lkIHRoaXMuX2NsZWFyKCk7Zm9yKHZhciBvPXRoaXMuX29mZnNldHMubGVuZ3RoO28tLTspe3RoaXMuX2FjdGl2ZVRhcmdldCE9PXRoaXMuX3RhcmdldHNbb10mJnQ+PXRoaXMuX29mZnNldHNbb10mJih2b2lkIDA9PT10aGlzLl9vZmZzZXRzW28rMV18fHQ8dGhpcy5fb2Zmc2V0c1tvKzFdKSYmdGhpcy5fYWN0aXZhdGUodGhpcy5fdGFyZ2V0c1tvXSl9fX0sZS5fYWN0aXZhdGU9ZnVuY3Rpb24odCl7dGhpcy5fYWN0aXZlVGFyZ2V0PXQsdGhpcy5fY2xlYXIoKTt2YXIgZT10aGlzLl9zZWxlY3Rvci5zcGxpdCgiLCIpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUrJ1tkYXRhLXRhcmdldD0iJyt0KyciXSwnK2UrJ1tocmVmPSInK3QrJyJdJ30pKSxuPW50LmZpbmRPbmUoZS5qb2luKCIsIikpO24uY2xhc3NMaXN0LmNvbnRhaW5zKCJkcm9wZG93bi1pdGVtIik/KG50LmZpbmRPbmUoIi5kcm9wZG93bi10b2dnbGUiLG4uY2xvc2VzdCgiLmRyb3Bkb3duIikpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpLG4uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikpOihuLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpLG50LnBhcmVudHMobiwiLm5hdiwgLmxpc3QtZ3JvdXAiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtudC5wcmV2KHQsIi5uYXYtbGluaywgLmxpc3QtZ3JvdXAtaXRlbSIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpfSkpLG50LnByZXYodCwiLm5hdi1pdGVtIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7bnQuY2hpbGRyZW4odCwiLm5hdi1saW5rIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIil9KSl9KSl9KSkpLHEudHJpZ2dlcih0aGlzLl9zY3JvbGxFbGVtZW50LCJhY3RpdmF0ZS5icy5zY3JvbGxzcHkiLHtyZWxhdGVkVGFyZ2V0OnR9KX0sZS5fY2xlYXI9ZnVuY3Rpb24oKXtudC5maW5kKHRoaXMuX3NlbGVjdG9yKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucygiYWN0aXZlIil9KSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIil9KSl9LHQualF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49TCh0aGlzLCJicy5zY3JvbGxzcHkiKTtpZihufHwobj1uZXcgdCh0aGlzLCJvYmplY3QiPT10eXBlb2YgZSYmZSkpLCJzdHJpbmciPT10eXBlb2YgZSl7aWYodm9pZCAwPT09bltlXSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrZSsnIicpO25bZV0oKX19KSl9LHQuZ2V0SW5zdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIEwodCwiYnMuc2Nyb2xsc3B5Iil9LG4odCxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBKdH19XSksdH0oKTtxLm9uKHdpbmRvdywibG9hZC5icy5zY3JvbGxzcHkuZGF0YS1hcGkiLChmdW5jdGlvbigpe250LmZpbmQoJ1tkYXRhLXNweT0ic2Nyb2xsIl0nKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGVlKHQsZXQuZ2V0RGF0YUF0dHJpYnV0ZXModCkpfSkpfSkpO3ZhciBuZT1FKCk7aWYobmUpe3ZhciBpZT1uZS5mbltadF07bmUuZm5bWnRdPWVlLmpRdWVyeUludGVyZmFjZSxuZS5mbltadF0uQ29uc3RydWN0b3I9ZWUsbmUuZm5bWnRdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbmUuZm5bWnRdPWllLGVlLmpRdWVyeUludGVyZmFjZX19dmFyIG9lPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9lbGVtZW50PXQsVCh0aGlzLl9lbGVtZW50LCJicy50YWIiLHRoaXMpfXZhciBlPXQucHJvdG90eXBlO3JldHVybiBlLnNob3c9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKCEodGhpcy5fZWxlbWVudC5wYXJlbnROb2RlJiZ0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoImFjdGl2ZSIpfHx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygiZGlzYWJsZWQiKSkpe3ZhciBlLG49ZCh0aGlzLl9lbGVtZW50KSxpPXRoaXMuX2VsZW1lbnQuY2xvc2VzdCgiLm5hdiwgLmxpc3QtZ3JvdXAiKTtpZihpKXt2YXIgbz0iVUwiPT09aS5ub2RlTmFtZXx8Ik9MIj09PWkubm9kZU5hbWU/IjpzY29wZSA+IGxpID4gLmFjdGl2ZSI6Ii5hY3RpdmUiO2U9KGU9bnQuZmluZChvLGkpKVtlLmxlbmd0aC0xXX12YXIgcz1udWxsO2lmKGUmJihzPXEudHJpZ2dlcihlLCJoaWRlLmJzLnRhYiIse3JlbGF0ZWRUYXJnZXQ6dGhpcy5fZWxlbWVudH0pKSwhKHEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJzaG93LmJzLnRhYiIse3JlbGF0ZWRUYXJnZXQ6ZX0pLmRlZmF1bHRQcmV2ZW50ZWR8fG51bGwhPT1zJiZzLmRlZmF1bHRQcmV2ZW50ZWQpKXt0aGlzLl9hY3RpdmF0ZSh0aGlzLl9lbGVtZW50LGkpO3ZhciByPWZ1bmN0aW9uKCl7cS50cmlnZ2VyKGUsImhpZGRlbi5icy50YWIiLHtyZWxhdGVkVGFyZ2V0OnQuX2VsZW1lbnR9KSxxLnRyaWdnZXIodC5fZWxlbWVudCwic2hvd24uYnMudGFiIix7cmVsYXRlZFRhcmdldDplfSl9O24/dGhpcy5fYWN0aXZhdGUobixuLnBhcmVudE5vZGUscik6cigpfX19LGUuZGlzcG9zZT1mdW5jdGlvbigpe0ModGhpcy5fZWxlbWVudCwiYnMudGFiIiksdGhpcy5fZWxlbWVudD1udWxsfSxlLl9hY3RpdmF0ZT1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcyxvPSghZXx8IlVMIiE9PWUubm9kZU5hbWUmJiJPTCIhPT1lLm5vZGVOYW1lP250LmNoaWxkcmVuKGUsIi5hY3RpdmUiKTpudC5maW5kKCI6c2NvcGUgPiBsaSA+IC5hY3RpdmUiLGUpKVswXSxzPW4mJm8mJm8uY2xhc3NMaXN0LmNvbnRhaW5zKCJmYWRlIikscj1mdW5jdGlvbigpe3JldHVybiBpLl90cmFuc2l0aW9uQ29tcGxldGUodCxvLG4pfTtpZihvJiZzKXt2YXIgYT1nKG8pO28uY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLHEub25lKG8sInRyYW5zaXRpb25lbmQiLHIpLF8obyxhKX1lbHNlIHIoKX0sZS5fdHJhbnNpdGlvbkNvbXBsZXRlPWZ1bmN0aW9uKHQsZSxuKXtpZihlKXtlLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpO3ZhciBpPW50LmZpbmRPbmUoIjpzY29wZSA+IC5kcm9wZG93bi1tZW51IC5hY3RpdmUiLGUucGFyZW50Tm9kZSk7aSYmaS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSwidGFiIj09PWUuZ2V0QXR0cmlidXRlKCJyb2xlIikmJmUuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwhMSl9KHQuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIiksInRhYiI9PT10LmdldEF0dHJpYnV0ZSgicm9sZSIpJiZ0LnNldEF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIsITApLHcodCksdC5jbGFzc0xpc3QuY29udGFpbnMoImZhZGUiKSYmdC5jbGFzc0xpc3QuYWRkKCJzaG93IiksdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJkcm9wZG93bi1tZW51IikpJiYodC5jbG9zZXN0KCIuZHJvcGRvd24iKSYmbnQuZmluZCgiLmRyb3Bkb3duLXRvZ2dsZSIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpfSkpLHQuc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIiwhMCkpO24mJm4oKX0sdC5qUXVlcnlJbnRlcmZhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXt2YXIgbj1MKHRoaXMsImJzLnRhYiIpfHxuZXcgdCh0aGlzKTtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKHZvaWQgMD09PW5bZV0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK2UrJyInKTtuW2VdKCl9fSkpfSx0LmdldEluc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBMKHQsImJzLnRhYiIpfSxuKHQsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjUuMC4wLWFscGhhMSJ9fV0pLHR9KCk7cS5vbihkb2N1bWVudCwiY2xpY2suYnMudGFiLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJ0YWIiXSwgW2RhdGEtdG9nZ2xlPSJwaWxsIl0sIFtkYXRhLXRvZ2dsZT0ibGlzdCJdJywoZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLChMKHRoaXMsImJzLnRhYiIpfHxuZXcgb2UodGhpcykpLnNob3coKX0pKTt2YXIgc2U9RSgpO2lmKHNlKXt2YXIgcmU9c2UuZm4udGFiO3NlLmZuLnRhYj1vZS5qUXVlcnlJbnRlcmZhY2Usc2UuZm4udGFiLkNvbnN0cnVjdG9yPW9lLHNlLmZuLnRhYi5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHNlLmZuLnRhYj1yZSxvZS5qUXVlcnlJbnRlcmZhY2V9fXZhciBhZT17YW5pbWF0aW9uOiJib29sZWFuIixhdXRvaGlkZToiYm9vbGVhbiIsZGVsYXk6Im51bWJlciJ9LGxlPXthbmltYXRpb246ITAsYXV0b2hpZGU6ITAsZGVsYXk6NTAwfSxjZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl9lbGVtZW50PXQsdGhpcy5fY29uZmlnPXRoaXMuX2dldENvbmZpZyhlKSx0aGlzLl90aW1lb3V0PW51bGwsdGhpcy5fc2V0TGlzdGVuZXJzKCksVCh0LCJicy50b2FzdCIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUuc2hvdz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJzaG93LmJzLnRvYXN0IikuZGVmYXVsdFByZXZlbnRlZCl7dGhpcy5fY29uZmlnLmFuaW1hdGlvbiYmdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJmYWRlIik7dmFyIGU9ZnVuY3Rpb24oKXt0Ll9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoInNob3dpbmciKSx0Ll9lbGVtZW50LmNsYXNzTGlzdC5hZGQoInNob3ciKSxxLnRyaWdnZXIodC5fZWxlbWVudCwic2hvd24uYnMudG9hc3QiKSx0Ll9jb25maWcuYXV0b2hpZGUmJih0Ll90aW1lb3V0PXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5oaWRlKCl9KSx0Ll9jb25maWcuZGVsYXkpKX07aWYodGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJoaWRlIiksdyh0aGlzLl9lbGVtZW50KSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoInNob3dpbmciKSx0aGlzLl9jb25maWcuYW5pbWF0aW9uKXt2YXIgbj1nKHRoaXMuX2VsZW1lbnQpO3Eub25lKHRoaXMuX2VsZW1lbnQsInRyYW5zaXRpb25lbmQiLGUpLF8odGhpcy5fZWxlbWVudCxuKX1lbHNlIGUoKX19LGUuaGlkZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYodGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSYmIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJoaWRlLmJzLnRvYXN0IikuZGVmYXVsdFByZXZlbnRlZCl7dmFyIGU9ZnVuY3Rpb24oKXt0Ll9lbGVtZW50LmNsYXNzTGlzdC5hZGQoImhpZGUiKSxxLnRyaWdnZXIodC5fZWxlbWVudCwiaGlkZGVuLmJzLnRvYXN0Iil9O2lmKHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLHRoaXMuX2NvbmZpZy5hbmltYXRpb24pe3ZhciBuPWcodGhpcy5fZWxlbWVudCk7cS5vbmUodGhpcy5fZWxlbWVudCwidHJhbnNpdGlvbmVuZCIsZSksXyh0aGlzLl9lbGVtZW50LG4pfWVsc2UgZSgpfX0sZS5kaXNwb3NlPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpLHRoaXMuX3RpbWVvdXQ9bnVsbCx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpJiZ0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoInNob3ciKSxxLm9mZih0aGlzLl9lbGVtZW50LCJjbGljay5kaXNtaXNzLmJzLnRvYXN0IiksQyh0aGlzLl9lbGVtZW50LCJicy50b2FzdCIpLHRoaXMuX2VsZW1lbnQ9bnVsbCx0aGlzLl9jb25maWc9bnVsbH0sZS5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiB0PXMocyhzKHt9LGxlKSxldC5nZXREYXRhQXR0cmlidXRlcyh0aGlzLl9lbGVtZW50KSksIm9iamVjdCI9PXR5cGVvZiB0JiZ0P3Q6e30pLHYoInRvYXN0Iix0LHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpLHR9LGUuX3NldExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cS5vbih0aGlzLl9lbGVtZW50LCJjbGljay5kaXNtaXNzLmJzLnRvYXN0IiwnW2RhdGEtZGlzbWlzcz0idG9hc3QiXScsKGZ1bmN0aW9uKCl7cmV0dXJuIHQuaGlkZSgpfSkpfSx0LmpRdWVyeUludGVyZmFjZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciBuPUwodGhpcywiYnMudG9hc3QiKTtpZihufHwobj1uZXcgdCh0aGlzLCJvYmplY3QiPT10eXBlb2YgZSYmZSkpLCJzdHJpbmciPT10eXBlb2YgZSl7aWYodm9pZCAwPT09bltlXSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrZSsnIicpO25bZV0odGhpcyl9fSkpfSx0LmdldEluc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBMKHQsImJzLnRvYXN0Iil9LG4odCxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHRUeXBlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYWV9fSx7a2V5OiJEZWZhdWx0IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbGV9fV0pLHR9KCksdWU9RSgpO2lmKHVlKXt2YXIgaGU9dWUuZm4udG9hc3Q7dWUuZm4udG9hc3Q9Y2UualF1ZXJ5SW50ZXJmYWNlLHVlLmZuLnRvYXN0LkNvbnN0cnVjdG9yPWNlLHVlLmZuLnRvYXN0Lm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdWUuZm4udG9hc3Q9aGUsY2UualF1ZXJ5SW50ZXJmYWNlfX1yZXR1cm57QWxlcnQ6SyxCdXR0b246JCxDYXJvdXNlbDpsdCxDb2xsYXBzZTpndCxEcm9wZG93bjp3dCxNb2RhbDpDdCxQb3BvdmVyOll0LFNjcm9sbFNweTplZSxUYWI6b2UsVG9hc3Q6Y2UsVG9vbHRpcDpVdH19KSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvb3RzdHJhcC5taW4uanMubWFw")

	tmpls["js/content.js"] = tostring("Ly8gU2V0dXAgaW5wdXRzIGZvciBjb250ZW50IGNyZWF0ZS91cGRhdGUuCihmdW5jdGlvbigpIHsgCgogIC8vIFNhdmUgYnV0dG9uIAogIHZhciBzYXZlQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdmFsdWU9U2F2ZV0nKQogIGZvciAodmFyIGkgPSAwOyBpIDwgc2F2ZUJ0bi5sZW5ndGg7IGkrKykgeyAKICAgIChmdW5jdGlvbihpLCBzYXZlQnRuKSB7IAogICAgICBzYXZlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gY29udGVudFVwZGF0ZShlKSB7IAogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCkKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb3JtW2FjdGlvbj0iL2NvbnRlbnQiXScpLnN1Ym1pdCgpCiAgICAgIH0pCiAgICB9KShpLCBzYXZlQnRuW2ldKTsKICB9CgogIC8vIEhUTUwKICB0aW55bWNlLmluaXQoeyAKICAgIGVuZF9jb250YWluZXJfb25fZW1wdHlfYmxvY2s6IHRydWUsCiAgICByZWxhdGl2ZV91cmxzOiBmYWxzZSwKICAgIGNvbnZlcnRfdXJsczogZmFsc2UsCiAgICByZW1vdmVfc2NyaXB0X2hvc3Q6IGZhbHNlLAogICAgYWxsb3dfc2NyaXB0X3VybHM6IHRydWUsCiAgICBicm93c2VyX3NwZWxsY2hlY2s6IHRydWUsCiAgICBmb3JjZWRfcm9vdF9ibG9jazogZmFsc2UsCiAgICBicmFuZGluZzogZmFsc2UsCiAgICBkcmFnZ2FibGVfbW9kYWw6IHRydWUsCiAgICBtb2JpbGU6IHsgbWVudWJhcjogdHJ1ZSB9LAogICAgc3RhdHVzYmFyOiBmYWxzZSwKICAgIHNlbGVjdG9yOiAndGV4dGFyZWEuaW5wdXQtaHRtbCcsCiAgICBwbHVnaW5zOiAiYXV0b3Jlc2l6ZSxjb2RlIiwKICAgIGNvbnRlbnRfY3NzOiAiL3N0YXRpYy9jc3MvdGlueW1jZS5jc3MiLAogICAgc2V0dXA6IGZ1bmN0aW9uKGl0ZW0pIHsgCiAgICAgIGl0ZW0ub24oJ2NoYW5nZScsIGZ1bmN0aW9uKCkgeyAKICAgICAgICBpdGVtLnRhcmdldEVsbS52YWx1ZSA9IGl0ZW0uZ2V0Q29udGVudCgpCiAgICAgIH0pCiAgICB9CiAgfSkKCiAgLy8gTUFSS0RPV04KICB0aW55bWNlLmluaXQoewogICAgZW5kX2NvbnRhaW5lcl9vbl9lbXB0eV9ibG9jazogdHJ1ZSwKICAgIHJlbGF0aXZlX3VybHM6IGZhbHNlLAogICAgY29udmVydF91cmxzOiBmYWxzZSwKICAgIHJlbW92ZV9zY3JpcHRfaG9zdDogZmFsc2UsCiAgICBhbGxvd19zY3JpcHRfdXJsczogdHJ1ZSwKICAgIGJyb3dzZXJfc3BlbGxjaGVjazogdHJ1ZSwKICAgIGZvcmNlZF9yb290X2Jsb2NrOiBmYWxzZSwKICAgIGJyYW5kaW5nOiBmYWxzZSwKICAgIGRyYWdnYWJsZV9tb2RhbDogdHJ1ZSwKICAgIG1vYmlsZTogeyBtZW51YmFyOiB0cnVlIH0sCiAgICBzdGF0dXNiYXI6IGZhbHNlLAogICAgc2VsZWN0b3I6ICJ0ZXh0YXJlYS5pbnB1dC1tYXJrZG93biIsCiAgICBwbHVnaW46ICdhdXRvcmVzaXplLHRleHRwYXR0ZXJuJywKICAgIGV4dGVybmFsX3BsdWdpbnM6IHsgCiAgICAgIHRleHRwYXR0ZXJuOiAnLy91bnBrZy5jb20vdGlueW1jZUA1LjIuMC9wbHVnaW5zL3RleHRwYXR0ZXJuL3BsdWdpbi5taW4uanMnCiAgICB9LAogICAgbWVudWJhcjogZmFsc2UsCiAgICB0b29sYmFyOiAndW5kbyByZWRvJywKICAgIGNvbnRlbnRfY3NzOiAiL3N0YXRpYy90aW55bWNlLmNzcyIsCiAgICB0ZXh0cGF0dGVybl9wYXR0ZXJuczogWwogICAgICB7c3RhcnQ6ICcqJywgZW5kOiAnKicsIGZvcm1hdDogJ2l0YWxpYyd9LAogICAgICB7c3RhcnQ6ICcqKicsIGVuZDogJyoqJywgZm9ybWF0OiAnYm9sZCd9LAogICAgICB7c3RhcnQ6ICdfJywgZW5kOiAnXycsIGZvcm1hdDogJ2JvbGQnfSwKICAgICAge3N0YXJ0OiAnIycsIGZvcm1hdDogJ2gxJ30sCiAgICAgIHtzdGFydDogJyMjJywgZm9ybWF0OiAnaDInfSwKICAgICAge3N0YXJ0OiAnIyMjJywgZm9ybWF0OiAnaDMnfSwKICAgICAge3N0YXJ0OiAnIyMjIycsIGZvcm1hdDogJ2g0J30sCiAgICAgIHtzdGFydDogJyMjIyMjJywgZm9ybWF0OiAnaDUnfSwKICAgICAge3N0YXJ0OiAnIyMjIyMjJywgZm9ybWF0OiAnaDYnfSwKICAgICAge3N0YXJ0OiAnMS4gJywgY21kOiAnSW5zZXJ0T3JkZXJlZExpc3QnfSwKICAgICAge3N0YXJ0OiAnKiAnLCBjbWQ6ICdJbnNlcnRVbm9yZGVyZWRMaXN0J30sCiAgICAgIHtzdGFydDogJy0gJywgY21kOiAnSW5zZXJ0VW5vcmRlcmVkTGlzdCd9CiAgICBdLAogICAgc2V0dXA6IGZ1bmN0aW9uKGl0ZW0pIHsgCiAgICAgIGl0ZW0ub24oJ2NoYW5nZScsIGZ1bmN0aW9uKCkgeyAKICAgICAgICBpdGVtLnRhcmdldEVsbS52YWx1ZSA9IGl0ZW0uZ2V0Q29udGVudCgpCiAgICAgIH0pCiAgICB9CiAgfSk7CgogIC8vIFJFRkVSRU5DRSAvIFJFRkVSRU5DRSBMSVNUCiAgdmFyIHJlZnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmVmLW1vZGFsJykKICBmb3IgKHZhciBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsgCiAgICB2YXIgcmVmICAgICA9IHJlZnNbaV07CiAgICB2YXIgaW5wdXRzICA9IHJlZi5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpOwogICAgdmFyIG91dHB1dCAgPSBpbnB1dHNbMF07CiAgICB2YXIgYnRuICAgICA9IGlucHV0c1sxXTsKICAgIHZhciBpbnB1dENUID0gaW5wdXRzWzJdOwogICAgdmFyIGlucHV0QyAgPSBpbnB1dHNbM107CiAgICB2YXIgbW9kYWwgICA9IHJlZi5xdWVyeVNlbGVjdG9yKCcubW9kYWwnKTsKICAgIHZhciBjbGVhciAgID0gcmVmLnF1ZXJ5U2VsZWN0b3IoJy5idG4tY2xlYXInKTsKCiAgICAoZnVuY3Rpb24ocmVmLCBvdXRwdXQsIGJ0biwgY29udGVudHR5cGUsIGNvbnRlbnQsIG1vZGFsKSB7CiAgICAgIHZhciBhdXRvQ1QgPSB7YXV0b2NvbXBsZXRlOntkZXN0cm95OmZ1bmN0aW9uKCl7fX19OwogICAgICB2YXIgYXV0b0MgPSB7YXV0b2NvbXBsZXRlOntkZXN0cm95OmZ1bmN0aW9uKCl7fX19OwogICAgICB2YXIgaXNMaXN0ID0gcmVmLmNsYXNzTmFtZS5pbmRleE9mKCdyZWYtbGlzdCcpICE9IC0xOwoKICAgICAgdmFyIGNob3NlbkNvbnRlbnRUeXBlSUQ7ICAgICAvLyB1c2VkIGJ5IGJvdGgKICAgICAgdmFyIGNob3NlbkNvbnRlbnRJRHMgPSBbXTsgICAvLyBvbmx5IHVzZWQgYmUgcmVmIGxpc3QKICAgICAgdmFyIGNob3NlbkNvbnRlbnROYW1lcyA9IFtdOyAvLyBvbmx5IHVzZWQgYmUgcmVmIGxpc3QKCiAgICAgIC8vICpTaHV0dGVycyoKICAgICAge3tpZiAuQ29udGVudH19CiAgICAgICAge3tyYW5nZSAka2V5LCAkdmFsIDo9IC5Db250ZW50LlZhbHVlc319CiAgICAgICAgICB7e2lmIGVxICR2YWwuVHlwZSAiUmVmZXJlbmNlTGlzdCJ9fQogICAgICAgICAgICB7e3JhbmdlICRrZXksICR2YWwgOj0gJHZhbC5GaWVsZFJlZmVyZW5jZUxpc3R9fQogICAgICAgICAgICAgIGNob3NlbkNvbnRlbnRJRHMucHVzaCh7eyR2YWwuQ29udGVudElEfX0pOwogICAgICAgICAgICAgIHt7cmFuZ2UgJGtleSwgJHZhbCA6PSAkdmFsLkNvbnRlbnRWYWx1ZXN9fQogICAgICAgICAgICAgICAge3tpZiBlcSAkdmFsLkZpZWxkTmFtZSAibmFtZSJ9fQogICAgICAgICAgICAgICAgICBjaG9zZW5Db250ZW50TmFtZXMucHVzaCh7ey5GaWVsZFZhbHVlfX0pOwogICAgICAgICAgICAgICAge3tlbmR9fQogICAgICAgICAgICAgIHt7ZW5kfX0KICAgICAgICAgICAge3tlbmR9fQogICAgICAgICAge3tlbmR9fQogICAgICAgIHt7ZW5kfX0KICAgICAge3tlbmR9fQoKICAgICAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignc2hvd24uYnMubW9kYWwnLCBmdW5jdGlvbigpIHsgCiAgICAgICAgdmFyIG9wdHMgPSB7CiAgICAgICAgICBhdXRvc2VsZWN0OiB0cnVlLAogICAgICAgICAgYXV0b3NlbGVjdE9uQmx1cjogdHJ1ZSwgCiAgICAgICAgICB0YWJBdXRvY29tcGxldGU6IHRydWUsCiAgICAgICAgICAvLyBjbGVhck9uU2VsZWN0ZWQ6IHRydWUsCiAgICAgICAgICBoaW50OiBmYWxzZSwKICAgICAgICAgIC8vIGRlYnVnOiB0cnVlCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBnZXRvcHRzKHVybCwgdHJhbnNmb3JtLCBkaXNwbGF5S2V5KSB7IAogICAgICAgICAgdmFyIGNvbnRlbnR0eXBlQWJvcnQgPSBmdW5jdGlvbigpIHt9CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBkaXNwbGF5S2V5OiBkaXNwbGF5S2V5LAogICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uKHF1ZXJ5LCBjYikgeyAKICAgICAgICAgICAgICBjYihbXSkKICAgICAgICAgICAgICBjb250ZW50dHlwZUFib3J0KCkKICAgICAgICAgICAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCkKICAgICAgICAgICAgICBjb250ZW50dHlwZUFib3J0ID0gZnVuY3Rpb24oKSB7IHJlcS5hYm9ydCgpIH0gCiAgICAgICAgICAgICAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSAhPSA0KSB7CiAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyAhPSAyMDApIHsKICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVzcG9uc2VUZXh0ICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgYWxlcnQodGhpcy5yZXNwb25zZVRleHQpCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgY2IoW10pCiAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRyeSB7IAogICAgICAgICAgICAgICAgICBjYih0cmFuc2Zvcm0oSlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCkpKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2goZSkgeyAKICAgICAgICAgICAgICAgICAgdmFyIG1zZyA9IGUudG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICBpZiAobXNnICE9ICIiKSB7IC8vIENhbmNlbGxlZCByZXF1ZXN0cyBoaXQgdGhpcy4KICAgICAgICAgICAgICAgICAgICBhbGVydChtc2cpCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHVybCgpICsgcXVlcnksIHRydWUpCiAgICAgICAgICAgICAgcmVxLnNlbmQoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgY29udGVudHR5cGVPcHRzID0gZ2V0b3B0cygKICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gJy9jb250ZW50dHlwZS9zZWFyY2g/c3BhY2U9e3sgLlNwYWNlLklEIH19JnF1ZXJ5PSc7IH0sIAogICAgICAgICAgZnVuY3Rpb24oZGF0YSkgeyByZXR1cm4gZGF0YS5Db250ZW50VHlwZUxpc3QgfSwKICAgICAgICAgICdDb250ZW50VHlwZU5hbWUnCiAgICAgICAgKQoKICAgICAgICBhdXRvQ1QgPSB3aW5kb3cuYXV0b2NvbXBsZXRlKGNvbnRlbnR0eXBlLCBvcHRzLCBbY29udGVudHR5cGVPcHRzXSkub24oJ2F1dG9jb21wbGV0ZTpzZWxlY3RlZCcsIG9uQ29udGVudFR5cGVTZWxlY3RlZCkKICAgICAgICBmdW5jdGlvbiBvbkNvbnRlbnRUeXBlU2VsZWN0ZWQoZSwgaXRlbSwgZGF0YXNldCwgY3R4KSB7CiAgICAgICAgICBjaG9zZW5Db250ZW50VHlwZUlEID0gaXRlbS5Db250ZW50VHlwZUlECiAgICAgICAgICBjb250ZW50LmRpc2FibGVkID0gZmFsc2UKICAgICAgICAgIGNvbnRlbnQuZm9jdXMoKQogICAgICAgIH0KCiAgICAgICAgdmFyIGNvbnRlbnRPcHRzID0gZ2V0b3B0cygKICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gJy9jb250ZW50L3NlYXJjaD9zcGFjZT17eyAuU3BhY2UuSUQgfX0mY29udGVudHR5cGU9JyArIGNob3NlbkNvbnRlbnRUeXBlSUQgKyAnJnF1ZXJ5PSc7IH0sIAogICAgICAgICAgZnVuY3Rpb24oZGF0YSkgeyAKICAgICAgICAgICAgLy8gQmlnIGhhY2suCiAgICAgICAgICAgIGRhdGEgPSBkYXRhID8gZGF0YS5Db250ZW50TGlzdCA6IFtdCgogICAgICAgICAgICAvLyBUT0RPOiBSZW1vdmUgY3VycmVudCBjb250ZW50IGZyb20gbGlzdCBpZiBhdmFpbGFibGUuIFRoaXMgCiAgICAgICAgICAgIC8vIHNob3VsZCBiZSBkb25lIG9uIHRoZSBzZXJ2ZXIuCiAgICAgICAgICAgIHt7IGlmIC5Db250ZW50IH19CiAgICAgICAgICAgIGRhdGEgPSAoZGF0YSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pIHsgcmV0dXJuIGl0ZW0uQ29udGVudElEICE9IHt7IC5Db250ZW50LklEIH19OyB9KTsKICAgICAgICAgICAge3sgZW5kIH19CgogICAgICAgICAgICBpZiAoaXNMaXN0KSB7CiAgICAgICAgICAgICAgZGF0YSA9IChkYXRhIHx8IFtdKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSkgeyByZXR1cm4gY2hvc2VuQ29udGVudElEcy5pbmRleE9mKGl0ZW0uQ29udGVudElEKSA9PT0gLTE7IH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeyAvLyBUaGlzIHJlc3BvbnNlIGlzIHBhZ2VkLCBkb24ndCB3b3JyeSBhYm91dCBPXjIuIE1heCBvZiAyMCBpdGVtcy4KCiAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGRhdGFbaV0uQ29udGVudFZhbHVlcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgaWYgKGRhdGFbaV0uQ29udGVudFZhbHVlc1tqXS5GaWVsZE5hbWUgPT0gIm5hbWUiKSB7IC8vIFdlJ3JlIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGlzLgogICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGRhdGFbaV0sIGRhdGFbaV0uQ29udGVudFZhbHVlc1tqXSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGRhdGEKICAgICAgICAgIH0sCiAgICAgICAgICAnRmllbGRWYWx1ZScKICAgICAgICApCgogICAgICAgIC8vIFRPRE86IFdlaXJkIGJlaGF2aW9yIGhlcmUsIHdoeSBkbyBJIGhhdmUgdG8gaW5saW5lIHRoaXMgY2xlYXIgb24KICAgICAgICAvLyBzZWxlY3RlZD8gV2h5IGNhbid0IGl0IGV4aXN0cyBpbiBjb250ZW50T3B0cz8KICAgICAgICBhdXRvQyA9IHdpbmRvdy5hdXRvY29tcGxldGUoY29udGVudCwgT2JqZWN0LmFzc2lnbih7fSwgb3B0cywge2NsZWFyT25TZWxlY3RlZDp0cnVlfSksIFtjb250ZW50T3B0c10pLm9uKCdhdXRvY29tcGxldGU6c2VsZWN0ZWQnLCBvbkNvbnRlbnRTZWxlY3RlZCkKICAgICAgICBmdW5jdGlvbiBvbkNvbnRlbnRTZWxlY3RlZChlLCBpdGVtLCBkYXRhc2V0LCBjdHgpIHsKICAgICAgICAgIGlmIChpc0xpc3QpIHsKICAgICAgICAgICAgY2hvc2VuQ29udGVudElEcy5wdXNoKGl0ZW0uQ29udGVudElEKQogICAgICAgICAgICBjaG9zZW5Db250ZW50TmFtZXMucHVzaChpdGVtLkZpZWxkVmFsdWUpCiAgICAgICAgICAgIG91dHB1dC52YWx1ZSA9IGNob3NlbkNvbnRlbnRJRHMKICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKHZhbCwgaSwgc2VsZikgeyByZXR1cm4gc2VsZi5pbmRleE9mKHZhbCkgPT09IGkgfSkKICAgICAgICAgICAgICAuam9pbignLScpCiAgICAgICAgICAgIGJ0bi52YWx1ZSA9IGNob3NlbkNvbnRlbnROYW1lcwogICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24odmFsLCBpLCBzZWxmKSB7IHJldHVybiBzZWxmLmluZGV4T2YodmFsKSA9PT0gaSB9KQogICAgICAgICAgICAgIC5qb2luKCcsICcpCiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgb3V0cHV0LnZhbHVlID0gaXRlbS5Db250ZW50SUQKICAgICAgICAgICAgYnRuLnZhbHVlID0gaXRlbS5GaWVsZFZhbHVlCiAgICAgICAgICAgIGJvb3RzdHJhcC5Nb2RhbC5nZXRJbnN0YW5jZShtb2RhbCkuaGlkZSgpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KQoKICAgICAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignaGlkZGVuLmJzLm1vZGFsJywgZnVuY3Rpb24oKSB7IAogICAgICAgIGlucHV0Q1QudmFsdWUgPSAnJwogICAgICAgIGF1dG9DVC5hdXRvY29tcGxldGUuZGVzdHJveSgpCiAgICAgICAgYXV0b0NUID0gZmFsc2U7CiAgICAgICAgaW5wdXRDLnZhbHVlID0gJycKICAgICAgICBpbnB1dEMuZGlzYWJsZWQgPSB0cnVlCiAgICAgICAgYXV0b0MuYXV0b2NvbXBsZXRlLmRlc3Ryb3koKQogICAgICAgIGF1dG9DID0gZmFsc2U7CiAgICAgIH0pCgogICAgICBjbGVhci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyAKICAgICAgICBpbnB1dENULnZhbHVlID0gJyc7CiAgICAgICAgaW5wdXRDLnZhbHVlID0gJyc7CiAgICAgICAgaW5wdXRDLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICBpbnB1dENULmZvY3VzKCk7CiAgICAgICAgb3V0cHV0LnZhbHVlID0gJyc7CiAgICAgICAgYnRuLnZhbHVlID0gJ09wZW4nOwogICAgICAgIGNob3NlbkNvbnRlbnRUeXBlSUQgPSB2b2lkIDA7CiAgICAgICAgY2hvc2VuQ29udGVudElEcyA9IFtdOwogICAgICAgIGNob3NlbkNvbnRlbnROYW1lcyA9IFtdOwogICAgICB9KQoKICAgIH0pKHJlZiwgb3V0cHV0LCBidG4sIGlucHV0Q1QsIGlucHV0QywgbW9kYWwsIGNsZWFyKTsKICB9Cgp9KSgpOwo=")

M internal/v/v.go => internal/v/v.go +1 -0
@@ 16,6 16,7 @@ func MustParse(name string) *template.Template {
	if all == nil {

		fns := template.FuncMap{
			"html":  func(val string) template.HTML { return template.HTML(val) },
			"inc":   func(i int) int { return i + 1 },
			"title": func(str string) string { return strings.Title(str) },
			"paid": func(u user.User) bool {

M main.go => main.go +44 -17
@@ 6,12 6,14 @@ import (
	"log"
	"net/http"
	"os"
	"strconv"
	"time"

	"git.sr.ht/~evanj/cms/internal/c"
	"git.sr.ht/~evanj/cms/internal/c/content"
	"git.sr.ht/~evanj/cms/internal/c/contenttype"
	"git.sr.ht/~evanj/cms/internal/c/doc"
	"git.sr.ht/~evanj/cms/internal/c/dynamic"
	"git.sr.ht/~evanj/cms/internal/c/file"
	"git.sr.ht/~evanj/cms/internal/c/hook"
	"git.sr.ht/~evanj/cms/internal/c/invite"


@@ 26,31 28,45 @@ import (
	"git.sr.ht/~evanj/cms/internal/s/rl"
	libstripe "git.sr.ht/~evanj/cms/internal/s/stripe"
	"git.sr.ht/~evanj/cms/pkg/e3"
	"git.sr.ht/~evanj/cms/pkg/skipper"
	"git.sr.ht/~evanj/security"
)

var (
	build string

	port             = os.Getenv("PORT")
	dbtype           = os.Getenv("DBTYPE")
	dbcreds          = os.Getenv("DB")
	url              = os.Getenv("URL")
	secret           = os.Getenv("SECRET")
	memcacheKey      = os.Getenv("MEMCACHE_KEY")
	memcacheServer   = os.Getenv("MEMCACHE_SERVER")
	e3user           = os.Getenv("E3_USER")
	e3pass           = os.Getenv("E3_PASS")
	e3url            = os.Getenv("E3_URL")
	signupEnabled    = os.Getenv("SIGNUP_ENABLE") == "true"
	staticDir        = os.Getenv("STATIC_DIR")
	analyticsEnabled = os.Getenv("ANALYTICS_ENABLE") == "true"
	stripeSuccessURL = os.Getenv("STRIPE_SUCCESS_URL")
	stripeErrorURL   = os.Getenv("STRIPE_ERROR_URL")
	stripePK         = os.Getenv("STRIPE_PK")
	stripeSK         = os.Getenv("STRIPE_SK")
	port                      = os.Getenv("PORT")
	dbtype                    = os.Getenv("DBTYPE")
	dbcreds                   = os.Getenv("DB")
	url                       = os.Getenv("URL")
	secret                    = os.Getenv("SECRET")
	memcacheKey               = os.Getenv("MEMCACHE_KEY")
	memcacheServer            = os.Getenv("MEMCACHE_SERVER")
	e3user                    = os.Getenv("E3_USER")
	e3pass                    = os.Getenv("E3_PASS")
	e3url                     = os.Getenv("E3_URL")
	signupEnabled             = os.Getenv("SIGNUP_ENABLE") == "true"
	staticDir                 = os.Getenv("STATIC_DIR")
	analyticsEnabled          = os.Getenv("ANALYTICS_ENABLE") == "true"
	stripeSuccessURL          = os.Getenv("STRIPE_SUCCESS_URL")
	stripeErrorURL            = os.Getenv("STRIPE_ERROR_URL")
	stripePK                  = os.Getenv("STRIPE_PK")
	stripeSK                  = os.Getenv("STRIPE_SK")
	dynamicContentUser        = os.Getenv("DYNAMIC_CONTENT_USER")
	dynamicContentPass        = os.Getenv("DYNAMIC_CONTENT_PASS")
	dynamicContentURL         = os.Getenv("DYNAMIC_CONTENT_URL")
	dynamicContentSpace       = mustInt(os.Getenv("DYNAMIC_CONTENT_SPACE"))
	dynamicContentContentType = mustInt(os.Getenv("DYNAMIC_CONTENT_CONTENTTYPE"))
)

func mustInt(val string) int {
	i, err := strconv.Atoi(val)
	if err != nil {
		log.Fatal(err)
	}
	return i
}

func main() {
	var (
		w         = os.Stdout


@@ 78,6 94,17 @@ func main() {

		app = &App{
			applogger,
			dynamic.New(
				c,
				log.New(w, "[cms:dynamic] ", 0),
				skipper.New(
					dynamicContentUser,
					dynamicContentPass,
					dynamicContentURL,
					dynamicContentSpace,
				),
				dynamicContentContentType,
			),
			map[string]http.Handler{
				"content": content.New(
					c,

M makefile => makefile +1 -1
@@ 22,7 22,7 @@ gen:
	@$(CC) generate ./...

test: 
	@env $(ENV) $(CC) test ./... -count 1
	@env $(ENV) $(CC) test ./... -cover -count 1

coverage: 
	@env $(ENV) $(CC) test ./... -cover -coverprofile=coverage.out ; $(CC) tool cover -html=coverage.out

D pkg/pkg.go => pkg/pkg.go +0 -2
@@ 1,2 0,0 @@
// pgk may be imported by world.
package pkg

D pkg/pkg_test.go => pkg/pkg_test.go +0 -1
@@ 1,1 0,0 @@
package pkg_test

A pkg/skipper/api/api.go => pkg/skipper/api/api.go +200 -0
@@ 0,0 1,200 @@
package api

import (
	"context"
	"encoding/json"
	"errors"
	"fmt"
	"html/template"
	"io/ioutil"
	"net/http"
)

var (
	ErrNoContent = errors.New("no content found for query")
)

type API struct {
	user, pass string
	space      int
	baseURL    string
	client     *http.Client
}

type Content struct {
	ContentID           string
	ContentParentTypeID string
	ContentValues       []ContentValue
	valueMap            map[string]ContentValue
}

func (c *Content) Val(key string) (string, bool) {
	val, ok := c.valueMap[key]
	if !ok {
		return "", false
	}
	return val.FieldValue, true
}

func (c *Content) HTML(key string) (template.HTML, bool) {
	val, ok := c.valueMap[key]
	if !ok {
		return template.HTML(""), false
	}
	return template.HTML(val.FieldValue), true
}

func (c *Content) Ref(key string) (*Content, bool) {
	val, ok := c.valueMap[key]
	if !ok || val.FieldReference == nil {
		return nil, false
	}

	ref := transform(*val.FieldReference)
	return &ref, true
}

func (c *Content) List(key string) ([]Content, bool) {
	val, ok := c.valueMap[key]
	if !ok || val.FieldReferenceList == nil {
		return nil, false
	}

	var list []Content
	for _, item := range val.FieldReferenceList {
		list = append(list, transform(item))
	}

	return list, true
}

type ContentMust struct {
	c Content
}

func (c *Content) Must() ContentMust {
	return ContentMust{Content{c.ContentID, c.ContentParentTypeID, c.ContentValues, c.valueMap}}
}

func (cm ContentMust) Val(key string) string {
	val, _ := cm.c.Val(key)
	return val
}

func (cm ContentMust) Ref(key string) *Content {
	val, _ := cm.c.Ref(key)
	return val
}

func (cm ContentMust) List(key string) []Content {
	val, _ := cm.c.List(key)
	return val
}

type ContentList struct {
	ContentList []Content
	ContentMore bool
}

type ContentValue struct {
	FieldID            string
	FieldType          string
	FieldName          string
	FieldValue         string
	FieldReference     *Content
	FieldReferenceList []Content
}

func New(user, pass, baseURL string, space int) API {
	return NewWithClient(user, pass, baseURL, space, http.DefaultClient)
}

func NewWithClient(user, pass, baseURL string, space int, client *http.Client) API {
	return API{
		user:    user,
		pass:    pass,
		space:   space,
		baseURL: baseURL,
		client:  client,
	}
}

func (cms API) List(ctx context.Context, typeID int, order, field string) ([]Content, error) {
	var (
		url  = fmt.Sprintf("%s/contenttype/%d/%d?order=%s&field=%s", cms.baseURL, cms.space, typeID, order, field)
		body struct{ ContentList ContentList }
	)

	req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
	if err != nil {
		return nil, err
	}
	req.SetBasicAuth(cms.user, cms.pass)

	resp, err := cms.client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	bytes, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}

	if err := json.Unmarshal(bytes, &body); err != nil {
		return nil, err
	}

	return transformList(body.ContentList.ContentList), nil
}

func (cms API) Find(ctx context.Context, typeID int, field, query string) (*Content, error) {
	var (
		url  = fmt.Sprintf("%s/content/search?space=%d&contenttype=%d&field=%s&query=%s", cms.baseURL, cms.space, typeID, field, query)
		body ContentList
	)

	req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
	if err != nil {
		return nil, err
	}
	req.SetBasicAuth(cms.user, cms.pass)

	resp, err := cms.client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	bytes, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}

	if err := json.Unmarshal(bytes, &body); err != nil {
		return nil, err
	}

	if len(body.ContentList) < 1 {
		return nil, ErrNoContent
	}

	c := transform(body.ContentList[0])
	return &c, nil
}

func transformList(in []Content) []Content {
	for i, c := range in {
		in[i] = transform(c)
	}
	return in
}

func transform(in Content) Content {
	in.valueMap = make(map[string]ContentValue)
	for _, val := range in.ContentValues {
		in.valueMap[val.FieldName] = val
	}
	return in
}

A pkg/skipper/api/api_test.go => pkg/skipper/api/api_test.go +1 -0
@@ 0,0 1,1 @@
package api_test

A pkg/skipper/skipper.go => pkg/skipper/skipper.go +109 -0
@@ 0,0 1,109 @@
package skipper

import (
	"context"
	"strings"

	"git.sr.ht/~evanj/cms/internal/m/content"
	"git.sr.ht/~evanj/cms/internal/m/value"
	"git.sr.ht/~evanj/cms/pkg/skipper/api"
)

type Skipper struct {
	api api.API
}

func New(user, pass, baseURL string, space int) Skipper {
	api := api.New(user, pass, baseURL, space)
	return Skipper{
		api: api,
	}
}

func (s Skipper) QueryContentByField(ctx context.Context, contentTypeID int, field, query string) (content.Content, error) {
	item, err := s.api.Find(ctx, contentTypeID, field, query)
	if err != nil {
		return nil, err
	}
	return c{item}, nil
}

///////////////////////////////////////////////////////////////////////////////
//
// CONTENT IMPL
//
///////////////////////////////////////////////////////////////////////////////

type c struct {
	// TODO: Get rid of this pointer.
	api *api.Content
}

func (c c) ID() string   { return c.api.ContentID }
func (c c) Type() string { return c.api.ContentParentTypeID }

func (c c) Values() (ret []value.Value) {
	for _, raw := range c.api.ContentValues {
		val := v{raw}
		ret = append(ret, val)
	}
	return
}

func (c c) ValueByName(name string) (value.Value, bool) {
	for _, val := range c.Values() {
		if val.Name() == name {
			return val, true
		}
	}
	return nil, false
}

func (c c) MustValueByName(name string) value.Value {
	val, _ := c.ValueByName(name)
	return val
}

///////////////////////////////////////////////////////////////////////////////
//
// VALUE IMPL
//
///////////////////////////////////////////////////////////////////////////////

type v struct {
	api api.ContentValue
}

func (v v) ID() string    { return v.api.FieldID }
func (v v) Type() string  { return v.api.FieldType }
func (v v) Name() string  { return v.api.FieldName }
func (v v) Value() string { return v.api.FieldValue }

func (v v) RefID() (ret string) {
	if v.api.FieldReference != nil {
		ret = v.api.FieldReference.ContentID
	}
	return
}

func (v v) RefName() (ret string) {
	if v.api.FieldReference != nil {
		ret = (c{v.api.FieldReference}).MustValueByName("name").Value()
	}
	return
}

func (v v) RefListIDs() (ret []string) {
	for _, val := range v.api.FieldReferenceList {
		ret = append(ret, val.ContentID)
	}
	return ret
}

func (v v) RefListNames() string {
	var ret []string
	for _, val := range v.api.FieldReferenceList {
		ret = append(ret, (c{&val}).MustValueByName("name").Value())
	}
	return strings.Join(ret, ", ")
}

A pkg/skipper/skipper_test.go => pkg/skipper/skipper_test.go +1 -0
@@ 0,0 1,1 @@
package skipper_test