@charset "UTF-8";
/*------------------------------------*\
	RESET
\*------------------------------------*/
*,
*::before,
*::after {
  box-sizing: border-box;
}

html {
  -moz-text-size-adjust: none;
  -webkit-text-size-adjust: none;
  text-size-adjust: none;
}

body {
  margin: 0;
  min-height: 100vh;
}

body, h1, h2, h3, h4,
p, figure, blockquote, dl, dd {
  margin-block-start: 0;
  margin-block-end: 0;
}

h1, h2, h3, h4 {
  text-wrap: pretty;
}

ul,
ol {
  margin: unset;
  padding: unset;
  list-style: none;
}

a:not([class]) {
  text-decoration-skip-ink: auto;
}

img,
picture {
  display: block;
  max-width: 100%;
  height: auto;
}

input, button,
textarea, select {
  font-family: inherit;
  font-size: inherit;
}

button {
  padding: 0;
  border: none;
  background: none;
  cursor: pointer;
}

button:disabled, button[aria-disabled=true],
input:disabled,
input[aria-disabled=true],
select:disabled,
select[aria-disabled=true],
textarea:disabled,
textarea[aria-disabled=true] {
  cursor: not-allowed;
}

a[aria-disabled=true] {
  cursor: not-allowed;
}

fieldset {
  border: none;
  padding: 0;
}

textarea {
  max-width: 100%;
  box-sizing: border-box;
}

textarea:not([rows]) {
  min-height: 10em;
}

:where([popover]) {
  border: none;
  padding: 0;
}

:target {
  scroll-margin-block: 5ex;
}

/*------------------------------------*\
	MEDIA QUERY

	Wraps content in the appropriate media query.

	Usage:
	.block {
		@include media-query('768') { ... }
	}

	Available aliases:
	portrait, landscape
	768, 768-plus
	900, 900-plus
	1024, 1024-plus
	1440, 1440-plus
	1920, 1920-plus
\*------------------------------------*/
/*------------------------------------*\
	GRID
\*------------------------------------*/
.grid {
  display: grid;
  grid-column: 1/-1;
  row-gap: var(--grid-gap, 25px);
  column-gap: var(--grid-gap, 25px);
  width: 100%;
}

.grid--in-cell {
  grid-column: auto;
}

.grid--1 {
  grid-template-columns: 100%;
}

.grid--2 {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

@media screen and (max-width: 767px) {
  .grid--2 {
    grid-template-columns: 100%;
  }
}
.grid--3 {
  grid-template-columns: repeat(3, minmax(0, 1fr));
}

@media screen and (max-width: 767px) {
  .grid--3 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
.grid--4 {
  grid-template-columns: repeat(4, minmax(0, 1fr));
}

@media screen and (max-width: 767px) {
  .grid--4 {
    grid-template-columns: 100%;
  }
}
.grid--5 {
  grid-template-columns: repeat(5, minmax(0, 1fr));
}

@media screen and (max-width: 767px) {
  .grid--5 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
.grid--6 {
  grid-template-columns: repeat(6, minmax(0, 1fr));
}

@media screen and (max-width: 1024px) {
  .grid--6 {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}
@media screen and (max-width: 767px) {
  .grid--6 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
.grid--split {
  grid-template-columns: var(--grid-columns, 1fr 1fr);
}

.grid--2-1 {
  grid-template-columns: 2fr 1fr;
}

.grid--1-2 {
  grid-template-columns: 1fr 2fr;
}

@media screen and (max-width: 1024px) {
  .grid--split, .grid--2-1, .grid--1-2 {
    grid-template-columns: 100%;
  }
}
.grid--center {
  align-items: center;
}

.grid--align-start {
  align-items: start;
}

/*------------------------------------*\
	BREATHE — vertical-rhythm utility
\*------------------------------------*/
.breathe {
  display: block;
}

.breathe:not([class*=breathe--]) {
  margin-top: 24px;
  margin-bottom: 24px;
}

.breathe[style*="--breathe-top"] {
  margin-top: var(--breathe-top);
}

.breathe[style*="--breathe-bottom"] {
  margin-bottom: var(--breathe-bottom);
}

.breathe--top {
  margin-top: 24px !important;
}

.breathe--top-tiny {
  margin-top: 4px !important;
}

.breathe--top-mini {
  margin-top: 8px !important;
}

.breathe--top-small {
  margin-top: 12px !important;
}

.breathe--top-large {
  margin-top: 40px !important;
}

.breathe--top-huge {
  margin-top: 64px !important;
}

.breathe--top-auto {
  margin-top: auto !important;
}

.breathe--bottom {
  margin-bottom: 24px !important;
}

.breathe--bottom-tiny {
  margin-bottom: 4px !important;
}

.breathe--bottom-mini {
  margin-bottom: 8px !important;
}

.breathe--bottom-small {
  margin-bottom: 12px !important;
}

.breathe--bottom-large {
  margin-bottom: 40px !important;
}

.breathe--bottom-huge {
  margin-bottom: 64px !important;
}

.breathe--bottom-auto {
  margin-bottom: auto !important;
}

/*------------------------------------*\
	IMAGES
\*------------------------------------*/
/*------------------------------------*\
	TRANSITIONS
\*------------------------------------*/
.hover-zoom {
  display: block;
  overflow: hidden;
}

.hover-zoom img {
  transition: all 300ms ease;
  width: 100%;
  height: auto;
}

.hover-zoom:hover img {
  transform: scale(1.08);
}

.img--cover {
  object-fit: cover;
  width: 100%;
  height: 100%;
}

.img--contain {
  object-fit: contain;
  width: 100%;
  height: 100%;
}

/*------------------------------------*\
	VISIBILITY
\*------------------------------------*/
.is-hidden {
  display: none;
}

@media screen and (max-width: 767px) {
  .is-hidden--mobile {
    display: none !important;
  }
}
@media screen and (max-width: 1024px) {
  .is-hidden--tablet {
    display: none !important;
  }
}
@media screen and (min-width: 1025px) {
  .is-hidden--desktop {
    display: none !important;
  }
}
@media (orientation: portrait) {
  .is-hidden--portrait {
    display: none !important;
  }
}
@media (orientation: landscape) {
  .is-hidden--landscape {
    display: none !important;
  }
}
/*------------------------------------*\
	HOVER

	Generates hover, focus, and active states.
	Pass $include-active: true to also include
	:active and .is-active states.
\*------------------------------------*/
/*------------------------------------*\
	BACKGROUND

	Shorthand for rgba background with opacity.

	Usage: @include background($dark-charcoal, 0.8);
\*------------------------------------*/
body {
  background-color: var(--bg-page);
  color: var(--text-body);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  line-height: var(--lh-body);
  interpolate-size: allow-keywords;
}

/*------------------------------------*\
	INTERACTION

	Approved on the product page mockup (MPG9) before being written here.

	Every hover state on this brand changes a COLOUR — text, background or
	border — and nothing moves. No lift, no scale. That follows the shape law:
	a control is a flat square thing, and a control that rises off the page is
	pretending to be a surface.

	So the layer is a fade at --motion-quick, and the one transform the brand
	will use (a disclosure marker turning, once authored) will run at the
	same rate, so the whole page shares one tempo.
\*------------------------------------*/
a,
.button,
button,
summary,
input,
select {
  transition: color var(--motion-quick) var(--motion-ease), background-color var(--motion-quick) var(--motion-ease), border-color var(--motion-quick) var(--motion-ease);
}

details::details-content {
  block-size: 0;
  overflow: hidden;
  transition: block-size var(--motion-quick) var(--motion-ease), content-visibility var(--motion-quick) var(--motion-ease) allow-discrete;
}

details[open]::details-content {
  block-size: auto;
}

a:focus-visible,
button:focus-visible,
summary:focus-visible,
input:focus-visible,
select:focus-visible {
  outline: 2px solid var(--border-focus);
  outline-offset: 2px;
}

@media (prefers-reduced-motion: reduce) {
  :root {
    --motion-quick: 0ms;
    --motion-standard: 0ms;
  }
}
/* ── Notice bar ─────────────────────────────────────────────────────── */
.site-head__alerts {
  background: var(--bg-notice);
  color: var(--text-on-brand);
}

.site-head__alerts p {
  max-width: var(--site-max-width);
  margin: 0 auto;
  padding: 10px var(--gutter-small);
  color: var(--text-on-brand);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  text-align: center;
}

/* ── Header bar ─────────────────────────────────────────────────────── */
.site-head__main {
  background: var(--bg-chrome);
}

.site-head__main__inner {
  display: flex;
  align-items: stretch;
  max-width: var(--site-max-width);
  margin: 0 auto;
  padding-left: var(--gutter-small);
}

.site-nav {
  display: flex;
  flex: 1;
  align-items: center;
  gap: 32px;
}

.site-nav__burger {
  display: none;
}

.site-nav__logo {
  display: flex;
  align-items: center;
  padding: 14px 0;
}

.pg-logo {
  display: block;
  width: auto;
  height: 38px;
}

.site-nav__menu {
  display: flex;
  gap: 34px;
  margin-inline: auto;
}

.site-nav__menu__item {
  padding: 0;
  border: 0;
  background: none;
  color: var(--neutral-400);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-light);
  text-transform: uppercase;
  cursor: pointer;
}

/*
 * The chevron is drawn, not an icon — the network markup carries no element for it.
 *
 * Scoped to `button` so it only appears on items that actually open something.
 * header.php renders a <button popovertarget> when a menu item HAS children and
 * a plain <a href> when it does not, so the tag is already the truth about
 * whether there is a panel behind it. Unscoped, every item wore a dropdown arrow
 * and every click just navigated — the arrow promised a menu that did not exist.
 * All three of this site's nav items have zero children today.
 *
 * Correct under both readings of that, which is why it is the tag and not a
 * hand-maintained list: if the design intends those items to be dropdowns, they
 * gain children, header.php emits buttons, and the chevrons come back on their
 * own. Nothing here needs revisiting either way.
 */
button.site-nav__menu__item::after {
  display: inline-block;
  width: 7px;
  height: 7px;
  margin-left: 9px;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: translateY(-2px) rotate(45deg);
  content: "";
}

.site-nav__menu__item:hover {
  color: var(--text-on-brand);
}

/* ── Header actions ─────────────────────────────────────────────────── */
/* The geometry of these controls is the PARENT's — box size, icon size, spacing
 * and the basket count's placement all come from
 * framework-v2/global/scss/layouts/_site-head.scss. This layer sets colour.
 *
 * What used to be here, and why none of it survives: a 66px box (the parent's
 * --action-box is 44px, the WCAG AAA target, and every brand now gets it), an
 * `align-items: stretch` that made the boxes full header height, and a
 * `border: 0; background: none; cursor: pointer` reset that the global `button`
 * reset in core/_reset.scss has always performed. The search panel is 44px tall
 * rather than the full 75px bar as a result — the background is still this
 * brand's, its extent is not.
 */
.site-head__actions__search {
  background: var(--bg-chrome-deep);
}

/* Shared with .footer__cta .icon below — same size/colour for both inline SVG symbols.
 *
 * ⚠ `.site-head__main`, NOT `.site-head`. The search modal moved inside the
 * header on 2026-09-21 so it could anchor to the header's bottom edge, and it is
 * a SIBLING of `__main`, not a descendant. Scoped one level up, this rule painted
 * the modal's own icons white — and the submit magnifier sits on a white field,
 * so the search button was invisible on every page of the site. Same specificity
 * as the framework's `.search-form__submit .icon`, brand sheet loads second, brand
 * won. Every header icon is inside `__main` (camcom-v2/header.php:39), which is
 * how Nerdworks and ARTSABERS already scope this.
 */
.site-head__main .icon,
.footer__cta .icon {
  fill: var(--text-on-brand);
}

/* Footer keeps its own size; the header's comes from the parent's --icon-size.
 * The 22px this used to set on both, plus a 26px exception for the search
 * magnifier, was this brand routing around --icon-size rather than using it —
 * `.site-head__main .icon` is two classes against the global primitive's one, so
 * it won silently and the lever looked broken. Header icons are 24px now, the
 * same as every other brand. */
.footer__cta .icon {
  width: 22px;
  height: 22px;
}

.site-head__actions__basket__count {
  background: var(--color-brand);
  color: var(--text-on-brand);
  font-family: var(--ff-body);
}

/* ── Footer ─────────────────────────────────────────────────────────── */
.footer {
  background: var(--bg-chrome);
  color: var(--text-on-chrome);
}

.footer__cta {
  background: var(--color-brand);
}

.footer__cta__inner {
  display: flex;
  gap: 18px;
  align-items: center;
  justify-content: center;
  max-width: var(--site-max-width);
  margin: 0 auto;
  padding: 18px var(--gutter-small);
}

.footer__cta__link,
.footer__cta__follow,
.footer__cta__sep,
.footer__cta__social {
  color: var(--text-on-brand);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  text-decoration: none;
}

.footer__cta__link,
.footer__cta__follow {
  font-size: 22px;
}

.footer__cta__social {
  display: inline-flex;
  align-items: center;
}

/* Icon sizing/colour shared with .site-head__main .icon above. */
.footer__inner {
  display: grid;
  grid-template-columns: 2fr 1fr;
  gap: var(--space-content-gap);
  max-width: var(--site-max-width);
  margin: 0 auto;
  padding: 44px var(--gutter-small);
}

.footer__columns {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-content-gap);
}

.footer__columns__list {
  margin: 0;
  padding: 0;
  list-style: none;
}

.footer__columns__list .title {
  margin: 0 0 12px;
  color: var(--text-on-brand);
  font-family: var(--ff-heading);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
}

.footer__columns__list .link {
  color: var(--text-on-chrome);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  line-height: 2;
  text-decoration: none;
}

.footer__columns__list .link:hover {
  color: var(--text-on-brand);
}

.footer__promo {
  display: flex;
  flex-direction: column;
  gap: 14px;
  align-items: flex-end;
  text-align: right;
}

.pg-logo--footer {
  height: 32px;
}

.footer__promo__info p,
.footer__legal p {
  margin: 0;
  color: var(--text-on-chrome);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  line-height: var(--lh-body);
}

.footer__legal {
  grid-column: 1/-1;
  padding-top: 24px;
  border-top: 1px solid var(--neutral-400);
}

/* ── Narrow ─────────────────────────────────────────────────────────── */
/*
 * This brand hands over LATER than the global 1024, because its header does not
 * fit at 1024.
 *
 * Measured at 1025: logo 160 + nav gap 32 + menu 622 + actions 228 + 40 of inner
 * padding = 1082px of content in a 1025px viewport. `.site-nav` is `flex: 1` and
 * its menu items are `white-space: nowrap`, so nothing compresses — the actions
 * cluster was pushed to a right edge of 1062 and took the whole document into
 * horizontal scroll. Same failure ARTSABERS hit at 768, one brand and one
 * breakpoint along.
 *
 * 1100 rather than 1082 so a menu label can grow by a word without bringing it
 * back. Move it if the design would rather shrink the type or shorten the
 * labels than collapse earlier — the number is a floor, not a preference.
 *
 * This block also carries the menu hide that used to duplicate global's. That
 * duplication was real and is gone; what remains is a genuine brand override,
 * because global hides the menu at 1024 and this brand needs it hidden to 1100.
 * Global's rule is doubled-class so it beats a brand base — this one beats it
 * back deliberately, by being later and equally specific.
 */
@media (max-width: 1100px) {
  .site-nav__menu {
    display: none;
  }
  .site-nav__burger {
    display: flex;
    align-items: center;
    padding: 0;
    border: 0;
    background: none;
    cursor: pointer;
  }
  .footer__inner,
  .footer__columns {
    grid-template-columns: 1fr;
  }
  .footer__promo {
    align-items: flex-start;
    text-align: left;
  }
}
/* The 480px block that used to sit here is gone. It squeezed the actions to 52px
 * and shaved the inner container's left padding to 12px, because three 66px boxes
 * plus the gutter overran a 390px viewport by a pixel and took the whole page into
 * horizontal scroll. At the parent's 44px — and with only two controls visible
 * below 768 — the cluster is 93px on a 390px screen, so neither workaround has
 * anything left to fix. Verified: no horizontal scroll at 390. */
.grid > .grid {
  grid-column: auto;
}

@media (max-width: 1100px) {
  .grid--4 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  .grid--5 {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
  .grid--1-2 {
    grid-template-columns: minmax(0, 1fr);
  }
}
@media (max-width: 900px) {
  .grid--3 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
/* ---------------------------------------------------------------------------
   THE STORE COLUMN COLLAPSES EARLIER, because it is 1042px inside a 1400px page.

   MPG1 and MPG8 state different breakpoints for the same primitives, and it is
   not a disagreement about taste — it is the two pages measuring different
   containers. The homepage's grids have the whole page; the funnel's sit in the
   content column beside a 328px rail. A three-up that still reads at 1400 is
   already tight at 1042, so the funnel collapses it at 1100 where the homepage
   waits until 900.

   Scoped to the store column rather than restated page-wide, so both approved
   designs stay correct at once. The honest fix is a container query — the rule
   is genuinely about the column's width and not the window's — but that is a
   change to the global grid under four other brands, and it is not this walk's
   to make. Raised for the operator's review.

   Breakpoints are MPG8's own (design 17955).
   --------------------------------------------------------------------------- */
@media (max-width: 1100px) {
  .store-layout__content .grid--3 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
@media (max-width: 640px) {
  .store-layout__content .grid--5 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  /* The three-up has to be restated here, and the reason is specificity rather
     than design: `.store-layout__content .grid--3` above is two classes against
     the phone rule's one, so it wins at every width below 1100 no matter which
     media query comes later. Without this line the magazine row sits at two
     columns on a phone, where MPG8 stacks it — and it looks like the phone rule
     is missing when it is present and outranked. */
  .store-layout__content .grid--3 {
    grid-template-columns: minmax(0, 1fr);
  }
}
@media (max-width: 640px) {
  .grid--2,
  .grid--3,
  .grid--4,
  .grid--5 {
    grid-template-columns: minmax(0, 1fr);
  }
}
/* ---------------------------------------------------------------------------
   THE PRODUCT GRID HOLDS THREE-UP LONGER THAN THE COLUMN'S SHARED THREE-UP.

   MPG7 collapses the listing 3 → 2 at 900 and 2 → 1 at 640. MPG8's block above
   collapses `.store-layout__content .grid--3` at 1100. Both pages sit in the
   same 1042px column, so unlike the MPG1/MPG8 case this is not two containers
   being measured — it is two kinds of card. The funnel's three-up carries
   ARTICLE cards, which hold an image, a title and an excerpt; the archive's
   carries PRODUCT cards, which are narrower and still read at 700px of column.

   So the listing composes `.grid` for its display, gap and width and states its
   own columns here, rather than taking `--3` and fighting the column rule for
   specificity between 1100 and 900. Nothing above changes, and the funnel's
   magazine row is untouched.

   Breakpoints are MPG7's own (design 17929). Raised for the operator's review:
   whether the store column should collapse by CONTENT TYPE, as it does now, or
   uniformly, is a brand decision and not this walk's to take.
   --------------------------------------------------------------------------- */
.product-grid {
  grid-template-columns: repeat(3, minmax(0, 1fr));
}

@media (max-width: 900px) {
  .product-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
@media (max-width: 640px) {
  .product-grid {
    grid-template-columns: minmax(0, 1fr);
  }
}
/*------------------------------------*\
	COMPONENTS
	One @use per authored brand component, alphabetical. The MPG9 product-page
	walk landed 32 (24 ported from the brand's block catalogue, 8 authored from
	the mockup); the MPG1 homepage walk added 8 more, every one a catalogue port.
\*------------------------------------*/
.about-panel {
  padding: var(--space-card-padding);
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

.about-panel__title {
  margin: 0 0 var(--space-6);
  font-family: var(--ff-heading);
  font-size: var(--fs-h2);
  font-weight: var(--fw-light);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.about-panel__body {
  max-width: var(--container-reading);
}

.about-panel__body p {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.about-panel__body p + p {
  margin-block-start: var(--space-4);
}

.about-panel__body a {
  color: var(--text-link);
  font-weight: var(--fw-medium);
  text-decoration: none;
}

.about-panel__body a:hover {
  color: var(--text-link-hover);
}

@media (max-width: 900px) {
  .about-panel__title {
    font-size: var(--fs-h3);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — account-login
   The logged-out form: one centred panel at the reading measure — a log-in
   form is two fields and a button, and a panel spanning 1400px would stretch
   it into a banner. The lost-password and reset-password forms take the same
   frame, since they are the same size of task.
   --------------------------------------------------------------------------- */
.account-login {
  max-width: var(--container-reading);
  margin-inline: auto;
}

/* Lost your password? sits on the button's line, inside the actions row. */
.account-login .form-actions > .form-note {
  margin: 0;
}

/* ---------------------------------------------------------------------------
   BLOCK — account-orders  (NEW)
   The customer's orders as a table: Order, Date, Status, Total, Actions. It is
   built the way the brand builds every table — spec-table's construction, a
   Paragon-blue header row with white heading-font labels over rows striped in
   stripe grey and panel white, the whole at the surface radius — widened to
   five columns. Not spec-table itself: that block is a two-column attribute
   list with bold names, and an order row is not an attribute.

   The order number is a link. The total is a price, so it sets in the
   commerce face, bold and slanted, with the item count after it in slate body
   text — WooCommerce's own "£520.81 for 4 items". Actions are link-blue text,
   medium weight, never buttons: five rows of blue buttons would shout louder
   than the orders.

   Phone: each row becomes a stacked card, label beside value, the labels
   read from WooCommerce's own data-title attribute on each cell, so the
   template needs no second markup for the small screen.
   --------------------------------------------------------------------------- */
.account-orders {
  border-radius: var(--radius-card);
  overflow: hidden;
}

.account-orders__table {
  width: 100%;
  border-collapse: collapse;
  text-align: left;
}

.account-orders__heading {
  padding: var(--space-3) var(--space-6);
  background-color: var(--color-brand);
  font-family: var(--ff-heading);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-on-brand);
  white-space: nowrap;
}

.account-orders__row:nth-child(odd) {
  background-color: var(--bg-panel-alt);
}

.account-orders__row:nth-child(even) {
  background-color: var(--bg-panel);
}

.account-orders__cell {
  padding: var(--space-4) var(--space-6);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-body);
  vertical-align: middle;
}

.account-orders__number {
  font-weight: var(--fw-medium);
  color: var(--text-link);
  text-decoration: none;
  white-space: nowrap;
}

.account-orders__number:hover {
  color: var(--text-link-hover);
}

/* Each package's own order number, under the checkout's: order splitting makes one
   order per package and the list shows the checkout once, so these are how a customer
   matches a package to its dispatch email. Not in the mockup, which predates the
   grouping (operator, 2026-09-26). */
.account-orders__packages {
  display: block;
  margin-block-start: var(--space-1);
  font-size: var(--fs-small);
  color: var(--text-muted);
}

/* A link that names something rather than numbering it — a product in the account's
   stock alerts. The order number's link colour and weight, but it WRAPS: a product
   name is long, and the order number's nowrap pushed the row's actions out of the
   table (refinement list, 2026-09-27). */
.account-orders__link {
  font-weight: var(--fw-medium);
  color: var(--text-link);
  text-decoration: none;
}

.account-orders__link:hover {
  color: var(--text-link-hover);
}

.account-orders__price {
  font-family: var(--ff-chrome);
  font-weight: var(--fw-bold);
  font-style: italic;
  color: var(--text-body);
  white-space: nowrap;
}

.account-orders__count {
  font-size: var(--fs-small);
  color: var(--text-muted);
  white-space: nowrap;
}

.account-orders__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2) var(--space-6);
}

.account-orders__action {
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-link);
  text-decoration: none;
  white-space: nowrap;
}

.account-orders__action:hover {
  color: var(--text-link-hover);
}

@media (max-width: 640px) {
  .account-orders__table,
  .account-orders__body,
  .account-orders__row,
  .account-orders__cell {
    display: block;
    width: 100%;
  }
  /* The column labels move into each cell; the blue bar would label nothing. */
  .account-orders__head {
    display: none;
  }
  .account-orders__row {
    padding-block: var(--space-3);
  }
  .account-orders__cell {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--space-4);
    padding: var(--space-2) var(--space-4);
    font-size: var(--fs-small);
    text-align: end;
  }
  .account-orders__cell::before {
    content: attr(data-title);
    flex: 0 0 auto;
    font-family: var(--ff-heading);
    font-weight: var(--fw-medium);
    color: var(--text-heading);
    text-align: start;
  }
  .account-orders__actions {
    justify-content: flex-end;
  }
  .account-orders__action {
    font-size: var(--fs-small);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — account-switch  (NEW)
   The account menu at phone width: one select-style control at the top of the
   content — "Dashboard" with the brand's chevron — instead of nine links
   stacked above every page. It is a real `details` and `summary`, the same
   disclosure store-nav settled, so it works with no script.

   Closed, it is the brand's select exactly: square, hairline border, panel
   white, the endpoint's name in body text and the Paragon-blue chevron at the
   right. Open, the control takes the focus border and the chevron turns up,
   and the nine sections drop beneath it as a panel-white count-list at the
   surface radius — the sidebar's own list, current item marked the same way,
   so the menu is one construction at every width.
   --------------------------------------------------------------------------- */
.account-switch {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}

/* DEPARTURE: the label's 8px bottom margin is the block's gap instead, so the block
   root carries a rule of its own rather than being a name nothing declares. Same
   geometry. */
.account-switch__label {
  display: block;
  margin: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.account-switch__control {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  padding: var(--space-3);
  border: 1px solid var(--border-input);
  border-radius: var(--radius-input);
  background-color: var(--bg-input);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-body);
  list-style: none;
  cursor: pointer;
}

/* The endpoint's name. Not styled in the mockup, which only ever drew "Dashboard";
   the longest section name has to hold one line beside the chevron at 320px, so it
   truncates rather than wrapping the control to two lines (walk-back, MPG13). */
.account-switch__current {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.account-switch__control::-webkit-details-marker {
  display: none;
}

.account-switch__control::marker {
  content: "";
}

.account-switch__control:focus-visible {
  border-color: var(--border-focus);
  outline: 2px solid var(--border-focus);
  outline-offset: 2px;
}

.account-switch__menu[open] .account-switch__control {
  border-color: var(--border-focus);
}

.account-switch__chevron {
  flex: 0 0 auto;
  width: 14px;
  height: 14px;
  color: var(--text-brand);
  transform: rotate(90deg);
}

.account-switch__menu[open] .account-switch__chevron {
  transform: rotate(-90deg);
}

.account-switch__panel {
  margin-block-start: var(--space-2);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-card);
  background-color: var(--bg-panel);
  overflow: hidden;
}

/* ---------------------------------------------------------------------------
   BLOCK — account-tile  (NEW)
   The dashboard's way into the account: one plain panel-white tile per
   section that matters most. Nothing in the catalogue fits — category-tile is
   photographic and range-card carries a product count — so this is new.

   A tile is a link on a panel: a Paragon-blue outline icon on the left, the
   section name in the heading font at the small-title size with the brand's
   trailing chevron, and one slate line saying what the section holds. Hover
   is the brand's navigation wash — the same blue tint count-list gives a row —
   and the name takes the link blue. No shadow, no lift: this brand is flat.
   --------------------------------------------------------------------------- */
.account-tile {
  display: grid;
  grid-template-columns: 32px minmax(0, 1fr);
  align-items: start;
  gap: var(--space-4);
  height: 100%;
  padding: var(--space-6);
  background-color: var(--bg-card);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-card);
  text-decoration: none;
}

.account-tile:hover {
  background-color: var(--bg-card-hover);
}

.account-tile:focus-visible {
  outline: 2px solid var(--border-focus);
  outline-offset: 2px;
}

.account-tile__icon {
  width: 32px;
  height: 32px;
  color: var(--text-brand);
}

.account-tile__icon svg {
  display: block;
  width: 100%;
  height: 100%;
}

.account-tile__body {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  min-width: 0;
}

.account-tile__name {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  margin: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h4);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.account-tile__chevron {
  flex: 0 0 auto;
  width: 14px;
  height: 14px;
  color: var(--text-brand);
}

.account-tile:hover .account-tile__name {
  color: var(--text-link);
}

.account-tile__text {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-muted);
}

@media (max-width: 640px) {
  .account-tile {
    padding: var(--space-4);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — address-card  (NEW)
   A postal address read back to the shopper: the name at medium weight as an
   address label leads, then the lines in body text. Not an inset — on this
   page it is the first thing in its labelled panel, not a value sitting inside
   a form. The block carries the gap beneath it, because what follows it (the
   package rows) always needs one.
   --------------------------------------------------------------------------- */
.address-card {
  margin: 0 0 var(--space-6);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-style: normal;
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.address-card__name {
  font-weight: var(--fw-medium);
}

/* ---------------------------------------------------------------------------
   BLOCK — address-lookup  (NEW)
   The delivery address found from the postcode, the default way in. Three
   shapes stacked, all of them the form specimen's own: the Postcode field and
   Find address button as an inline-form; the addresses at that postcode in a
   field select; and, once one is chosen, the address itself as a compact
   filled block with Edit. A quiet form-note link beneath opens the full
   manual fields for an address the lookup does not know.

   The chosen block is an inset rather than a card — stripe grey with the
   hairline at the surface radius — because it is a value the shopper has
   given, sitting inside a card, not a new surface. The name leads at medium
   weight, as an address label does.

   The block owns the gap between its parts, so the inline-form's own top
   margin (set for when it follows a basket's items) is handed back.
   --------------------------------------------------------------------------- */
.address-lookup > * {
  margin-block: 0;
}

.address-lookup > * + * {
  margin-block-start: var(--space-4);
}

/* The Find address button stays level with the postcode box whatever sits under
   the field — the inline row aligns to its bottom edge, which in the error state is
   the error message (operator review of MPG11). Offset by exactly one label's height
   instead; on phones the row stacks and needs no offset. */
.address-lookup .inline-form__row {
  align-items: start;
}

@media (min-width: 641px) {
  .address-lookup .inline-form__action {
    padding-block-start: calc(var(--fs-small) * var(--lh-heading) + var(--space-2));
  }
}
.address-lookup__chosen {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--space-4);
  padding: var(--space-4) var(--space-6);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-card);
  background-color: var(--bg-panel-alt);
}

.address-lookup__address {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-style: normal;
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.address-lookup__name {
  font-weight: var(--fw-medium);
}

.address-lookup__edit {
  appearance: none;
  -webkit-appearance: none;
  flex: 0 0 auto;
  margin: 0;
  padding: 0;
  border: 0;
  background: none;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-body);
  color: var(--text-link);
  cursor: pointer;
}

.address-lookup__edit:hover {
  color: var(--text-link-hover);
}

.address-lookup__edit:focus-visible {
  outline: 2px solid var(--border-focus);
  outline-offset: 2px;
}

@media (max-width: 640px) {
  .address-lookup__chosen {
    padding: var(--space-4);
  }
}
/* ---------------------------------------------------------------------------
   IDEAL POSTCODES' ADDRESS FINDER (checkout wiring, MPG11). Autocomplete in the
   plugin's separate-finder mode (operator, 2026-09-25): p.form-row.idpc-finder
   above the address, the street fields hidden until an address is chosen, then
   folded into `address-lookup__chosen` with Edit by the parent's WooCommerce module
   (addressFinderSummary). The finder's label and box take the brand field rules
   (_field.scss); its suggestion list is dressed here. The postcode-and-button
   lookup the mockup drew is off — autocomplete replaces it.
   --------------------------------------------------------------------------- */
.idpc-finder {
  grid-column: 1/-1;
  margin: 0;
}

.idpc-finder .idpc_af {
  z-index: 30;
  margin-block-start: var(--space-1);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-card);
  background-color: var(--bg-panel);
  box-shadow: var(--shadow-1);
  overflow: hidden;
}

.idpc-finder .idpc_ul {
  margin: 0;
  padding: 0;
  list-style: none;
}

.idpc-finder .idpc_ul li {
  padding: var(--space-3) var(--space-4);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  line-height: var(--lh-heading);
  color: var(--text-body);
  cursor: pointer;
}

.idpc-finder .idpc_ul li + li {
  border-block-start: 1px solid var(--border-default);
}

.idpc-finder .idpc_ul li:hover,
.idpc-finder .idpc_ul li[aria-selected=true] {
  background-color: var(--color-brand-soft);
}

.idpc-manual-entry-link {
  grid-column: 1/-1;
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-body);
  color: var(--text-link);
  cursor: pointer;
}

.idpc-manual-entry-link:hover {
  color: var(--text-link-hover);
}

.address-lookup__chosen {
  grid-column: 1/-1;
}

/* --folded: the address grid once an address is chosen — the street rows fold into
   the chosen block (parent WooCommerce module, addressFinderSummary). The plugin and
   WooCommerce's address script both set these rows' inline display after a pick, so
   the fold holds with !important for as long as the class is on. Edit removes it. */
.address-lookup--folded > .address-field:not([id$=_country_field]),
.address-lookup--folded .idpc-manual-entry-link {
  display: none !important;
}

/* ---------------------------------------------------------------------------
   BLOCK — applied-code  (NEW)
   A discount code that has been accepted, shown as a removable chip beneath the
   code field. A chip is a control, so it is square; it carries the brand's
   outline and wash so it reads as "yours, and live" without borrowing the
   green, which this brand keeps for confirmations.
   --------------------------------------------------------------------------- */
.applied-code {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-3);
  margin: var(--space-4) 0 0;
}

.applied-code__label {
  font-family: var(--ff-heading);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.applied-code__chip {
  display: inline-flex;
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-1) var(--space-1) var(--space-1) var(--space-3);
  border: 1px solid var(--border-brand);
  border-radius: var(--radius-btn);
  background-color: var(--bg-card-hover);
}

.applied-code__code {
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  letter-spacing: 0.06em;
  color: var(--text-body);
}

.applied-code__remove {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  padding: 0;
  border: 0;
  border-radius: var(--radius-btn);
  background: none;
  color: var(--text-brand);
  cursor: pointer;
}

.applied-code__remove:hover {
  background-color: var(--bg-panel);
}

.applied-code__remove svg {
  width: 12px;
  height: 12px;
}

.archive-flow {
  display: flex;
  flex-direction: column;
  gap: var(--space-content-gap);
  min-width: 0;
}

.archive-flow__list {
  display: flex;
  flex-direction: column;
  gap: var(--space-content-gap);
  margin: 0;
  padding: 0;
}

.archive-flow__phone {
  display: none;
}

@media (max-width: 1100px) {
  .archive-flow__phone {
    display: block;
  }
}
@media (max-width: 640px) {
  .archive-flow,
  .archive-flow__list {
    gap: var(--space-6);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — archive-header  (REUSED, verbatim)
   --------------------------------------------------------------------------- */
.archive-header {
  max-width: var(--container-reading);
}

.archive-header__standfirst {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body-lg);
  font-weight: var(--fw-light);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.archive-header__count {
  margin: var(--space-3) 0 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

.article-card {
  position: relative;
  display: flex;
  flex-direction: column;
  background-color: var(--bg-card);
  border-radius: var(--radius-card);
  overflow: hidden;
  box-shadow: var(--shadow-card);
}

.article-card__media {
  display: block;
  width: 100%;
  aspect-ratio: 16/9;
  object-fit: cover;
}

.article-card__body {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  padding: var(--space-card-padding);
}

.article-card__kicker {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: 1;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-brand);
}

.article-card__title {
  margin: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h4);
  font-weight: var(--fw-regular);
  font-style: italic;
  line-height: var(--lh-heading);
}

.article-card__title a {
  color: var(--text-brand);
  text-decoration: none;
}

.article-card__title a:hover {
  color: var(--text-link-hover);
}

.article-card__date {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

.article-card__score {
  position: absolute;
  inset-block-start: var(--space-4);
  inset-inline-end: var(--space-4);
}

/* ---------------------------------------------------------------------------
   BLOCK — article-doc  (NEW)
   Distinct from description-panel, which carries a product description at one
   uniform gap. An article needs two things a product description does not: its
   own measure — the panel is sized to the styleguide's reading width, not to
   the content column, so the copy inside lands at the reading measure with the
   panel's padding outside it — and heading-aware spacing, because a heading
   has to bind to the text beneath it and be pushed away from the text above.

   Every gap here is a top margin and never a bottom one, so nothing collapses
   unpredictably. The rhythm rule sets the default; the two "what follows a
   heading" rules bring the space beneath a heading down; the two heading rules
   take the space above it up. Source order is load-bearing — the heading rules
   sit last so a heading always wins its own space.

   Note the specificity: `> * + *` counts as one class, because `*` counts as
   nothing. A block dropped in here that states a bare `margin: 0` ties that
   rule and wins on source order, landing flush against its neighbour. Blocks
   written for this document state the rhythm value outright instead — the way
   media-figure and figure-row already do. The four heading rules carry two
   classes and win outright.

   The three depths are the whole point of the block: the title at the h1 size
   set light and italic in the header above, sections at the h2 size set light,
   sub-sections at the h4 size set medium. The h4 size for a third-level
   heading is the setting feature-panel already uses, so the brand carries one
   in-document sub-heading and not two.
   --------------------------------------------------------------------------- */
/* ---------------------------------------------------------------------------
   BLOCK — article-doc  (UPDATED — segments)
   With break-out images the article is several article-doc panels in a row,
   and a panel can now open on a heading or an advert. Whatever comes first
   sits flush with the panel's padding rather than carrying the space it
   would take after a paragraph. Last among the article-doc rules, and at the
   same two-class weight, so it wins.
   --------------------------------------------------------------------------- */
.article-doc {
  max-width: calc(var(--container-article) + var(--space-card-padding) * 2);
  margin-inline: auto;
  padding: var(--space-card-padding);
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

.article-doc > * {
  margin-block: 0;
}

.article-doc > * + * {
  margin-block-start: var(--space-8);
}

.article-doc__h2 {
  margin: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h2);
  font-weight: var(--fw-light);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.article-doc__h3 {
  margin: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h4);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.article-doc > .article-doc__h2 + * {
  margin-block-start: var(--space-4);
}

.article-doc > .article-doc__h3 + * {
  margin-block-start: var(--space-3);
}

.article-doc > .article-doc__h2 {
  margin-block-start: var(--space-12);
}

.article-doc > .article-doc__h3 {
  margin-block-start: var(--space-8);
}

@media (max-width: 900px) {
  .article-doc__h2 {
    font-size: var(--fs-h3);
  }
}
@media (max-width: 640px) {
  .article-doc {
    padding: var(--space-6);
  }
}
.article-doc > :first-child {
  margin-block-start: 0;
}

.article-doc .prose {
  max-width: none;
}

/* ---------------------------------------------------------------------------
   BLOCK — article-header  (NEW)
   The magazine's masthead. The title sets the heading font light and italic in
   Paragon blue per the design brief — one weight lighter than the store sets
   the same size, because the editorial side speaks more quietly than the shop.
   The byline sits under a hairline so the three facts read as furniture rather
   than as another line of the standfirst.
   --------------------------------------------------------------------------- */
/* ---------------------------------------------------------------------------
   BLOCK — article-header  (UPDATED — --on-image)
   The same masthead reversed for the hero. Title in panel white at medium
   weight — the styleguide's legibility exception for any title laid over
   photography — and still italic, so it is recognisably the magazine's.
   The kicker takes light blue, the editorial light accent, because Paragon
   blue is too dark to read on the scrim. Byline in mist over a quiet rule.
   --------------------------------------------------------------------------- */
.article-header {
  display: block;
}

.article-header__kicker {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: 1;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-brand);
}

.article-header__kicker a {
  color: var(--text-brand);
  text-decoration: none;
}

.article-header__kicker a:hover {
  color: var(--text-link-hover);
}

.article-header__kicker-sep {
  margin-inline: var(--space-2);
  color: var(--neutral-500);
}

.article-header__title {
  margin: var(--space-4) 0 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h1);
  font-weight: var(--fw-light);
  font-style: italic;
  line-height: var(--lh-heading);
  color: var(--text-brand);
}

.article-header__standfirst {
  max-width: var(--container-article);
  margin: var(--space-6) 0 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body-lg);
  font-weight: var(--fw-light);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.article-header__byline {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--space-2) var(--space-6);
  margin: var(--space-6) 0 0;
  padding: var(--space-4) 0 0;
  border-block-start: 1px solid var(--border-default);
  list-style: none;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

.article-header__author {
  font-weight: var(--fw-medium);
  color: var(--text-body);
}

@media (max-width: 900px) {
  .article-header__title {
    font-size: var(--fs-h2);
  }
}
@media (max-width: 640px) {
  .article-header__title {
    font-size: var(--fs-h3);
  }
  .article-header__standfirst {
    font-size: var(--fs-body);
  }
}
.article-header--on-image .article-header__kicker,
.article-header--on-image .article-header__kicker a {
  color: var(--paragon-300);
}

.article-header--on-image .article-header__kicker a:hover {
  color: var(--text-on-brand);
}

.article-header--on-image .article-header__title {
  font-weight: var(--fw-medium);
  color: var(--text-on-brand);
}

.article-header--on-image .article-header__standfirst {
  color: var(--text-on-brand);
}

.article-header--on-image .article-header__byline {
  border-block-start-color: var(--neutral-600);
  color: var(--text-on-chrome);
}

.article-header--on-image .article-header__author {
  color: var(--text-on-brand);
}

/* ---------------------------------------------------------------------------
   BLOCK — article-hero  (NEW, layout)
   The article's key art, edge to edge, and it IS the article's header: 60%
   of the viewport tall, a charcoal scrim rising from the bottom (the chrome
   colour, never a colour cast), and on it — bottom left, on the reading
   column's text edge — the breadcrumbs, the masthead and the byline. On a
   review the score meter sits at the right, over the rail column, with
   "Jump to verdict" beneath it.

   The frame inside is the article-layout's own two columns, so the title
   lands exactly above the first line of the article and the meter exactly
   above the rail's first panel. The bottom padding reserves the overlap the
   reading card pulls up into, plus a gap, so no text is ever under the card.

   Only used when the featured image is at least ~1600px wide. Smaller art
   falls back to the contained layout: header in the card, article-lead
   inside the column.
   --------------------------------------------------------------------------- */
.article-hero {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  min-height: 60vh;
  overflow: hidden;
  background-color: var(--bg-chrome);
}

.article-hero__media {
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center 55%;
}

.article-hero__scrim {
  position: absolute;
  inset: 0;
  background-image: linear-gradient(90deg, color-mix(in srgb, var(--bg-chrome) 80%, transparent) 0%, color-mix(in srgb, var(--bg-chrome) 65%, transparent) 35%, color-mix(in srgb, var(--bg-chrome) 25%, transparent) 60%, transparent 80%), linear-gradient(0deg, var(--bg-chrome) 0%, color-mix(in srgb, var(--bg-chrome) 88%, transparent) 22%, color-mix(in srgb, var(--bg-chrome) 55%, transparent) 52%, transparent 82%);
}

.article-hero__inner {
  position: relative;
  width: 100%;
  max-width: calc(var(--site-max-width) + var(--gutter-small) * 2);
  margin-inline: auto;
  padding: var(--space-16) var(--gutter-small) calc(var(--space-16) + var(--space-8) + var(--space-8));
}

.article-hero__frame {
  display: grid;
  grid-template-columns: minmax(0, calc(var(--container-article) + var(--space-card-padding) * 2)) var(--width-sidebar);
  justify-content: center;
  align-items: end;
  gap: var(--space-content-gap) var(--space-16);
}

.article-hero__head {
  min-width: 0;
  padding-inline: var(--space-card-padding);
}

.article-hero__series {
  margin-block-end: var(--space-4);
}

.article-hero__score {
  justify-self: end;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-3);
}

.article-hero__jump {
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-on-brand);
  text-decoration: none;
}

.article-hero__jump:hover {
  color: var(--paragon-300);
}

@media (max-width: 1100px) {
  .article-hero__frame {
    grid-template-columns: minmax(0, calc(var(--container-article) + var(--space-card-padding) * 2));
  }
  .article-hero__score {
    display: none;
  }
}
@media (max-width: 640px) {
  .article-hero {
    min-height: 55vh;
  }
  .article-hero__inner {
    padding: var(--space-12) var(--gutter-small) calc(var(--space-12) + var(--space-6));
  }
  .article-hero__scrim {
    background-image: linear-gradient(0deg, var(--bg-chrome) 0%, color-mix(in srgb, var(--bg-chrome) 85%, transparent) 30%, color-mix(in srgb, var(--bg-chrome) 60%, transparent) 100%);
  }
  .article-hero__head {
    padding-inline: 0;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — article-layout  (NEW, layout)
   The article's two columns inside the content column: the reading column
   (the reading measure plus the panel's padding either side, so the copy
   lands at 680) and the right rail at the styleguide's sidebar width, with a
   wide gutter so the rail never crowds the text. The pair is centred in the
   1400 column. --single spans the same frame as one column, so the bands
   after the article (buy it, tags and author, keep reading) share its edges.

   __rail is offset down by the breadcrumb trail's height so its first panel
   lines up with the top of the article panel, not with the breadcrumbs.
   __sticky is the part of the rail that stays in view: the rail as a whole is
   taller than a laptop window, so the verdict and the game's products scroll
   with the header they sit beside and the house advert pins beneath them.

   Below 1100px the rail is dropped: its panels move into the flow (the score
   strip under the byline, the products into Buy it) and nothing is sticky.
   __inflow carries anything that only appears once the rail has gone.
   --------------------------------------------------------------------------- */
/* ---------------------------------------------------------------------------
   BLOCK — article-layout  (UPDATED — --hero and __break)
   --hero lifts the whole frame 96px up into the bottom of the article hero,
   so the reading card and the rail's first panel both start on the key art
   and the page reads as one piece. It stacks above the hero, which is a
   positioned element and would otherwise paint over the overlap. The rail
   loses its breadcrumb offset because the breadcrumbs now live on the hero.

   __break is a row that spans the reading column AND the rail. The grid
   auto-places in source order, so a break between two segments of the
   article ends the rail above it and starts a fresh rail cell below it —
   the rail steps aside for the image rather than sitting under it. A rail
   cell stretches to its row, so a sticky panel in it pins for exactly the
   length of the segment beside it.
   --------------------------------------------------------------------------- */
.article-layout {
  display: grid;
  grid-template-columns: minmax(0, calc(var(--container-article) + var(--space-card-padding) * 2)) var(--width-sidebar);
  justify-content: center;
  gap: var(--space-content-gap) var(--space-16);
}

.article-layout--single {
  grid-template-columns: minmax(0, calc(var(--container-article) + var(--space-card-padding) * 2 + var(--space-16) + var(--width-sidebar)));
}

.article-layout__main {
  min-width: 0;
}

.article-layout__main > .breakout-figure,
.article-layout__main > .breakout-figure + .article-doc {
  margin-block-start: var(--space-content-gap);
}

.article-layout__after {
  margin-block-start: var(--space-content-gap);
}

.article-layout__rail {
  display: flex;
  flex-direction: column;
  gap: var(--space-content-gap);
  padding-block-start: calc(var(--fs-small) * var(--lh-heading) + var(--space-4));
}

.article-layout__sticky {
  position: sticky;
  inset-block-start: var(--space-6);
  display: flex;
  flex-direction: column;
  gap: var(--space-content-gap);
}

.article-layout__inflow {
  display: none;
}

@media (max-width: 1100px) {
  .article-layout {
    grid-template-columns: minmax(0, calc(var(--container-article) + var(--space-card-padding) * 2));
  }
  .article-layout--single {
    grid-template-columns: minmax(0, 1fr);
  }
  .article-layout__rail {
    display: none;
  }
  .article-layout__inflow {
    display: block;
  }
}
.article-layout--hero {
  position: relative;
  z-index: 1;
  margin-block-start: calc(-1 * (var(--space-16) + var(--space-8)));
}

.article-layout--hero .article-layout__rail {
  padding-block-start: 0;
}

.article-layout__break {
  grid-column: 1/-1;
  min-width: 0;
  margin-block: var(--space-6);
}

@media (max-width: 640px) {
  .article-layout--hero {
    margin-block-start: calc(-1 * var(--space-12));
  }
  .article-layout__break {
    margin-block: 0;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — article-lead  (NEW)
   The lead image INSIDE the reading column, replacing the full-bleed
   lead-image on article pages. Its height is set by the fold: at 1440 x 900,
   under the network header, title, standfirst and byline, an 8:3 image at the
   reading measure (255px) is the tallest that still lets the first paragraph
   land above the fold. 16:9 at this measure is 383px and pushes the opening
   paragraph below it. On a phone, where the fold is a different question, it
   returns to 16:9.
   --------------------------------------------------------------------------- */
.article-lead {
  margin: var(--space-6) 0 0;
}

.article-lead__media {
  display: block;
  width: 100%;
  aspect-ratio: 8/3;
  object-fit: cover;
  border-radius: var(--radius-card);
  background-color: var(--neutral-800);
}

.article-lead__caption {
  margin-block-start: var(--space-2);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

@media (max-width: 640px) {
  .article-lead__media {
    aspect-ratio: 16/9;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — article-masthead  (NEW)
   Sets the catalogue's article-header beside a compact score badge, so a
   review answers "is it any good?" in the same glance as its title without
   adding a line of height above the fold. The badge column is only as wide
   as the ring; with no badge (news, features) the header takes the width.
   --------------------------------------------------------------------------- */
.article-masthead {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: start;
  gap: var(--space-6);
}

@media (max-width: 1100px) {
  .article-masthead {
    grid-template-columns: minmax(0, 1fr);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — assurance-list  (NEW)
   The rows inside the Good to Know group: an outline icon in Paragon blue, a
   statement in the heading font at medium weight — the styleguide gives the
   heading font the trust statements — and one short slate line under it. Rows
   are divided by the hairline, as rows inside a panel are. Contents only: the
   surface is bordered-group, the brand's one labelled-panel treatment, as
   order-totals is for the summary above it.

   Deliberately not trust-strip: that is a row of separate cards on the
   canvas; this is a list inside one panel, at a sidebar's width.
   --------------------------------------------------------------------------- */
.assurance-list {
  margin: 0;
  padding: 0;
  list-style: none;
}

.assurance-list__item {
  display: flex;
  align-items: flex-start;
  gap: var(--space-3);
}

.assurance-list__item + .assurance-list__item {
  margin-block-start: var(--space-4);
  padding-block-start: var(--space-4);
  border-block-start: 1px solid var(--border-default);
}

.assurance-list__icon {
  flex: 0 0 auto;
  width: 28px;
  height: 28px;
  color: var(--text-brand);
}

.assurance-list__icon svg {
  display: block;
  width: 100%;
  height: 100%;
}

.assurance-list__title {
  display: block;
  font-family: var(--ff-heading);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.assurance-list__text {
  display: block;
  margin-block-start: var(--space-1);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-muted);
}

.assurance-list__text a {
  font-weight: var(--fw-medium);
  color: var(--text-link);
  text-decoration: none;
}

.assurance-list__text a:hover {
  color: var(--text-link-hover);
}

.atc__quantity {
  display: flex;
  align-items: stretch;
  border: 1px solid var(--border-input);
  border-radius: var(--radius-input);
  background-color: var(--bg-input);
}

.atc__quantity__button {
  width: 36px;
  padding: 0;
  border: 0;
  border-radius: var(--radius-btn);
  background-color: transparent;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-brand);
  cursor: pointer;
}

.atc__quantity__button:hover:not(:disabled) {
  background-color: var(--bg-card-hover);
}

.atc__quantity__button:disabled {
  color: var(--text-muted);
  cursor: default;
}

.atc__quantity__input {
  width: 52px;
  padding: var(--space-2) 0;
  border: 0;
  border-inline: 1px solid var(--border-input);
  border-radius: var(--radius-input);
  background-color: var(--bg-input);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-body);
  text-align: center;
  -moz-appearance: textfield;
}

.atc__quantity__input::-webkit-outer-spin-button, .atc__quantity__input::-webkit-inner-spin-button {
  margin: 0;
  -webkit-appearance: none;
}

/* ---------------------------------------------------------------------------
   BLOCK — basket  (NEW)
   The one white panel the old store's `cart.php` put every line on, with the
   delivery choice and the discount code inside it rather than in separate
   cards. Its parts are separated by the brand's hairline — rules are allowed
   INSIDE a panel; it is only between bands on the canvas that they are not.

   At phone width the panel dissolves and each of its parts becomes its own
   panel-white card, which is what the build brief means by "items stack as
   cards": the ground shows between them, so a long basket reads as a list of
   things rather than one tall sheet.
   --------------------------------------------------------------------------- */
.basket {
  padding: var(--space-card-padding);
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

.basket > * + * {
  margin-block-start: var(--space-6);
  padding-block-start: var(--space-6);
  border-block-start: 1px solid var(--border-default);
}

/* The column labels share the line's own track sizes, so the labels sit over
   the things they name whatever the titles do. */
.basket__columns {
  display: grid;
  grid-template-columns: 96px minmax(0, 1fr) 140px 120px;
  gap: var(--space-6);
  margin: 0;
  padding-block-end: var(--space-3);
  border-block-end: 1px solid var(--border-default);
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-muted);
}

.basket__columns + .basket__lines {
  margin-block-start: 0;
  padding-block-start: 0;
  border-block-start: 0;
}

.basket__column--product {
  grid-column: 1/3;
}

.basket__column--total {
  text-align: end;
}

.basket__lines {
  margin: 0;
  padding: 0;
  list-style: none;
}

.basket__item {
  padding-block: var(--space-6);
}

.basket__item + .basket__item {
  border-block-start: 1px solid var(--border-default);
}

.basket__item:last-child {
  padding-block-end: 0;
}

@media (max-width: 900px) {
  .basket__columns {
    display: none;
  }
  .basket__item:first-child {
    padding-block-start: 0;
  }
}
@media (max-width: 640px) {
  .basket {
    display: flex;
    flex-direction: column;
    gap: var(--space-4);
    padding: 0;
    background-color: transparent;
    border-radius: 0;
  }
  .basket > * + * {
    margin-block-start: 0;
    padding-block-start: 0;
    border-block-start: 0;
  }
  .basket__lines {
    display: flex;
    flex-direction: column;
    gap: var(--space-4);
  }
  .basket__item,
  .basket__section,
  .basket__foot {
    padding: var(--space-6);
    background-color: var(--bg-panel);
    border-radius: var(--radius-card);
  }
  .basket__item + .basket__item {
    border-block-start: 0;
  }
  .basket__item:first-child,
  .basket__item:last-child {
    padding-block: var(--space-6);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — basket  (EXTENDED — `basket--package`)
   The basket was one white panel; an order that ships in packages is now one
   panel PER PACKAGE, each opening with a package-head. The panel itself is
   unchanged. Two things the modifier adds:

   - The first line sits straight under the head. The unmodified panel only
     suppressed the line's top padding after its column labels; a package
     panel has no column labels (three sets, one per panel, read as a table
     repeated three times), so the head takes their place.
   - It does NOT dissolve at phone width. The unmodified basket breaks into one
     card per part there — right for a single sheet of lines, wrong for
     packages, which the brief says "stack as cards": a package IS the card,
     and breaking it up would leave its head on the bare canvas and lose which
     lines travel together.
   --------------------------------------------------------------------------- */
/* The lines list's own `margin: 0; padding: 0` comes after the panel's
   `> * + *` rhythm in source and ties it on specificity, so the hairline under
   the head would sit flush on the first line. Stated outright here. */
.basket--package .basket__lines {
  margin-block-start: var(--space-6);
  padding-block-start: var(--space-6);
}

.basket--package .basket__item:first-child {
  padding-block-start: 0;
}

@media (max-width: 640px) {
  .basket--package {
    display: block;
    padding: var(--space-6);
    background-color: var(--bg-panel);
    border-radius: var(--radius-card);
  }
  .basket--package > * + * {
    margin-block-start: var(--space-6);
    padding-block-start: var(--space-6);
    border-block-start: 1px solid var(--border-default);
  }
  .basket--package .basket__lines {
    display: block;
  }
  .basket--package .basket__item,
  .basket--package .basket__section,
  .basket--package .basket__foot {
    padding: 0;
    background-color: transparent;
    border-radius: 0;
  }
  .basket--package .basket__item {
    padding-block: var(--space-6);
  }
  .basket--package .basket__item + .basket__item {
    border-block-start: 1px solid var(--border-default);
  }
  .basket--package .basket__item:first-child {
    padding-block-start: 0;
  }
  .basket--package .basket__item:last-child {
    padding-block-end: 0;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — basket-line  (NEW)
   One line of the basket: the manufacturer shot on a square tile, the title in
   the commerce face at the product card's title size, the SKU and the stock
   state beneath it, the quantity stepper with a quiet Remove, and the line
   total. No per-line update button — changing the quantity updates the basket.

   The four tracks match `basket__columns` exactly, so the labels over them
   stay true. At tablet width the stepper and total drop to a second row under
   the title; at phone width the image shrinks and the same second row holds.
   --------------------------------------------------------------------------- */
.basket-line {
  display: grid;
  grid-template-columns: 96px minmax(0, 1fr) 140px 120px;
  align-items: start;
  gap: var(--space-6);
}

.basket-line__media {
  display: block;
  padding: var(--space-2);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-card);
  background-color: var(--bg-card);
}

.basket-line__media img {
  display: block;
  width: 100%;
  aspect-ratio: 1/1;
  object-fit: contain;
}

.basket-line__info {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  min-width: 0;
}

.basket-line__title {
  margin: 0;
  font-family: var(--ff-chrome);
  font-size: var(--fs-h4);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  letter-spacing: 0.01em;
}

.basket-line__title a {
  color: var(--text-heading);
  text-decoration: none;
}

.basket-line__title a:hover {
  color: var(--text-link);
}

.basket-line__sku {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
  overflow-wrap: anywhere;
}

.basket-line__stock {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.basket-line__stock-dot {
  flex: 0 0 auto;
  width: 8px;
  height: 8px;
  border-radius: var(--radius-pill);
  background-color: var(--color-positive);
}

.basket-line--out-of-stock .basket-line__stock-dot {
  background-color: var(--color-negative);
}

.basket-line__quantity {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--space-2);
}

.basket-line__remove {
  padding: 0;
  border: 0;
  background: none;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
  cursor: pointer;
}

.basket-line__remove:hover {
  color: var(--text-link);
}

.basket-line__total {
  margin: 0;
  font-family: var(--ff-chrome);
  font-size: var(--fs-h4);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  color: var(--text-body);
  text-align: end;
}

@media (max-width: 900px) {
  .basket-line {
    grid-template-columns: 96px minmax(0, 1fr) auto;
    row-gap: var(--space-4);
  }
  .basket-line__info {
    grid-column: 2/-1;
  }
  .basket-line__quantity {
    grid-column: 2;
    flex-direction: row;
    align-items: center;
    gap: var(--space-4);
  }
  .basket-line__total {
    grid-column: 3;
    align-self: center;
  }
}
@media (max-width: 640px) {
  .basket-line {
    grid-template-columns: 72px minmax(0, 1fr) auto;
    column-gap: var(--space-4);
  }
  .basket-line__title {
    font-size: var(--fs-body);
  }
  .basket-line__quantity {
    grid-column: 1/3;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — basket-line  (EXTENDED — `basket-line--pre-order`)
   A pre-order line reads `Pre-order` where a stocked line reads `In stock`,
   and its dot takes the brand blue: green says "on the shelf", which a
   pre-order is not, and red is reserved for out of stock and errors.
   --------------------------------------------------------------------------- */
.basket-line--pre-order .basket-line__stock-dot {
  background-color: var(--color-brand);
}

/* ---------------------------------------------------------------------------
   BLOCK — basket-notice  (NEW)
   One standing line about the whole basket — that it ships in several
   packages, or the dispatch rule — on its own slim panel-white card, because
   the design brief does not let content sit on the canvas however slight it
   is. An outline icon in Paragon blue, the line at body size, and an optional
   quieter second line for the detail that qualifies it.
   --------------------------------------------------------------------------- */
.basket-notice {
  display: flex;
  align-items: flex-start;
  gap: var(--space-3);
  padding: var(--space-4) var(--space-6);
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

.basket-notice__icon {
  flex: 0 0 auto;
  width: 24px;
  height: 24px;
  margin-block-start: 0.1em;
  color: var(--text-brand);
}

.basket-notice__icon svg {
  display: block;
  width: 100%;
  height: 100%;
}

.basket-notice__text {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.basket-notice__detail {
  display: block;
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  color: var(--text-muted);
}

/* ---------------------------------------------------------------------------
   BLOCK — bordered-group  (NEW)
   A labelled panel: a full-width title bar over a bordered white body. This is
   the same construction as `widget` — the brand's sidebar furniture — reused
   here on purpose so the brand carries ONE labelled-panel treatment rather
   than two similar ones. Operator, 2026-09-14. Paragon blue by default,
   --negative for a validation summary, --positive for a confirmation; colour
   is the only thing the modifiers change.
   --------------------------------------------------------------------------- */
.bordered-group {
  border: 2px solid var(--border-brand);
  border-radius: var(--radius-card);
  background-color: var(--bg-panel);
  overflow: hidden;
}

.bordered-group__title {
  margin: 0;
  padding: var(--space-3) var(--space-6);
  background-color: var(--color-brand);
  font-family: var(--ff-heading);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-on-brand);
}

.bordered-group__body {
  padding: var(--space-6);
}

.bordered-group__text {
  margin: 0;
  max-width: var(--container-reading);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.bordered-group--negative {
  border-color: var(--color-negative);
}

.bordered-group--negative .bordered-group__title {
  background-color: var(--color-negative);
}

/* An error summary carries `role="alert"` and `tabindex="-1"`, and WooCommerce's script
   moves focus to it on load so a screen reader announces it. Nobody tabbed there, so the
   browser's focus ring would only draw a dark line over the red border — the panel IS
   the signal. Scoped to tabindex -1, which the keyboard can never reach (MPG13 wiring). */
.bordered-group[tabindex="-1"]:focus {
  outline: none;
}

.bordered-group--positive {
  border-color: var(--color-positive);
}

.bordered-group--positive .bordered-group__title {
  background-color: var(--color-positive);
}

.brand-list {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-6);
  padding: var(--space-card-padding);
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

.brand-list__item {
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-body);
  text-decoration: none;
  white-space: nowrap;
}

.brand-list__item:hover {
  color: var(--text-link);
}

@media (max-width: 640px) {
  .brand-list {
    justify-content: flex-start;
    gap: var(--space-4);
  }
}
.breadcrumbs {
  margin: 0 0 var(--space-4);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

.breadcrumbs p {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--space-2);
  margin: 0;
}

.breadcrumbs a {
  color: var(--text-muted);
  text-decoration: none;
}

.breadcrumbs a:hover {
  color: var(--text-link-hover);
}

.breadcrumbs .last {
  color: var(--text-body);
}

.breadcrumbs .separator {
  color: var(--neutral-500);
}

.breadcrumbs--on-image,
.breadcrumbs--on-image a,
.breadcrumbs--on-image .last {
  color: var(--text-on-chrome);
}

.breadcrumbs--on-image .separator {
  color: var(--neutral-600);
}

.breadcrumbs--on-image a:hover {
  color: var(--text-on-brand);
}

/* ---------------------------------------------------------------------------
   BLOCK — breakout-figure  (NEW)
   An in-body image that runs wider than the reading column, so a long
   article does not read as one grey strip. Sits in article-layout__break.

   --wide spans the reading column and the rail: the image inside a panel-
   white frame at the surface radius with its caption on the panel beneath —
   the category banner's construction, so the caption never sits on the
   canvas. --bleed runs edge to edge, like the hero: no radius (it has no
   edge to round), and the caption on a charcoal foot scrim, aligned to the
   reading column's text edge. On a phone both go to the full screen width.
   --------------------------------------------------------------------------- */
.breakout-figure {
  margin: 0;
}

.breakout-figure__media {
  display: block;
  width: 100%;
  object-fit: cover;
  background-color: var(--neutral-800);
}

.breakout-figure__caption {
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
}

.breakout-figure--wide {
  overflow: hidden;
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
}

.breakout-figure--wide .breakout-figure__media {
  aspect-ratio: 12/5;
}

.breakout-figure--wide .breakout-figure__caption {
  max-width: calc(var(--container-article) + var(--space-card-padding) * 2);
  padding: var(--space-4) var(--space-card-padding);
  color: var(--text-muted);
}

.breakout-figure--bleed {
  position: relative;
  width: 100vw;
  margin-inline: calc(50% - 50vw);
}

.breakout-figure--bleed .breakout-figure__media {
  aspect-ratio: 3/1;
  min-height: 360px;
  max-height: 80vh;
}

.breakout-figure--bleed .breakout-figure__caption {
  position: absolute;
  inset-inline: 0;
  inset-block-end: 0;
  padding-block: var(--space-16) var(--space-6);
  padding-inline: calc(max(var(--gutter-small), (100% - (var(--container-article) + var(--space-card-padding) * 2 + var(--space-16) + var(--width-sidebar))) / 2) + var(--space-card-padding));
  background-image: linear-gradient(0deg, color-mix(in srgb, var(--bg-chrome) 90%, transparent) 0%, transparent 100%);
  color: var(--text-on-brand);
}

@media (max-width: 1100px) {
  .breakout-figure--bleed .breakout-figure__caption {
    padding-inline: calc(max(var(--gutter-small), (100% - (var(--container-article) + var(--space-card-padding) * 2)) / 2) + var(--space-card-padding));
  }
}
@media (max-width: 640px) {
  .breakout-figure--wide {
    width: 100vw;
    margin-inline: calc(50% - 50vw);
    border-radius: 0;
  }
  .breakout-figure--wide .breakout-figure__media {
    aspect-ratio: 4/3;
  }
  .breakout-figure--wide .breakout-figure__caption {
    padding-inline: var(--gutter-small);
  }
  .breakout-figure--bleed .breakout-figure__media {
    aspect-ratio: 4/3;
    min-height: 0;
  }
  .breakout-figure--bleed .breakout-figure__caption {
    padding: var(--space-12) var(--gutter-small) var(--space-4);
  }
}
.breakout-figure--column {
  overflow: hidden;
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

.breakout-figure--column .breakout-figure__media {
  height: auto;
}

.breakout-figure--column .breakout-figure__caption {
  padding: var(--space-4) var(--space-card-padding);
  color: var(--text-muted);
}

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  padding-block: var(--space-3);
  padding-inline: var(--space-6);
  border: 0;
  border-radius: var(--radius-btn);
  box-shadow: var(--shadow-card);
  font-family: var(--ff-heading);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  text-align: center;
  text-decoration: none;
  cursor: pointer;
}

.btn--primary {
  background-color: var(--btn-primary-bg);
  color: var(--btn-primary-text);
}

.btn--primary:hover {
  background-color: var(--btn-primary-bg-hover);
  color: var(--btn-primary-text);
}

.btn--commerce {
  background-color: var(--btn-primary-bg);
  color: var(--btn-primary-text);
  font-family: var(--ff-chrome);
  font-weight: var(--fw-bold);
  font-style: italic;
  font-size: var(--fs-body);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  padding-inline: var(--space-4);
}

.btn--commerce:hover {
  background-color: var(--btn-primary-bg-hover);
  color: var(--btn-primary-text);
}

.btn--block {
  width: 100%;
}

/* ---------------------------------------------------------------------------
   BLOCK — buy-box  (UPDATED — a delivery line, a was-price, no invented promise)
   The one region that decides whether the store trades.

   THREE CHANGES from the first draft, each of them a fact rather than a taste:

   1. The dispatch line said "Order before 2pm for same-day dispatch". Nothing
      in the migrated data supports it and no operator stated it, so it is
      gone. Its place is taken by a DELIVERY line read from the product's
      shipping class, which is where this brand keeps delivery windows —
      operator-editable term meta, one value per class. All eleven classes are
      currently empty, so the mockup shows the shape with a marked placeholder
      rather than a number nobody has agreed.

      The class names are SUPPLIER names (Spire Technology, Exertis UK, Target
      Components). The shopper sees the window, never the supplier.

   2. A was-price and a saving, for the 348 products of 3,912 that carry a sale
      price. Absent on the other 91%, where the price stands alone.

   3. No rating and no review count anywhere. Every product in the catalogue
      reads zero reviews and zero average rating — not low, nil — so there is
      nothing to show and no empty state worth printing on 3,912 pages.
   --------------------------------------------------------------------------- */
.buy-box {
  display: flex;
  flex-direction: column;
  gap: var(--space-6);
}

.buy-box__prices {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--space-3);
}

.buy-box__price {
  margin: 0;
  font-family: var(--ff-chrome);
  font-size: var(--fs-h2);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  letter-spacing: 0.01em;
  color: var(--text-body);
}

.buy-box__was {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  line-height: var(--lh-heading);
  color: var(--text-muted);
  text-decoration: line-through;
}

.buy-box__save {
  padding: var(--space-1) var(--space-3);
  border-radius: var(--radius-pill);
  background-color: var(--color-brand);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-body);
  color: var(--text-on-brand);
}

.buy-box__facts {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

.buy-box__stock {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.buy-box__stock-dot {
  flex: 0 0 auto;
  width: 8px;
  height: 8px;
  border-radius: var(--radius-pill);
  background-color: var(--color-positive);
}

.buy-box--out-of-stock .buy-box__stock-dot {
  background-color: var(--color-negative);
}

.buy-box__delivery {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.buy-box__delivery-icon {
  flex: 0 0 auto;
  width: 40px;
  height: 40px;
  color: var(--text-brand);
}

.buy-box__delivery-icon svg {
  width: 100%;
  height: 100%;
}

.buy-box__purchase {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

.buy-box__quantity {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-3);
}

/* The stock state qualifies the control beside it rather than the product above
   it, so it rides the quantity row and sits at its end. `auto` rather than
   space-between, so the label and stepper stay together when the row is wide. */
.buy-box__quantity .buy-box__stock {
  margin-inline-start: auto;
}

.buy-box__quantity-label {
  font-family: var(--ff-heading);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.buy-box__actions {
  display: flex;
  align-items: stretch;
  gap: var(--space-2);
}

.buy-box__actions .btn {
  flex: 1 1 auto;
}

.buy-box__wishlist {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 46px;
  padding: 0;
  border: 1px solid var(--border-default);
  border-radius: var(--radius-btn);
  background-color: var(--bg-card);
  color: var(--text-brand);
  cursor: pointer;
}

.buy-box__wishlist:hover {
  border-color: var(--border-brand);
  background-color: var(--bg-card-hover);
}

.buy-box__wishlist svg {
  width: 26px;
  height: 26px;
}

.buy-box__pay-later {
  display: block;
}

.buy-box__pay-later-label {
  display: block;
  margin: 0 0 var(--space-2);
  font-family: var(--ff-heading);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-muted);
}

.buy-box__instalments {
  flex-basis: 100%;
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-muted);
}

.buy-box__loyalty {
  display: flex;
  align-items: center;
  gap: var(--space-3);
}

.buy-box__loyalty-icon {
  flex: 0 0 auto;
  width: 34px;
  height: 34px;
  color: var(--text-brand);
}

.buy-box__loyalty-icon svg {
  width: 100%;
  height: 100%;
}

.buy-box__figure {
  font-family: var(--ff-body);
  font-weight: var(--fw-medium);
}

/* ---------------------------------------------------------------------------
   PAGE LAYOUT — the shell, the rail and the region grids.

   BUILT 2026-09-15 from six pieces of operator feedback, after three designs
   were rejected. Each of the six is answered in one place and the place is
   named, so a later session can see which choices are load-bearing:

   1. The short description goes BEFORE the buy box    → .buy-region__summary
   2. Loyalty points sit AFTER the buy box             → .buy-region__summary
   3. Stat pills live inside the product description   → .doc-figures
   4. The description takes the live site's column     → .store-layout
   5. Add to Basket never wraps to two lines           → .btn--commerce, .route-row
   6. The navigation rail comes back, desktop only     → .store-layout__sidebar

   THE COLUMN IS 1042px AND THAT IS THE POINT OF (4). It is what the live store
   gives its content: a 1400 page, a 328 rail, a 30 gap. Three drafts put the
   description at 680 or 740 because that is the styleguide's READING measure,
   and all three read as cramped — because the measure was set for editorial
   pages, where prose is alone on the page. A product description is not alone:
   it carries stat blocks, spec tables and feature rows, and it wants the room
   the store already gives it. The 680 measure still governs article pages.
   --------------------------------------------------------------------------- */
.page__inner {
  max-width: calc(var(--site-max-width) + var(--gutter-small) * 2);
  margin-inline: auto;
  padding-inline: var(--gutter-small);
}

/* ---- the buying region ----------------------------------------------------

   TWO PANELS, NOT ONE. The gallery and the summary carry very different
   amounts, and a single panel spanning both would be as tall as the taller and
   show the difference as empty white — the fault that sank the first two
   drafts. Sized separately they each end where their content ends, and what
   shows beneath the shorter one is the page's own ground.
   --------------------------------------------------------------------------- */
.buy-region {
  display: flex;
  flex-direction: column;
  gap: var(--space-content-gap);
}

/* The two halves of the one panel. There is no grey between them — the panel's
   own padding is the outer edge and this gap is the only separation, which is
   what makes them read as one card rather than two. */
.buy-region__grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  align-items: start;
  gap: var(--space-content-gap);
}

/* The pay-later and loyalty cards, on the ground beneath, one under each half. */
.buy-region__cards {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-content-gap);
}

/* (1) and (2) are both this stack's ORDER, and it is the whole of what they
   asked for: title, then the short description, then the buy box, then the
   loyalty panel, then the identity line. The loyalty group used to be nested
   inside the buy box at its foot; it is now its own panel after it, which is
   also why it can keep the labelled-panel treatment without being a box inside
   a box inside a box. */
.buy-region__summary {
  display: flex;
  flex-direction: column;
  gap: var(--space-6);
}

@media (max-width: 900px) {
  .buy-region__grid,
  .buy-region__cards {
    grid-template-columns: minmax(0, 1fr);
  }
}
/* The identity line closes the hero card, running its whole width. Brand, SKU,
   manufacturer part and barcode then sit on ONE line — in a half-width column
   they wrapped to two, which is what made the gallery side the taller half. */
.buy-region .description-panel > .decision__identity {
  margin-block-start: var(--space-6);
}

.card-line {
  display: block;
  margin-block-start: var(--space-3);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-body);
}

/* ---------------------------------------------------------------------------
   CATEGORY EDITORIAL  (NEW, layout)
   The category's own long-form copy, alternating text and photograph down the
   page. It is what a category page competes on: the grid answers "show me
   controllers", this answers "which controller should I buy", which is the
   query with the volume behind it.

   IT IS NOT THE POLICY BAND IN A BIGGER FORMAT. The band below repeats on
   every archive and stays short on purpose; this is unique per category and is
   the content that carries the page. Source is the category's own
   `bottom_content_page`, which holds real migrated copy on 33 of 284
   categories — Controllers runs to about a thousand words under one h2 and
   three h3s, which is exactly this shape.

   The panels reuse `feature-panel` from the catalogue, alternating with its
   own `--reverse` modifier. No new block.
   --------------------------------------------------------------------------- */
.category-editorial {
  display: flex;
  flex-direction: column;
  gap: var(--space-12);
  padding: var(--space-card-padding);
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

.category-editorial__lede {
  margin: 0;
  max-width: var(--container-reading);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  line-height: var(--lh-body);
  color: var(--text-body);
}

/* ---- category-header (reused from the brand catalogue, verbatim) ---- */
/* ---------------------------------------------------------------------------
   BLOCK — category-header  (NEW)
   The hero that heads every category page: a wide photographic banner carrying
   the category name, with the intro and the store's four promises beneath it
   on white. Chosen by the operator 2026-09-14 over a photograph-beside-copy
   treatment, which is kept on record because it is what works when a category
   owns only a cut-out rather than a scene.

   The banner needs a DARK, WIDE image. The one here is real — a controller in
   low light, 2560x1082 — but it is attached to a product, not to the category,
   so the template needs a category banner field of its own rather than a
   photograph picked at random from the catalogue.

   Text over photography is carried by a scrim rising from the foot of the
   banner, which is the same rule the homepage hero already follows.
   --------------------------------------------------------------------------- */
/* ---- shared over-image typography ---- */
.category-header__title {
  margin: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h1);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-on-brand);
}

/* ---- H: banner over copy ---- */
.category-header {
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  overflow: hidden;
}

.category-header__banner {
  position: relative;
  display: flex;
  align-items: flex-end;
  min-height: 220px;
  background-color: var(--bg-chrome);
}

.category-header__media {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.category-header__scrim {
  position: absolute;
  inset: 0;
  background-image: linear-gradient(0deg, var(--bg-overlay) 0 46%, transparent 90%);
}

.category-header__title {
  position: relative;
  padding: var(--space-6) var(--space-card-padding);
}

.category-header__body {
  padding: var(--space-6) var(--space-card-padding);
}

.category-header__intro {
  margin: 0;
  max-width: var(--container-reading);
  font-family: var(--ff-body);
  font-size: var(--fs-body-lg);
  font-weight: var(--fw-light);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.category-header__promises {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-3) var(--space-8);
  margin: var(--space-4) 0 0;
  padding: var(--space-4) 0 0;
  border-block-start: 1px solid var(--border-default);
  list-style: none;
}

/* ---- the promise row ---- */
.category-header__promise {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  min-width: 0;
}

.category-header__promise-icon {
  flex: 0 0 auto;
  width: 24px;
  height: 24px;
  color: var(--text-brand);
}

.category-header__promise-icon svg {
  width: 100%;
  height: 100%;
}

.category-header__promise-label {
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-body);
  white-space: nowrap;
}

/* White on the photograph. Written as a descendant so it outranks the shared
   promise rule below rather than tying it and losing on source order. */
.category-header__banner .category-header__title {
  color: var(--text-on-brand);
}

.category-tile {
  position: relative;
  display: block;
  border-radius: var(--radius-card);
  overflow: hidden;
  background-color: var(--neutral-800);
  box-shadow: var(--shadow-card);
  text-decoration: none;
}

.category-tile__media {
  display: block;
  width: 100%;
  aspect-ratio: 3/2;
  object-fit: cover;
}

.category-tile--compact .category-tile__media {
  aspect-ratio: 4/3;
}

.category-tile__scrim {
  position: absolute;
  inset: 0;
  background-color: var(--bg-overlay);
}

.category-tile__title {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  padding-inline: var(--space-6);
  font-family: var(--ff-heading);
  font-size: var(--fs-h4);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-on-brand);
  text-align: center;
}

.category-tile:hover .category-tile__title {
  color: var(--text-on-brand);
}

/* ---------------------------------------------------------------------------
   BLOCK — checkout-bar  (NEW)
   At phone width the Order Summary has dropped below the items, so the way on
   is pinned to the foot of the viewport with the total beside it — the shopper
   never has to scroll past a long basket to pay. Hidden above phone width,
   where the summary is sticky in its own column. The one place the brand's
   single shadow is used on this page: it is floating UI.

   --specimen pins it in the flow instead, so it can be judged at desktop in
   the approval strip. Not for production.
   --------------------------------------------------------------------------- */
.checkout-bar {
  position: fixed;
  inset-inline: 0;
  inset-block-end: 0;
  z-index: 20;
  display: none;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
  padding: var(--space-3) var(--gutter-small);
  background-color: var(--bg-panel);
  border-block-start: 1px solid var(--border-default);
  box-shadow: var(--shadow-1);
}

.checkout-bar__total {
  display: flex;
  flex-direction: column;
}

.checkout-bar__label {
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-muted);
}

.checkout-bar__value {
  font-family: var(--ff-chrome);
  font-size: var(--fs-h4);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.checkout-bar .btn {
  flex: 0 0 auto;
}

.checkout-bar--specimen {
  position: static;
  display: flex;
  max-width: 390px;
  border: 1px solid var(--border-default);
}

@media (max-width: 640px) {
  .checkout-bar {
    display: flex;
  }
}
/* DEPARTURE — the page-level rules the mockup kept outside any block, moved here
   because the bar is what creates the need: at phone width the bar replaces the
   summary's own action, and the page leaves room at its foot so the pinned bar
   never covers the last panel. Scoped with :has() so only a page carrying the
   bar is affected. */
@media (max-width: 640px) {
  .page__body:has(.checkout-bar) {
    padding-block-end: calc(var(--space-16) + var(--space-16));
  }
  .page__body:has(.checkout-bar) .order-totals__action {
    display: none;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — checkout-steps  (NEW)
   Where the shopper is in the order funnel: Basket, Details & Payment,
   Confirmation. On its own slim panel-white card, because the design brief
   does not let content sit on the canvas however slight it is.

   A step is a round indicator (round indicators take the pill radius) and a
   label, joined to the next step by the brand's hairline. A finished step is
   a Paragon-blue outline with a tick, its label a link back; the current step
   is filled Paragon blue, its label ink at medium weight; a step still to
   come is the hairline grey with a slate number. The rule out of a finished
   step takes the brand blue, so the line reads as travelled up to "you are
   here". No green: a finished step is not a confirmation.
   --------------------------------------------------------------------------- */
.checkout-steps {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  margin: 0;
  padding: var(--space-4) var(--space-6);
  list-style: none;
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

.checkout-steps__item {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  min-width: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

/* The joining rule fills whatever the step's own content leaves. */
.checkout-steps__item:not(:last-child)::after {
  content: "";
  flex: 1 1 auto;
  min-width: var(--space-4);
  margin-inline: var(--space-2) var(--space-4);
  border-block-start: 1px solid var(--border-default);
}

.checkout-steps__item--done:not(:last-child)::after {
  border-block-start-color: var(--border-brand);
}

.checkout-steps__marker {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border: 2px solid var(--border-default);
  border-radius: var(--radius-pill);
  background-color: var(--bg-panel);
  font-family: var(--ff-heading);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: 1;
  color: var(--text-muted);
}

.checkout-steps__marker svg {
  width: 14px;
  height: 14px;
}

.checkout-steps__item--done .checkout-steps__marker {
  border-color: var(--border-brand);
  color: var(--text-brand);
}

.checkout-steps__item--current .checkout-steps__marker {
  border-color: var(--border-brand);
  background-color: var(--color-brand);
  color: var(--text-on-brand);
}

.checkout-steps__label {
  flex: 0 1 auto;
  min-width: 0;
}

.checkout-steps__link {
  font-weight: var(--fw-medium);
  color: var(--text-link);
  text-decoration: none;
}

.checkout-steps__link:hover {
  color: var(--text-link-hover);
}

.checkout-steps__item--current .checkout-steps__label {
  font-weight: var(--fw-medium);
  color: var(--text-heading);
}

/* Phone: each step stacks its marker over its label and the joining rules
   stand down — three labels side by side at 390px have no room for them. */
@media (max-width: 640px) {
  .checkout-steps {
    gap: var(--space-2);
    padding: var(--space-3) var(--space-4);
  }
  .checkout-steps__item {
    flex-direction: column;
    align-items: center;
    gap: var(--space-2);
    font-size: var(--fs-small);
    text-align: center;
  }
  .checkout-steps__item:not(:last-child)::after {
    content: none;
  }
  .checkout-steps__marker {
    width: 28px;
    height: 28px;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — choice  (REUSED, verbatim)
   --------------------------------------------------------------------------- */
.choice {
  display: flex;
  align-items: flex-start;
  gap: var(--space-3);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-body);
  cursor: pointer;
}

.choice__control {
  appearance: none;
  -webkit-appearance: none;
  flex: 0 0 auto;
  width: 20px;
  height: 20px;
  margin: 0;
  margin-block-start: 0.3em;
  border: 1px solid var(--border-input);
  border-radius: var(--radius-input);
  background-color: var(--bg-input);
  background-repeat: no-repeat;
  background-position: center;
  cursor: pointer;
}

.choice__control[type=radio] {
  border-radius: var(--radius-pill);
}

.choice__control:checked {
  border-color: var(--color-brand);
  background-color: var(--color-brand);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3 8.4 L6.4 11.8 L13 4.6' fill='none' stroke='%23FFFFFF' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-size: 13px auto;
}

.choice__control[type=radio]:checked {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Ccircle cx='4' cy='4' r='4' fill='%23FFFFFF'/%3E%3C/svg%3E");
  background-size: 8px auto;
}

.choice__control:focus,
.choice__control:focus-visible,
.choice__control--focus {
  border-color: var(--border-focus);
  outline: 2px solid var(--border-focus);
  outline-offset: 2px;
}

.choice__control:disabled {
  background-color: var(--bg-page);
  border-color: var(--border-default);
  cursor: not-allowed;
}

.choice__control:disabled + .choice__label {
  color: var(--neutral-500);
}

.choice__label {
  min-width: 0;
}

.field--error .choice__control {
  border: 2px solid var(--color-negative);
}

/* ---------------------------------------------------------------------------
   BLOCK — code-disclosure  (NEW)
   "Have a discount code?" folded shut, opening the basket's own inline-form.
   Most shoppers at checkout have no code, and an open empty field at the
   moment of paying reads as "you are missing a discount". A real disclosure —
   `details` and `summary` — so it works with no script.

   Closed, it is one line of link-blue body text with the brand's chevron at
   the far end, pointing down; open, the chevron points up. The same chevron,
   turned the same way, as faq-accordion. Inside a sidebar the inline-form's
   two-track row is too wide, so the field and the button share the column —
   the field takes what the button leaves.
   --------------------------------------------------------------------------- */
.code-disclosure {
  margin: var(--space-4) 0 0;
  padding-block-start: var(--space-4);
  border-block-start: 1px solid var(--border-default);
}

.code-disclosure__summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  list-style: none;
  cursor: pointer;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-link);
}

.code-disclosure__summary::-webkit-details-marker {
  display: none;
}

.code-disclosure__summary::marker {
  content: "";
}

.code-disclosure__summary:hover {
  color: var(--text-link-hover);
}

.code-disclosure__summary:focus-visible {
  outline: 2px solid var(--border-focus);
  outline-offset: 2px;
}

.code-disclosure__marker {
  flex: 0 0 auto;
  display: inline-flex;
  width: 14px;
  height: 14px;
  color: var(--text-brand);
}

.code-disclosure__marker svg {
  width: 100%;
  height: 100%;
  transform: rotate(90deg);
}

.code-disclosure[open] .code-disclosure__marker svg {
  transform: rotate(-90deg);
}

.code-disclosure .inline-form {
  margin-block-start: var(--space-4);
}

.code-disclosure .inline-form__row {
  grid-template-columns: minmax(0, 1fr) auto;
}

/* ---------------------------------------------------------------------------
   BLOCK — confirm-hero  (NEW)
   The success state's opening: a brand photograph, darkened, carrying a green
   check mark, the thank-you title and the order line. The operator asked for
   "a bit more life"; the page still has to show what happens next above the
   fold on a 900px-tall laptop, so this is the compact cousin of the homepage's
   hero-slider rather than a copy of it — hero-slider is 1400 / 520 with a
   380px floor, and overlay-band and cta-band both floor at 300px or more before
   their aspect ratio adds height. None of them can be held to 300px without
   overriding the rule that defines them.

   What it takes from hero-slider, unchanged: the surface (card radius, the
   neutral-800 ground under the photograph, clipped), the leading-edge scrim at
   the same stops, the title in the heading font at medium weight — the
   styleguide's exception for a title over photography — and the lead in the
   body font, light, at the large size, both white. At phone width the scrim
   flips bottom-up and the text sits at the foot, as hero-slider does.

   Height: exactly 300px on desktop. The photograph is absolutely placed, so
   the image's own proportions never add height; the content is centred in
   the fixed box. At phone width the box grows with its text instead, from a
   320px floor, because a wrapped email address must never be clipped.

   The check mark is a round indicator, so it takes the pill radius, filled go
   green — the styleguide's colour for a positive confirmation — with a white
   tick. It is the only green on the hero.
   --------------------------------------------------------------------------- */
.confirm-hero {
  position: relative;
  display: flex;
  align-items: center;
  height: 300px;
  border-radius: var(--radius-card);
  overflow: hidden;
  background-color: var(--neutral-800);
  box-shadow: var(--shadow-card);
}

.confirm-hero__media {
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 50% 55%;
}

.confirm-hero__scrim {
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, var(--bg-overlay) 0%, var(--bg-overlay) 40%, transparent 78%);
}

.confirm-hero__content {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--space-3);
  max-width: 720px;
  padding: var(--space-8) var(--space-12);
  text-align: left;
}

.confirm-hero__mark {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 48px;
  height: 48px;
  margin-block-end: var(--space-1);
  border-radius: var(--radius-pill);
  background-color: var(--color-positive);
  color: var(--text-on-brand);
}

.confirm-hero__mark svg {
  width: 26px;
  height: 26px;
}

.confirm-hero__title {
  margin: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h1);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-on-brand);
}

.confirm-hero__lead {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body-lg);
  font-weight: var(--fw-light);
  line-height: var(--lh-body);
  color: var(--text-on-brand);
  overflow-wrap: anywhere;
}

@media (max-width: 900px) {
  .confirm-hero__content {
    padding: var(--space-6) var(--space-8);
    max-width: 75%;
  }
  .confirm-hero__title {
    font-size: var(--fs-h2);
  }
}
@media (max-width: 640px) {
  .confirm-hero {
    align-items: flex-end;
    height: auto;
    min-height: 320px;
  }
  /* The source photograph is square with white letterbox bars; at a near-square
     crop the scale keeps them out of frame. A properly cropped brand image at
     build makes this rule a no-op. */
  .confirm-hero__media {
    transform: scale(1.5);
  }
  .confirm-hero__scrim {
    background: linear-gradient(0deg, var(--bg-overlay) 0%, var(--bg-overlay) 55%, transparent 95%);
  }
  .confirm-hero__content {
    max-width: none;
    padding: var(--space-16) var(--space-6) var(--space-6);
    gap: var(--space-2);
  }
  .confirm-hero__mark {
    width: 40px;
    height: 40px;
  }
  .confirm-hero__mark svg {
    width: 22px;
    height: 22px;
  }
  .confirm-hero__title {
    font-size: var(--fs-h3);
  }
  .confirm-hero__lead {
    font-size: var(--fs-body);
  }
}
.content {
  width: 100%;
}

.content > :where(* + *) {
  margin-block-start: var(--space-6);
}

.content > .alignfull {
  width: auto;
  margin-inline: calc(var(--space-card-padding) * -1);
}

.content > .alignwide {
  width: auto;
  margin-inline: calc(var(--space-card-padding) * -0.5);
}

.count-list {
  margin: 0;
  padding: 0;
  list-style: none;
}

.count-list__item + .count-list__item {
  border-block-start: 1px solid var(--border-default);
}

.count-list__link {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-3);
  padding: var(--space-3) var(--space-6);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-body);
  text-decoration: none;
}

.count-list__link:hover {
  background-color: var(--bg-card-hover);
  color: var(--text-link);
}

/* The category name. The count is fixed and this half takes what is left, so the
   floor decides what happens to a long name in a 328px rail: wrap under itself,
   rather than hold the row open and push the count off the end of the panel.
   Category names here run to 'Gaming Chairs & Accessories' and longer. */
.count-list__label {
  min-width: 0;
}

.count-list__count {
  flex: 0 0 auto;
  font-size: var(--fs-small);
  color: var(--text-muted);
}

.count-list__link:hover .count-list__count {
  color: var(--text-link);
}

.count-list__item--current {
  border-inline-start: 3px solid var(--color-brand);
}

.count-list__item--current .count-list__link {
  padding-inline-start: calc(var(--space-6) - 3px);
  background-color: var(--bg-card-hover);
  font-weight: var(--fw-medium);
  color: var(--text-link);
}

.count-list__more {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-3) var(--space-6);
  border-block-start: 1px solid var(--border-default);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-link);
  text-decoration: none;
}

.count-list__more:hover {
  background-color: var(--bg-card-hover);
  color: var(--text-link-hover);
}

.count-list__more svg {
  flex: 0 0 auto;
  width: 14px;
  height: 14px;
}

/* ---------------------------------------------------------------------------
   BLOCK — cta-band  (NEW, layout)
   The band that closes a listing. The shopper has browsed and either found
   something or has not, and that is the point at which to offer the next step.

   It is image-led rather than tinted, and that is brand law rather than taste:
   this brand has one ground and bans alternating band tones, which is how most
   stores mark a section break. Here the break is carried by the photograph.

   A band, so it is the full width of the column it closes; a surface, so it
   takes the card radius like every other surface. The scrim is weighted to the
   leading edge on desktop and flipped bottom-up at phone width, the same way
   the brand's other overlaid image behaves. The title sets medium, which is
   the styleguide's legibility exception for a title laid over photography.
   --------------------------------------------------------------------------- */
.cta-band {
  position: relative;
  display: block;
  border-radius: var(--radius-card);
  overflow: hidden;
  background-color: var(--neutral-800);
}

.cta-band__media {
  display: block;
  width: 100%;
  aspect-ratio: 1400/420;
  min-height: 320px;
  object-fit: cover;
}

.cta-band__scrim {
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, var(--bg-overlay) 0%, var(--bg-overlay) 50%, transparent 90%);
}

.cta-band__content {
  position: absolute;
  inset-block: 0;
  inset-inline-start: 0;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  max-width: 620px;
  padding: var(--space-8) var(--space-12);
}

.cta-band__title {
  margin: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h2);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-on-brand);
}

.cta-band__text {
  margin: var(--space-3) 0 var(--space-6);
  font-family: var(--ff-body);
  font-size: var(--fs-body-lg);
  font-weight: var(--fw-light);
  line-height: var(--lh-body);
  color: var(--text-on-brand);
}

@media (max-width: 900px) {
  .cta-band__content {
    max-width: 75%;
    padding: var(--space-6) var(--space-8);
  }
  .cta-band__title {
    font-size: var(--fs-h3);
  }
  .cta-band__text {
    font-size: var(--fs-body);
  }
}
@media (max-width: 640px) {
  .cta-band__media {
    aspect-ratio: 3/4;
    min-height: 440px;
  }
  .cta-band__scrim {
    background: linear-gradient(0deg, var(--bg-overlay) 0%, var(--bg-overlay) 62%, transparent 96%);
  }
  .cta-band__content {
    justify-content: flex-end;
    max-width: none;
    padding: var(--space-6);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — decision  (NEW)
   The right-hand column of the header panel: who makes it, what it is, what it
   costs, whether it is here, when it arrives, and the basket — in that order,
   because that is the order the questions arrive in.

   It is a stack with a gap rather than a set of margins, so nothing inside it
   can tie the document's own rhythm rule and win on source order.
   --------------------------------------------------------------------------- */
.decision {
  display: flex;
  flex-direction: column;
  gap: var(--space-6);
}

/* Brand, SKU and manufacturer part, at the foot and deliberately quiet. A
   component buyer cross-references all three against a build list or a
   compatibility checker; the old store buried them in a tab. */
.decision__identity {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2) var(--space-6);
  padding-block-start: var(--space-4);
  border-block-start: 1px solid var(--border-default);
}

.decision__identity-pair {
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

.decision__identity-value {
  font-weight: var(--fw-medium);
  color: var(--text-body);
}

/* The identity line closes the hero card, running its whole width. Brand, SKU,
   manufacturer part and barcode then sit on ONE line — in a half-width column
   they wrapped to two, which is what made the gallery side the taller half. */
.buy-region .description-panel > .decision__identity {
  margin-block-start: var(--space-6);
}

/* ---------------------------------------------------------------------------
   BLOCK — delivery-options  (NEW)
   The delivery speeds, chosen in the basket rather than first met at checkout
   — the one thing the old store's basket did that most stores leave to the
   next page. Each method is a `choice` radio with its price set right, in the
   commerce face because it is a price. The selected method takes the brand's
   current-item wash, the same one the store navigation uses. The rows are a
   bordered group of list rows, so the outline takes the surface radius.
   --------------------------------------------------------------------------- */
.delivery-options {
  min-inline-size: 0;
  margin: 0;
  padding: 0;
  border: 1px solid var(--border-default);
  border-radius: var(--radius-card);
  overflow: hidden;
}

.delivery-options__legend {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

.delivery-options__item {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--space-4);
  padding: var(--space-3) var(--space-4);
  background-color: var(--bg-panel);
}

.delivery-options__item + .delivery-options__item {
  border-block-start: 1px solid var(--border-default);
}

.delivery-options__item--selected {
  background-color: var(--bg-card-hover);
  box-shadow: inset 3px 0 0 var(--border-brand);
}

.delivery-options__item .choice {
  flex: 1 1 auto;
}

.delivery-options__detail {
  display: block;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-muted);
}

.delivery-options__price {
  flex: 0 0 auto;
  font-family: var(--ff-chrome);
  font-size: var(--fs-body-lg);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-body);
  color: var(--text-body);
}

.delivery-options__scope {
  margin: 0 0 var(--space-4);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-muted);
}

.delivery-options__note {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  margin: var(--space-4) 0 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.delivery-options__note-icon {
  flex: 0 0 auto;
  width: 24px;
  height: 24px;
  color: var(--text-brand);
}

.description-panel {
  padding: var(--space-card-padding);
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

.description-panel__doc > * {
  margin-block: 0;
}

.description-panel__doc > * + * {
  margin-block-start: var(--space-8);
}

/* ---- doc-section (reused from the brand catalogue, verbatim) ---- */
/* ---------------------------------------------------------------------------
   BLOCK — doc-section  (NEW)
   A reference page is consulted, not read: a reader arrives from a support
   email at one section and never sees the rest. So a section is a real object
   rather than a heading followed by some paragraphs — it carries the id the
   contents list and the support email point at, and the scroll offset that
   stops the heading landing flush against the top of the viewport.

   Two gaps, and the difference between them is what makes the page scannable:
   a section and its neighbour are a section gap apart, the shapes inside one
   section a document gap apart. The document gap is the same one the brand's
   other documents already use, so a block written for an article or a product
   description states the right value and lands correctly in here too.

   The rhythm value is stated outright rather than reset to zero. The document
   container's `> * + *` rule is a single-class selector, so a bare `margin: 0`
   here would tie it and win on source order, landing every section flush
   against the last — the trap figure-row and pull-quote already document.

   The heading rule hands the space beneath a section title back to the title's
   own margin, so the heading binds to what it introduces instead of floating
   midway between two shapes. It carries two classes and wins outright.
   --------------------------------------------------------------------------- */
.doc-section {
  margin: var(--space-12) 0 0;
  scroll-margin-block-start: var(--space-12);
}

.doc-section > * + * {
  margin-block-start: var(--space-8);
}

.doc-section > .section-head + * {
  margin-block-start: 0;
}

@media (max-width: 640px) {
  .doc-section {
    margin-block-start: var(--space-8);
  }
}
.empty-state {
  padding: var(--space-16) var(--space-card-padding);
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
  text-align: center;
}

.empty-state__title {
  margin: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h2);
  font-weight: var(--fw-light);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.empty-state__text {
  max-width: var(--container-reading);
  margin: var(--space-4) auto 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-muted);
}

@media (max-width: 900px) {
  .empty-state {
    padding: var(--space-12) var(--space-6);
  }
  .empty-state__title {
    font-size: var(--fs-h3);
  }
}
/* --compact: an empty state standing in for ONE panel inside a column, not a whole
   result set — titled at card size so it never out-ranks the page title (operator
   review of MPG13). Ported for the account walk, MPG13. */
.empty-state--compact .empty-state__title {
  font-size: var(--fs-h3);
}

@media (max-width: 900px) {
  .empty-state--compact .empty-state__title {
    font-size: var(--fs-h4);
  }
}
/* The brand form specimen's error summary list (catalogue block `error-list`),
   pasted verbatim into MPG11 for the checkout's error state. */
.error-list {
  margin: 0;
  padding: 0;
  list-style: none;
}

.error-list__item {
  padding-block: var(--space-2);
}

.error-list__item + .error-list__item {
  border-block-start: 1px solid var(--border-default);
}

.error-list__link {
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-body);
  color: var(--text-link);
  text-decoration: none;
}

.error-list__link:hover {
  color: var(--text-link-hover);
}

/* ---------------------------------------------------------------------------
   BLOCK — express-checkout  (NEW)
   The fastest way through: Apple Pay and Google Pay, above the form, on its
   own slim panel-white card. An express payment supplies the shopper's name,
   email and address, so taking it skips the form entirely — which is why it
   sits first, and why the divider beneath it says what the form below is for.

   The two buttons are the one place on the page that does not wear the brand:
   the platforms require their own black button with a white mark, drawn here
   with the brand's own ink and panel white (the palette has both, so no value
   outside the seventeen is needed). Everything around them — the card, the
   eyebrow, the hairline divider — is the brand's. The buttons take the square
   control corner; Stripe's Express Checkout Element sets its buttons' corner
   from the Appearance API's border radius, so square is buildable.

   The buttons share the row equally in a flex row, so a device offering only
   one of them shows one full-width button with no gap; a device offering
   neither drops the whole card.
   --------------------------------------------------------------------------- */
.express-checkout {
  padding: var(--space-6) var(--space-card-padding);
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

.express-checkout__title {
  margin: 0 0 var(--space-4);
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-muted);
}

.express-checkout__buttons {
  display: flex;
  gap: var(--space-4);
}

.express-checkout__button {
  flex: 1 1 0;
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 0;
  height: 48px;
  padding: 0 var(--space-4);
  border: 0;
  border-radius: var(--radius-btn);
  background-color: var(--neutral-900);
  color: var(--neutral-50);
  cursor: pointer;
}

.express-checkout__button svg {
  display: block;
  width: auto;
  height: 22px;
}

.express-checkout__button:focus-visible {
  outline: 2px solid var(--border-focus);
  outline-offset: 2px;
}

.express-checkout__divider {
  display: flex;
  align-items: center;
  gap: var(--space-4);
  margin: var(--space-6) 0 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
  text-align: center;
}

.express-checkout__divider::before,
.express-checkout__divider::after {
  content: "";
  flex: 1 1 0;
  min-width: var(--space-4);
  border-block-start: 1px solid var(--border-default);
}

@media (max-width: 640px) {
  .express-checkout {
    padding: var(--space-4);
  }
  .express-checkout__buttons {
    gap: var(--space-3);
  }
  .express-checkout__divider {
    gap: var(--space-3);
  }
}
/* Wiring (MPG11): Stripe prints its own "— OR —" inside its button output and shows it
   with an inline `display` from its script; there is no hook to remove it, so the one
   `!important` on this page takes it down. The card's own divider says what the form
   below is for. */
.express-checkout__buttons #wc-stripe-express-checkout-button-separator {
  display: none !important;
}

/* ---- faq-accordion (reused from the brand catalogue, verbatim) ---- */
/* ---------------------------------------------------------------------------
   BLOCK — faq-accordion  (NEW)
   A real disclosure — `details` and `summary` — and not a styled list with a
   script on it. Three things follow from that and all three are requirements
   rather than preferences: it opens with no JavaScript, a search engine and a
   screen reader see every answer whether or not its row is open, and the
   platform's own fragment-reveal opens a closed row when a link points inside
   it.

   THE ID SITS ON THE ANSWER, not on the row and not on the question. The
   reveal only fires for a target inside the disclosure, and a summary is
   already visible so it does not count — an id on the question scrolls to a
   row that is still shut. On the answer it opens, which is the whole point: a
   support email pointing at one question must not land on a closed page. The
   answer then carries a scroll offset a little deeper than the height of the
   row above it, so the question it belongs to lands on screen with it.

   THE CLOSED ROW — the question at the brand's in-document sub-heading
   setting, a chevron at the far end, a hairline to the next row and nothing
   else. No ground, no border, no box: six questions in a row of boxes reads as
   six cards, and these are one list.

   THE MARKER — the brand's own chevron, the one section-link and count-list
   carry, turned to point down. Down is already how this brand says a thing
   opens: it is the mark on every item in the main navigation and on every bar
   in the store sidebar. It sits at the far end of the row rather than in front
   of the question, so the questions stay flush left and scannable as a column
   of sentences; a leading marker would also collide with the dots the nested
   list puts in that same position elsewhere on the page. Open, it points up.

   THE OPEN ROW — the row differs by more than height, because a reader who has
   scrolled past the summary needs to know which question the answer belongs
   to. It takes the brand's current-item marking exactly as the store sidebar
   and count-list already define it: the blue-tint wash across the whole row,
   the three-pixel Paragon-blue rule on the leading edge, and the question in
   Paragon blue. The rule is paid for out of the row's own padding, so an open
   row is the same width as a closed one and nothing shifts as it opens.

   Hover is the same wash without the rule — a row about to be opened,
   previewing the state it is heading for.

   The measure is the reading measure plus the row's padding: a question is a
   sentence and an answer is a paragraph, so both are read along, not across.
   --------------------------------------------------------------------------- */
.faq-accordion {
  max-width: calc(var(--container-reading) + var(--space-4) * 2);
  /* The rhythm value stated outright — see doc-section. */
  margin: var(--space-8) 0 0;
  border-block: 1px solid var(--border-default);
}

.faq-accordion__item + .faq-accordion__item {
  border-block-start: 1px solid var(--border-default);
}

.faq-accordion__summary {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--space-6);
  padding: var(--space-4);
  list-style: none;
  cursor: pointer;
}

/* The browser's own disclosure triangle, removed in both dialects. */
.faq-accordion__summary::-webkit-details-marker {
  display: none;
}

.faq-accordion__summary::marker {
  content: "";
}

.faq-accordion__summary:hover {
  background-color: var(--bg-card-hover);
}

.faq-accordion__summary:focus-visible {
  outline: 2px solid var(--border-focus);
  outline-offset: -2px;
}

.faq-accordion__question {
  margin: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h4);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.faq-accordion__marker {
  flex: 0 0 auto;
  display: inline-flex;
  width: 16px;
  height: 16px;
  margin-block-start: 0.3em;
  color: var(--text-brand);
}

.faq-accordion__marker svg {
  width: 100%;
  height: 100%;
  transform: rotate(90deg);
}

.faq-accordion__answer {
  padding: 0 var(--space-4) var(--space-6);
  scroll-margin-block-start: var(--space-16);
}

.faq-accordion__item[open] {
  background-color: var(--bg-card-hover);
  border-inline-start: 3px solid var(--color-brand);
}

/* The leading rule is paid for out of the row's own start padding, so an open
   row is exactly the width of a closed one — the trick count-list already uses
   to mark its current item. */
.faq-accordion__item[open] .faq-accordion__summary,
.faq-accordion__item[open] .faq-accordion__answer {
  padding-inline-start: calc(var(--space-4) - 3px);
}

.faq-accordion__item[open] .faq-accordion__question {
  color: var(--text-link);
}

.faq-accordion__item[open] .faq-accordion__marker svg {
  transform: rotate(-90deg);
}

@media (max-width: 640px) {
  .faq-accordion__summary {
    gap: var(--space-4);
    padding-inline: var(--space-3);
  }
  .faq-accordion__item[open] .faq-accordion__summary,
  .faq-accordion__item[open] .faq-accordion__answer {
    padding-inline-start: calc(var(--space-3) - 3px);
  }
  .faq-accordion__question {
    font-size: var(--fs-body);
  }
  .faq-accordion__answer {
    padding-inline: var(--space-3);
  }
}
.feature-panel {
  display: grid;
  grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
  align-items: center;
  gap: var(--space-8);
}

.feature-panel--reverse {
  grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);
}

.feature-panel__media {
  display: block;
  width: 100%;
  aspect-ratio: 3/2;
  object-fit: contain;
  background-color: var(--bg-panel);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-card);
}

.feature-panel--reverse .feature-panel__media {
  order: 2;
}

/* The text half. Placed by the track, so no layout here either — only the floor
   that stops a long word in migrated category copy from widening the column past
   its share of the panel and squeezing the render beside it. */
.feature-panel__body {
  min-width: 0;
}

.feature-panel__title {
  margin: 0 0 var(--space-3);
  font-family: var(--ff-heading);
  font-size: var(--fs-h4);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.feature-panel__text {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-body);
}

@media (max-width: 768px) {
  .feature-panel,
  .feature-panel--reverse {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--space-6);
  }
  .feature-panel--reverse .feature-panel__media {
    order: 0;
  }
  .feature-panel__media {
    aspect-ratio: 16/9;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — featured-product  (NEW)
   The range's one rotating slot: a single product given the room a band would
   normally give a grid — manufacturer shot on panel white beside a label, the
   name, the price, one line of copy, the stock fact and one action.

   Authored rather than reused, and the two near misses are worth recording.
   promo-tile has the proportions the build brief points at, but it lays its
   copy over a photograph and carries neither a price nor a button — and this
   brand's product imagery is a manufacturer shot on white that is never cropped
   into a scene. product-card carries every field except the line of copy, but a
   product-card at the full width of the column reads as a product grid holding
   one item, which is the one thing this page must not become.

   The label is the whole point of the slot. One day it reads 'Our Best Seller'
   and the copy is about how many have sold; the next it reads 'Worth A Look'
   and the copy is about a product nobody has bought yet. Same block, same
   geometry, different promise — the words carry the difference, so the operator
   can rotate the slot without the page changing shape underneath them.

   Large promotional copy sets the body font at 18px light, per the styleguide.
   --------------------------------------------------------------------------- */
.featured-product {
  display: grid;
  grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
  align-items: center;
  gap: var(--space-12);
  padding: var(--space-card-padding);
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

.featured-product__media {
  display: block;
  background-color: var(--bg-panel);
}

.featured-product__media img {
  display: block;
  width: 100%;
  aspect-ratio: 4/3;
  object-fit: contain;
}

/* The copy half. The track places it; this is the floor that keeps a product name
   inside the column rather than letting it widen past its 3fr share and take the
   manufacturer shot's width with it. */
.featured-product__body {
  min-width: 0;
}

.featured-product__eyebrow {
  margin: 0 0 var(--space-3);
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: 1;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-brand);
}

.featured-product__title {
  margin: 0;
  font-family: var(--ff-chrome);
  font-size: var(--fs-h3);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  letter-spacing: 0.01em;
}

.featured-product__title a {
  color: var(--text-heading);
  text-decoration: none;
}

.featured-product__title a:hover {
  color: var(--text-link);
}

.featured-product__price {
  margin: var(--space-3) 0 0;
  font-family: var(--ff-chrome);
  font-size: var(--fs-h2);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.featured-product__text {
  margin: var(--space-4) 0 0;
  max-width: var(--container-reading);
  font-family: var(--ff-body);
  font-size: var(--fs-body-lg);
  font-weight: var(--fw-light);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.featured-product__meta {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  margin: var(--space-4) 0 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  color: var(--text-muted);
}

.featured-product__stock-dot {
  flex: 0 0 auto;
  width: 8px;
  height: 8px;
  border-radius: var(--radius-pill);
  background-color: var(--color-positive);
}

.featured-product__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-4);
  margin-block-start: var(--space-6);
}

/* section-link is built to close a band, so it carries a top margin and sets
   medium. Beside a button it is neither — the margin knocks it out of line with
   the button, and medium competes with the button it sits next to. */
.featured-product__actions .section-link {
  margin-block-start: 0;
  font-weight: var(--fw-regular);
}

@media (max-width: 900px) {
  .featured-product {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--space-8);
  }
  .featured-product__media img {
    aspect-ratio: 16/9;
  }
}
@media (max-width: 640px) {
  .featured-product {
    padding: var(--space-6);
  }
  .featured-product__title {
    font-size: var(--fs-h4);
  }
  .featured-product__price {
    font-size: var(--fs-h3);
  }
  .featured-product__text {
    font-size: var(--fs-body);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — field  (REUSED, verbatim)
   The price range's two inputs and the toolbar's sort control are both the
   brand's standard control.
   --------------------------------------------------------------------------- */
.field {
  display: block;
  min-width: 0;
}

/* --wide: spans both tracks of a two-column field grid (field-group__fields). No-op
   outside one. Ported from MPG11 for the checkout walk. */
.field--wide {
  grid-column: 1/-1;
}

.field__label,
.idpc-finder > label {
  display: block;
  margin-block-end: var(--space-2);
  padding: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

/* Required carries no mark; optional is marked, and the form says so once at
   the top. The marker is the only thing that distinguishes the two. */
.field__marker {
  margin-inline-start: var(--space-2);
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-regular);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-muted);
}

.field__help,
.field .description {
  margin: 0 0 var(--space-2);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-muted);
}

.field__control,
.idpc-finder input {
  display: block;
  width: 100%;
  padding: var(--space-3);
  border: 1px solid var(--border-input);
  border-radius: var(--radius-input);
  background-color: var(--bg-input);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.field__control::placeholder {
  color: var(--neutral-500);
  opacity: 1;
}

/* FOCUS — authored, never the browser's own outline, and three signals so it
   survives on panel white and on canvas grey alike: the border takes the brand
   colour, the ground takes the brand's soft wash, and a 2px brand ring sits
   clear of the box. Nothing changes width, so nothing shifts. */
.field__control:focus,
.field__control:focus-visible,
.field__control--focus,
.idpc-finder input:focus {
  border-color: var(--border-focus);
  background-color: var(--color-brand-soft);
  outline: 2px solid var(--border-focus);
  outline-offset: 2px;
}

/* ERROR — the border doubles to the brand's emphatic weight in alert red and
   the padding gives back the pixel, so an errored field is exactly the size of
   a good one. Red appears here and nowhere else. */
.field--error .field__control,
.field.woocommerce-invalid .field__control {
  border: 2px solid var(--color-negative);
  padding: calc(var(--space-3) - 1px);
}

.field--error .field__control:focus,
.field--error .field__control:focus-visible,
.field--error .field__control--focus,
.field.woocommerce-invalid .field__control:focus {
  border-color: var(--color-negative);
  background-color: var(--bg-input);
  outline-color: var(--color-negative);
}

.field__error,
.field .checkout-inline-error-message {
  display: flex;
  align-items: flex-start;
  gap: var(--space-2);
  margin: var(--space-2) 0 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-body);
  color: var(--color-negative);
}

.field__error-icon {
  flex: 0 0 auto;
  width: 16px;
  height: 16px;
  margin-block-start: 0.3em;
}

/* DISABLED — unavailable, not merely pale. The control drops off the panel on
   to the page ground, its text and its label to the disabled grey. */
.field__control:disabled,
.field__control--disabled {
  background-color: var(--bg-page);
  border-color: var(--border-default);
  color: var(--neutral-500);
  cursor: not-allowed;
}

.field--disabled .field__label,
.field--disabled .field__help {
  color: var(--neutral-500);
}

.field__control[type=date]::-webkit-calendar-picker-indicator {
  cursor: pointer;
}

.field__choices {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-4) var(--space-8);
}

/* SELECT — square, own chevron in Paragon blue, greyed while it still shows its
   placeholder. The chevron is the token value inlined; a data URI cannot read a custom
   property. Added by walk-back on the checkout walk (MPG11): the form specimen's port
   left the select and textarea rules out, and the checkout's address select rendered
   the browser's own control. */
select.field__control {
  appearance: none;
  -webkit-appearance: none;
  padding-inline-end: var(--space-12);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 12'%3E%3Cpath d='M1.5 2 L10 9.5 L18.5 2' fill='none' stroke='%231D7DBB' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right var(--space-4) center;
  background-size: 14px auto;
  cursor: pointer;
}

select.field__control:required:invalid {
  color: var(--neutral-500);
}

select.field__control option {
  color: var(--text-body);
}

textarea.field__control {
  line-height: var(--lh-body);
  resize: vertical;
}

/* ---------------------------------------------------------------------------
   WOOCOMMERCE'S OWN FIELD MARKUP (checkout wiring, MPG11). woocommerce_form_field()
   draws a field as p.form-row > label + span.woocommerce-input-wrapper > control +
   span.description, and the checkout script validates through that markup, so it is
   kept and dressed rather than replaced. includes/order-funnel.php adds `field`,
   `field__label` and `field__control`; the rules below cover the parts WooCommerce
   names itself — the help line (drawn above the control, as the brand's field does),
   the required mark (none: the form says so once), the optional mark, the invalid
   state and the inline error, which join the brand rules above.
   --------------------------------------------------------------------------- */
.field.form-row {
  margin: 0;
  padding: 0;
}

.field .woocommerce-input-wrapper {
  display: flex;
  flex-direction: column;
}

.field .description {
  order: -1;
}

.field .required {
  display: none;
}

/* WooCommerce writes "(optional)" with its brackets hard-coded, in PHP and again in
   the address script whenever the country loads, so the text cannot be changed at
   source. The brand's marker is drawn in its place. English-only store. */
.field .optional {
  margin-inline-start: var(--space-2);
  font-size: 0;
}

.field .optional::after {
  content: "Optional";
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-regular);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-muted);
}

/* WooCommerce enhances the country and county selects with selectWoo (select2), which
   hides the real <select> — the one carrying field__control — and draws its own box.
   Only the closed box is dressed, to the brand control; the open list is select2's own
   furniture (the ARTSABERS precedent). */
.field .select2-container .select2-selection--single {
  height: auto;
  padding: var(--space-3);
  border: 1px solid var(--border-input);
  border-radius: var(--radius-input);
  background-color: var(--bg-input);
}

.field .select2-container .select2-selection__rendered {
  padding: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.field .select2-container .select2-selection__arrow {
  top: 50%;
  right: var(--space-3);
  transform: translateY(-50%);
}

.field .select2-container--focus .select2-selection--single,
.field .select2-container--open .select2-selection--single {
  border-color: var(--border-focus);
  outline: 2px solid var(--border-focus);
  outline-offset: 2px;
}

.field-group {
  display: block;
}

.field-group__title {
  margin: 0 0 var(--space-6);
  padding-block-end: var(--space-3);
  border-block-end: 1px solid var(--border-default);
  font-family: var(--ff-heading);
  font-size: var(--fs-h4);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

/* Two tracks at a measure a control is actually read at — a panel spanning the
   full column must not stretch an order number to half of it. A field that
   needs the room takes --wide and spans both tracks. */
.field-group__fields {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 24rem));
  gap: var(--space-6) var(--space-content-gap);
  align-items: start;
  justify-content: start;
}

@media (max-width: 900px) {
  .field-group__fields {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
@media (max-width: 640px) {
  .field-group__fields {
    grid-template-columns: minmax(0, 1fr);
  }
}
/* On the checkout, WooCommerce's billing and shipping templates wrap their groups in
   their own divs, so the card's `> * + *` rhythm (description-panel__doc) stops at the
   wrapper and Contact / Address / the deliver-elsewhere choice / Delivery Address sat
   against each other. The same step is given inside the wrappers. (Checkout wiring,
   MPG11.) */
.woocommerce-billing-fields > .field-group + .field-group,
.woocommerce-shipping-fields > .field-group + .field-group {
  margin-block-start: var(--space-8);
}

.figure-row {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: var(--space-4);
  /* The list reset has to carry its own top margin. A bare `margin: 0` ties
     with the document's `> * + *` rhythm rule on specificity and wins on
     source order, so the row lands flush against the bullets above it. */
  margin: var(--space-8) 0 0;
  padding: 0;
  list-style: none;
}

.figure-row__cell {
  padding: var(--space-6);
  border: 2px solid var(--border-brand);
  border-radius: var(--radius-card);
}

.figure-row__value {
  display: block;
  font-family: var(--ff-heading);
  font-size: var(--fs-h2);
  font-weight: var(--fw-light);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.figure-row__label {
  display: block;
  margin-block-start: var(--space-2);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

@media (max-width: 900px) {
  .figure-row {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
@media (max-width: 640px) {
  .figure-row__value {
    font-size: var(--fs-h3);
  }
  .figure-row__cell {
    padding: var(--space-4);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — filter-chips  (NEW)
   What the listing is filtered by, above the grid, each one removable, with
   'Clear all' beside them. A filtered listing that does not say what it is
   filtered by is the commonest way a shopper concludes the shop has no stock.

   It sits on a panel like everything else on this brand — content never sits
   directly on the canvas. Each chip is a control, so it is square, and it
   carries the facet name above its value so 'Xbox' cannot be read as a brand
   when it was chosen as a platform.
   --------------------------------------------------------------------------- */
.filter-chips {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-3) var(--space-4);
  padding: var(--space-4) var(--space-6);
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

.filter-chips__label {
  font-family: var(--ff-heading);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.filter-chips__list {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-2);
  margin: 0;
  padding: 0;
  list-style: none;
}

.filter-chips__chip {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-1) var(--space-3);
  border: 1px solid var(--border-brand);
  border-radius: var(--radius-btn);
  background-color: var(--bg-card-hover);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-body);
  text-decoration: none;
}

.filter-chips__chip:hover {
  background-color: var(--bg-panel);
}

.filter-chips__group {
  color: var(--text-muted);
}

.filter-chips__value {
  font-weight: var(--fw-medium);
}

.filter-chips__remove {
  flex: 0 0 auto;
  width: 12px;
  height: 12px;
  color: var(--text-brand);
}

.filter-chips__clear {
  margin-inline-start: auto;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-link);
  text-decoration: none;
}

.filter-chips__clear:hover {
  color: var(--text-link-hover);
  text-decoration: underline;
}

@media (max-width: 640px) {
  .filter-chips__clear {
    margin-inline-start: 0;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — filter-group  (NEW)
   A collapsible filter panel in the store sidebar.

   It is the brand's widget and not a third labelled-panel treatment: the
   markup composes `widget` unchanged and this block adds only what turns a
   panel into a disclosure — the native marker removed, the brand's chevron at
   the far end of the title bar, pointing down closed and up open. Exactly the
   gesture the store navigation above it uses, at the scale of a panel.

   The body holds whatever the facet needs: a flush `count-list` where the
   values carry counts, the standard `field` controls where it is a range, a
   `choice` where it is a single switch.
   --------------------------------------------------------------------------- */
.filter-group__summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  list-style: none;
  cursor: pointer;
}

.filter-group__summary::-webkit-details-marker {
  display: none;
}

.filter-group__summary::marker {
  content: "";
}

.filter-group__summary:focus-visible {
  outline: 2px solid var(--neutral-50);
  outline-offset: -3px;
}

.filter-group__marker {
  flex: 0 0 auto;
  display: inline-flex;
  width: 14px;
  height: 14px;
  color: var(--text-on-brand);
}

.filter-group__marker svg {
  width: 100%;
  height: 100%;
  transform: rotate(90deg);
}

.filter-group[open] .filter-group__marker svg {
  transform: rotate(-90deg);
}

.filter-group__range {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-3);
  margin-block-end: var(--space-4);
}

.filter-group__note {
  margin: var(--space-3) 0 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-muted);
}

/* The brand form specimen's closing row (catalogue block `form-actions`), pasted
   verbatim into MPG11 for the checkout's phone foot. */
.form-actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-6);
  padding-block-start: var(--space-6);
  border-block-start: 1px solid var(--border-default);
}

.form-actions__cancel {
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
  text-decoration: none;
}

.form-actions__cancel:hover {
  color: var(--text-link);
}

@media (max-width: 640px) {
  .form-actions {
    flex-direction: column;
    align-items: stretch;
    gap: var(--space-4);
  }
  .form-actions .btn {
    width: 100%;
  }
  .form-actions__cancel {
    text-align: center;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — form-note  (NEW)
   One quiet line that belongs to a form but to none of its fields: that
   optional fields are the marked ones, a way in for a returning customer, the
   consent line under the order button. Body font at the small size in slate;
   a link inside it is Paragon blue, no underline, as links are in this brand.

   The base sets no top margin on purpose: a note that opens a form, or follows
   a group inside a document, takes its container's own rhythm. The two
   trailing modifiers always follow something — the fields above, the payment
   marks above — so they carry the gap themselves, and say which way they
   align.
   --------------------------------------------------------------------------- */
.form-note {
  margin-block-end: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-muted);
}

.form-note a {
  font-weight: var(--fw-medium);
  color: var(--text-link);
  text-decoration: none;
}

.form-note a:hover {
  color: var(--text-link-hover);
}

/* --start: a note closing a field group, on the left like the fields above it. It was
   `--end`, right-aligned, until the operator asked for the checkout's "Already have an
   account?" line to sit left (2026-09-26) — `--end` had no other use, so it is replaced
   rather than kept beside it. */
.form-note--start {
  margin-block-start: var(--space-4);
}

.form-note--center {
  margin-block-start: var(--space-4);
  text-align: center;
}

.hero-slider {
  /* The arrow's geometry, declared once. The arrow rules below consume it, and
     so does the copy's inline padding — the copy has to clear the arrow, and
     before this was a token that clearance was a hand-added 64px that left
     exactly 4px of daylight. Stated from the parts, the copy follows the arrow
     if the arrow ever moves. */
  --hero-arrow-size: 44px;
  --hero-arrow-inset: var(--space-4);
  /* ALL SLIDES OCCUPY ONE CELL, so they can cross-fade. They used to be
     `display: none` / `block`, which cannot transition — a property that jumps
     between two keywords has nothing to interpolate. Stacking them in a single
     grid cell keeps the tallest slide sizing the band, which absolute
     positioning would have given away, and the band keeps its height with no
     slide visible at all. */
  position: relative;
  display: grid;
  border-radius: var(--radius-card);
  overflow: hidden;
  background-color: var(--neutral-800);
  box-shadow: var(--shadow-card);
}

/* THE SLIDE OWNS THE BOX, NOT ITS IMAGE.

   Until 2026-09-17 the ratio and the floor sat on `.hero-slider__media`, so the
   slide's height came from its picture. That works in a mockup, where every
   slide has one. It does not work in a theme: the scrim and the copy are both
   absolutely positioned, so a slide with no image has NO in-flow child at all
   and collapses to zero — and the whole hero with it. The band did not look
   broken, it looked absent, which is why it read as a missing block rather than
   a sizing rule in the wrong place.

   The brand has no hero photography yet, so this is the normal case rather than
   an edge one. The slide now carries the design's own 1400x520 proportion with a
   floor for narrow viewports, and the image — when one lands — fills that box
   instead of defining it. `.hero-slider` already paints a ground, so an
   image-less slide shows brand colour under the scrim rather than nothing. */
.hero-slider__slide {
  position: relative;
  grid-area: 1/1;
  aspect-ratio: 1400/520;
  min-height: 380px;
  /* Hidden, but still laid out — that is the point of stacking them. `opacity`
     carries the fade; `visibility` is what takes an inactive slide out of the
     accessibility tree and off the tab order, which `opacity: 0` alone does not
     do. Its transition is a zero-length step DELAYED until the fade finishes, so
     the outgoing slide stays visible while it fades and only then stops
     existing. Transitioning visibility as a duration instead makes it flicker
     half way. */
  opacity: 0;
  visibility: hidden;
  transition: opacity var(--motion-standard) var(--motion-ease), visibility 0s linear var(--motion-standard);
}

.hero-slider__slide.is-active {
  /* Above its siblings so that during the fade the OUTGOING slide's scrim is not
     the thing a pointer lands on. The controls sit above both — see the z-index
     on the arrows and dots, which is load-bearing rather than tidy: without it
     this line alone puts the whole slide over them and every click hits the
     scrim instead of the button. The slider is then silently dead, and it still
     looks perfect. */
  z-index: 1;
  opacity: 1;
  visibility: visible;
  transition: opacity var(--motion-standard) var(--motion-ease), visibility 0s linear 0s;
}

/* A slider is decoration a reader did not ask to move. Honour the system
   setting: the slide still changes, it just arrives rather than fades. */
@media (prefers-reduced-motion: reduce) {
  .hero-slider__slide,
  .hero-slider__slide.is-active {
    transition: none;
  }
}
.hero-slider__media {
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.hero-slider__scrim {
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, var(--bg-overlay) 0%, var(--bg-overlay) 40%, transparent 78%);
}

.hero-slider__content {
  position: absolute;
  inset-block: 0;
  inset-inline-start: 0;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  gap: var(--space-6);
  max-width: 680px;
  /* CLEARS THE ARROW WITH ROOM TO SPARE, rather than by four pixels. The old
     value was a flat 64px against an arrow that ends at 60 — technically clear,
     and it read as the copy being jammed against the control. Built from the
     arrow's own geometry plus a gap, so it is 24px of daylight by construction
     and stays right if the arrow moves. Measured before: text at x=84, arrow
     ending at x=80. */
  padding-inline-start: calc(var(--hero-arrow-inset) + var(--hero-arrow-size) + var(--space-6));
  padding-inline-end: var(--space-8);
  padding-block: var(--space-8);
  text-align: left;
}

.hero-slider__eyebrow {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: 1;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-on-brand);
}

.hero-slider__title {
  margin: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h1);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-on-brand);
}

.hero-slider__lead {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body-lg);
  font-weight: var(--fw-light);
  line-height: var(--lh-body);
  color: var(--text-on-brand);
}

.hero-slider__arrow {
  position: absolute;
  /* Above the slide stack — see the note on `.is-active`. */
  z-index: 2;
  inset-block-start: 50%;
  transform: translateY(-50%);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: var(--hero-arrow-size);
  height: var(--hero-arrow-size);
  border: 0;
  border-radius: var(--radius-btn);
  background-color: var(--btn-primary-bg);
  color: var(--btn-primary-text);
  cursor: pointer;
}

.hero-slider__arrow:hover {
  background-color: var(--btn-primary-bg-hover);
}

.hero-slider__arrow--prev {
  inset-inline-start: var(--hero-arrow-inset);
}

.hero-slider__arrow--next {
  inset-inline-end: var(--hero-arrow-inset);
}

.hero-slider__arrow svg {
  width: 22px;
  height: 22px;
}

.hero-slider__dots {
  position: absolute;
  /* Above the slide stack — see the note on `.is-active`. */
  z-index: 2;
  inset-block-end: var(--space-6);
  inset-inline-start: 50%;
  transform: translateX(-50%);
  display: flex;
  gap: var(--space-3);
}

.hero-slider__dot {
  width: 12px;
  height: 12px;
  border: 0;
  border-radius: var(--radius-pill);
  background-color: var(--color-surface);
  opacity: 0.55;
  cursor: pointer;
}

.hero-slider__dot.is-current {
  background-color: var(--color-brand);
  opacity: 1;
}

@media (max-width: 1100px) {
  .hero-slider__content {
    /* NOT a flat value here either. The arrow is the same size at this width,
       so the clearance is the same calculation — restating 64px would put the
       copy back against the control below 1100 only, which is the kind of
       fault that survives a desktop check. */
    padding-inline-start: calc(var(--hero-arrow-inset) + var(--hero-arrow-size) + var(--space-6));
    padding-inline-end: var(--space-6);
    max-width: 560px;
  }
}
@media (max-width: 900px) {
  .hero-slider__title {
    font-size: var(--fs-h2);
  }
}
@media (max-width: 640px) {
  /* THE RATIO FOLLOWED THE BOX. When the slide took ownership of its own height
     on 2026-09-17 this override was left pointing at the media, which no longer
     sizes anything — so the phone hero fell back to the 380px floor instead of
     the design's portrait crop, and nothing looked broken enough to notice. */
  .hero-slider__slide {
    aspect-ratio: 4/5;
    min-height: 420px;
  }
  .hero-slider__scrim {
    background: linear-gradient(0deg, var(--bg-overlay) 0%, var(--bg-overlay) 55%, transparent 95%);
  }
  .hero-slider__content {
    justify-content: flex-end;
    padding-inline-start: var(--space-6);
    padding-inline-end: var(--space-6);
    padding-block-end: var(--space-16);
    max-width: none;
    gap: var(--space-4);
  }
  /* THE ARROWS MOVE OFF THE COPY. Below 640 the slide goes portrait and the copy
     moves to the BOTTOM of it, while the arrows stay vertically centred — which
     puts the prev arrow straight through the lead paragraph. Measured at 390:
     arrow 392-436, lead 401-509, a genuine overlap that the title cleared and
     the paragraph did not.

     Pinned to the top of the slide rather than nudged up a percentage, so the
     clearance does not drift when a slide's copy runs to another line. The
     transform goes with the centring it existed to correct. */
  .hero-slider__arrow {
    inset-block-start: var(--space-8);
    transform: none;
  }
  .hero-slider__title {
    font-size: var(--fs-h3);
  }
  .hero-slider__lead {
    font-size: var(--fs-body);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — house-ad  (NEW)
   "From the store": the magazine carries the shop's own adverts, not third-
   party ones. Product-led, labelled plainly, and never louder than the text
   around it — a hairline outline on white rather than a filled band, one
   product, one commerce button, one quiet View link.

   --inline sits once in the body where the old in-article ad marker was: a
   single compact row at the reading-column width. --rail is the portrait
   form for the rail. When the article has no game hub the rail form holds a
   promo-tile from the store's promo pool instead of a product.
   --------------------------------------------------------------------------- */
.house-ad {
  background-color: var(--bg-card);
  border-radius: var(--radius-card);
}

.house-ad__label {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: 1;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-muted);
}

/* The label's store icon — the listing advert carries one (MPG15). */
.house-ad__label svg {
  flex: 0 0 auto;
  width: 14px;
  height: 14px;
  color: var(--text-brand);
}

.house-ad__media {
  display: block;
}

.house-ad__media img {
  display: block;
  width: 100%;
  aspect-ratio: 1;
  object-fit: contain;
  background-color: var(--bg-card);
}

.house-ad__body {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  min-width: 0;
}

.house-ad__title {
  margin: 0;
  font-family: var(--ff-chrome);
  font-size: var(--fs-body);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
}

.house-ad__title a {
  color: var(--text-heading);
  text-decoration: none;
}

.house-ad__title a:hover {
  color: var(--text-link);
}

.house-ad__price {
  margin: 0;
  font-family: var(--ff-chrome);
  font-size: var(--fs-h4);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.house-ad__meta {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

.house-ad__actions {
  display: flex;
  align-items: center;
  gap: var(--space-4);
}

.house-ad__view {
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-link);
  text-decoration: none;
}

.house-ad__view:hover {
  color: var(--text-link-hover);
}

.house-ad--inline {
  margin: var(--space-8) 0 0;
  display: grid;
  grid-template-columns: 112px minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--space-4) var(--space-6);
  padding: var(--space-4) var(--space-6);
  border: 1px solid var(--border-default);
}

.house-ad--rail {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  padding: var(--space-6);
}

.house-ad--rail .house-ad__media img {
  aspect-ratio: 4/3;
}

.house-ad--rail .house-ad__actions {
  flex-direction: column;
  align-items: stretch;
  gap: var(--space-3);
  text-align: center;
}

@media (max-width: 640px) {
  .house-ad--inline {
    grid-template-columns: 88px minmax(0, 1fr);
    padding: var(--space-4);
  }
  .house-ad--inline .house-ad__actions {
    grid-column: 1/-1;
  }
}
/* ---------------------------------------------------------------------------
   MODIFIER — house-ad--listing  (MPG15, section landing)
   The advert once in a list of articles, after the sixth: a wide row — image,
   text, button — the same height class as the review cards around it, and with
   their card shadow so it sits in the list rather than on it. The mockup named
   the parts __name and __action; they are the base __title and __actions here,
   so one advert partial serves the article and the listing. Its phone rules are
   scoped to the variant — unscoped, they would have resized the article's adverts.
   --------------------------------------------------------------------------- */
.house-ad--listing {
  display: grid;
  overflow: hidden;
  box-shadow: var(--shadow-card);
  grid-template-columns: 160px minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--space-8);
  padding: var(--space-6) var(--space-card-padding);
}

.house-ad--listing .house-ad__body {
  min-width: 0;
  max-width: var(--container-reading);
}

@media (max-width: 640px) {
  .house-ad--listing {
    grid-template-columns: 96px minmax(0, 1fr);
    gap: var(--space-4) var(--space-6);
    padding: var(--space-6);
  }
  .house-ad--listing .house-ad__actions {
    grid-column: 1/-1;
  }
  .house-ad--listing .house-ad__actions .btn {
    width: 100%;
  }
  .house-ad--listing .house-ad__title {
    font-size: var(--fs-body);
  }
  .house-ad--listing .house-ad__price {
    font-size: var(--fs-h4);
  }
}
/* ---- the policy band ------------------------------------------------------

   Four short blocks at the foot: delivery, returns, ways to pay, help. Each
   names the product or its category and links to the page that owns the
   subject.

   Four across the content column gives each block about 223px, which is a
   footer column's width and is why the copy is deliberately short. It is also
   the point: this band exists so the product term and the payment or delivery
   term appear in ONE document, which is what a dedicated policy page can never
   do for a compound query. Volume of text would work against it.
   --------------------------------------------------------------------------- */
/* The band carries its own surface rather than being wrapped in a panel, because
   it now has two consumers — the product page and the category archive — and a
   block that needs a wrapper to look right is a block that gets composed wrong
   on the third page. */
.info-band {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-12) var(--space-16);
  padding: var(--space-card-padding);
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

/* The grid item. The track places it, so it declares no layout of its own — this
   is the floor that keeps it inside that track. A grid item's default minimum is
   its own longest word, and this copy names the product it sits on, which arrives
   from the catalogue and can be a single unbroken string. Without the floor one
   such name widens the item past its 459px column and the two-up row goes with it. */
.info-band__block {
  min-width: 0;
}

.info-band__title {
  margin: 0 0 var(--space-3);
  font-family: var(--ff-heading);
  font-size: var(--fs-h4);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.info-band__text {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.info-band .section-link {
  margin-block-start: var(--space-3);
  font-size: var(--fs-small);
}

@media (max-width: 560px) {
  .info-band {
    grid-template-columns: minmax(0, 1fr);
  }
}
.inline-form {
  margin: var(--space-6) 0 0;
}

.inline-form__row {
  display: grid;
  grid-template-columns: minmax(0, 18rem) minmax(0, 22rem) auto;
  gap: var(--space-4);
  align-items: end;
  justify-content: start;
}

/* --single: one field and its button, the field taking the width — a search box in
   a 328px sidebar (MPG15 walk-back) cannot hold the three-column row. It stands
   alone in its panel, so it takes no top margin. */
.inline-form--single {
  margin: 0;
}

.inline-form--single .inline-form__row {
  grid-template-columns: minmax(0, 1fr) auto;
  gap: var(--space-3);
}

/* The button's own padding gives back the two pixels the inputs spend on their
   borders, so the row reads as one height. */
.inline-form__action .btn {
  padding-block: calc(var(--space-3) + 1px);
}

@media (max-width: 900px) {
  .inline-form__row {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) auto;
  }
}
@media (max-width: 640px) {
  .inline-form__row {
    grid-template-columns: minmax(0, 1fr);
    align-items: stretch;
    gap: var(--space-6);
  }
  .inline-form__action .btn {
    width: 100%;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — lead-story  (REUSED, verbatim — plus one NEW modifier, --split)
   --------------------------------------------------------------------------- */
.lead-story {
  display: flex;
  flex-direction: column;
  height: 100%;
  background-color: var(--bg-card);
  border-radius: var(--radius-card);
  overflow: hidden;
  box-shadow: var(--shadow-card);
}

.lead-story__media {
  position: relative;
  display: block;
  flex: 1 0 auto;
  aspect-ratio: 16/9;
}

.lead-story__media img {
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.lead-story__body {
  display: flex;
  flex-direction: column;
  padding: var(--space-card-padding);
}

.lead-story__kicker {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: 1;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-brand);
}

.lead-story__title {
  margin: var(--space-3) 0 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h2);
  font-weight: var(--fw-light);
  font-style: italic;
  line-height: var(--lh-heading);
}

.lead-story__title a {
  color: var(--text-brand);
  text-decoration: none;
}

.lead-story__title a:hover {
  color: var(--text-link-hover);
}

.lead-story__standfirst {
  max-width: var(--container-reading);
  margin: var(--space-4) 0 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body-lg);
  font-weight: var(--fw-light);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.lead-story__meta {
  display: flex;
  align-items: center;
  gap: var(--space-4);
  margin-block-start: var(--space-6);
  padding-block-start: var(--space-6);
  border-block-start: 1px solid var(--border-default);
}

.lead-story__byline {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.lead-story__author {
  font-weight: var(--fw-medium);
}

.lead-story__date {
  color: var(--text-muted);
}

@media (max-width: 640px) {
  .lead-story__title {
    font-size: var(--fs-h3);
  }
  .lead-story__standfirst {
    font-size: var(--fs-body);
  }
}
.lead-story--split {
  flex-direction: row;
}

.lead-story--split .lead-story__media {
  flex: 0 0 50%;
  aspect-ratio: auto;
  min-height: 300px;
}

.lead-story--split .lead-story__body {
  flex: 1 1 auto;
  justify-content: center;
}

@media (max-width: 900px) {
  .lead-story--split {
    flex-direction: column;
  }
  .lead-story--split .lead-story__media {
    flex: 1 0 auto;
    aspect-ratio: 16/9;
    min-height: 0;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — listing-toolbar  (NEW)
   The row above the grid: what you are looking at on the left, how it is
   ordered and how it is laid out on the right.

   Beneath it, quiet and left-aligned, the dispatch line. The store's real term
   is 2pm Monday to Friday, so before the cut-off it counts the time left and
   after it reads 'Ordered today, dispatched tomorrow' — the same slot, never
   empty, never a countdown to nothing.

   The sort control is the brand's standard select, given an auto width; the
   view toggle is two square controls with the current one filled, because
   this brand offers both layouts and the shopper chooses.
   --------------------------------------------------------------------------- */
.listing-toolbar {
  padding: var(--space-4) var(--space-6);
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

.listing-toolbar__row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
}

.listing-toolbar__count {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.listing-toolbar__controls {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-3);
}

.listing-toolbar__label {
  font-family: var(--ff-heading);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

/* The sort control arrives inside WooCommerce's own form, which is what carries
   the active filters through a sort as hidden inputs. The form is the flex item
   and has no appearance of its own — this only stops a margin arriving from the
   platform's stylesheet and pushing the select out of the row. */
.listing-toolbar__ordering {
  margin: 0;
}

.listing-toolbar__select {
  width: auto;
  min-width: 210px;
  padding-block: var(--space-2);
}

.listing-toolbar__views {
  display: flex;
  gap: var(--space-2);
  margin-inline-start: var(--space-2);
}

.listing-toolbar__view {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  padding: 0;
  border: 1px solid var(--border-default);
  border-radius: var(--radius-btn);
  background-color: var(--bg-panel);
  color: var(--text-brand);
  cursor: pointer;
}

.listing-toolbar__view svg {
  width: 18px;
  height: 18px;
}

.listing-toolbar__view:hover {
  border-color: var(--border-brand);
  background-color: var(--bg-card-hover);
}

.listing-toolbar__view--current {
  border-color: var(--btn-primary-bg);
  background-color: var(--btn-primary-bg);
  color: var(--btn-primary-text);
}

.listing-toolbar__view--current:hover {
  border-color: var(--btn-primary-bg-hover);
  background-color: var(--btn-primary-bg-hover);
  color: var(--btn-primary-text);
}

.listing-toolbar__dispatch {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  margin: var(--space-4) 0 0;
  padding-block-start: var(--space-4);
  border-block-start: 1px solid var(--border-default);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

.listing-toolbar__dispatch svg {
  flex: 0 0 auto;
  width: 16px;
  height: 16px;
  color: var(--text-brand);
}

@media (max-width: 640px) {
  .listing-toolbar__controls {
    width: 100%;
  }
  .listing-toolbar__select {
    flex: 1 1 auto;
    min-width: 0;
  }
  .listing-toolbar__views {
    margin-inline-start: 0;
  }
}
/* The loyalty claim, given the weight the operator asked for. It keeps the
   brand's one labelled-panel treatment rather than inventing a second surface —
   the impact is in the size of the figure, which is set in the commerce face at
   h2, matching the pay-later card opposite so the two are the same height. */
.loyalty-card__body {
  display: flex;
  align-items: center;
  gap: var(--space-4);
}

.loyalty-card__icon {
  flex: 0 0 auto;
  width: 44px;
  height: 44px;
  color: var(--text-brand);
}

.loyalty-card__icon svg {
  width: 100%;
  height: 100%;
}

/* The figures beside the icon. A flex item's default minimum is its longest word,
   and the card sits in a 476px half of the hero — the floor lets the wording under
   the figure wrap instead of pushing the icon out of the row. */
.loyalty-card__figures {
  min-width: 0;
}

.loyalty-card__points {
  display: block;
  font-family: var(--ff-chrome);
  font-size: var(--fs-h2);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  /* Black, not brand blue — operator, 2026-09-15. The blue read as a link at
     that size and the card already has blue on its title bar. */
  color: var(--text-heading);
}

.loyalty-card__worth {
  display: block;
  margin-block-start: var(--space-1);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

/* Both cards carry a trailing link, which is what makes them the same height —
   and that is the only way two cards bottom-aligned can also line up along the
   top. Bottom-aligning alone put their title bars 36px apart, which reads worse
   than the 14px it was meant to fix, because the eye follows the blue bar and
   not the foot of the card. */
.paylater-card .section-link,
.loyalty-card .section-link {
  margin-block-start: var(--space-4);
}

/* BLOCK — media-figure (NEW) */
.media-figure {
  margin: var(--space-8) 0 0;
}

.media-figure--bleed {
  margin-inline: calc(-1 * var(--space-card-padding));
}

.media-figure__media {
  display: block;
  width: 100%;
  height: auto;
  border-block: 1px solid var(--border-default);
}

.media-figure__caption {
  margin-block-start: var(--space-3);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-muted);
}

.media-figure--bleed .media-figure__caption {
  padding-inline: var(--space-card-padding);
}

/* ---------------------------------------------------------------------------
   BLOCK — order-close  (EXTENDED on the second review, markup only)
   One quiet line of help links — plain section-links, the brand's trailing
   link. The trailing button slot is now optional: on the confirmation,
   Continue Shopping moved to the foot of Complete Your Setup, so the row here
   carries the links alone. The CSS is unchanged; with no button the row's
   space-between simply leaves the links on the left. Not a band and not a panel: the design brief lets
   the canvas carry the small trailing links that follow a band, and this is
   exactly that. The section-link's own top margin is handed back to the row.
   --------------------------------------------------------------------------- */
.order-close {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4) var(--space-8);
}

.order-close__links {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-2) var(--space-8);
  margin: 0;
  padding: 0;
  list-style: none;
}

.order-close__links .section-link {
  margin-block-start: 0;
}

@media (max-width: 640px) {
  .order-close {
    flex-direction: column;
    align-items: stretch;
    gap: var(--space-6);
  }
  .order-close__links {
    flex-direction: column;
    align-items: flex-start;
    gap: var(--space-3);
  }
  .order-close .btn {
    width: 100%;
  }
}
.order-layout {
  display: grid;
  grid-template-columns: repeat(7, minmax(0, 1fr));
  align-items: start;
  gap: var(--gutter-small);
}

.order-layout__main {
  grid-column: span 5;
}

.order-layout__aside {
  position: sticky;
  top: var(--space-6);
  grid-column: span 2;
}

/* Each column stacks its panels with a flex GAP, not a `> * + *` margin (changed for
   the checkout walk, MPG11): the checkout's main column opens with the phone-only
   summary toggle, and hidden above phone width it still counted as "a previous
   sibling", so the first visible panel took the gap and sat 30px below the summary's
   top edge. A gap is only laid between boxes that render. */
.order-layout__main,
.order-layout__aside {
  display: flex;
  flex-direction: column;
  gap: var(--space-content-gap);
}

.order-layout__main > *,
.order-layout__aside > * {
  margin-block: 0;
}

/* __stack: a container INSIDE a column that stacks the column's panels — the basket's
   cart form. WooCommerce's cart form wraps every package panel, so the column's own
   spacing reaches only the form, and the panels would touch. Added by walk-back
   during the MPG10 packages composition (2026-09-24). */
.order-layout__stack {
  display: flex;
  flex-direction: column;
  gap: var(--space-content-gap);
}

.order-layout__stack > * {
  margin-block: 0;
}

/* The Smart Coupons plugin reserves a slot at the top of the cart form for its coupon
   messages — a wrapper holding an empty placeholder whenever there is no message. As a
   flex item it still took a line and a gap, dropping the first panel 50px below the
   summary. Hidden only while it holds nothing but the placeholder, so a real coupon
   message still shows. Once a coupon is applied it re-renders with no placeholder at
   all — only whitespace, which :empty does not match — hence the second selector. */
.order-layout__stack > .wc_coupon_message_wrap:has(> .no_wc_coupon_message:only-child),
.order-layout__stack > .wc_coupon_message_wrap:not(:has(*)) {
  display: none;
}

/* WooCommerce's checkout script puts its error summary (and any update notices) at the
   top of the checkout form — which is this grid — so without this it lands in one
   seventh-wide cell and pushes both columns out of place. It spans the grid, above both
   columns. (Checkout wiring, MPG11.) */
.order-layout > .woocommerce-NoticeGroup {
  grid-column: 1/-1;
}

/* --settled: the order confirmation (MPG12). The order is placed and there is no button
   to keep in reach, so nothing sticks; and below 1100 the aside — Delivering To — takes
   the full width rather than the basket's 480px right-hand column. */
.order-layout--settled .order-layout__aside {
  position: static;
}

@media (max-width: 1100px) {
  .order-layout--settled .order-layout__aside {
    max-width: none;
  }
}
/* The checkout's summary panel is a bordered-group, whose `overflow: hidden` crops its
   title to the card radius — and also makes it a scroll container, which silently
   cancels any `position: sticky` inside it: the payment marks pinned to the viewport
   foot (order-totals__action--sticky) sat at the panel's end instead. `clip` crops the
   same without creating a scroll container. */
.order-layout__summary {
  overflow: clip;
}

/* The checkout's phone piece (MPG11): __toggle is the order summary folded into a bar
   above the form. It stands down while the sidebar does its job, and at phone width
   __summary — the sidebar's summary panel — stands down for it. */
.order-layout__toggle {
  display: none;
}

@media (max-width: 1100px) {
  .order-layout {
    grid-template-columns: minmax(0, 1fr);
  }
  .order-layout__main,
  .order-layout__aside {
    grid-column: 1/-1;
  }
  .order-layout__aside {
    position: static;
    max-width: 480px;
    justify-self: end;
    width: 100%;
  }
}
@media (max-width: 640px) {
  .order-layout__aside {
    max-width: none;
  }
  .order-layout__toggle {
    display: block;
  }
  .order-layout__summary {
    display: none;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — order-lines  (NEW)
   What is in the order, compactly, grouped by package — the checkout
   summary's contents above its totals. Each package opens with the basket's
   own package-head and closes with its delivery as an order-totals row, so the
   three parts are the basket's vocabulary at a sidebar's width; this block is
   only the grouping and the compact line.

   A line is a small manufacturer shot on a hairline tile at the surface
   radius, the title in the commerce face at the small size and never more
   than two lines, the quantity, and the line total in the commerce face. A
   pre-order line keeps its marker, with the brand-blue dot the basket gives
   it. The block closes on a hairline, so the grand totals below it start
   clean.
   --------------------------------------------------------------------------- */
.order-lines {
  margin: 0 0 var(--space-4);
  padding: 0 0 var(--space-6);
  list-style: none;
  border-block-end: 1px solid var(--border-default);
}

/* The closing hairline separates the lines from the totals BELOW them. Where nothing
   follows — Track Order lists the packages and stops — it closed the panel on a stray
   line, so it only draws when something comes after (refinement list, 2026-09-27). */
.order-lines:last-child {
  margin-block-end: 0;
  padding-block-end: 0;
  border-block-end: 0;
}

.order-lines__package + .order-lines__package {
  margin-block-start: var(--space-6);
  padding-block-start: var(--space-6);
  border-block-start: 1px solid var(--border-default);
}

.order-lines__list {
  margin: var(--space-4) 0 var(--space-2);
  padding: 0;
  list-style: none;
}

.order-lines__item {
  display: grid;
  grid-template-columns: 56px minmax(0, 1fr) auto;
  align-items: start;
  gap: var(--space-3);
}

.order-lines__item + .order-lines__item {
  margin-block-start: var(--space-3);
}

.order-lines__media {
  display: block;
  padding: var(--space-1);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-card);
  background-color: var(--bg-card);
}

.order-lines__media img {
  display: block;
  width: 100%;
  aspect-ratio: 1/1;
  object-fit: contain;
}

.order-lines__info {
  min-width: 0;
}

.order-lines__title {
  display: -webkit-box;
  margin: 0;
  overflow: hidden;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  font-family: var(--ff-chrome);
  font-size: var(--fs-small);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.order-lines__meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-1) var(--space-3);
  margin: var(--space-1) 0 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

.order-lines__marker {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  font-weight: var(--fw-medium);
  color: var(--text-body);
}

.order-lines__marker::before {
  content: "";
  width: 8px;
  height: 8px;
  border-radius: var(--radius-pill);
  background-color: var(--color-brand);
}

.order-lines__total {
  margin: 0;
  font-family: var(--ff-chrome);
  font-size: var(--fs-body);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  color: var(--text-body);
  white-space: nowrap;
}

/* ---------------------------------------------------------------------------
   BLOCK — order-status  (NEW)
   An order's status as a small indicator: a round dot — round indicators take
   the pill radius, per the shape law — and the status name in body text at
   medium weight, ink. The colour is only ever the dot; the words stay ink, so
   no status reads as coloured text.

   The modifier is WooCommerce's own status slug, so the template writes
   `order-status--{slug}` from the order and never picks a colour per row.
   Custom statuses registered in camcom-global fall back to the base grey dot
   until they are given one.
     processing, on-hold  Paragon blue — with us, in hand
     completed            go green — the brand's positive confirmation
     pending              slate, hollow — waiting on payment
     failed, cancelled    alert red — an error state, which is red's job
     refunded             mist — closed, nothing more to happen
   --------------------------------------------------------------------------- */
.order-status {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-body);
  white-space: nowrap;
}

.order-status::before {
  content: "";
  flex: 0 0 auto;
  width: 10px;
  height: 10px;
  border: 2px solid var(--border-strong);
  border-radius: var(--radius-pill);
  background-color: var(--border-strong);
}

.order-status--processing::before,
.order-status--on-hold::before {
  border-color: var(--color-brand);
  background-color: var(--color-brand);
}

.order-status--completed::before {
  border-color: var(--color-positive);
  background-color: var(--color-positive);
}

.order-status--pending::before {
  border-color: var(--text-muted);
  background-color: transparent;
}

.order-status--failed::before,
.order-status--cancelled::before {
  border-color: var(--color-negative);
  background-color: var(--color-negative);
}

.order-status--refunded::before {
  border-color: var(--border-strong);
  background-color: var(--border-strong);
}

/* ---------------------------------------------------------------------------
   BLOCK — order-totals  (NEW)
   The contents of the Order Summary: the sum, the delivery, any discount, then
   the total in the commerce face at the size the product page gives a price,
   the VAT it includes, the Clearpay line when the total allows it, and the
   points line. Contents only — the surface is bordered-group, the brand's one
   labelled-panel treatment, exactly as buy-box sits inside it on the product
   page.
   --------------------------------------------------------------------------- */
.order-totals {
  margin: 0;
}

.order-totals__row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-4);
  padding-block: var(--space-2);
}

.order-totals__label {
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.order-totals__detail {
  display: block;
  margin-block-start: var(--space-1);
  font-size: var(--fs-small);
  color: var(--text-muted);
}

.order-totals__value {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-body);
  white-space: nowrap;
}

.order-totals__total {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-4);
  margin-block-start: var(--space-3);
  padding-block-start: var(--space-4);
  border-block-start: 1px solid var(--border-default);
}

.order-totals__total-label {
  font-family: var(--ff-heading);
  font-size: var(--fs-h4);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.order-totals__total-value {
  margin: 0;
  font-family: var(--ff-chrome);
  font-size: var(--fs-h2);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  letter-spacing: 0.01em;
  color: var(--text-body);
  white-space: nowrap;
}

.order-totals__vat {
  margin: var(--space-1) 0 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
  text-align: end;
}

.order-totals__line {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  margin: var(--space-4) 0 0;
  padding-block-start: var(--space-4);
  border-block-start: 1px solid var(--border-default);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.order-totals__line + .order-totals__line {
  margin-block-start: var(--space-3);
  padding-block-start: 0;
  border-block-start: 0;
}

.order-totals__line strong {
  font-weight: var(--fw-medium);
}

.order-totals__icon {
  flex: 0 0 auto;
  width: 28px;
  height: 28px;
  color: var(--text-brand);
}

.order-totals__icon svg {
  width: 100%;
  height: 100%;
}

/* The checkout action's wrapper. WooCommerce prints `wc-proceed-to-checkout`;
   this element names it for the brand so the phone checkout bar can stand in
   for it (see _checkout-bar.scss). In the mockup this was a page-level
   `order-summary__action` owned by no block. */
.order-totals__action {
  margin-block-start: var(--space-6);
}

/* --sticky: THE PAYMENT MARKS STAY IN VIEW (checkout, MPG11). The checkout summary lists
   every package before its totals, so it is taller than a laptop screen and a sticky
   column alone would carry its foot off the bottom. The accepted-payment marks pin to
   the foot of the viewport inside the pinned column — a trust signal kept above the
   fold (operator, 2026-09-26) — and settle back as the column's end comes into view,
   painted panel white with a hairline above so whatever scrolls beneath is covered
   cleanly. Static once the summary drops below the form. Ported from the mockup's
   `order-summary__action`; Place Order itself moved into the Payment card. */
.order-totals__action--sticky {
  position: sticky;
  bottom: 0;
  z-index: 1;
  padding-block: var(--space-4);
  border-block-start: 1px solid var(--border-default);
  background-color: var(--bg-panel);
}

.order-totals__action--sticky > .payment-marks {
  margin-block-start: 0;
}

@media (max-width: 1100px) {
  .order-totals__action--sticky {
    position: static;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — package-delivery  (EXTENDED on the checkout's second review)
   The checkout's per-package delivery, confirmed rather than chosen again.
   The shopper picked each package's speed in the basket, so here each package
   is ONE read-only line — which package, when it arrives, the speed and its
   price. DEPARTURE: no Change. The mockup offered one at the far end of each
   line; it is gone (operator, 2026-09-24) because the store runs one speed,
   and because the checkout merges the packages into one settled charge so the
   wallets can render (camcom-global camcom-dropship-checkout-merge.php) —
   there is nothing to change and nowhere to change it. The rules for Change
   and its opened row were not ported.

   What changed: the row used to be the basket's package-head beside a select
   holding the speed. The select is gone — it asked the basket's question a
   second time, and at 390px it clipped its own price. The row is now a single
   line that wraps rather than truncates: a Paragon-blue outline icon (a van,
   or a calendar for a pre-order), the package name and arrival at ink and
   medium weight, the speed in slate, the price in the commerce face because
   it is a price, and Change as a link-blue text button. Change opens that
   package's two speeds in place as the basket's own delivery-options, reused
   verbatim; the opened row takes the brand's leading Paragon-blue rule so it
   is clear which package is being changed. Beneath the rows the dispatch
   rule, as before, and a new quieter line for the Highlands & Islands
   surcharge, which the shopper never picks.
   --------------------------------------------------------------------------- */
.package-delivery__rows {
  margin: 0;
  padding: 0;
  list-style: none;
  border: 1px solid var(--border-default);
  border-radius: var(--radius-card);
  overflow: hidden;
}

.package-delivery__row {
  padding: var(--space-4) var(--space-6);
  background-color: var(--bg-panel);
}

.package-delivery__row + .package-delivery__row {
  border-block-start: 1px solid var(--border-default);
}

.package-delivery__line {
  display: grid;
  grid-template-columns: 24px minmax(0, 1fr);
  align-items: start;
  column-gap: var(--space-3);
  row-gap: var(--space-2);
}

.package-delivery__icon {
  width: 24px;
  height: 24px;
  margin-block-start: 0.15em;
  color: var(--text-brand);
}

.package-delivery__icon svg {
  display: block;
  width: 100%;
  height: 100%;
}

.package-delivery__summary {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-muted);
}

.package-delivery__package,
.package-delivery__arrival {
  font-weight: var(--fw-medium);
  color: var(--text-body);
}

.package-delivery__price {
  font-family: var(--ff-chrome);
  font-weight: var(--fw-bold);
  font-style: italic;
  color: var(--text-body);
  white-space: nowrap;
}

.package-delivery__note {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  margin: var(--space-8) 0 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.package-delivery__note-icon {
  flex: 0 0 auto;
  width: 24px;
  height: 24px;
  color: var(--text-brand);
}

.package-delivery__note-icon svg {
  display: block;
  width: 100%;
  height: 100%;
}

.package-delivery__surcharge {
  margin: var(--space-2) 0 0;
  padding-inline-start: calc(24px + var(--space-3));
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-muted);
}

/* Phone: the line keeps every word and wraps, a step smaller. */
@media (max-width: 640px) {
  .package-delivery__row {
    padding: var(--space-4);
  }
  .package-delivery__summary {
    font-size: var(--fs-small);
  }
  .package-delivery__note {
    align-items: flex-start;
    font-size: var(--fs-small);
    line-height: var(--lh-body);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — package-head  (NEW)
   The top of a package panel: `Package 1 of 3` in the heading font at the
   small-title size, then the package's status line. The build brief calls the
   arrival date the most important line in the panel, so it is the one phrase
   set at ink and medium weight — the stock state beside it matches it, the
   dispatch detail between them stays slate. A Paragon-blue outline icon leads
   the line: a van for a stocked package, a calendar for a pre-order.

   The title is optional. A basket that does not split draws the head with the
   status line alone — "Package 1 of 1" would be a label for a fact nobody
   needs told.
   --------------------------------------------------------------------------- */
.package-head {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}

.package-head__title {
  margin: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h4);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.package-head__status {
  display: flex;
  align-items: flex-start;
  gap: var(--space-3);
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-muted);
}

.package-head__icon {
  flex: 0 0 auto;
  width: 24px;
  height: 24px;
  margin-block-start: 0.15em;
  color: var(--text-brand);
}

.package-head__icon svg {
  display: block;
  width: 100%;
  height: 100%;
}

.package-head__state,
.package-head__arrival {
  font-weight: var(--fw-medium);
  color: var(--text-body);
}

@media (max-width: 640px) {
  .package-head__status {
    font-size: var(--fs-small);
  }
}
/* ---------------------------------------------------------------------------
   PAGE LAYOUT — the shell, the rail and the region grids.

   BUILT 2026-09-15 from six pieces of operator feedback, after three designs
   were rejected. Each of the six is answered in one place and the place is
   named, so a later session can see which choices are load-bearing:

   1. The short description goes BEFORE the buy box    → .buy-region__summary
   2. Loyalty points sit AFTER the buy box             → .buy-region__summary
   3. Stat pills live inside the product description   → .doc-figures
   4. The description takes the live site's column     → .store-layout
   5. Add to Basket never wraps to two lines           → .btn--commerce, .route-row
   6. The navigation rail comes back, desktop only     → .store-layout__sidebar

   THE COLUMN IS 1042px AND THAT IS THE POINT OF (4). It is what the live store
   gives its content: a 1400 page, a 328 rail, a 30 gap. Three drafts put the
   description at 680 or 740 because that is the styleguide's READING measure,
   and all three read as cramped — because the measure was set for editorial
   pages, where prose is alone on the page. A product description is not alone:
   it carries stat blocks, spec tables and feature rows, and it wants the room
   the store already gives it. The 680 measure still governs article pages.
   --------------------------------------------------------------------------- */
.page__inner {
  max-width: calc(var(--site-max-width) + var(--gutter-small) * 2);
  margin-inline: auto;
  padding-inline: var(--gutter-small);
}

.page__body {
  padding-block: var(--space-6) var(--space-16);
}

.page__flow > * + * {
  margin-block-start: var(--space-12);
}

/* The tight flow — INSIDE a band rather than between bands.

   A band is a head and the thing it introduces, and on a composed page those
   arrive as separate top-level blocks. Left as siblings of the page flow they
   took the 48px that separates one band from the NEXT, so a title sat as far
   from its own grid as from the band above it and nothing read as a unit
   (measured 2026-09-17: every head 48px from its own content).

   So each band is wrapped in a group carrying this, and the page flow's 48px
   falls between those groups. A modifier rather than a second component: the
   mechanism is identical and only the step changes, which is what `--wide`
   already established for the axis. 24px is the value `.section-head` carries
   for the same gap in the PHP templates, so both routes space a band head the
   same way.

   TWO SELECTORS BECAUSE THERE ARE TWO DOM SHAPES. A PHP template puts the
   children directly inside; a `core/group` wraps them in
   `.wp-block-group__inner-container`, which WordPress restores on any site
   without a `theme.json` — every theme in this line, by policy. A `>` rule alone
   therefore lands on the wrapper and spaces nothing. Naming the container is
   normally the thing not to do, but the alternative here is a descendant rule
   that would reach every nesting level of a band. */
.page__flow--tight > * + *,
.page__flow--tight > .wp-block-group__inner-container > * + * {
  margin-block-start: var(--space-6);
}

/* The wide flow — the bands below the product zone. They are not about THIS
   product's purchase decision, they are the routes out of it, so they run the
   full page width rather than the content column's and pass under the rail where
   it ends. A modifier rather than a second container: same vertical rhythm,
   different width. Operator, 2026-09-16. */
.page__flow--wide {
  width: 100%;
  /* The gap between the two zones. Without it the specification band opens
     immediately under the description's last line and reads as part of it —
     which is the opposite of what moving it out here was for. */
  margin-block-start: var(--space-16);
}

/* __band: a full-width band that follows the page's main content — the basket's
   trust row. It stands further off than the flow's panel gap so it reads as the
   page's close rather than one more panel (MPG10). */
.page__flow > .page__band {
  margin-block-start: var(--space-12);
}

/* A WooCommerce page (basket, checkout, account) prints its whole template inside one
   `.woocommerce` wrapper, so the page flow's own spacing never reaches the parts —
   the opening, the steps band, the order layout, the closing band. The wrapper stacks
   them instead, at the order funnel's rhythm (--space-8, as the accepted basket
   draws it). A flex gap, not sibling margins, because WooCommerce always prints a
   notices wrapper that is usually empty: hidden, it takes no gap at all.
   The closing band keeps its further offset (--space-12 in all). Walk-back, MPG10. */
.page__flow > .woocommerce {
  display: flex;
  flex-direction: column;
  gap: var(--space-8);
}

.page__flow > .woocommerce > * {
  margin-block: 0;
}

.page__flow > .woocommerce > .woocommerce-notices-wrapper:empty {
  display: none;
}

.page__flow > .woocommerce > .page__band {
  margin-block-start: var(--space-4);
}

/* In the rail the contents list stacks instead of running as a wrapped row. */
.seo-doc__rail .page-contents {
  margin: 0;
  padding: 0;
  border: 0;
}

.seo-doc__rail .page-contents__list {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

.seo-doc__rail .page-contents__item::after {
  content: none;
}

/* ---- page-contents (reused from the brand catalogue, verbatim) ---- */
/* ---------------------------------------------------------------------------
   BLOCK — page-contents  (NEW)
   Inline at the top of the document, not sticky. These pages are consulted
   once from a support email and then left; a rail that follows the reader down
   a page they are not reading is furniture for its own sake, and it would have
   to survive beside the spliced site header.

   Built the way breadcrumbs is built — a wrapping flex row with the separator
   on the item's own ::after — so the brand's two 'where am I' strips read as
   one construction. The separator is the middot the article kicker already
   uses, in the same quiet grey.
   --------------------------------------------------------------------------- */
.page-contents {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--space-3) var(--space-6);
  padding-block-end: var(--space-6);
  border-block-end: 1px solid var(--border-default);
}

/* AS A CORE COLUMN, the rail states its own share here rather than carrying the
   editor's `style="flex-basis:28%"` into a pattern file. The doc beside it takes
   the rest. */
.wp-block-column.page-contents {
  flex: 0 0 28%;
}

.page-contents__label {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-muted);
}

.page-contents__list {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--space-2) var(--space-4);
  margin: 0;
  padding: 0;
  list-style: none;
}

.page-contents__item {
  display: inline-flex;
  align-items: baseline;
  gap: var(--space-4);
}

.page-contents__item::after {
  content: "·";
  color: var(--neutral-500);
}

.page-contents__item:last-child::after {
  content: none;
}

.page-contents__link {
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-link);
  text-decoration: none;
}

.page-contents__link:hover {
  color: var(--text-link-hover);
}

@media (max-width: 640px) {
  .page-contents__label {
    flex: 0 0 100%;
  }
}
.pagination {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
  align-items: center;
  gap: var(--space-4);
  padding: var(--space-4) var(--space-6);
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

.pagination__list {
  grid-column: 2;
  display: flex;
  align-items: center;
  gap: var(--space-2);
  margin: 0;
  padding: 0;
  list-style: none;
}

.pagination__page {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  height: 44px;
  padding-inline: var(--space-3);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-btn);
  background-color: var(--bg-panel);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: 1;
  color: var(--text-body);
  text-decoration: none;
}

.pagination__page:hover {
  border-color: var(--border-brand);
  background-color: var(--bg-card-hover);
  color: var(--text-link);
}

.pagination__page--current {
  border-color: var(--btn-primary-bg);
  background-color: var(--btn-primary-bg);
  font-weight: var(--fw-medium);
  color: var(--btn-primary-text);
}

.pagination__gap {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 24px;
  height: 44px;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  line-height: 1;
  color: var(--text-muted);
}

.pagination__arrow {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  height: 44px;
  padding-inline: var(--space-4);
  border: 1px solid var(--border-brand);
  border-radius: var(--radius-btn);
  background-color: var(--bg-panel);
  line-height: 1;
  color: var(--text-link);
  text-decoration: none;
  white-space: nowrap;
}

.pagination__arrow[rel=prev] {
  grid-row: 1;
  grid-column: 1;
  justify-self: start;
}

.pagination__arrow[rel=next] {
  grid-row: 1;
  grid-column: 3;
  justify-self: end;
}

.pagination__arrow:hover {
  background-color: var(--bg-card-hover);
  color: var(--text-link-hover);
}

.pagination__arrow svg {
  flex: 0 0 auto;
  width: 14px;
  height: 14px;
}

/* The control holds an icon and a word, and only the word has a typeface. Type
   therefore sits here rather than on the control, which owns the box: the icon
   is sized in pixels and inherits nothing, so this is the only element the
   heading face, the small step and the medium weight actually describe. */
.pagination__arrow-label {
  font-family: var(--ff-heading);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
}

/* Too narrow for one row: the number run takes a row of its own and the two
   arrows sit beneath it, one at each end, where a thumb reaches them. */
@media (max-width: 640px) {
  .pagination {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: var(--space-4);
    padding: var(--space-4);
  }
  .pagination__list {
    grid-row: 1;
    grid-column: 1/-1;
    justify-content: center;
  }
  .pagination__arrow[rel=prev] {
    grid-row: 2;
    grid-column: 1;
  }
  .pagination__arrow[rel=next] {
    grid-row: 2;
    grid-column: 2;
  }
  .pagination__page,
  .pagination__gap {
    min-width: 38px;
    height: 38px;
    padding-inline: var(--space-2);
  }
  .pagination__arrow {
    height: 38px;
    padding-inline: var(--space-3);
  }
}
/* The pay-later card, under the gallery. Same construction as the loyalty card
   so the two read as a pair either side of the hero, and the figure is set the
   same way — commerce face, black, with the explanation beneath it. */
.paylater-card__body {
  display: flex;
  align-items: center;
  gap: var(--space-4);
}

.paylater-card__icon {
  flex: 0 0 auto;
  width: 44px;
  height: 44px;
  color: var(--text-brand);
}

.paylater-card__icon svg {
  width: 100%;
  height: 100%;
}

/* Same floor as the loyalty card's figures, for the same reason: a flex item's
   default minimum is its longest word, so without it the instalment wording pushes
   the icon out of the row rather than wrapping under the figure. */
.paylater-card__figures {
  min-width: 0;
}

/* Matched to the loyalty figure so the two cards are the same height, which is
   the only way they line up along the top as well as the foot. */
.paylater-card__amount {
  display: block;
  font-family: var(--ff-chrome);
  font-size: var(--fs-h2);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.paylater-card__note {
  display: block;
  margin-block-start: var(--space-1);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

/* Both cards carry a trailing link, which is what makes them the same height —
   and that is the only way two cards bottom-aligned can also line up along the
   top. Bottom-aligning alone put their title bars 36px apart, which reads worse
   than the 14px it was meant to fix, because the eye follows the blue bar and
   not the foot of the card. */
.paylater-card .section-link,
.loyalty-card .section-link {
  margin-block-start: var(--space-4);
}

/* ---------------------------------------------------------------------------
   BLOCK — payment-marks  (EXTENDED — real marks replace the text labels;
   EXTENDED again on the basket's second review — a Google Pay mark joins the
   row, drawn the same way: a monochrome G and "Pay" in currentColor, in the
   same hairline chip. CSS unchanged; the row is now Visa, Mastercard,
   Apple Pay, Google Pay, Clearpay — the ways Stripe takes payment here.)
   The accepted ways to pay, beneath the checkout button and deliberately quiet
   — a reassurance, not a feature.

   What changed: each mark is now the payment scheme's own drawn mark (Visa,
   Mastercard, Apple Pay, Clearpay) as inline SVG rather than a text label, so
   the shopper recognises it at a glance instead of reading it. The marks are
   drawn in `currentColor` and the chip sets that to the muted text role: the
   schemes' own colours are not in this brand's seventeen, and a row of four
   competing logos beside the one blue button would be exactly the garishness
   the brief rules out. The chip keeps its square control corner and hairline.
   Each SVG carries role="img" and an aria-label, so the list still reads as
   words to a screen reader.
   --------------------------------------------------------------------------- */
.payment-marks {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-2);
  margin: var(--space-4) 0 0;
  padding: 0;
  list-style: none;
}

.payment-marks__mark {
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 56px;
  height: 34px;
  padding: var(--space-1) var(--space-2);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-btn);
  background-color: var(--bg-panel);
  color: var(--text-muted);
}

.payment-marks__mark svg {
  display: block;
  width: auto;
  height: 18px;
}

/* The two presentation details the marks' SVGs carried inline in the mockup, moved
   here because a theme template carries no inline styles: the Visa wordmark's slant,
   and the Clearpay mark's knocked-out arrow drawn in the panel colour. */
.payment-marks__italic {
  font-style: italic;
}

.payment-marks__knockout {
  stroke: var(--bg-panel);
}

/* ---------------------------------------------------------------------------
   BLOCK — payment-methods  (EXTENDED on the checkout's second review)
   The ways to pay as radio tiles: Card and Clearpay, and nothing else. Each
   tile's head is a `choice` radio with the method's name, an optional slate
   detail line, and the scheme's own marks at the far end — the basket's
   `payment-marks`, reused, so the marks here and under the order button are
   one drawing.

   What changed: markup and copy only, CSS untouched. Payments are Stripe's
   now; Apple Pay and Google Pay have moved up into express-checkout, so the
   Apple Pay tile is gone. The Card tile opens to Stripe's card fields (Card
   number, Expiry, Security code — Stripe's Payment Element collects no name
   on card) and the note under them names Stripe. The block now sits inside a
   bordered-group titled Payment.

   The tiles are list rows inside a hairline outline at the surface radius,
   the construction delivery-options uses, and the selected tile takes the
   same current-item marking: the blue-tint wash and a Paragon-blue rule on
   its leading edge. Only the selected tile opens. Its body keeps the leading
   rule, so the card fields read as belonging to the tile that opened them.

   A method that is not offered — Clearpay over its £1,200 limit — is simply
   absent. The tiles are a stack, so a missing one leaves no gap.
   --------------------------------------------------------------------------- */
.payment-methods {
  min-inline-size: 0;
  margin: 0;
  padding: 0;
  border: 1px solid var(--border-default);
  border-radius: var(--radius-card);
  overflow: hidden;
}

.payment-methods__legend {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

.payment-methods__item + .payment-methods__item {
  border-block-start: 1px solid var(--border-default);
}

.payment-methods__head {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3) var(--space-4);
  padding: var(--space-4) var(--space-6);
  background-color: var(--bg-panel);
}

.payment-methods__item:has(> .payment-methods__head .input-radio:checked) .payment-methods__head {
  background-color: var(--bg-card-hover);
  box-shadow: inset 3px 0 0 var(--border-brand);
}

.payment-methods__head .choice {
  flex: 1 1 auto;
  align-items: center;
}

.payment-methods__head .choice__control {
  margin-block-start: 0;
}

.payment-methods__name {
  display: block;
  font-family: var(--ff-heading);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.payment-methods__detail {
  display: block;
  margin-block-start: var(--space-1);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

.payment-methods__marks {
  flex: 0 0 auto;
}

/* payment-marks sits under a button everywhere else, centred with a gap
   above it. In a tile head it sits beside the method's name, so the head
   takes both back. Nothing else about the marks changes. */
.payment-methods__marks .payment-marks {
  margin: 0;
  justify-content: flex-end;
}

.payment-methods__body {
  padding: var(--space-6);
  border-block-start: 1px solid var(--border-default);
  background-color: var(--bg-panel);
  box-shadow: inset 3px 0 0 var(--border-brand);
}

.payment-methods__note {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  margin: var(--space-6) 0 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-muted);
}

.payment-methods__note-icon {
  flex: 0 0 auto;
  width: 18px;
  height: 18px;
  color: var(--text-brand);
}

.payment-methods__note-icon svg {
  display: block;
  width: 100%;
  height: 100%;
}

@media (max-width: 640px) {
  .payment-methods__head {
    padding: var(--space-4);
  }
  .payment-methods__marks {
    flex-basis: 100%;
    padding-inline-start: calc(20px + var(--space-3));
  }
  .payment-methods__marks .payment-marks {
    justify-content: flex-start;
  }
  .payment-methods__body {
    padding: var(--space-4);
  }
  .payment-methods__note {
    align-items: flex-start;
  }
}
/* The highlight follows the CHECKED RADIO through `:has()` above, and nothing else.
   WooCommerce's checkout script only swaps the open payment box when the shopper picks
   another method, so a class the server sets on the chosen gateway never moves: a
   `--selected` modifier drawn here as well left Card lit beside Klarna or Clearpay
   (operator, 2026-09-26). The server already renders the chosen radio `checked`, so the
   radio alone covers first paint too. The radio itself is the brand choice control
   (WooCommerce's `input-radio` class kept for its script). */
/* PLACE ORDER closes the Payment card (operator, 2026-09-26). It is WooCommerce's
   `#place_order`, whose text checkout.js rewrites on every payment-method change — an
   icon inside it would be wiped on page load — so the padlock is drawn here, from the
   same drawing the other Place Order buttons carry, as a mask in currentColor (a data
   URI cannot read a custom property). */
.place-order #place_order::before {
  content: "";
  width: 16px;
  height: 16px;
  background-color: currentColor;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='10.5' width='16' height='11'/%3E%3Cpath d='M8 10.5V7a4 4 0 0 1 8 0v3.5'/%3E%3C/svg%3E") center/contain no-repeat;
}

.woocommerce-checkout-payment .form-actions {
  margin-block-start: var(--space-8);
}

.woocommerce-checkout-payment .form-actions + .woocommerce-terms-and-conditions-wrapper {
  margin-block-start: var(--space-4);
}

/* ---------------------------------------------------------------------------
   BLOCK — product-card  (UPDATED — an instalment line and three states)

   Four additive slots, every one of them optional. The card still renders
   correctly with all four absent, which is how the homepage and the editorial
   buy band already use it, and nothing about the base card moved.

     __badge          the sale mark, alert red, on the image. Red is reserved
                      for sale, out of stock and errors, and this is the first
                      time the card has drawn it.
     __price-was      the previous price struck through beside the current one.
                      The current price stays ink: the badge carries the red,
                      so red never becomes decoration.
     __instalments    pay-later messaging belongs beside a price and not only
                      in a trust card. Shown above a threshold only, so it
                      never appears under a £5.99 cable, and never on an item
                      that cannot be bought.
     __stock-note     'Only 2 left'. Set in ink at medium weight rather than
                      red, because low stock is not on the brand's red list.
                      Rare is what makes it credible.

   Out of stock is a state rather than a slot: the stock dot turns red and the
   basket button gives way to 'Notify me', which is not a commerce action and
   so sets its label in the heading font like every other secondary button.
   The card keeps its shape.

   One correction carried in this overwrite: the catalogue's copy of the media
   rule had an escape character in front of the slash in its aspect ratio, which
   no browser parses. It reads plainly here.
   --------------------------------------------------------------------------- */
.product-card {
  display: flex;
  flex-direction: column;
  background-color: var(--bg-card);
  border-radius: var(--radius-card);
  overflow: hidden;
  box-shadow: var(--shadow-card);
}

.product-card__media {
  position: relative;
  display: block;
  padding: var(--space-6) var(--space-4);
  background-color: var(--bg-card);
}

.product-card__media img {
  display: block;
  width: 100%;
  aspect-ratio: 4/3;
  object-fit: contain;
}

.product-card__badge {
  position: absolute;
  inset-block-start: var(--space-4);
  inset-inline-start: var(--space-4);
  padding: var(--space-1) var(--space-3);
  background-color: var(--color-negative);
  font-family: var(--ff-chrome);
  font-size: var(--fs-small);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--text-on-brand);
}

.product-card__body {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  padding: var(--space-6);
  padding-block-start: 0;
}

.product-card__title {
  margin: 0;
  font-family: var(--ff-chrome);
  font-size: var(--fs-h4);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  letter-spacing: 0.01em;
}

.product-card__title a {
  color: var(--text-heading);
  text-decoration: none;
}

.product-card__title a:hover {
  color: var(--text-link);
}

.product-card__price {
  margin: 0;
  font-family: var(--ff-chrome);
  font-size: var(--fs-h3);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.product-card__price-was {
  margin-inline-start: var(--space-2);
  font-size: var(--fs-h4);
  font-weight: var(--fw-regular);
  color: var(--text-muted);
  text-decoration: line-through;
}

/* The instalment line is pulled back against the price it belongs to, out of
   the body's own gap, so it reads as part of the price and not as a third
   line of meta. */
.product-card__instalments {
  margin: calc(-1 * var(--space-2)) 0 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

.product-card__meta {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  color: var(--text-muted);
}

.product-card__stock-dot {
  flex: 0 0 auto;
  width: 8px;
  height: 8px;
  border-radius: var(--radius-pill);
  background-color: var(--color-positive);
}

.product-card__stock-dot--out {
  background-color: var(--color-negative);
}

.product-card__stock-note {
  margin: calc(-1 * var(--space-2)) 0 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

/* The actions sit on the card's floor, so a row of cards lines its buttons up
   whatever the titles run to (operator, 2026-09-24). The body fills the card's
   height (above) and `auto` takes up the slack; the 4px the row always had above
   it is kept as padding, so a lone card looks exactly as it did. */
.product-card__actions {
  display: flex;
  align-items: stretch;
  gap: var(--space-2);
  margin-block-start: auto;
  padding-block-start: var(--space-1);
}

.product-card__actions .btn {
  flex: 1 1 auto;
}

.product-card__wishlist {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 42px;
  padding: 0;
  border: 1px solid var(--border-default);
  border-radius: var(--radius-btn);
  background-color: var(--bg-card);
  color: var(--text-brand);
  cursor: pointer;
}

.product-card__wishlist:hover {
  border-color: var(--border-brand);
  background-color: var(--bg-card-hover);
}

.product-card__wishlist svg {
  width: 26px;
  height: 26px;
}

/* EVERY CARD IN THE STRIP IS THE SAME HEIGHT, ACROSS ROWS AS WELL AS ALONG THEM.

   A grid row is as tall as its own tallest item, so a four-card strip laid out
   two-by-two gives two rows that each size independently — and one product title
   wrapping to a second line makes the whole bottom row taller than the top one.
   Within a row the cards already match, which is what makes the difference read
   as a fault rather than as content: two cards of one height beside two of
   another, with nothing visible to explain it.

   `1fr` sizes every row to the tallest, so the strip is one block of equal cards
   whatever any single title does. Safe because the card is a flex column with its
   price pinned to the bottom — a stretched card grows its middle, it does not
   leave a gap under its content.

   Brand-side rather than on `.grid--in-cell`, which is a global modifier four
   brands use: the rule an inner grid needs is "occupy one cell", and equal rows
   is this strip's own decision. */
.wp-block-tff-product-strip {
  grid-auto-rows: 1fr;
  /* AND NOT ONCE IT IS A SINGLE COLUMN. `.grid--2` collapses at 768, and below
     that every card is its own row — so `1fr` stops equalising cards beside each
     other and starts padding every stacked card out to the tallest one in the
     strip. Measured at 390: four cards at 587px each, where their own content
     wanted 563, 563, 587 and 563. Equal height is a rule about a ROW of cards,
     and there are no rows here. */
}

@media (max-width: 768px) {
  .wp-block-tff-product-strip {
    grid-auto-rows: auto;
  }
}
/* ===========================================================================
   NEW BLOCKS — authored here because no catalogue block carries the
   structural purpose.
   =========================================================================== */
/* ---------------------------------------------------------------------------
   THIS PAGE'S OWN BLOCKS
   --------------------------------------------------------------------------- */
/* ---------------------------------------------------------------------------
   BLOCK — product-gallery  (UPDATED — the thumbnail rail is vertical)
   Manufacturer shots on white at their natural proportions; the design brief
   forbids cropping them into scenes, so the stage is `object-fit: contain` and
   a square shot and a wide one both sit correctly in it.

   The rail moved from under the stage to beside it. Eight 76px thumbs at an
   8px gap stack to 664px against a 690px stage, so the gallery is exactly as
   tall as its own picture and adds nothing to the column. `auto-fill` on a
   strip underneath could not do that — it added a row's height to whichever
   column was already taller, which is how two earlier attempts ended up with
   white space to fill.

   The current thumbnail is marked with the brand's 2px Paragon-blue border,
   the same weight a bordered group uses, because this brand has no second
   accent to mark a selection with.
   --------------------------------------------------------------------------- */
.product-gallery {
  display: grid;
  grid-template-columns: 76px minmax(0, 1fr);
  align-items: start;
  gap: var(--space-4);
}

.product-gallery__thumbs {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  margin: 0;
  padding: 0;
  list-style: none;
}

.product-gallery__thumb {
  display: block;
  width: 100%;
  padding: var(--space-1);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-card);
  background-color: var(--bg-panel);
  cursor: pointer;
}

.product-gallery__thumb:hover {
  border-color: var(--border-brand);
}

.product-gallery__thumb:focus-visible {
  outline: 2px solid var(--border-focus);
  outline-offset: 2px;
}

.product-gallery__thumb--active .product-gallery__thumb {
  border: 2px solid var(--border-brand);
  padding: calc(var(--space-1) - 1px);
}

.product-gallery__thumb .product-gallery__img {
  display: block;
  width: 100%;
  aspect-ratio: 1/1;
  object-fit: contain;
}

.product-gallery__main {
  display: block;
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  overflow: hidden;
}

/* `aspect-ratio` holds only because the global reset gives every image
   `height: auto`: `wp_get_attachment_image()` emits width and height ATTRIBUTES, and
   without an author height rule the attribute sets the used height — every thumbnail
   rendered at 300px inside a 66px box. This rule carried its own `height: auto` until
   the reset took it on for every image (2026-09-27). */
.product-gallery__img {
  display: block;
  width: 100%;
  aspect-ratio: 1/1;
  object-fit: contain;
  background-color: var(--bg-panel);
}

@media (max-width: 1180px) {
  .product-gallery {
    grid-template-columns: minmax(0, 1fr);
  }
  .product-gallery__thumbs {
    flex-direction: row;
    flex-wrap: wrap;
    order: 2;
  }
  .product-gallery__thumb {
    flex: 0 0 76px;
  }
}
/* ---------------------------------------------------------------------------
   OVERRIDES THAT MUST OUTRANK THE BLOCKS ABOVE

   Both of these are single-class rules that tie with a block's own single-class
   rule, so they win on SOURCE ORDER and nothing else — which is why they are
   written here, after the blocks, rather than up with the page layout. Placed
   before the blocks they lose silently and the page renders as if they were
   never written; that is exactly what happened to the gallery modifier on the
   first run of this build.
   --------------------------------------------------------------------------- */
/* ---- product-gallery --under ----------------------------------------------

   The thumbnails go UNDER the stage rather than beside it, and at this width
   that is arithmetic rather than taste: the gallery panel's padding leaves
   446px, and a 76px rail down the side would take the picture to 354. Under
   it, the stage keeps the whole 446.
   --------------------------------------------------------------------------- */
.product-gallery--under {
  grid-template-columns: minmax(0, 1fr);
}

/* ONE ROW, SCROLLED — not wrapped.
   Eight thumbs at 76px plus gaps need 700px and the rail has 446, so wrapping put
   them on two rows and the gallery's height then changed with the image count:
   a four-image product and a nine-image one made different-sized panels, which is
   the hero's two halves argued about in a different form.
   Scrolled, the rail is one row whatever the product carries. `scroll-snap` makes
   a drag land on a thumb rather than between two, and the thin scrollbar is left
   VISIBLE deliberately — a scroll area with no scrollbar is a scroll area nobody
   knows about. */
.product-gallery--under .product-gallery__thumbs {
  flex-direction: row;
  flex-wrap: nowrap;
  order: 2;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-snap-type: x proximity;
  padding-block-end: var(--space-2);
  scrollbar-width: thin;
  scrollbar-color: var(--border-strong) transparent;
}

.product-gallery--under .product-gallery__thumbs::-webkit-scrollbar {
  height: 6px;
}

.product-gallery--under .product-gallery__thumbs::-webkit-scrollbar-thumb {
  border-radius: var(--radius-pill);
  background-color: var(--border-strong);
}

.product-gallery--under .product-gallery__thumb {
  flex: 0 0 76px;
  scroll-snap-align: start;
}

/* ---------------------------------------------------------------------------
   BLOCK — gallery lightbox  (NEW)
   The stage opens a full-size view. Component buyers inspect port layouts and
   connector positions, and eight photographs at 446px does not let them.

   Driven by `:target`, so the mockup demonstrates the real behaviour with no
   script; the theme's own modal module takes over at wiring time.
   --------------------------------------------------------------------------- */
.product-gallery__zoom {
  position: relative;
  cursor: zoom-in;
}

.product-gallery__zoom-cue {
  position: absolute;
  inset-block-start: var(--space-3);
  inset-inline-end: var(--space-3);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 38px;
  height: 38px;
  border: 1px solid var(--border-default);
  border-radius: var(--radius-btn);
  background-color: var(--bg-panel);
  color: var(--text-brand);
}

.product-gallery__zoom-cue svg {
  width: 20px;
  height: 20px;
}

.product-gallery__zoom:hover .product-gallery__zoom-cue {
  border-color: var(--border-brand);
  background-color: var(--bg-card-hover);
}

/* ---------------------------------------------------------------------------
   BLOCK — product-heading  (UPDATED — it lives in the decision column)
   26px in the commerce face, bold and slanted, over the brand's diagonal-cut
   rule. It used to run across the whole page at 40px; at that size it was the
   loudest thing on a page whose job is a photograph and a price.
   --------------------------------------------------------------------------- */
.product-heading__eyebrow {
  display: inline-block;
  margin: 0 0 var(--space-2);
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-link);
  text-decoration: none;
}

.product-heading__eyebrow:hover {
  color: var(--text-link-hover);
}

.product-heading__title {
  margin: 0;
  font-family: var(--ff-chrome);
  font-size: var(--fs-h3);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  letter-spacing: 0.01em;
  color: var(--text-heading);
}

.product-heading__rule {
  display: block;
  width: 100%;
  height: 6px;
  margin-block-start: var(--space-4);
  background-color: var(--color-brand);
  clip-path: polygon(20px 0, 100% 0, 100% 100%, 0 100%);
}

@media (max-width: 640px) {
  .product-heading__title {
    font-size: var(--fs-h4);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — product-line  (NEW)
   The compact product row for a rail: a small manufacturer shot on white,
   the name and the price in the commerce font. The whole row is the link —
   no basket button here; the article's Buy it band carries those. Rows run
   edge to edge in a flush widget body, each with a hairline above it.
   --------------------------------------------------------------------------- */
.product-line {
  display: grid;
  grid-template-columns: 56px minmax(0, 1fr);
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-3) var(--space-6);
  border-block-start: 1px solid var(--border-default);
  text-decoration: none;
}

.product-line:hover {
  background-color: var(--bg-card-hover);
}

.product-line__media {
  display: block;
  width: 56px;
  aspect-ratio: 1;
  object-fit: contain;
  border: 1px solid var(--border-default);
  border-radius: var(--radius-card);
  background-color: var(--bg-card);
}

.product-line__body {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
  min-width: 0;
}

.product-line__title {
  font-family: var(--ff-chrome);
  font-size: var(--fs-small);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.product-line:hover .product-line__title {
  color: var(--text-link);
}

.product-line__price {
  font-family: var(--ff-chrome);
  font-size: var(--fs-body);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  color: var(--text-body);
}

/* ---------------------------------------------------------------------------
   BLOCK — product-list-row  (NEW)
   The listing's other layout, and a different block from the product card on
   purpose: the card compares products by shape and price, and the row
   compares them by specification.

   Image left; title, three bullet highlights and the three facts a shopper
   asks for — stock, dispatch day, loyalty points — in the middle; price,
   instalment line, wishlist and add to basket in a column on the right, so the
   prices line up down the page whatever the titles do.

   The bullet is the brand's small Paragon-blue dot. The facts are outline
   Paragon-blue icons with a short body-font label each. Loyalty points are
   display-only until the points system exists.
   --------------------------------------------------------------------------- */
.product-list-row {
  display: grid;
  grid-template-columns: 200px minmax(0, 1fr) 250px;
  gap: var(--space-6);
  padding: var(--space-6);
  background-color: var(--bg-card);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-card);
}

.product-list-row__media {
  display: block;
  align-self: start;
}

.product-list-row__media img {
  display: block;
  width: 100%;
  aspect-ratio: 4/3;
  object-fit: contain;
}

/* The middle column. The track places it — `minmax( 0, 1fr )` between a fixed
   picture and a fixed buy column — so it declares no layout, only the floor that
   keeps a long product name inside the column instead of widening the row past
   its own card. Product names here run to 'Backbone One: PlayStation Gaming
   Controller For iOS Lightning - White'. */
.product-list-row__body {
  min-width: 0;
}

.product-list-row__title {
  margin: 0;
  font-family: var(--ff-chrome);
  font-size: var(--fs-h4);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  letter-spacing: 0.01em;
}

.product-list-row__title a {
  color: var(--text-heading);
  text-decoration: none;
}

.product-list-row__title a:hover {
  color: var(--text-link);
}

.product-list-row__highlights {
  margin: var(--space-3) 0 0;
  padding: 0;
  list-style: none;
}

.product-list-row__highlight {
  position: relative;
  padding-inline-start: var(--space-4);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.product-list-row__highlight::before {
  content: "";
  position: absolute;
  inset-inline-start: 0;
  inset-block-start: 0.62em;
  width: 6px;
  height: 6px;
  border-radius: var(--radius-pill);
  background-color: var(--color-brand);
}

.product-list-row__facts {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2) var(--space-6);
  margin: var(--space-4) 0 0;
  padding: 0;
  list-style: none;
}

.product-list-row__fact {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

.product-list-row__fact svg {
  flex: 0 0 auto;
  width: 18px;
  height: 18px;
  color: var(--text-brand);
}

.product-list-row__buy {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: var(--space-2);
}

.product-list-row__price {
  margin: 0;
  font-family: var(--ff-chrome);
  font-size: var(--fs-h3);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.product-list-row__instalments {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
  text-align: right;
}

.product-list-row__actions {
  display: flex;
  align-items: stretch;
  gap: var(--space-2);
  width: 100%;
  margin-block-start: var(--space-2);
}

.product-list-row__actions .btn {
  flex: 1 1 auto;
}

.product-list-row__wishlist {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 42px;
  padding: 0;
  border: 1px solid var(--border-default);
  border-radius: var(--radius-btn);
  background-color: var(--bg-card);
  color: var(--text-brand);
  cursor: pointer;
}

.product-list-row__wishlist:hover {
  border-color: var(--border-brand);
  background-color: var(--bg-card-hover);
}

.product-list-row__wishlist svg {
  width: 26px;
  height: 26px;
}

@media (max-width: 900px) {
  .product-list-row {
    grid-template-columns: 150px minmax(0, 1fr);
  }
  .product-list-row__buy {
    grid-column: 1/-1;
    flex-direction: row;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
  }
  .product-list-row__actions {
    width: auto;
    margin-block-start: 0;
  }
}
@media (max-width: 640px) {
  .product-list-row {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--space-4);
  }
  .product-list-row__media img {
    max-width: 200px;
  }
  .product-list-row__actions {
    width: 100%;
  }
}
/* ---- the list view's container --------------------------------------------

   The rows stack; nothing else. It is the grid's counterpart and the two never
   render together — the shopper's view toggle picks one.

   Not in the catalogue row, which stores the ROW. Taken from the MPG7 mockup's
   own stylesheet, where it is declared beside it.
   --------------------------------------------------------------------------- */
.product-list {
  display: flex;
  flex-direction: column;
  gap: var(--space-content-gap);
}

.product-mini {
  display: flex;
  flex-direction: column;
  background-color: var(--bg-card);
  border-radius: var(--radius-card);
  overflow: hidden;
  box-shadow: var(--shadow-card);
}

.product-mini__media {
  display: block;
  padding: var(--space-3);
  background-color: var(--bg-card);
}

.product-mini__media img {
  display: block;
  width: 100%;
  aspect-ratio: 1/1;
  object-fit: contain;
}

.product-mini__body {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  padding: var(--space-4);
  padding-block-start: 0;
}

.product-mini__title {
  margin: 0;
  font-family: var(--ff-chrome);
  font-size: var(--fs-small);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
}

.product-mini__title a {
  color: var(--text-heading);
  text-decoration: none;
}

.product-mini__title a:hover {
  color: var(--text-link);
}

.product-mini__price {
  margin: 0;
  font-family: var(--ff-chrome);
  font-size: var(--fs-body);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.promo-tile {
  position: relative;
  display: block;
  aspect-ratio: 1;
  border-radius: var(--radius-card);
  overflow: hidden;
  background-color: var(--neutral-800);
  box-shadow: var(--shadow-card);
  text-decoration: none;
}

/* THE TILE THAT TAKES ITS HEIGHT FROM A NEIGHBOUR (MPG1 walk, 2026-09-16).

   The square above is right for the rail, where the tile has no neighbour to
   measure against and a fixed ratio is what removes the height breakpoint. The
   homepage's Best Sellers band is the other case: one tall tile beside a 2x2
   product grid, where the tile's job is to stand exactly as tall as the four
   cards next to it. A square there either leaves a gap under it or crops the
   artwork — and the artwork is authored 560x760 for this slot.

   So the ratio is dropped rather than replaced. The grid row supplies the
   height, the media fills it, and nothing here needs to know how tall that is.

   NO `height: 100%` HERE, and that is the working part rather than an omission.
   A percentage height on a grid item resolves against its grid AREA, and an
   `auto`-sized row is indefinite while it is being laid out — so the percentage
   falls back to auto and the tile sizes to its image's own aspect ratio instead.
   Measured: 622px against a 1445px neighbour, which is the fault it was meant to
   fix. Leaving the height auto lets the grid's default `align-items: stretch`
   do it, and `__media` at `height: 100%` then has a definite box to fill. */
.promo-tile--fill {
  aspect-ratio: auto;
}

.promo-tile__media {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.promo-tile__scrim {
  position: absolute;
  inset: 0;
  background: linear-gradient(0deg, var(--bg-overlay) 0%, var(--bg-overlay) 35%, transparent 80%);
}

.promo-tile__content {
  position: absolute;
  inset-inline: 0;
  inset-block-end: 0;
  padding: var(--space-8);
}

.promo-tile__title {
  display: block;
  font-family: var(--ff-heading);
  font-size: var(--fs-h3);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-on-brand);
}

.promo-tile__cue {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  margin-block-start: var(--space-3);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  color: var(--text-on-brand);
}

.promo-tile__cue svg {
  width: 16px;
  height: 16px;
}

@media (max-width: 1100px) {
  .promo-tile,
  .promo-tile__media {
    min-height: 300px;
  }
}
.prose {
  max-width: var(--container-reading);
}

.prose p {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.prose p + p {
  margin-block-start: var(--space-6);
}

.prose a {
  color: var(--text-link);
  font-weight: var(--fw-medium);
  text-decoration: none;
}

.prose a:hover {
  color: var(--text-link-hover);
}

.prose ul,
.prose ol {
  margin: 0;
  padding-inline-start: var(--space-6);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.prose ul {
  list-style: none;
}

.prose ul > li {
  position: relative;
}

.prose ul > li::before {
  content: "";
  position: absolute;
  inset-inline-start: calc(-1 * var(--space-6));
  inset-block-start: 0.7em;
  width: 7px;
  height: 7px;
  border-radius: var(--radius-pill);
  background-color: var(--color-brand);
}

.prose li + li,
.prose ul + ul,
.prose ol + ol {
  margin-block-start: var(--space-3);
}

.prose p + ul,
.prose p + ol,
.prose ul + p,
.prose ol + p {
  margin-block-start: var(--space-6);
}

/* ---------------------------------------------------------------------------
   BLOCK — pull-quote  (NEW)
   Editorial only. The gradient fills the quote's own letterforms rather than a
   panel behind it, which is the same move the score ring makes and the only
   form the gradient takes in this brand. It never touches a store surface.
   --------------------------------------------------------------------------- */
.pull-quote {
  margin: var(--space-8) 0 0;
  padding-inline-start: var(--space-6);
  border-inline-start: 3px solid var(--color-brand);
}

.pull-quote__text {
  margin: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h3);
  font-weight: var(--fw-light);
  font-style: italic;
  line-height: var(--lh-heading);
  color: var(--text-brand);
  background-image: var(--gradient-editorial);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}

@media (max-width: 640px) {
  .pull-quote {
    padding-inline-start: var(--space-4);
  }
  .pull-quote__text {
    font-size: var(--fs-h4);
  }
}
.range-card {
  display: flex;
  flex-direction: column;
  background-color: var(--bg-card);
  border-radius: var(--radius-card);
  overflow: hidden;
  box-shadow: var(--shadow-card);
  text-decoration: none;
}

.range-card:hover {
  background-color: var(--bg-card-hover);
}

.range-card__media {
  display: block;
  width: 100%;
  aspect-ratio: 4/3;
  object-fit: cover;
}

.range-card__body {
  display: block;
  padding: var(--space-6);
}

.range-card__title {
  display: block;
  font-family: var(--ff-heading);
  font-size: var(--fs-h4);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
  margin-block-end: var(--space-1);
}

.range-card__count {
  display: block;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

/* ---------------------------------------------------------------------------
   BLOCK — reading-progress  (NEW)
   A thin Paragon-blue line fixed to the very top of the viewport, filling
   as the reader moves through the body — from the top of the reading card
   to the end of the last paragraph. Quiet: hidden until the reader has
   scrolled past the hero, 3px, no label. Off on phones, where nothing is
   fixed or sticky.
   --------------------------------------------------------------------------- */
.reading-progress {
  position: fixed;
  inset-block-start: 0;
  inset-inline: 0;
  z-index: 20;
  height: 3px;
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.2s linear;
}

.reading-progress--visible {
  opacity: 1;
}

.reading-progress__bar {
  display: block;
  height: 100%;
  background-color: var(--color-brand);
  transform: scaleX(var(--progress, 0));
  transform-origin: left center;
}

@media (prefers-reduced-motion: reduce) {
  .reading-progress {
    transition: none;
  }
}
@media (max-width: 640px) {
  .reading-progress {
    display: none;
  }
}
.recent-row {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: var(--space-content-gap);
}

/* ---------------------------------------------------------------------------
   BLOCK — review-card  (REUSED, verbatim)
   --------------------------------------------------------------------------- */
.review-card {
  display: flex;
  flex-direction: row;
  background-color: var(--bg-card);
  border-radius: var(--radius-card);
  overflow: hidden;
  box-shadow: var(--shadow-card);
}

.review-card__media {
  display: block;
  flex: 0 0 360px;
  align-self: stretch;
}

.review-card__media img {
  display: block;
  width: 100%;
  height: 100%;
  aspect-ratio: 16/9;
  object-fit: cover;
}

.review-card__body {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  padding: var(--space-card-padding);
}

.review-card__kicker {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: 1;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-brand);
}

.review-card__title {
  margin: var(--space-3) 0 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h4);
  font-weight: var(--fw-regular);
  font-style: italic;
  line-height: var(--lh-heading);
}

.review-card__title a {
  color: var(--text-brand);
  text-decoration: none;
}

.review-card__title a:hover {
  color: var(--text-link-hover);
}

.review-card__score {
  display: flex;
  align-items: center;
  margin: var(--space-4) 0 0;
}

.review-card__unscored {
  display: inline-flex;
  align-items: center;
  gap: var(--space-3);
  margin: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-muted);
}

.review-card__unscored::before {
  content: "";
  flex: 0 0 auto;
  width: 24px;
  height: 3px;
  background-color: var(--color-brand);
}

.review-card__summary {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  overflow: hidden;
  margin: var(--space-4) 0 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.review-card__date {
  margin: 0;
  margin-block-start: auto;
  padding-block-start: var(--space-4);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

@media (max-width: 640px) {
  .review-card {
    flex-direction: column;
  }
  .review-card__media {
    flex-basis: auto;
  }
}
/* ---------------------------------------------------------------------------
   PAGE LAYOUT — the shell, the rail and the region grids.

   BUILT 2026-09-15 from six pieces of operator feedback, after three designs
   were rejected. Each of the six is answered in one place and the place is
   named, so a later session can see which choices are load-bearing:

   1. The short description goes BEFORE the buy box    → .buy-region__summary
   2. Loyalty points sit AFTER the buy box             → .buy-region__summary
   3. Stat pills live inside the product description   → .doc-figures
   4. The description takes the live site's column     → .store-layout
   5. Add to Basket never wraps to two lines           → .btn--commerce, .route-row
   6. The navigation rail comes back, desktop only     → .store-layout__sidebar

   THE COLUMN IS 1042px AND THAT IS THE POINT OF (4). It is what the live store
   gives its content: a 1400 page, a 328 rail, a 30 gap. Three drafts put the
   description at 680 or 740 because that is the styleguide's READING measure,
   and all three read as cramped — because the measure was set for editorial
   pages, where prose is alone on the page. A product description is not alone:
   it carries stat blocks, spec tables and feature rows, and it wants the room
   the store already gives it. The 680 measure still governs article pages.
   --------------------------------------------------------------------------- */
.page__inner {
  max-width: calc(var(--site-max-width) + var(--gutter-small) * 2);
  margin-inline: auto;
  padding-inline: var(--gutter-small);
}

/* ---- the route bands ------------------------------------------------------

   (5) THE ROW MEASURES ITS COLUMNS, IT DOES NOT COUNT THEM. 'Add to Basket'
   needs about 244px with its wishlist button beside it, and a card's own
   padding takes 48 more — so 292px is the width below which the action cannot
   be served, and `auto-fill` fits as many of those as the row has room for.

   A fixed three-across was the first answer and it broke at 1150, where the
   rail is still present and the content column has dropped to 702: three cards
   of 214 each, and `white-space: nowrap` turned the squeeze into a horizontal
   scrollbar across the whole page. That nowrap is doing its job — it makes the
   failure visible instead of quietly wrapping the button again — but the fix is
   to stop hard-coding a column count that the content column cannot always
   afford.
   --------------------------------------------------------------------------- */
.route-row {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(292px, 1fr));
  gap: var(--space-content-gap);
}

/* ---------------------------------------------------------------------------
   BLOCK — score-badge  (NEW)
   The compact score beside a review's title: the catalogue's score ring and a
   quiet "Jump to verdict" link under it, wrapped to the ring's width. Hidden
   below 1100px, where the score strip under the byline takes its place.
   --------------------------------------------------------------------------- */
.score-badge {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-2);
  padding-block-start: var(--space-1);
  text-align: center;
}

.score-badge__link {
  max-width: 72px;
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-link);
  text-decoration: none;
}

.score-badge__link:hover {
  color: var(--text-link-hover);
}

@media (max-width: 1100px) {
  .score-badge {
    display: none;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — score-glance  (NEW)
   The verdict at a glance, for the rail: the ring with its scale, then the
   five aspects as compact star rows. The full score panel stays at the end of
   the article where reviews conclude; this is the one-look version. Sits in a
   widget body.
   --------------------------------------------------------------------------- */
.score-glance__head {
  display: flex;
  align-items: center;
  gap: var(--space-4);
  padding-block-end: var(--space-4);
  border-block-end: 1px solid var(--border-default);
}

.score-glance__overall {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
}

.score-glance__label {
  margin: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-heading);
}

.score-glance__scale {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

.score-glance__aspects {
  margin: var(--space-2) 0 0;
  padding: 0;
  list-style: none;
}

.score-glance__aspect {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  padding-block: var(--space-2);
}

.score-glance__aspect + .score-glance__aspect {
  border-block-start: 1px solid var(--border-default);
}

.score-glance__aspect-label {
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

/* ---------------------------------------------------------------------------
   BLOCK — score-list  (NEW)
   The compact 'best of' for a rail: the score, then the title, one line each,
   highest first. Built in count-list's construction — hairline separators,
   the blue-tint wash on hover, 24px inline padding — so the rail carries one
   list rhythm, not two. The difference is the thing on the left: a score is
   the point of the row, so it leads and it carries the editorial gradient the
   styleguide allows on review score figures, sitting on the ring's 3px
   Paragon-blue stroke laid flat. The title is the magazine's: heading font,
   regular, italic, Paragon blue.
   --------------------------------------------------------------------------- */
.score-list {
  margin: 0;
  padding: 0;
  list-style: none;
}

.score-list__item + .score-list__item {
  border-block-start: 1px solid var(--border-default);
}

.score-list__link {
  display: grid;
  grid-template-columns: 40px minmax(0, 1fr);
  align-items: center;
  gap: var(--space-4);
  padding: var(--space-3) var(--space-6);
  text-decoration: none;
}

.score-list__link:hover {
  background-color: var(--bg-card-hover);
}

.score-list__score {
  justify-self: start;
  padding-block-end: var(--space-1);
  border-block-end: 3px solid var(--border-brand);
  font-family: var(--ff-heading);
  font-size: var(--fs-h4);
  font-weight: var(--fw-medium);
  line-height: 1;
  color: var(--text-brand);
  background-image: var(--gradient-editorial);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}

.score-list__title {
  font-family: var(--ff-heading);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  font-style: italic;
  line-height: var(--lh-heading);
  color: var(--text-brand);
}

.score-list__link:hover .score-list__title {
  color: var(--text-link-hover);
}

/* ---------------------------------------------------------------------------
   BLOCK — score-meter  (NEW)
   The large score: a white disc with the score drawn as an arc of Paragon
   blue around it — 58 fills 58% of the ring — and the figure in the
   editorial gradient inside. The same indicator as score-ring, grown, with
   the arc doing what a border cannot: showing how much of the ring is
   earned. Round, because it is an indicator.

   Two sizes: the default for the hero (the only big ring above the fold)
   and --lg for the verdict finale. The arc is complete in the markup, so the
   meter is right with no script at all. The finale's meter opts in to the
   reveal with data-reveal: the script sets --pending (arc empty) and lifts it
   when the meter scrolls into view, and the arc draws itself. Under reduced
   motion the script never sets --pending and the transition is off.
   --------------------------------------------------------------------------- */
.score-meter {
  position: relative;
  display: inline-flex;
  flex: 0 0 auto;
  align-items: center;
  justify-content: center;
  width: 112px;
  height: 112px;
  border-radius: var(--radius-pill);
  background-color: var(--bg-card);
}

.score-meter__ring {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  transform: rotate(-90deg);
}

.score-meter__track,
.score-meter__arc {
  fill: none;
  stroke-width: 7;
}

.score-meter__track {
  stroke: var(--arctic-200);
}

.score-meter__arc {
  stroke: var(--border-brand);
  stroke-dasharray: var(--score, 0) 100;
  transition: stroke-dasharray 1.6s cubic-bezier(0.22, 0.8, 0.25, 1);
}

.score-meter--pending .score-meter__arc {
  stroke-dasharray: 0 100;
}

.score-meter__value {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-1);
}

.score-meter__figure {
  font-family: var(--ff-heading);
  font-size: var(--fs-h1);
  font-weight: var(--fw-medium);
  line-height: 1;
  color: var(--text-brand);
  background-image: var(--gradient-editorial);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  font-variant-numeric: tabular-nums;
}

.score-meter__scale {
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: 1;
  letter-spacing: 0.08em;
  color: var(--text-muted);
}

.score-meter--lg {
  width: 168px;
  height: 168px;
}

.score-meter--lg .score-meter__figure {
  font-size: calc(var(--fs-h1) * 1.5);
}

@media (prefers-reduced-motion: reduce) {
  .score-meter__arc {
    transition: none;
  }
}
@media (max-width: 640px) {
  .score-meter--lg {
    width: 128px;
    height: 128px;
  }
  .score-meter--lg .score-meter__figure {
    font-size: var(--fs-h1);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — score-panel  (NEW)
   The verdict, read without reading the piece: one figure, five aspects, and
   what was good against what was not. It carries no border or ground because
   it sits inside the brand's bordered group — the one labelled-panel
   treatment — and the overall figure reuses the catalogue's score ring, which
   is where the editorial gradient is allowed to appear.

   The two verdict lists are genuinely uneven — two positives against four
   negatives on this review — so the columns start at the top and are never
   stretched level. A forced-level pair would read as a designed balance the
   review does not have.
   --------------------------------------------------------------------------- */
.score-panel {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  align-items: start;
  gap: var(--space-6) var(--space-12);
}

.score-panel__overall {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-3);
  text-align: center;
}

.score-panel__overall-label {
  margin: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-heading);
}

.score-panel__overall-scale {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

.score-panel__aspects {
  margin: 0;
  padding: 0;
  list-style: none;
}

.score-panel__aspect {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
  padding-block: var(--space-2);
}

.score-panel__aspect + .score-panel__aspect {
  border-block-start: 1px solid var(--border-default);
}

.score-panel__aspect-label {
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.score-panel__verdict {
  grid-column: 1/-1;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  align-items: start;
  gap: var(--space-6) var(--space-12);
  padding-block-start: var(--space-6);
  border-block-start: 1px solid var(--border-default);
}

.score-panel__column {
  min-width: 0;
}

.score-panel__column-title {
  margin: 0 0 var(--space-3);
  font-family: var(--ff-heading);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-heading);
}

.score-panel__list {
  margin: 0;
  padding: 0;
  list-style: none;
}

.score-panel__item {
  display: flex;
  align-items: flex-start;
  gap: var(--space-3);
  padding-block: var(--space-2);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.score-panel__item svg {
  flex: 0 0 auto;
  width: 18px;
  height: 18px;
  margin-block-start: 0.34em;
}

.score-panel__item--positive svg {
  color: var(--text-brand);
}

.score-panel__item--negative svg {
  color: var(--color-negative);
}

@media (max-width: 640px) {
  .score-panel,
  .score-panel__verdict {
    grid-template-columns: minmax(0, 1fr);
  }
  .score-panel__overall {
    flex-direction: row;
    align-items: center;
    justify-content: flex-start;
    gap: var(--space-4);
    text-align: left;
  }
  .score-panel__aspect {
    flex-wrap: wrap;
    gap: var(--space-2);
  }
}
.score-ring {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 64px;
  height: 64px;
  border: 3px solid var(--border-brand);
  border-radius: var(--radius-pill);
  background-color: var(--bg-card);
}

.score-ring__figure {
  font-family: var(--ff-heading);
  font-size: var(--fs-h3);
  font-weight: var(--fw-medium);
  line-height: 1;
  color: var(--text-brand);
  background-image: var(--gradient-editorial);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}

/* ---------------------------------------------------------------------------
   BLOCK — score-strip  (NEW)
   The rail's verdict-at-a-glance, folded into the flow under the byline once
   the rail has gone (below 1100px): the score ring, the five sub-scores as a
   wrapping line of figures, and the jump link. On the panel's stripe-grey
   inset, the way series-bar sits, so it reads as furniture, not as a band.
   --------------------------------------------------------------------------- */
.score-strip {
  display: none;
  align-items: center;
  gap: var(--space-4);
  padding: var(--space-4);
  background-color: var(--bg-panel-alt);
  border-radius: var(--radius-card);
}

.score-strip__ring {
  flex: 0 0 auto;
  display: flex;
}

.score-strip__body {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  min-width: 0;
}

.score-strip__aspects {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-1) var(--space-4);
  margin: 0;
  padding: 0;
  list-style: none;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

.score-strip__value {
  font-weight: var(--fw-medium);
  color: var(--text-body);
}

.score-strip__link {
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-link);
  text-decoration: none;
}

@media (max-width: 1100px) {
  .score-strip {
    display: flex;
  }
}
.section-head {
  margin-block-end: var(--space-6);
}

.section-head__title {
  font-family: var(--ff-heading);
  font-size: var(--fs-h2);
  font-weight: var(--fw-light);
  line-height: var(--lh-heading);
  color: var(--text-heading);
  text-align: left;
}

/* The magazine's voice — a step smaller and muted, because the editorial side
   speaks more quietly than the shop. NOTHING ON THE STORE SIDE USES IT, and it
   is not for store furniture: a 26px muted title beside a 32px sibling reads as
   a mistake rather than a register, which is why the product page dropped it on
   2026-09-16. Kept for the article and magazine-archive templates, which is the
   context it was written for. Carried over from `band-title--quiet`. */
/* A BAND TITLE COMPOSED WITHOUT ITS WRAPPER.
   On a composed page a band head is a core/heading carrying this class, not a
   `<header class="section-head">` — there is no wrapper to hold the margin, and
   global's reset zeroes heading margins. The alternative was the editor
   serialising `style="margin-bottom:…"` into a pattern file, which is a
   hardcoded inline style in shipped template code and refused at commit.
   Same value as the wrapper's, from the same token. */
.section-head__title--standalone {
  margin-block-end: var(--space-6);
}

.section-head__title--quiet {
  font-size: var(--fs-h3);
  color: var(--neutral-600);
}

@media (max-width: 900px) {
  .section-head__title {
    font-size: var(--fs-h3);
  }
}
/* --inline + __count: a count set BESIDE the title rather than under it — the
   basket's "4 items · 3 packages" (MPG10). Ported from the mockup's
   archive-header--inline; a modifier on the existing head is a smaller change
   than porting a second opening block for one line. */
.section-head--inline {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  column-gap: var(--space-4);
}

.section-head__count {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

/* --card: a card's own title inside a page — one step below the page title, so the
   page keeps one top-level heading (operator review of MPG11): Checkout at h2 size,
   each form card at h3. Ported from MPG11 for the checkout walk. */
.section-head--card .section-head__title {
  font-size: var(--fs-h3);
}

@media (max-width: 900px) {
  .section-head--card .section-head__title {
    font-size: var(--fs-h4);
  }
}
.section-link {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  margin-block-start: var(--space-6);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  color: var(--text-link);
  text-decoration: none;
}

.section-link:hover {
  color: var(--text-link-hover);
}

.section-link__icon {
  width: 16px;
  height: 16px;
  flex: 0 0 auto;
}

/* The composed copy is a two-column document: prose at the reading measure on
   the left, the contents list as a rail on the right. The panel was always full
   width; the prose is not, and must not be — 1042px of body copy runs to about
   130 characters a line. The rail is what earns the space the measure leaves.
   Operator, 2026-09-14. */
.seo-doc {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 260px;
  gap: var(--space-12);
  align-items: start;
}

.seo-doc__rail {
  position: sticky;
  inset-block-start: var(--space-6);
  padding-inline-start: var(--space-6);
  border-inline-start: 1px solid var(--border-default);
}

/* In the rail the contents list stacks instead of running as a wrapped row. */
.seo-doc__rail .page-contents {
  margin: 0;
  padding: 0;
  border: 0;
}

.seo-doc__rail .page-contents__list {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

.seo-doc__rail .page-contents__item::after {
  content: none;
}

@media (max-width: 900px) {
  .seo-doc {
    grid-template-columns: minmax(0, 1fr);
  }
  .seo-doc__rail {
    position: static;
    padding-inline-start: 0;
    border-inline-start: 0;
    border-block-start: 1px solid var(--border-default);
    padding-block-start: var(--space-4);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — series-bar  (NEW)
   The compact series navigation directly under the article header. It has one
   job — let a reader who landed mid-series step back or forward — and one
   constraint: it must not push the first paragraph below the fold. So it is a
   single row on the panel's lightest inset (stripe grey, the styleguide's
   inset tone, not a band tint), with small type and no imagery.

   Three cells: previous on the left, the series and position in the middle,
   next on the right. Under the position sits a row of fifteen short ticks —
   one per entry, the current one in Paragon blue. It shows WHERE, not what
   has been read: there are no accounts, so nothing is tracked.

   At phone width the bar collapses to the one line the build brief asks for:
   "5 of 15 · Next →". Previous and both part titles drop out.
   --------------------------------------------------------------------------- */
.series-bar {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
  align-items: center;
  gap: var(--space-6);
  padding: var(--space-4) var(--space-6);
  background-color: var(--bg-panel-alt);
  border-radius: var(--radius-card);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  line-height: var(--lh-heading);
}

.series-bar__step {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
  min-width: 0;
  text-decoration: none;
}

.series-bar__step--next {
  align-items: flex-end;
  text-align: right;
}

.series-bar__direction {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-muted);
}

.series-bar__direction svg {
  flex: 0 0 auto;
  width: 12px;
  height: 12px;
}

.series-bar__title {
  overflow: hidden;
  max-width: 100%;
  font-weight: var(--fw-medium);
  color: var(--text-link);
  text-overflow: ellipsis;
  white-space: nowrap;
}

.series-bar__step:hover .series-bar__title {
  color: var(--text-link-hover);
}

.series-bar__here {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-2);
}

.series-bar__position {
  font-weight: var(--fw-medium);
  color: var(--text-body);
  white-space: nowrap;
}

.series-bar__ticks {
  display: flex;
  gap: 3px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.series-bar__tick {
  width: 8px;
  height: 3px;
  background-color: var(--border-strong);
}

.series-bar__tick--current {
  width: 16px;
  background-color: var(--color-brand);
}

.series-bar__compact {
  display: none;
}

@media (max-width: 640px) {
  .series-bar {
    display: flex;
    padding: var(--space-3) var(--space-4);
  }
  .series-bar__step,
  .series-bar__here {
    display: none;
  }
  .series-bar__compact {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3);
    width: 100%;
  }
  .series-bar__compact-position {
    font-weight: var(--fw-medium);
    color: var(--text-body);
  }
  .series-bar__compact-next {
    display: inline-flex;
    align-items: center;
    gap: var(--space-1);
    font-weight: var(--fw-medium);
    color: var(--text-link);
    text-decoration: none;
  }
  .series-bar__compact-next svg {
    width: 14px;
    height: 14px;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — series-index  (NEW)
   The full run of a series, every entry, the current one marked. It is not a
   new list treatment: it is the brand's widget (a Paragon-blue title bar over
   a panel-white body) holding the brand's count-list, with the publication
   date standing in the count slot and --current marking this part. This block
   owns only what a series adds on top of those two — the phone-width
   collapse and the disclosure that undoes it.

   At phone width the list folds to the current entry and its two neighbours;
   every other entry carries series-index__far and is hidden until the reader
   presses "Show all 15". Order is publication order, so the neighbours are
   the previous and next parts, whatever they are called.
   --------------------------------------------------------------------------- */
.series-index {
  display: block;
}

.series-index__toggle {
  display: none;
}

@media (max-width: 640px) {
  .series-index:not(.series-index--open) .series-index__far {
    display: none;
  }
  .series-index__toggle {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: var(--space-2);
    width: 100%;
    padding: var(--space-3) var(--space-6);
    border: 0;
    border-block-start: 1px solid var(--border-default);
    border-radius: var(--radius-btn);
    background-color: transparent;
    font-family: var(--ff-body);
    font-size: var(--fs-small);
    font-weight: var(--fw-medium);
    line-height: var(--lh-heading);
    color: var(--text-link);
    cursor: pointer;
  }
  .series-index__toggle:hover {
    background-color: var(--bg-card-hover);
  }
  .series-index__toggle svg {
    width: 14px;
    height: 14px;
  }
  .series-index--open .series-index__toggle svg {
    transform: rotate(180deg);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — series-marker  (NEW)
   The line above an article's kicker that says which series the piece belongs
   to and where it sits in it. The series name is a link to the series page;
   the position is a count badge, and a count badge is one of the brand's round
   indicators, so it takes the pill radius. Outline rather than fill, because
   the marker is identity, not a control — the one filled blue element near the
   title should be nothing.
   --------------------------------------------------------------------------- */
/* ---------------------------------------------------------------------------
   BLOCK — series-marker  (UPDATED — --on-image)
   --------------------------------------------------------------------------- */
.series-marker {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-2) var(--space-3);
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
}

.series-marker__name {
  color: var(--text-link);
  text-decoration: none;
}

.series-marker__name:hover {
  color: var(--text-link-hover);
}

.series-marker__position {
  display: inline-flex;
  align-items: center;
  padding: var(--space-1) var(--space-3);
  border: 1px solid var(--border-brand);
  border-radius: var(--radius-pill);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: 1;
  letter-spacing: 0.04em;
  color: var(--text-brand);
  white-space: nowrap;
}

.series-marker--on-image .series-marker__name {
  color: var(--text-on-brand);
}

.series-marker--on-image .series-marker__name:hover {
  color: var(--paragon-300);
}

.series-marker--on-image .series-marker__position {
  border-color: var(--paragon-300);
  color: var(--paragon-300);
}

/* ---------------------------------------------------------------------------
   BLOCK — series-next  (NEW)
   The card a reader who has just finished a part is offered first: the next
   part of the same series, large. A sibling of article-card — same lead
   image at 16:9, same Paragon-blue kicker, same light italic title in blue —
   but it carries three things article-card has no slot for: the part's
   position in the series, its standfirst, and a button, because this is the
   one card on the page whose whole purpose is to be pressed.

   The magazine's card-title rule applies: regular weight, one lighter than
   the store would set the same size. It is set at the h3 size rather than
   article-card's h4 because it is the single card of its row.
   --------------------------------------------------------------------------- */
.series-next {
  display: flex;
  flex-direction: column;
  background-color: var(--bg-card);
  border-radius: var(--radius-card);
  overflow: hidden;
  box-shadow: var(--shadow-card);
}

.series-next__media {
  display: block;
  width: 100%;
  aspect-ratio: 16/9;
  object-fit: cover;
  background-color: var(--neutral-800);
}

.series-next__body {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--space-4);
  padding: var(--space-card-padding);
}

.series-next__meta {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--space-2) var(--space-4);
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: 1;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

.series-next__kicker {
  color: var(--text-brand);
}

.series-next__position {
  color: var(--text-muted);
}

.series-next__title {
  margin: 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h3);
  font-weight: var(--fw-regular);
  font-style: italic;
  line-height: var(--lh-heading);
}

.series-next__title a {
  color: var(--text-brand);
  text-decoration: none;
}

.series-next__title a:hover {
  color: var(--text-link-hover);
}

.series-next__standfirst {
  max-width: var(--container-article);
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.series-next__date {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

.series-next__action {
  margin-block-start: auto;
  padding-block-start: var(--space-2);
}

@media (max-width: 640px) {
  .series-next__body {
    padding: var(--space-6);
  }
  .series-next__title {
    font-size: var(--fs-h4);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — series-steps  (NEW)
   Previous and next part, side by side, for the rail's series panel —
   series-bar's two outer cells without its middle, because in a 328px rail
   the position already sits in the series-marker above it.
   --------------------------------------------------------------------------- */
.series-steps {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-4);
  margin-block-start: var(--space-4);
  padding-block-start: var(--space-4);
  border-block-start: 1px solid var(--border-default);
}

.series-steps__step {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
  min-width: 0;
  text-decoration: none;
}

.series-steps__step--next {
  align-items: flex-end;
  text-align: right;
}

.series-steps__direction {
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-muted);
}

.series-steps__title {
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-link);
}

.series-steps__step:hover .series-steps__title {
  color: var(--text-link-hover);
}

/* ---------------------------------------------------------------------------
   BLOCK — setup-band  (NEW, layout)
   Complete Your Setup: the one recommendation band the confirmation carries,
   below the order details and the help row so it never sits above what
   happens next. The canvas carries the section head and, pulled up against
   it, one muted line that belongs to the title; then four of the store's
   standard product cards at the panel gap; then the one way on, Continue
   Shopping, as the band's trailing action. No ground of its own — this brand
   has one ground, and the cards are the surfaces.
   DEPARTURE: no __grid. The four cards sit in the brand's own .grid.grid--4, which
   already steps 4 → 2 at 1100 and → 1 at 640 exactly as this band does
   (layouts/_grid.scss).
   --------------------------------------------------------------------------- */
.setup-band {
  display: block;
}

.setup-band__lead {
  margin: calc(-1 * var(--space-4)) 0 var(--space-6);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-light);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.setup-band__foot {
  display: flex;
  margin-block-start: var(--space-8);
}

@media (max-width: 640px) {
  .setup-band__lead {
    margin-block-start: calc(-1 * var(--space-3));
  }
  .setup-band__foot .btn {
    width: 100%;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — share-links  (NEW)
   Small text share links at the end of the article — not a floating bar and
   not the brand's social-row, which is for following the store. Closes a
   panel body under a hairline.
   --------------------------------------------------------------------------- */
.share-links {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--space-2) var(--space-4);
  margin: var(--space-4) 0 0;
  padding: var(--space-4) 0 0;
  border-block-start: 1px solid var(--border-default);
  list-style: none;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  line-height: var(--lh-heading);
}

.share-links__label {
  font-family: var(--ff-heading);
  font-weight: var(--fw-medium);
  color: var(--text-heading);
}

.share-links__link {
  font-weight: var(--fw-medium);
  color: var(--text-link);
  text-decoration: none;
}

.share-links__link:hover {
  color: var(--text-link-hover);
}

/* ---------------------------------------------------------------------------
   BLOCK — shipment-list  (NEW)
   What happens next, a row per package: the basket's own package-head, so the
   shopper recognises the three groups they saw before paying, with the
   package's items as small manufacturer shots at the far end. A row can carry
   one note under its status line — the pre-order's "Paid today" — indented to
   the status text so it reads as part of the same package. Rows are divided
   by the hairline, as rows inside a panel are, and the list closes on one
   line that applies to every package: how tracking arrives.

   Contents only — the surface is the panel it sits in. The thumbnails are the
   same hairline tile at the surface radius order-lines uses, a size up,
   because here they are the only product information in the row.
   --------------------------------------------------------------------------- */
.shipment-list__rows {
  margin: 0;
  padding: 0;
  list-style: none;
}

.shipment-list__item {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: start;
  gap: var(--space-4) var(--space-content-gap);
  padding-block: var(--space-6);
}

.shipment-list__item:first-child {
  padding-block-start: 0;
}

.shipment-list__item + .shipment-list__item {
  border-block-start: 1px solid var(--border-default);
}

.shipment-list__body {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  min-width: 0;
}

.shipment-list__note {
  margin: 0;
  padding-inline-start: calc(24px + var(--space-3));
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.shipment-list__thumbs {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: var(--space-2);
  margin: 0;
  padding: 0;
  list-style: none;
}

.shipment-list__thumb {
  width: 72px;
  padding: var(--space-1);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-card);
  background-color: var(--bg-card);
}

.shipment-list__thumb img {
  display: block;
  width: 100%;
  aspect-ratio: 1/1;
  object-fit: contain;
}

/* EXTENDED on the second review (operator, 2026-09-24): the foot is a row that
   can carry an action beside the tracking line (a Track button was tried there
   and removed — nothing is trackable until a package ships), and the list can
   close on one quieter line beneath (__after), indented to the foot's text. The
   line's type moved from __foot to __foot-text. */
.shipment-list__foot {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4) var(--space-8);
  padding-block-start: var(--space-6);
  border-block-start: 1px solid var(--border-default);
}

.shipment-list__foot-text {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.shipment-list__after {
  margin: var(--space-3) 0 0;
  padding-inline-start: calc(24px + var(--space-3));
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

.shipment-list__foot-icon {
  flex: 0 0 auto;
  width: 24px;
  height: 24px;
  color: var(--text-brand);
}

.shipment-list__foot-icon svg {
  display: block;
  width: 100%;
  height: 100%;
}

/* Phone: the thumbnails drop under the status line, indented to its text. */
@media (max-width: 640px) {
  .shipment-list__item {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--space-3);
  }
  .shipment-list__thumbs {
    justify-content: flex-start;
    padding-inline-start: calc(24px + var(--space-3));
  }
  .shipment-list__thumb {
    width: 56px;
  }
  .shipment-list__note {
    font-size: var(--fs-small);
  }
  .shipment-list__foot {
    flex-direction: column;
    align-items: stretch;
  }
  .shipment-list__foot-text {
    align-items: flex-start;
    font-size: var(--fs-small);
    line-height: var(--lh-body);
  }
}
/* ---- panel (modal only) ---- */
.modal__wrapper {
  position: relative;
  margin-block-start: 0;
  padding: var(--space-16) var(--space-8) var(--space-12);
  background-color: var(--bg-chrome-deep);
}

.modal__wrapper::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 2px;
  background-color: var(--color-brand);
}

/* ---- close (modal only) ---- */
.modal__close {
  top: 12px;
  right: 12px;
  width: 40px;
  height: 40px;
}

.modal__close .icon {
  fill: var(--text-on-chrome);
  transition: fill 200ms ease;
}

.modal__close:hover .icon {
  fill: var(--color-brand);
}

/* ---- field (modal AND results page) ---- */
.search-form__wrapper {
  border: 1px solid var(--border-input);
  border-radius: var(--radius-input);
  background-color: var(--bg-input);
  transition: border-color 200ms ease;
}

.search-form__wrapper:focus-within {
  border-color: var(--border-focus);
}

.search-form__input {
  font-family: var(--ff-body);
  font-size: var(--fs-body-lg);
  color: var(--text-body);
}

.search-form__input::placeholder {
  color: var(--text-muted);
}

.search-form__input:focus {
  outline: none;
}

.search-form__submit .icon {
  fill: var(--text-muted);
  transition: fill 200ms ease;
}

.search-form__submit:hover .icon {
  fill: var(--color-brand);
}

@media (max-width: 767px) {
  .modal__wrapper {
    padding-inline: var(--space-4);
    padding-block-end: var(--space-8);
  }
}
.spec-bullets {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-2) var(--space-12);
}

.spec-bullets--single {
  grid-template-columns: minmax(0, 1fr);
}

.spec-bullets__list {
  margin: 0;
  padding: 0;
  list-style: none;
}

.spec-bullets__item {
  position: relative;
  padding-inline-start: var(--space-6);
  padding-block: var(--space-2);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.spec-bullets__item::before {
  content: "";
  position: absolute;
  inset-inline-start: 0;
  inset-block-start: 0.72em;
  width: 7px;
  height: 7px;
  border-radius: var(--radius-pill);
  background-color: var(--color-brand);
}

.spec-bullets__item + .spec-bullets__item {
  border-block-start: 1px solid var(--border-default);
}

@media (max-width: 640px) {
  .spec-bullets {
    grid-template-columns: minmax(0, 1fr);
    gap: 0;
  }
  .spec-bullets__list + .spec-bullets__list .spec-bullets__item:first-child {
    border-block-start: 1px solid var(--border-default);
  }
}
/* A modifier on the block, not a class of its own. It was `.spec-columns`, which
   read as a separate component and left `spec-grid` with no element carrying its
   own name — the block would have entered the catalogue with a root nothing
   matched. It resets `display` because the base rule is a grid and a grid
   container ignores `columns`. */
.spec-grid--columns {
  display: block;
  columns: 2;
  column-gap: var(--space-12);
}

.spec-grid--columns .spec-grid__group {
  break-inside: avoid;
  margin: 0 0 var(--space-8);
}

@media (max-width: 900px) {
  .spec-grid--columns {
    columns: 1;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — spec-grid  (NEW)
   A label-and-value list for the product's attributes, built to be read down
   rather than across. It replaces the striped two-column table the earlier
   drafts used, which had to be squeezed into a narrow column and lost the
   thing a table is for.

   FIFTY-FIVE PER CENT of the catalogue carries attributes; the other 45% has
   none. So the panel is a stack of GROUPS, each with its own small heading,
   and a group that has no data is simply not rendered. On a product with no
   attributes the panel still stands with its identity group, which every
   product has — it is never an empty shell with a header on it.
   --------------------------------------------------------------------------- */
.spec-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
}

.spec-grid__group + .spec-grid__group {
  margin-block-start: var(--space-8);
}

.spec-grid__heading {
  margin: 0 0 var(--space-3);
  font-family: var(--ff-heading);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-muted);
}

.spec-grid__row {
  display: grid;
  grid-template-columns: minmax(0, 42%) minmax(0, 1fr);
  gap: var(--space-4);
  padding-block: var(--space-3);
}

.spec-grid__row + .spec-grid__row {
  border-block-start: 1px solid var(--border-default);
}

.spec-grid__label {
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-muted);
}

.spec-grid__value {
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

@media (max-width: 1180px) {
  .spec-grid__rows {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    column-gap: var(--space-12);
  }
  .spec-grid__row {
    border-block-start: 1px solid var(--border-default);
  }
}
@media (max-width: 860px) {
  .spec-grid__rows {
    grid-template-columns: minmax(0, 1fr);
  }
}
/* BLOCK — star-rating (NEW) */
.star-rating {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  line-height: 1;
}

.star-rating__stars {
  position: relative;
  display: inline-block;
  color: var(--neutral-300);
  letter-spacing: 1px;
  white-space: nowrap;
}

.star-rating__fill {
  position: absolute;
  inset-block-start: 0;
  inset-inline-start: 0;
  width: var(--fill, 0%);
  overflow: hidden;
  color: var(--text-brand);
  white-space: nowrap;
}

.star-rating__count {
  font-size: var(--fs-small);
  color: var(--text-muted);
}

/* ---------------------------------------------------------------------------
   PAGE LAYOUT — the shell, the rail and the region grids.

   BUILT 2026-09-15 from six pieces of operator feedback, after three designs
   were rejected. Each of the six is answered in one place and the place is
   named, so a later session can see which choices are load-bearing:

   1. The short description goes BEFORE the buy box    → .buy-region__summary
   2. Loyalty points sit AFTER the buy box             → .buy-region__summary
   3. Stat pills live inside the product description   → .doc-figures
   4. The description takes the live site's column     → .store-layout
   5. Add to Basket never wraps to two lines           → .btn--commerce, .route-row
   6. The navigation rail comes back, desktop only     → .store-layout__sidebar

   THE COLUMN IS 1042px AND THAT IS THE POINT OF (4). It is what the live store
   gives its content: a 1400 page, a 328 rail, a 30 gap. Three drafts put the
   description at 680 or 740 because that is the styleguide's READING measure,
   and all three read as cramped — because the measure was set for editorial
   pages, where prose is alone on the page. A product description is not alone:
   it carries stat blocks, spec tables and feature rows, and it wants the room
   the store already gives it. The 680 measure still governs article pages.
   --------------------------------------------------------------------------- */
/* `.page__inner` is NOT declared here. It was, identically, in this file and in
   `_page.scss` — the same rule and the same docblock, copied — until the MPG8
   walk found the pair. The page owns the page container; this file owns the
   store shell inside it. */
.store-layout {
  display: grid;
  grid-template-columns: var(--width-sidebar) minmax(0, 1fr);
  gap: var(--space-content-gap);
}

/* (6) The rail. It carries the store navigation and then the space the
   operator asked for — promotional tiles, which are the brand's own
   `promo-tile` block rather than anything new. On desktop it fills the page's
   left edge for its whole height; below 1100 it is removed outright rather
   than folded underneath, because a navigation column stacked under a product
   is furniture nobody scrolls to and the site header's menu already covers
   the same ground on a phone. */
.store-layout__sidebar {
  display: flex;
  flex-direction: column;
  gap: var(--space-content-gap);
  min-width: 0;
}

/* THE PROMO PAIR PINS AS ONE UNIT, the navigation scrolls away.
   The rail cannot be filled to match the column, and the arithmetic is not close:
   its content is ~1,800px against a product zone of ~8,800px on this product, and
   across 3,904 descriptions the median is 7,568 characters with only 18 under
   1,500. Filling by volume would need ten cards on a median product and twenty on
   a long one, and would still be wrong on the next one. So the rail stops trying
   to match a height nobody can know: the navigation scrolls past — it is used at
   the start of a visit, not during a read — and the promo pair stays beside the
   reader for the whole description.

   SQUARE TILES ARE WHAT MAKE THIS SIMPLE. At the rail's 328px a square is 328
   tall, so the pair is 686 with its gap, and that fits every window the rail
   renders in — it is removed below 1100px wide, and the shortest laptop it meets
   is about 800 tall. No height breakpoint, no shrinking, and one image ratio to
   design to.

   The pair was 883px when a tile took its height from the image's own aspect
   ratio, which did not fit an 800px window and wanted a max-height rule at a
   height breakpoint to cope. A fixed ratio removes the problem rather than
   handling it. */
.store-layout__promos {
  display: flex;
  flex-direction: column;
  gap: var(--space-content-gap);
  position: sticky;
  top: var(--space-8);
}

/* The tiles must not stretch. `promo-tile` carries its own square ratio, and the
   rail is a grid item as tall as the whole page — without this the two would share
   that height between them and render as one dark slab down the left of the page,
   which is what happened before the ratio existed. */
.store-layout__sidebar .promo-tile,
.store-layout__sidebar .promo-tile__media {
  flex: 0 0 auto;
}

@media (max-width: 1100px) {
  .store-layout {
    grid-template-columns: minmax(0, 1fr);
  }
  /* (6) Removed outright on a phone, not stacked underneath. A navigation
     column beneath a product is furniture nobody scrolls to, and the site
     header's menu already covers the same ground there. */
  .store-layout__sidebar {
    display: none;
  }
  /* …EXCEPT WHERE THE RAIL IS THE POINT OF THE PAGE. That reasoning is about a
     PRODUCT — a shopper reading one item does not want a range list under it.
     A category funnel is the opposite case: the page's whole job is routing
     into the range, and the rail is the routing. So the removal stays the
     default and a funnel opts out, rather than the rule being softened for
     every template that shares this shell.

     It goes BELOW the content rather than above it. The range's own header and
     its type tiles are what the visitor came for; the full store list is where
     they go if this range was the wrong turn, and that is a decision made after
     reading, not before. MPG8 (design 17955) draws it this way. */
  .store-layout--nav-persists .store-layout__sidebar {
    display: flex;
    order: 2;
  }
  .store-layout--nav-persists .store-layout__content {
    order: 1;
  }
}
/* ---- the account variant (MPG13) -------------------------------------------

   The account area is the store's two-column shell at the store's own measures —
   the account menu in the 328px rail, the endpoint's content in the 1042px column.
   Two things differ, and both are this modifier.

   BOTH COLUMNS START ON ONE LINE: the content column stacks its panels with the
   content gap and every child's own block margins are zeroed, exactly as on the
   basket, the checkout and the confirmation.

   THE MENU NEVER DISAPPEARS. Below 1100 the rail is removed, as it is on a product,
   and the account menu comes back as one select-style control at the top of the
   content (`account-switch`), in `__switch`. The mockup switched at 900; it moves to
   1100 so the account and the store lose their rail at the same width, rather than
   leaving 900–1100 with no menu at all (operator, MPG13 checkpoint 2). Above that the
   switch renders no box, and a flex gap is only laid between boxes that render, so it
   costs the first panel nothing.
   --------------------------------------------------------------------------- */
.store-layout--account {
  align-items: start;
}

.store-layout--account .store-layout__content {
  display: flex;
  flex-direction: column;
  gap: var(--space-content-gap);
  min-width: 0;
}

.store-layout--account .store-layout__content > * {
  margin-block: 0;
}

.store-layout__switch {
  display: none;
}

@media (max-width: 1100px) {
  .store-layout__switch {
    display: block;
  }
}
/* ---- the sidebar's one piece of canvas furniture ---------------------------

   The mockup calls this `store-sidebar__heading`, which would make it the only
   element of a block that has no rules of its own — and the class lint caught
   exactly that: a parent block nothing declares. It is the store layout's
   sidebar heading, so it is an element of `store-layout`, which is the block
   that already owns the column it sits in. Renamed rather than given an empty
   parent rule to satisfy the check.

   The negative bottom margin pulls the first filter panel back up to the
   sidebar's own gap: the heading labels the panels below it and should read as
   part of that group, not as a band of its own.
   --------------------------------------------------------------------------- */
/* The sidebar's one piece of canvas furniture. */
.store-layout__sidebar-heading {
  margin: var(--space-2) 0 calc(-1 * var(--space-2));
  font-family: var(--ff-heading);
  font-size: var(--fs-h4);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

/* ---------------------------------------------------------------------------
   BLOCK — store-nav  (NEW)
   The store navigation sidebar, designed here for the first time and inherited
   by every store page after it — category, brand, search results, deals,
   product.

   A stack of Paragon-blue bars, one per top-level range, each a white
   body-font label with a down chevron, separated by thin rules. The rule is
   the panel showing through between two bars, which is what a stack of bars on
   a white panel actually looks like.

   THE DISCLOSURE is the one the reference specimen settled and not a second
   one: a real `details` and `summary`, the brand's own chevron turned to point
   down, turned up when the row is open. It works with no script, and a link
   pointing into a closed range opens it.

   THE OPEN BAR expands in place to a panel-white list of its subcategories,
   and that list is `count-list` — the same list the filter groups and the
   featured brands take, so the column carries one list treatment and not
   three. The current item is marked exactly as count-list already marks it:
   the blue-tint wash across the row and the three-pixel Paragon-blue leading
   rule, paid for out of the row's own padding so nothing shifts.

   The bar label follows the styleguide's navigation setting — body font,
   16px, light, uppercase — which is what distinguishes a navigation bar from
   the heading-font title bar a widget carries.
   --------------------------------------------------------------------------- */
.store-nav {
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  overflow: hidden;
  box-shadow: var(--shadow-panel);
}

.store-nav__range + .store-nav__range {
  border-block-start: 1px solid var(--bg-panel);
}

.store-nav__bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  /* Symmetrical again. The two-pixel nudge above this line existed to correct an
     ALL-CAPS label sitting high in its cap band; with the labels set as written,
     the descenders fill the lower half and the correction would push the text
     low. An optical fix is tied to the treatment that needed it. */
  padding: var(--space-3) var(--space-6);
  background-color: var(--color-brand);
  list-style: none;
  cursor: pointer;
}

.store-nav__bar::-webkit-details-marker {
  display: none;
}

.store-nav__bar::marker {
  content: "";
}

.store-nav__bar:focus-visible {
  outline: 2px solid var(--neutral-50);
  outline-offset: -3px;
}

.store-nav__label {
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  /* The label is set AS WRITTEN — "PC Components", not "PC COMPONENTS". Operator,
     2026-09-16: the uppercase read wrong in the rail.
     Which takes the line-height back to the heading step and the tracking back to
     normal. Both were compensations for capitals: 1.2 reserves descender space
     that caps never use, and 0.04em opens up letterforms that uppercase needs and
     mixed case does not. */
  line-height: var(--lh-heading);
  letter-spacing: normal;
  /* Two pixels above the label, and ONLY the label — the bar's own padding stays
     symmetrical so the marker is not pushed with it. The two align on their
     optical centres rather than their boxes: the label's line box carries
     descender space below the letters that the eye does not count, so a box
     centred on the bar sits high against a chevron centred on the same axis. */
  padding-block-start: 2px;
  color: var(--text-on-brand);
}

/* 21px — half again on the 14 it was. At 14 the chevron read as a hint rather
   than a control next to a 16px label. */
.store-nav__marker {
  flex: 0 0 auto;
  display: inline-flex;
  width: 21px;
  height: 21px;
  color: var(--text-on-brand);
}

.store-nav__marker svg {
  width: 100%;
  height: 100%;
  transform: rotate(90deg);
}

.store-nav__range[open] .store-nav__marker svg {
  transform: rotate(-90deg);
}

/* THIRD LEVEL — indented, so the hierarchy reads down the rail.
   The indent goes on the LINK's inline padding, not on the list: a padded list
   would leave a strip of unhighlighted rail down the left of every child row,
   because the hover ground is the link's own background. Same reason the second
   level's padding lives there.
   `store-nav__children` had no rule at all until now — it is in the markup the
   mockup carries, and nothing had ever styled it, so a third-level item sat flush
   with its parent. */
.store-nav__children .count-list__link {
  padding-inline-start: calc(var(--space-6) + var(--space-4));
}

.store-nav__panel {
  background-color: var(--bg-panel);
  border-block-start: 1px solid var(--border-default);
}

@media (max-width: 640px) {
  .store-nav__bar {
    padding-inline: var(--space-4);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — summary-toggle  (NEW)
   The order summary at phone width, folded into one bar at the top of the
   form: "Show order summary" in link blue with the chevron, the total at the
   far end in the commerce face. Open, it shows the same order-lines and
   order-totals the sidebar shows. A real disclosure, so it needs no script.

   On its own panel-white card, as everything on this canvas is. The page
   decides when it appears — at wider widths the sidebar does this job.
   --------------------------------------------------------------------------- */
.summary-toggle {
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

.summary-toggle__bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
  padding: var(--space-4) var(--space-6);
  list-style: none;
  cursor: pointer;
}

.summary-toggle__bar::-webkit-details-marker {
  display: none;
}

.summary-toggle__bar::marker {
  content: "";
}

.summary-toggle__bar:focus-visible {
  outline: 2px solid var(--border-focus);
  outline-offset: -2px;
}

.summary-toggle__label {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-link);
}

.summary-toggle__label--open {
  display: none;
}

.summary-toggle[open] .summary-toggle__label--closed {
  display: none;
}

.summary-toggle[open] .summary-toggle__label--open {
  display: inline-flex;
}

.summary-toggle__icon {
  flex: 0 0 auto;
  width: 14px;
  height: 14px;
  color: var(--text-brand);
  transform: rotate(90deg);
}

.summary-toggle[open] .summary-toggle__icon {
  transform: rotate(-90deg);
}

.summary-toggle__total {
  font-family: var(--ff-chrome);
  font-size: var(--fs-h4);
  font-weight: var(--fw-bold);
  font-style: italic;
  line-height: var(--lh-heading);
  color: var(--text-body);
  white-space: nowrap;
}

.summary-toggle__body {
  padding: var(--space-6);
  border-block-start: 1px solid var(--border-default);
}

@media (max-width: 640px) {
  .summary-toggle__bar,
  .summary-toggle__body {
    padding-inline: var(--space-4);
  }
}
.tag-cloud {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--space-1) var(--space-2);
}

.tag-cloud__tag {
  padding: var(--space-1) var(--space-2);
  border-radius: var(--radius-card);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-link);
  text-decoration: none;
}

.tag-cloud__tag--sm {
  font-size: var(--fs-small);
}

.tag-cloud__tag--lg {
  font-size: var(--fs-body-lg);
  font-weight: var(--fw-medium);
}

.tag-cloud__tag:hover {
  background-color: var(--bg-card-hover);
  color: var(--text-link-hover);
}

/* ---------------------------------------------------------------------------
   BLOCK — term-chips  (REUSED, verbatim)
   --------------------------------------------------------------------------- */
.term-chips {
  padding: var(--space-2) var(--space-card-padding);
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

.term-chips__row {
  display: flex;
  align-items: baseline;
  gap: var(--space-6);
  padding-block: var(--space-4);
}

.term-chips__row + .term-chips__row {
  border-block-start: 1px solid var(--border-default);
}

.term-chips__label {
  flex: 0 0 96px;
  font-family: var(--ff-heading);
  font-size: var(--fs-small);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

.term-chips__list {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2);
  min-width: 0;
  margin: 0;
  padding: 0;
  list-style: none;
}

.term-chips__chip {
  display: inline-flex;
  align-items: baseline;
  gap: var(--space-2);
  padding: var(--space-2) var(--space-4);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-btn);
  background-color: var(--bg-panel);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-heading);
  color: var(--text-body);
  text-decoration: none;
  white-space: nowrap;
}

.term-chips__chip:hover {
  border-color: var(--border-brand);
  background-color: var(--bg-card-hover);
  color: var(--text-link);
}

.term-chips__count {
  font-size: var(--fs-eyebrow);
  color: var(--text-muted);
}

.term-chips__chip:hover .term-chips__count {
  color: var(--text-link);
}

@media (max-width: 640px) {
  .term-chips {
    padding-inline: var(--space-4);
  }
  .term-chips__row {
    flex-direction: column;
    gap: var(--space-3);
  }
  .term-chips__label {
    flex-basis: auto;
  }
  .term-chips__list {
    flex-wrap: nowrap;
    align-self: stretch;
    overflow-x: auto;
    scrollbar-width: none;
    margin-inline-end: calc(var(--space-4) * -1);
    padding-inline-end: var(--space-4);
  }
  .term-chips__list::-webkit-scrollbar {
    display: none;
  }
  .term-chips__list > li {
    flex: 0 0 auto;
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — trust-row  (UPDATED — every statement is now a link)

   A claim the shopper can check is worth more than a claim they cannot, so
   each of the four statements now routes to the page that backs it: the
   Trustpilot profile, Store & Shipping Information twice, and the Clearpay
   FAQ. That turns the row from four pieces of decoration into four routes
   into the information centre.

   The card is unchanged. What moved is the padding: it now sits on the link
   rather than the item, so the whole card is the hit target and the row looks
   exactly as it did. Hover takes the label to Paragon blue — the brand's link
   colour, no underline — and nothing else moves.

   The old block's phone rules also stripped the cards back to hairline-
   separated rows. That contradicted the design brief's own instruction that a
   row of four short trust statements is four cards and not four columns, so
   the cards now stay cards at every width and simply stack.
   --------------------------------------------------------------------------- */
/* THE ROW FITS ITS CONTAINER, NOT ITS FIRST PAGE (MPG1 walk, 2026-09-16).

   This was `repeat( 3, … )`, fixed on 2026-09-16 because four statements in the
   product page's 962px column gave 222px each — a footer column's width for a
   line meant to be read at a glance. Three sat at 301 and read correctly.

   That is a measurement of the COLUMN, and the class was carrying it as though
   it were a property of the component. The homepage's band is four statements
   at the full 1400px page width, where four fit at ~330px — wider than the 301
   the product page settled on — and a hard three-column rule put the fourth on
   a row of its own.

   `auto-fit` at a 260px floor states the actual rule: as many across as fit
   without going under the width the copy needs. The product page is unchanged
   by it — three items in 962px still measure 301px each. The two breakpoints
   below still override deliberately: two across on a tablet rather than the
   three auto-fit would otherwise allow, and one on a phone. */
.trust-row {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  margin: 0;
  padding: 0;
  list-style: none;
  gap: var(--space-content-gap);
}

.trust-row__item {
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-panel);
}

.trust-row__link {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  height: 100%;
  padding: var(--space-card-padding);
  text-decoration: none;
}

/* 40px, matching the delivery icon in the buy box — the brand's existing size
   for an icon that carries a fact rather than decorates a label. At 30 these
   read as bullets beside their copy; the row is four claims, and the icon is
   half of each claim. One rule, so the product page's three take it too. */
.trust-row__icon {
  flex: 0 0 auto;
  width: 40px;
  height: 40px;
  color: var(--text-brand);
}

.trust-row__icon svg {
  width: 100%;
  height: 100%;
}

.trust-row__label {
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-body);
}

.trust-row__link:hover .trust-row__label {
  color: var(--text-link);
}

.trust-row__link:focus-visible {
  outline: 2px solid var(--border-focus);
  outline-offset: -2px;
}

@media (max-width: 1100px) {
  .trust-row {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
@media (max-width: 640px) {
  .trust-row {
    grid-template-columns: minmax(0, 1fr);
  }
  .trust-row__link {
    padding: var(--space-6);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — verdict-band  (NEW, layout)
   The review's finale: a full-bleed band after the body with the key art
   behind it, darker than the hero — the same scrim, turned up — so the
   finale is recognisably the article's own ending and not an advert. On it,
   over the reading column: the eyebrow, "The Verdict", and the one-line
   verdict in the magazine's italic, reversed. Beneath them, on a panel
   because content belongs on panels, the catalogue's score-panel with the
   large score meter as its overall figure — the meter fills to the score
   as the band scrolls into view. The rail column stays open so the art
   shows through on the right.

   A news article has no finale. Replaces MPG16's in-card verdict panel.
   --------------------------------------------------------------------------- */
.verdict-band {
  position: relative;
  margin-block-start: var(--space-12);
  overflow: hidden;
  background-color: var(--bg-chrome);
  scroll-margin-block-start: var(--space-6);
}

.verdict-band__media {
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center 30%;
}

.verdict-band__scrim {
  position: absolute;
  inset: 0;
  background-image: linear-gradient(90deg, color-mix(in srgb, var(--bg-chrome) 94%, transparent) 0%, color-mix(in srgb, var(--bg-chrome) 86%, transparent) 55%, color-mix(in srgb, var(--bg-chrome) 55%, transparent) 100%);
}

.verdict-band__inner {
  position: relative;
  width: 100%;
  max-width: calc(var(--site-max-width) + var(--gutter-small) * 2);
  margin-inline: auto;
  padding: var(--space-16) var(--gutter-small);
}

.verdict-band__frame {
  display: grid;
  grid-template-columns: minmax(0, calc(var(--container-article) + var(--space-card-padding) * 2)) var(--width-sidebar);
  justify-content: center;
  gap: var(--space-8) var(--space-16);
}

.verdict-band__head,
.verdict-band__panel {
  grid-column: 1;
  min-width: 0;
}

.verdict-band__head {
  padding-inline: var(--space-card-padding);
}

.verdict-band__eyebrow {
  margin: 0;
  font-family: var(--ff-body);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-medium);
  line-height: 1;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--paragon-300);
}

.verdict-band__title {
  margin: var(--space-3) 0 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h2);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-on-brand);
}

.verdict-band__line {
  margin: var(--space-6) 0 0;
  font-family: var(--ff-heading);
  font-size: var(--fs-h3);
  font-weight: var(--fw-regular);
  font-style: italic;
  line-height: var(--lh-heading);
  color: var(--text-on-brand);
}

.verdict-band__byline {
  margin: var(--space-4) 0 0;
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  line-height: var(--lh-heading);
  color: var(--text-on-chrome);
}

.verdict-band__panel {
  padding: var(--space-card-padding);
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
}

@media (max-width: 1100px) {
  .verdict-band__frame {
    grid-template-columns: minmax(0, calc(var(--container-article) + var(--space-card-padding) * 2));
  }
}
@media (max-width: 640px) {
  .verdict-band__inner {
    padding-block: var(--space-12);
  }
  .verdict-band__head {
    padding-inline: 0;
  }
  .verdict-band__title {
    font-size: var(--fs-h3);
  }
  .verdict-band__line {
    font-size: var(--fs-h4);
  }
  .verdict-band__panel {
    padding: var(--space-6);
  }
}
/* ---------------------------------------------------------------------------
   BLOCK — video-embed  (NEW)
   The play control is a control, so it is square like every other control in
   the brand — a round one would read as an indicator. The caption takes the
   same setting media-figure gives a caption, so an article's two kinds of
   media are captioned identically.
   --------------------------------------------------------------------------- */
.video-embed {
  margin: var(--space-8) 0 0;
}

.video-embed__facade {
  position: relative;
  display: block;
  width: 100%;
  padding: 0;
  border: 0;
  border-radius: var(--radius-card);
  overflow: hidden;
  background-color: var(--neutral-800);
  cursor: pointer;
}

.video-embed__poster {
  display: block;
  width: 100%;
  aspect-ratio: 16/9;
  object-fit: cover;
}

.video-embed__play {
  position: absolute;
  inset-block-start: 50%;
  inset-inline-start: 50%;
  transform: translate(-50%, -50%);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 64px;
  height: 64px;
  border-radius: var(--radius-btn);
  background-color: var(--btn-primary-bg);
  color: var(--btn-primary-text);
}

.video-embed__facade:hover .video-embed__play {
  background-color: var(--btn-primary-bg-hover);
}

.video-embed__play svg {
  width: 24px;
  height: 24px;
  fill: currentColor;
}

.video-embed__caption {
  margin-block-start: var(--space-3);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  font-weight: var(--fw-regular);
  line-height: var(--lh-body);
  color: var(--text-muted);
}

@media (max-width: 640px) {
  .video-embed__play {
    width: 52px;
    height: 52px;
  }
}
.woocommerce-message,
.woocommerce-info,
.woocommerce-error {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3) var(--space-6);
  margin: 0;
  padding: var(--space-4) var(--space-6);
  border-inline-start: 4px solid var(--border-brand);
  border-radius: var(--radius-card);
  background-color: var(--bg-panel);
  list-style: none;
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.woocommerce-error {
  flex-direction: column;
  align-items: flex-start;
  border-inline-start-color: var(--color-negative);
}

.woocommerce-error li {
  margin: 0;
}

.woocommerce-notices-wrapper {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

.woocommerce-message a.button,
.woocommerce-info a.button,
.woocommerce-message .restore-item {
  font-weight: var(--fw-medium);
  color: var(--text-brand);
  text-decoration: none;
}

.woocommerce-message a.button,
.woocommerce-info a.button {
  order: 1;
}

/* ---- widget (reused from the brand catalogue, verbatim) ---- */
.widget {
  background-color: var(--bg-panel);
  border-radius: var(--radius-card);
  overflow: hidden;
  box-shadow: var(--shadow-panel);
}

.widget__title {
  margin: 0;
  padding: var(--space-3) var(--space-6);
  background-color: var(--color-brand);
  font-family: var(--ff-heading);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-on-brand);
}

.widget__body {
  padding: var(--space-6);
}

.widget__body--flush {
  padding: 0;
}

/*------------------------------------*\
	CORE BLOCKS
	The description region is a Gutenberg block area (operator, 2026-09-16), so
	these are not optional decoration — they are what 3,904 product descriptions
	are made of. Ten partials, scoped by what the catalogue actually uses.

	This group compiles AFTER components, deliberately: several block rules tie
	on specificity with component rules and are meant to win on source order.
\*------------------------------------*/
.wp-block-columns {
  --wp--style--block-gap: var(--space-8);
  margin-block: var(--space-8);
}

.wp-block-column {
  min-width: 0;
}

.content > .wp-block-cover {
  width: calc(100% + var(--space-card-padding) * 2);
  margin-block: var(--space-8);
  margin-inline: calc(var(--space-card-padding) * -1);
  padding: var(--space-12) var(--space-8);
  border-radius: 0;
}

.wp-block-cover {
  margin-block: var(--space-8);
  padding: var(--space-12) var(--space-8);
  border-radius: var(--radius-card);
}

.wp-block-cover .wp-block-heading {
  margin-block: var(--space-8) var(--space-3);
  font-weight: var(--fw-light);
  color: inherit;
}

.wp-block-cover .wp-block-heading + * {
  margin-block-start: 0;
}

.wp-block-cover .wp-block-heading:first-child {
  margin-block-start: 0;
}

.wp-block-cover .wp-block-heading:last-child {
  margin-block-end: 0;
}

.wp-block-details + .wp-block-details {
  border-block-start: 1px solid var(--border-default);
}

.wp-block-details[open] {
  background-color: var(--bg-card-hover);
  border-inline-start: 3px solid var(--color-brand);
}

/* Core's own wrapper carries no measure, so the band would otherwise run the
   full width of the column while the component it matches is held to the
   reading measure. */
.doc-section .wp-block-details:first-of-type {
  margin-block-start: var(--space-8);
  border-block-start: 1px solid var(--border-default);
}

.doc-section .wp-block-details:last-of-type {
  border-block-end: 1px solid var(--border-default);
}

.wp-block-details > summary {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--space-6);
  padding: var(--space-4);
  list-style: none;
  cursor: pointer;
  font-family: var(--ff-heading);
  font-size: var(--fs-h4);
  font-weight: var(--fw-medium);
  line-height: var(--lh-heading);
  color: var(--text-heading);
}

/* The browser's own disclosure triangle, removed in both dialects — the brand
   supplies its own marker below. */
.wp-block-details > summary::-webkit-details-marker {
  display: none;
}

.wp-block-details > summary::marker {
  content: "";
}

.wp-block-details > summary:hover {
  background-color: var(--bg-card-hover);
}

.wp-block-details > summary:focus-visible {
  outline: 2px solid var(--border-focus);
  outline-offset: -2px;
}

.wp-block-details[open] > summary {
  padding-inline-start: calc(var(--space-4) - 3px);
  color: var(--text-link);
}

/* The chevron, at the far end of the row — the same position and the same
   direction the store sidebar and the main navigation already use to say a
   thing opens. */
.wp-block-details > summary::after {
  content: "";
  flex: 0 0 auto;
  width: 9px;
  height: 9px;
  margin-block-start: 0.45em;
  border-inline-end: 2px solid var(--color-brand);
  border-block-end: 2px solid var(--color-brand);
  transform: rotate(45deg);
}

.wp-block-details[open] > summary::after {
  transform: rotate(-135deg);
  margin-block-start: 0.7em;
}

/* The answer is whatever inner blocks the operator put there, so the padding
   goes on the children rather than on a wrapper that does not exist. */
.wp-block-details > :not(summary) {
  padding: 0 var(--space-4) var(--space-6);
  margin-block: 0;
  scroll-margin-block-start: var(--space-16);
}

.wp-block-details[open] > :not(summary) {
  padding-inline-start: calc(var(--space-4) - 3px);
}

@media (max-width: 640px) {
  .wp-block-details > summary {
    font-size: var(--fs-body);
  }
  .wp-block-details > :not(summary) {
    padding-inline: var(--space-3);
  }
  .wp-block-details[open] > :not(summary) {
    padding-inline-start: calc(var(--space-3) - 3px);
  }
}
.wp-block-embed {
  margin-block: var(--space-8);
}

.wp-block-embed iframe {
  display: block;
  border-radius: var(--radius-card);
}

.wp-block-group {
  border-radius: var(--radius-card);
}

.wp-block-group.has-background {
  padding: var(--space-6);
}

/* The restored-wrapper repair (`display: contents` on a `.grid` group's inner
   container, plus zeroing core's flow margin on its children) MOVED TO GLOBAL on
   2026-09-17 — `framework-v2/global/scss/blocks/_wp-block-group.scss`.

   It is a consequence of the no-`theme.json` policy meeting the global `.grid`
   primitive, not brand vocabulary, and ARTSABERS had independently written the
   identical pair. Do not re-add it here; if a grid group stacks, the global rule
   is the place to look. */
.wp-block-heading {
  font-family: var(--ff-heading);
  line-height: var(--lh-heading);
  margin-block: var(--space-8) var(--space-3);
}

h1.wp-block-heading {
  font-size: var(--fs-h1);
  font-weight: var(--fw-light);
}

h2.wp-block-heading {
  font-size: var(--fs-h2);
  font-weight: var(--fw-light);
}

h3.wp-block-heading {
  font-size: var(--fs-h3);
  font-weight: var(--fw-light);
}

h4.wp-block-heading {
  font-size: var(--fs-h4);
  font-weight: var(--fw-medium);
}

h5.wp-block-heading,
h6.wp-block-heading {
  font-size: var(--fs-body-lg);
  font-weight: var(--fw-medium);
}

:is(figure.wp-block-image, div.wp-block-image > figure) {
  margin-block: var(--space-6);
}

:is(figure.wp-block-image, div.wp-block-image > figure) img {
  border-radius: var(--radius-card);
}

.wp-block-image figcaption {
  margin-block-start: var(--space-3);
  font-family: var(--ff-body);
  font-size: var(--fs-small);
  color: var(--text-muted);
}

.wp-block-list {
  margin-block: var(--space-4);
  padding-inline-start: var(--space-6);
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  line-height: var(--lh-body);
}

.wp-block-list li {
  margin-block-end: var(--space-2);
}

.wp-block-list li {
  position: relative;
}

.wp-block-list li::before {
  content: "";
  position: absolute;
  inset-inline-start: calc(var(--space-4) * -1);
  inset-block-start: 0.6em;
  width: 6px;
  height: 6px;
  border-radius: var(--radius-pill);
  background-color: var(--color-brand);
}

.wp-block-media-text {
  margin-block: var(--space-8);
  border-radius: var(--radius-card);
  overflow: hidden;
}

.wp-block-media-text > .wp-block-media-text__content {
  padding: var(--space-8);
}

.wp-block-media-text__media img {
  border-radius: 0;
}

.wp-block-paragraph {
  font-family: var(--ff-body);
  font-size: var(--fs-body);
  line-height: var(--lh-body);
}

.wp-block-paragraph.has-large-font-size {
  font-size: var(--fs-body-lg);
}

.spec-pills {
  margin-block: var(--space-12);
}

.spec-pills .wp-block-column {
  padding: var(--space-4) var(--space-3);
  border: 2px solid var(--border-brand);
  border-radius: var(--radius-card);
  text-align: center;
}

.spec-pills .wp-block-group.has-background {
  padding: 0;
  background-color: transparent;
}

.spec-pills .has-ugp-white-color,
.spec-pills .wp-block-group.has-ugp-white-color {
  color: var(--text-body);
}

.spec-pills .wp-block-group .has-large-font-size {
  font-family: var(--ff-body);
  font-size: var(--fs-h3);
  font-weight: var(--fw-regular);
  color: var(--text-body);
}

.spec-pills .wp-block-group p + p {
  margin-block-start: 0;
}

.spec-pills .wp-block-group .has-medium-font-size {
  font-size: var(--fs-small);
  color: var(--text-muted);
}

.has-ugp-blue-color {
  color: var(--paragon-600);
}

.has-ugp--light-blue-color {
  color: var(--paragon-300);
}

.has-ugp-grey-color {
  color: var(--neutral-700);
}

.has-ugp-black-color {
  color: var(--neutral-900);
}

.has-ugp-white-color {
  color: var(--neutral-50);
}

.has-ugp-blue-background-color {
  background-color: var(--paragon-600);
}

.has-ugp--light-blue-background-color {
  background-color: var(--paragon-300);
}

.has-ugp-grey-background-color {
  background-color: var(--neutral-700);
}

.has-ugp-black-background-color {
  background-color: var(--neutral-900);
}

.has-ugp-white-background-color {
  background-color: var(--neutral-50);
}

:root {
  /*------------------------------------*\
  	LAYER 1 — palette
  	Measured values. Nothing derived, nothing generated.
  \*------------------------------------*/
  --paragon-600: #1D7DBB;
  --paragon-400: #25A6F9;
  --paragon-300: #60B9F6;
  --paragon-50: #E8F2F8;
  --arctic-100: #F6F6F6;
  --arctic-200: #E7EAED;
  --arctic-300: #DCDEDF;
  --neutral-50: #FFFFFF;
  --neutral-300: #DCDCDC;
  --neutral-400: #C4C4C4;
  --neutral-500: #9F9F9F;
  --neutral-550: #8A8A8A;
  --neutral-600: #606060;
  --neutral-700: #303030;
  --neutral-800: #262626;
  --neutral-900: #000000;
  --status-positive: #35943A;
  --status-negative: #DD0000;
  --status-warning: var(--paragon-50);
  /*------------------------------------*\
  	LAYER 2 — roles
  \*------------------------------------*/
  --color-brand: var(--paragon-600);
  --color-brand-strong: var(--neutral-700);
  --color-brand-soft: var(--paragon-50);
  --color-background: var(--arctic-300);
  --color-surface: var(--neutral-50);
  --color-surface-alt: var(--arctic-100);
  --color-surface-elevated: var(--neutral-50);
  --color-text: var(--neutral-900);
  --color-text-muted: var(--neutral-600);
  --color-text-on-brand: var(--neutral-50);
  --color-border: var(--neutral-400);
  --color-border-strong: var(--neutral-500);
  --color-positive: var(--status-positive);
  --color-warning: var(--status-warning);
  --color-negative: var(--status-negative);
  /*------------------------------------*\
  	LAYER 3 — usage
  \*------------------------------------*/
  --bg-page: var(--color-background);
  --bg-panel: var(--color-surface);
  --bg-panel-alt: var(--color-surface-alt);
  --bg-card: var(--color-surface);
  --bg-card-hover: var(--color-brand-soft);
  --bg-input: var(--color-surface);
  --bg-overlay: rgba( 0, 0, 0, 0.62 );
  --bg-chrome: var(--neutral-700);
  --bg-chrome-deep: var(--neutral-800);
  --bg-notice: var(--paragon-600);
  --text-on-chrome: var(--neutral-400);
  --gradient-editorial: linear-gradient( 135deg, var(--paragon-600) 0%, var(--paragon-400) 100% );
  --text-body: var(--color-text);
  --text-heading: var(--color-text);
  --text-muted: var(--color-text-muted);
  --text-brand: var(--color-brand);
  --text-link: var(--color-brand);
  --text-link-hover: var(--color-brand-strong);
  --text-on-brand: var(--color-text-on-brand);
  --border-default: var(--color-border);
  --border-strong: var(--color-border-strong);
  --border-brand: var(--color-brand);
  --border-focus: var(--color-brand);
  --border-input: var(--neutral-550);
  --btn-primary-bg: var(--color-brand);
  --btn-primary-bg-hover: var(--color-brand-strong);
  --btn-primary-text: var(--color-text-on-brand);
  /*------------------------------------*\
  	TYPE
  	Three faces, one Adobe kit (qsv4pqt — the same kit the old store
  	loads, and domain-locked). Purista is the SELLING voice: product
  	titles, prices, add-to-basket, sale badges, always bold and slanted.
  \*------------------------------------*/
  --ff-heading: "ubuntu", "Ubuntu", system-ui, -apple-system, "Segoe UI", sans-serif;
  --ff-body: "poppins", "Poppins", system-ui, -apple-system, "Segoe UI", sans-serif;
  --ff-chrome: "purista-web", "Purista", "ubuntu", system-ui, sans-serif;
  --fs-h1: 40px;
  --fs-h2: 32px;
  --fs-h3: 26px;
  --fs-h4: 20px;
  --fs-body-lg: 18px;
  --fs-body: 16px;
  --fs-small: 14px;
  --fs-eyebrow: 12px;
  --fw-light: 300;
  --fw-regular: 400;
  --fw-medium: 500;
  --fw-bold: 700;
  --lh-body: 1.7;
  --lh-heading: 1.2;
  /*------------------------------------*\
  	SPACE
  \*------------------------------------*/
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-6: 24px;
  --space-8: 32px;
  --space-12: 48px;
  --space-16: 64px;
  --space-content-gap: 30px;
  --space-card-padding: 30px;
  /*------------------------------------*\
  	SHAPE
  	One radius. Every surface takes 10px; every control is square; only
  	indicators are round. There is no second surface radius — the token
  	for one was retired.
  \*------------------------------------*/
  --radius-card: 10px;
  --radius-btn: 0;
  --radius-input: 0;
  --radius-pill: 999px;
  --shadow-card: none;
  --shadow-panel: none;
  --shadow-1: 0 0 12px -3px var(--neutral-300);
  /*------------------------------------*\
  	LAYOUT
  	--site-max-width / --gutter-small are the names global/scss/layouts/
  	_wrapper.scss and _section.scss actually read (with generic
  	1440px/20px fallbacks) — they must carry the styleguide's measured
  	values here, or `.wrapper` / `.section__inner` silently render at the
  	generic fallback instead of the brand's own column.
  \*------------------------------------*/
  --site-max-width: 1400px;
  --gutter-small: 20px;
  --container-reading: 680px;
  --container-article: 800px;
  --width-sidebar: 328px;
  /*------------------------------------*\
  	MOTION
  	The two speeds framework-v2 already ships as transition mixins: 180ms
  	for anything a pointer touches directly, 300ms for a surface that
  	arrives underneath it. Nothing in this theme invents a third.
  \*------------------------------------*/
  --motion-quick: 180ms;
  --motion-standard: 300ms;
  --motion-ease: ease;
}
/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2dsb2JhbC9zY3NzL2NvcmUvX3Jlc2V0LnNjc3MiLCIuLi8uLi8uLi9nbG9iYWwvc2Nzcy9mdW5jdGlvbnMvX21lZGlhLXF1ZXJ5LnNjc3MiLCIuLi8uLi8uLi9nbG9iYWwvc2Nzcy9jb3JlL19ncmlkLnNjc3MiLCIuLi8uLi8uLi9nbG9iYWwvc2Nzcy9jb3JlL19icmVhdGhlLnNjc3MiLCIuLi8uLi8uLi9nbG9iYWwvc2Nzcy9jb3JlL19pbWFnZXMuc2NzcyIsIi4uLy4uLy4uL2dsb2JhbC9zY3NzL2Z1bmN0aW9ucy9fdHJhbnNpdGlvbnMuc2NzcyIsIi4uLy4uLy4uL2dsb2JhbC9zY3NzL2NvcmUvX3Zpc2liaWxpdHkuc2NzcyIsIi4uLy4uLy4uL2dsb2JhbC9zY3NzL2Z1bmN0aW9ucy9faG92ZXIuc2NzcyIsIi4uLy4uLy4uL2dsb2JhbC9zY3NzL2Z1bmN0aW9ucy9fYmFja2dyb3VuZC5zY3NzIiwiX2Jhc2Uuc2NzcyIsImxheW91dHMvX2Nocm9tZS5zY3NzIiwibGF5b3V0cy9fZ3JpZC5zY3NzIiwicGFyYWdvbi5zY3NzIiwiY29tcG9uZW50cy9fYWJvdXQtcGFuZWwuc2NzcyIsImNvbXBvbmVudHMvX2FjY291bnQtbG9naW4uc2NzcyIsImNvbXBvbmVudHMvX2FjY291bnQtb3JkZXJzLnNjc3MiLCJjb21wb25lbnRzL19hY2NvdW50LXN3aXRjaC5zY3NzIiwiY29tcG9uZW50cy9fYWNjb3VudC10aWxlLnNjc3MiLCJjb21wb25lbnRzL19hZGRyZXNzLWNhcmQuc2NzcyIsImNvbXBvbmVudHMvX2FkZHJlc3MtbG9va3VwLnNjc3MiLCJjb21wb25lbnRzL19hcHBsaWVkLWNvZGUuc2NzcyIsImNvbXBvbmVudHMvX2FyY2hpdmUtZmxvdy5zY3NzIiwiY29tcG9uZW50cy9fYXJjaGl2ZS1oZWFkZXIuc2NzcyIsImNvbXBvbmVudHMvX2FydGljbGUtY2FyZC5zY3NzIiwiY29tcG9uZW50cy9fYXJ0aWNsZS1kb2Muc2NzcyIsImNvbXBvbmVudHMvX2FydGljbGUtaGVhZGVyLnNjc3MiLCJjb21wb25lbnRzL19hcnRpY2xlLWhlcm8uc2NzcyIsImNvbXBvbmVudHMvX2FydGljbGUtbGF5b3V0LnNjc3MiLCJjb21wb25lbnRzL19hcnRpY2xlLWxlYWQuc2NzcyIsImNvbXBvbmVudHMvX2FydGljbGUtbWFzdGhlYWQuc2NzcyIsImNvbXBvbmVudHMvX2Fzc3VyYW5jZS1saXN0LnNjc3MiLCJjb21wb25lbnRzL19hdGMtcXVhbnRpdHkuc2NzcyIsImNvbXBvbmVudHMvX2Jhc2tldC5zY3NzIiwiY29tcG9uZW50cy9fYmFza2V0LWxpbmUuc2NzcyIsImNvbXBvbmVudHMvX2Jhc2tldC1ub3RpY2Uuc2NzcyIsImNvbXBvbmVudHMvX2JvcmRlcmVkLWdyb3VwLnNjc3MiLCJjb21wb25lbnRzL19icmFuZC1saXN0LnNjc3MiLCJjb21wb25lbnRzL19icmVhZGNydW1icy5zY3NzIiwiY29tcG9uZW50cy9fYnJlYWtvdXQtZmlndXJlLnNjc3MiLCJjb21wb25lbnRzL19idG4uc2NzcyIsImNvbXBvbmVudHMvX2J1eS1ib3guc2NzcyIsImNvbXBvbmVudHMvX2J1eS1yZWdpb24uc2NzcyIsImNvbXBvbmVudHMvX2NhcmQtbGluZS5zY3NzIiwiY29tcG9uZW50cy9fY2F0ZWdvcnktZWRpdG9yaWFsLnNjc3MiLCJjb21wb25lbnRzL19jYXRlZ29yeS1oZWFkZXIuc2NzcyIsImNvbXBvbmVudHMvX2NhdGVnb3J5LXRpbGUuc2NzcyIsImNvbXBvbmVudHMvX2NoZWNrb3V0LWJhci5zY3NzIiwiY29tcG9uZW50cy9fY2hlY2tvdXQtc3RlcHMuc2NzcyIsImNvbXBvbmVudHMvX2Nob2ljZS5zY3NzIiwiY29tcG9uZW50cy9fY29kZS1kaXNjbG9zdXJlLnNjc3MiLCJjb21wb25lbnRzL19jb25maXJtLWhlcm8uc2NzcyIsImNvbXBvbmVudHMvX2NvbnRlbnQuc2NzcyIsImNvbXBvbmVudHMvX2NvdW50LWxpc3Quc2NzcyIsImNvbXBvbmVudHMvX2N0YS1iYW5kLnNjc3MiLCJjb21wb25lbnRzL19kZWNpc2lvbi5zY3NzIiwiY29tcG9uZW50cy9fZGVsaXZlcnktb3B0aW9ucy5zY3NzIiwiY29tcG9uZW50cy9fZGVzY3JpcHRpb24tcGFuZWwuc2NzcyIsImNvbXBvbmVudHMvX2RvYy1zZWN0aW9uLnNjc3MiLCJjb21wb25lbnRzL19lbXB0eS1zdGF0ZS5zY3NzIiwiY29tcG9uZW50cy9fZXJyb3ItbGlzdC5zY3NzIiwiY29tcG9uZW50cy9fZXhwcmVzcy1jaGVja291dC5zY3NzIiwiY29tcG9uZW50cy9fZmFxLWFjY29yZGlvbi5zY3NzIiwiY29tcG9uZW50cy9fZmVhdHVyZS1wYW5lbC5zY3NzIiwiY29tcG9uZW50cy9fZmVhdHVyZWQtcHJvZHVjdC5zY3NzIiwiY29tcG9uZW50cy9fZmllbGQuc2NzcyIsImNvbXBvbmVudHMvX2ZpZWxkLWdyb3VwLnNjc3MiLCJjb21wb25lbnRzL19maWd1cmUtcm93LnNjc3MiLCJjb21wb25lbnRzL19maWx0ZXItY2hpcHMuc2NzcyIsImNvbXBvbmVudHMvX2ZpbHRlci1ncm91cC5zY3NzIiwiY29tcG9uZW50cy9fZm9ybS1hY3Rpb25zLnNjc3MiLCJjb21wb25lbnRzL19mb3JtLW5vdGUuc2NzcyIsImNvbXBvbmVudHMvX2hlcm8tc2xpZGVyLnNjc3MiLCJjb21wb25lbnRzL19ob3VzZS1hZC5zY3NzIiwiY29tcG9uZW50cy9faW5mby1iYW5kLnNjc3MiLCJjb21wb25lbnRzL19pbmxpbmUtZm9ybS5zY3NzIiwiY29tcG9uZW50cy9fbGVhZC1zdG9yeS5zY3NzIiwiY29tcG9uZW50cy9fbGlzdGluZy10b29sYmFyLnNjc3MiLCJjb21wb25lbnRzL19sb3lhbHR5LWNhcmQuc2NzcyIsImNvbXBvbmVudHMvX21lZGlhLWZpZ3VyZS5zY3NzIiwiY29tcG9uZW50cy9fb3JkZXItY2xvc2Uuc2NzcyIsImNvbXBvbmVudHMvX29yZGVyLWxheW91dC5zY3NzIiwiY29tcG9uZW50cy9fb3JkZXItbGluZXMuc2NzcyIsImNvbXBvbmVudHMvX29yZGVyLXN0YXR1cy5zY3NzIiwiY29tcG9uZW50cy9fb3JkZXItdG90YWxzLnNjc3MiLCJjb21wb25lbnRzL19wYWNrYWdlLWRlbGl2ZXJ5LnNjc3MiLCJjb21wb25lbnRzL19wYWNrYWdlLWhlYWQuc2NzcyIsImNvbXBvbmVudHMvX3BhZ2Uuc2NzcyIsImNvbXBvbmVudHMvX3BhZ2UtY29udGVudHMuc2NzcyIsImNvbXBvbmVudHMvX3BhZ2luYXRpb24uc2NzcyIsImNvbXBvbmVudHMvX3BheWxhdGVyLWNhcmQuc2NzcyIsImNvbXBvbmVudHMvX3BheW1lbnQtbWFya3Muc2NzcyIsImNvbXBvbmVudHMvX3BheW1lbnQtbWV0aG9kcy5zY3NzIiwiY29tcG9uZW50cy9fcHJvZHVjdC1jYXJkLnNjc3MiLCJjb21wb25lbnRzL19wcm9kdWN0LWdhbGxlcnkuc2NzcyIsImNvbXBvbmVudHMvX3Byb2R1Y3QtaGVhZGluZy5zY3NzIiwiY29tcG9uZW50cy9fcHJvZHVjdC1saW5lLnNjc3MiLCJjb21wb25lbnRzL19wcm9kdWN0LWxpc3Qtcm93LnNjc3MiLCJjb21wb25lbnRzL19wcm9kdWN0LW1pbmkuc2NzcyIsImNvbXBvbmVudHMvX3Byb21vLXRpbGUuc2NzcyIsImNvbXBvbmVudHMvX3Byb3NlLnNjc3MiLCJjb21wb25lbnRzL19wdWxsLXF1b3RlLnNjc3MiLCJjb21wb25lbnRzL19yYW5nZS1jYXJkLnNjc3MiLCJjb21wb25lbnRzL19yZWFkaW5nLXByb2dyZXNzLnNjc3MiLCJjb21wb25lbnRzL19yZWNlbnQtcm93LnNjc3MiLCJjb21wb25lbnRzL19yZXZpZXctY2FyZC5zY3NzIiwiY29tcG9uZW50cy9fcm91dGUtcm93LnNjc3MiLCJjb21wb25lbnRzL19zY29yZS1iYWRnZS5zY3NzIiwiY29tcG9uZW50cy9fc2NvcmUtZ2xhbmNlLnNjc3MiLCJjb21wb25lbnRzL19zY29yZS1saXN0LnNjc3MiLCJjb21wb25lbnRzL19zY29yZS1tZXRlci5zY3NzIiwiY29tcG9uZW50cy9fc2NvcmUtcGFuZWwuc2NzcyIsImNvbXBvbmVudHMvX3Njb3JlLXJpbmcuc2NzcyIsImNvbXBvbmVudHMvX3Njb3JlLXN0cmlwLnNjc3MiLCJjb21wb25lbnRzL19zZWN0aW9uLWhlYWQuc2NzcyIsImNvbXBvbmVudHMvX3NlY3Rpb24tbGluay5zY3NzIiwiY29tcG9uZW50cy9fc2VvLWRvYy5zY3NzIiwiY29tcG9uZW50cy9fc2VyaWVzLWJhci5zY3NzIiwiY29tcG9uZW50cy9fc2VyaWVzLWluZGV4LnNjc3MiLCJjb21wb25lbnRzL19zZXJpZXMtbWFya2VyLnNjc3MiLCJjb21wb25lbnRzL19zZXJpZXMtbmV4dC5zY3NzIiwiY29tcG9uZW50cy9fc2VyaWVzLXN0ZXBzLnNjc3MiLCJjb21wb25lbnRzL19zZXR1cC1iYW5kLnNjc3MiLCJjb21wb25lbnRzL19zaGFyZS1saW5rcy5zY3NzIiwiY29tcG9uZW50cy9fc2hpcG1lbnQtbGlzdC5zY3NzIiwiY29tcG9uZW50cy9fc2l0ZS1zZWFyY2guc2NzcyIsImNvbXBvbmVudHMvX3NwZWMtYnVsbGV0cy5zY3NzIiwiY29tcG9uZW50cy9fc3BlYy1ncmlkLnNjc3MiLCJjb21wb25lbnRzL19zdGFyLXJhdGluZy5zY3NzIiwiY29tcG9uZW50cy9fc3RvcmUtbGF5b3V0LnNjc3MiLCJjb21wb25lbnRzL19zdG9yZS1uYXYuc2NzcyIsImNvbXBvbmVudHMvX3N1bW1hcnktdG9nZ2xlLnNjc3MiLCJjb21wb25lbnRzL190YWctY2xvdWQuc2NzcyIsImNvbXBvbmVudHMvX3Rlcm0tY2hpcHMuc2NzcyIsImNvbXBvbmVudHMvX3RydXN0LXJvdy5zY3NzIiwiY29tcG9uZW50cy9fdmVyZGljdC1iYW5kLnNjc3MiLCJjb21wb25lbnRzL192aWRlby1lbWJlZC5zY3NzIiwiY29tcG9uZW50cy9fd2Mtbm90aWNlcy5zY3NzIiwiY29tcG9uZW50cy9fd2lkZ2V0LnNjc3MiLCJibG9ja3MvX3dwLWJsb2NrLWNvbHVtbnMuc2NzcyIsImJsb2Nrcy9fd3AtYmxvY2stY292ZXIuc2NzcyIsImJsb2Nrcy9fd3AtYmxvY2stZGV0YWlscy5zY3NzIiwiYmxvY2tzL193cC1ibG9jay1lbWJlZC5zY3NzIiwiYmxvY2tzL193cC1ibG9jay1ncm91cC5zY3NzIiwiYmxvY2tzL193cC1ibG9jay1oZWFkaW5nLnNjc3MiLCJibG9ja3MvX3dwLWJsb2NrLWltYWdlLnNjc3MiLCJibG9ja3MvX3dwLWJsb2NrLWxpc3Quc2NzcyIsImJsb2Nrcy9fd3AtYmxvY2stbWVkaWEtdGV4dC5zY3NzIiwiYmxvY2tzL193cC1ibG9jay1wYXJhZ3JhcGguc2NzcyIsImJsb2Nrcy9fc3BlYy1waWxscy5zY3NzIiwiYmxvY2tzL19sZWdhY3ktdWdwLnNjc3MiLCJfYnJhbmQtdG9rZW5zLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQUE7QUFBQTtFQUlDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBOzs7QUFJRDtBQUFBO0VBR0M7RUFDQTs7O0FBSUQ7RUFFQzs7O0FBSUQ7QUFBQTtFQUdDO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQzs7O0FBV0Q7QUFBQTtFQUdDO0VBQ0E7RUFDQTs7O0FBSUQ7QUFBQTtFQUdDO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQXNCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtFQUdDOzs7QUFNRjtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTs7O0FBSUQ7RUFFQzs7O0FBY0Q7RUFFQztFQUNBOzs7QUFJRDtFQUVDOzs7QUNqS0Q7QUFBQTs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FDRUE7QUFBQTtBQUFBO0FBSUE7RUFrQkM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0E7RUFFQzs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQzs7O0FEd0JDO0VDMUJGO0lBTUU7OztBQU1GO0VBRUM7OztBRFlDO0VDZEY7SUFNRTs7O0FBTUY7RUFFQzs7O0FEQUM7RUNGRjtJQU1FOzs7QUFNRjtFQUVDOzs7QURaQztFQ1VGO0lBTUU7OztBQU1GO0VBRUM7OztBRHhCQztFQ3NCRjtJQU1FOzs7QUQ1QkE7RUNzQkY7SUFZRTs7O0FBYUY7RUFFQzs7O0FBY0Q7RUFFQzs7O0FBT0Q7RUFFQzs7O0FEMUVDO0VDOEVGO0lBTUU7OztBQVNGO0VBRUM7OztBQVFEO0VBRUM7OztBQzlLRjtBQUFBO0FBQUE7QUFnQ0E7RUFFQzs7O0FBSUE7RUFFQztFQUNBOzs7QUFRRDtFQUVDOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUFlOzs7QUFDZjtFQUFlOzs7QUFDZjtFQUFlOzs7QUFDZjtFQUFlOzs7QUFDZjtFQUFlOzs7QUFDZjtFQUFlOzs7QUFDZjtFQUFlOzs7QUFFZjtFQUFrQjs7O0FBQ2xCO0VBQWtCOzs7QUFDbEI7RUFBa0I7OztBQUNsQjtFQUFrQjs7O0FBQ2xCO0VBQWtCOzs7QUFDbEI7RUFBa0I7OztBQUNsQjtFQUFrQjs7O0FDM0VuQjtBQUFBO0FBQUE7QUNBQTtBQUFBO0FBQUE7QURNQTtFQUVDO0VBQ0E7OztBQUVBO0VDTEE7RURTQztFQUNBOzs7QUFNQTtFQUVDOzs7QUFVRjtFQUVDO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7OztBRTVDRjtBQUFBO0FBQUE7QUFJQTtFQUVDOzs7QUw2REU7RUszREY7SUFJRTs7O0FMdURBO0VLakRGO0lBSUU7OztBTDZDQTtFS3ZDRjtJQUlFOzs7QUFRRDtFQUZEO0lBSUU7OztBQVFEO0VBRkQ7SUFJRTs7O0FDdERIO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUNBQTtBQUFBOztBQUFBOztBQUFBO0FBQUE7QUNTQTtFQU9DO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFJQTs7O0FBSUQ7QUFBQTs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtFQU9DOzs7QUFZRDtFQUVDO0VBQ0E7RUFDQTs7O0FBTUQ7RUFFQzs7O0FBT0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtFQU1DO0VBQ0E7OztBQUlEO0VBRUM7SUFFQztJQUNBOzs7QUNuRkY7QUFFQTtFQUVDO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0FBRUE7RUFFQzs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZUE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVlBO0VBRUM7OztBQUlEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFXQTtBQUFBO0VBR0M7OztBQUlEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BO0VBRUM7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7OztBQUlEO0FBRUE7RUFFQztFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtBQUFBO0FBQUE7QUFBQTtFQUtDO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtBQUFBO0VBUUM7OztBQUlEO0VBRUM7RUFDQTs7O0FBSUQ7QUFFQTtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtBQUFBO0VBR0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7OztBQUlEO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBcUJBO0VBRUM7SUFFQzs7RUFTRDtJQUVDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7RUFJRDtBQUFBO0lBR0M7O0VBSUQ7SUFFQztJQUNBOzs7QUFNRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUNuV0E7RUFFQzs7O0FBR0Q7RUFFQztJQUVDOztFQUdEO0lBRUM7O0VBR0Q7SUFFQzs7O0FBSUY7RUFFQztJQUVDOzs7QUFJRjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFtQkE7RUFFQztJQUVDOzs7QUFJRjtFQUVDO0lBRUM7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0VBTUE7SUFFQzs7O0FBSUY7RUFFQztBQUFBO0FBQUE7QUFBQTtJQUtDOzs7QUFJRjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW9CQTtFQUVDOzs7QUFHRDtFQUVDO0lBRUM7OztBQUlGO0VBRUM7SUFFQzs7O0FDNUpGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQ2JBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7SUFFQzs7O0FDNURGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT0E7RUFFQztFQUNBOzs7QUFHRDtBQUNBO0VBRUM7OztBQ2ZEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW1CQTtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0FBQUE7QUFBQTtBQUFBO0FBSUE7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFJQTtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7QUFBQTtBQUFBO0FBQUE7SUFLQztJQUNBOztBQUdEO0VBQ0E7SUFFQzs7RUFHRDtJQUVDOztFQUdEO0lBRUM7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7O0VBR0Q7SUFFQztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7O0VBR0Q7SUFFQzs7RUFHRDtJQUVDOzs7QUNuTUY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBY0E7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0FBQUE7QUFBQTtBQUdBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtBQUFBO0FBQUE7QUFHQTtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQ25HRDtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVlBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7SUFFQzs7O0FDM0dGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFRQTtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUNyQkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFpQkE7RUFFQzs7O0FBR0Q7RUFFQzs7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFJQTtFQUVDOzs7QUFHRDtFQUVDO0lBRUM7OztBQUlGO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDO0lBRUM7OztBQUlGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNBO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtBQUFBO0VBR0M7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQzs7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUFBO0VBR0M7OztBQy9MRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU9BO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7OztBQ25FRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7SUFFQzs7O0FBS0Y7RUFFQztBQUFBO0lBR0M7OztBQ3pDRjtBQUFBO0FBQUE7QUFJQTtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQ3BCRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQ2pGRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTZCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU0E7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQztJQUVDOzs7QUFLRjtFQUVDO0lBRUM7OztBQUtGO0VBRUM7OztBQU1EO0VBRUM7OztBQ3ZJRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNBO0VBRUM7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTs7O0FBSUQ7RUFFQztJQUVDOzs7QUFLRjtFQUVDO0lBRUM7O0VBSUQ7SUFFQzs7O0FBS0Y7QUFBQTtFQUdDOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7RUFDQTs7O0FBSUQ7RUFFQzs7O0FDcktEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFtQkE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBTUE7OztBQWdCRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQztJQUVDOztFQUlEO0lBRUM7OztBQUtGO0VBRUM7SUFFQzs7RUFJRDtJQUVDOztFQU9EO0lBRUM7O0VBU0Q7SUFFQzs7O0FDL0tGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW9CQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdCQTtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDOzs7QUFNRDtBQUFBO0VBR0M7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQztJQUVDOztFQUlEO0lBRUM7O0VBSUQ7SUFFQzs7RUFJRDtJQUVDOzs7QUFLRjtFQUVDO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7OztBQUlEO0VBRUM7SUFFQzs7RUFJRDtJQUVDOzs7QUM1SkY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFXQTtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7SUFFQzs7O0FDM0NGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUUE7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztJQUVDOzs7QUNyQkY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFZQTtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUMvREQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUVBO0VBRUM7OztBQUlEO0VBRUM7RUFDQTs7O0FBTUY7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBRUE7RUFHQztFQUNBOzs7QUMxRUY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFZQTtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7QUFBQTtBQUVBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztJQUVDOztFQUdEO0lBRUM7OztBQUlGO0VBRUM7SUFFQztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7O0VBR0Q7SUFFQztJQUNBO0lBQ0E7O0VBR0Q7SUFFQztJQUNBO0lBQ0E7O0VBR0Q7QUFBQTtBQUFBO0lBSUM7SUFDQTtJQUNBOztFQUdEO0lBRUM7O0VBR0Q7QUFBQTtJQUdDOzs7QUFJRjtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0JBO0FBQUE7QUFBQTtBQUdBO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztJQUVDO0lBQ0E7SUFDQTtJQUNBOztFQUdEO0lBRUM7SUFDQTtJQUNBOztFQUdEO0lBRUM7O0VBR0Q7QUFBQTtBQUFBO0lBSUM7SUFDQTtJQUNBOztFQUdEO0lBRUM7O0VBR0Q7SUFFQzs7RUFHRDtJQUVDOztFQUdEO0lBRUM7OztBQy9ORjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFXQTtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztJQUVDO0lBQ0E7O0VBR0Q7SUFFQzs7RUFHRDtJQUVDO0lBQ0E7SUFDQTtJQUNBOztFQUdEO0lBRUM7SUFDQTs7O0FBSUY7RUFFQztJQUVDO0lBQ0E7O0VBR0Q7SUFFQzs7RUFHRDtJQUVDOzs7QUFJRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtFQUVDOzs7QUNyTUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUMvQ0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVUE7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDOzs7QUFHRDtBQUFBO0FBQUE7QUFBQTtBQUlBO0VBRUM7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7OztBQ3RFRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztJQUVDO0lBQ0E7OztBQ2ZGO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBUUQ7RUFFQzs7O0FBR0Q7RUFFQzs7O0FBTUQ7QUFBQTtBQUFBO0VBSUM7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7OztBQ3RGRDtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWFBO0VBRUM7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0lBRUM7OztBQUtGO0VBRUM7SUFFQztJQUNBO0lBQ0E7O0VBSUQ7SUFFQzs7RUFJRDtJQUVDOztFQUlEO0lBRUM7SUFDQTs7RUFJRDtJQUVDOzs7QUFXRjtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7OztBQ3pKRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQzs7O0FDakREO0FBQUE7QUFBQTs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF5QkE7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7QUFBQTtBQUFBO0FBR0E7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FDcFFEO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBdUJBO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTQTtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7QUFBQTtBQUFBO0FBR0E7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7QUFDQTtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTUE7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUE7QUFBQTtJQUdFOzs7QUFJRjtBQUFBO0FBQUE7QUFHQTtFQUVDOzs7QUN2RkQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FDWkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFrQkE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQ25DRDtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQWlCQTtBQUNBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtBQUVBO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7QUFDQTtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtBQUFBO0FBRUE7RUFFQzs7O0FDcklEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FDeEREO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQVdBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0lBRUM7OztBQUlGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQTtFQUVDO0lBRUM7O0VBR0Q7SUFFQzs7O0FDekZGO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWNBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0FBQ0E7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtBQUFBO0FBRUE7RUFFQztJQUVDO0lBQ0E7O0VBR0Q7SUFFQztJQUNBO0lBQ0E7SUFDQTtJQUNBOztFQUdEO0lBRUM7O0VBR0Q7SUFFQztJQUNBOzs7QUN6SUY7QUFBQTtBQUFBO0FBSUE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUVEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUVEO0VBRUM7OztBQUVEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUVEO0VBRUM7RUFDQTs7O0FBRUQ7QUFBQTtBQUFBO0VBSUM7RUFDQTtFQUNBOzs7QUFFRDtFQUVDO0VBQ0E7RUFDQTs7O0FBRUQ7RUFFQzs7O0FBRUQ7RUFFQzs7O0FBRUQ7RUFFQzs7O0FDN0VEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFhQTtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7OztBQ3BGRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEyQkE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztJQUVDO0lBQ0E7O0VBR0Q7SUFFQzs7O0FBSUY7RUFFQztJQUVDO0lBQ0E7SUFDQTs7QUFHRDtBQUFBO0FBQUE7RUFHQTtJQUVDOztFQUdEO0lBRUM7O0VBR0Q7SUFFQztJQUNBO0lBQ0E7O0VBR0Q7SUFFQztJQUNBOztFQUdEO0lBRUM7SUFDQTs7RUFHRDtJQUVDOztFQUdEO0lBRUM7OztBQy9KRjtFQUVDOzs7QUFXQTtFQUVDOzs7QUFTRDtFQUVDO0VBQ0E7OztBQUtEO0VBRUM7RUFDQTs7O0FDM0NGO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFJQTtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUN4RkQ7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdCQTtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7SUFFQztJQUNBOztFQUdEO0lBRUM7O0VBR0Q7SUFFQzs7O0FBSUY7RUFFQztJQUVDO0lBQ0E7O0VBR0Q7SUFFQzs7RUFHRDtJQUVDO0lBQ0E7SUFDQTs7O0FDcEhGO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBVUE7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0FBQUE7QUFBQTtBQUdBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtBQUFBO0FBQUE7QUFHQTtFQUVDOzs7QUNsREQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU0E7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUN4R0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQzs7O0FDaEJEO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXdCQTtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7SUFFQzs7O0FDNUNGO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7SUFFQzs7RUFHRDtJQUVDOzs7QUFJRjtBQUFBO0FBQUE7QUFHQTtFQUVDOzs7QUFHRDtFQUVDO0lBRUM7OztBQzFERjtBQUFBO0FBRUE7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUMvQkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBbUJBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7QUFBQTtFQUdDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0lBRUM7O0VBR0Q7SUFFQzs7RUFHRDtJQUVDOzs7QUFJRjtBQUFBO0FBQUE7QUFBQTtBQUlBO0VBRUM7OztBQ25IRDtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUE2Q0E7RUFFQztBQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7QUFDQTtFQUVDOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtBQUFBO0FBQUE7QUFHQTtBQUFBO0VBR0M7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7SUFFQztJQUNBOztFQUdEO0FBQUE7SUFHQzs7RUFHRDtJQUVDOztFQUdEO0lBRUM7OztBQzlLRjtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtBQUFBO0FBQUE7QUFHQTtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7QUFBQTtJQUdDO0lBQ0E7O0VBR0Q7SUFFQzs7RUFHRDtJQUVDOzs7QUNyRUY7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUF1QkE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0FBQUE7QUFBQTtBQUdBO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7QUFBQTtBQUFBO0FBR0E7RUFFQztFQUNBOzs7QUFHRDtFQUVDO0lBRUM7SUFDQTs7RUFHRDtJQUVDOzs7QUFJRjtFQUVDO0lBRUM7O0VBR0Q7SUFFQzs7RUFHRDtJQUVDOztFQUdEO0lBRUM7OztBQ3ZMRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTUE7RUFFQztFQUNBOzs7QUFHRDtBQUFBO0FBRUE7RUFFQzs7O0FBRUQ7QUFBQTtFQUdDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUVEO0FBQUE7QUFFQTtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFFRDtBQUFBO0VBR0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFFRDtBQUFBO0VBR0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBRUQ7RUFFQztFQUNBOzs7QUFFRDtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQUE7QUFBQTtBQUFBO0VBS0M7RUFDQTtFQUNBO0VBQ0E7OztBQUVEO0FBQUE7QUFBQTtBQUdBO0FBQUE7RUFHQztFQUNBOzs7QUFFRDtBQUFBO0FBQUE7QUFBQTtFQUtDO0VBQ0E7RUFDQTs7O0FBRUQ7QUFBQTtFQUdDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBRUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBRUQ7QUFBQTtBQUVBO0FBQUE7RUFHQztFQUNBO0VBQ0E7RUFDQTs7O0FBRUQ7QUFBQTtFQUdDOzs7QUFFRDtFQUVDOzs7QUFFRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVVBO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDOzs7QUFHRDtBQUFBO0FBQUE7QUFHQTtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0FBQUE7QUFBQTtBQUFBO0FBSUE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtBQUFBO0VBR0M7RUFDQTtFQUNBOzs7QUNyUkQ7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtBQUFBO0FBQUE7QUFHQTtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7SUFFQzs7O0FBSUY7RUFFQztJQUVDOzs7QUFJRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS0E7QUFBQTtFQUdDOzs7QUNuREQ7RUFFQztFQUNBO0VBQ0E7QUFDQTtBQUFBO0FBQUE7RUFHQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztJQUVDOzs7QUFJRjtFQUVDO0lBRUM7O0VBR0Q7SUFFQzs7O0FDdkRGO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVlBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7SUFFQzs7O0FDeEdGO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZUE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQ25GRDtBQUFBO0FBRUE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0lBRUM7SUFDQTtJQUNBOztFQUdEO0lBRUM7O0VBR0Q7SUFFQzs7O0FDM0NGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFhQTtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0FBQUE7QUFBQTtBQUFBO0FBSUE7RUFFQzs7O0FBR0Q7RUFFQztFQUNBOzs7QUN0Q0Q7QUFFQztBQUFBO0FBQUE7QUFBQTtBQUFBO0VBS0E7RUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtFQU1BO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWVBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtFQU9BO0VBQ0E7RUFDQTs7O0FBS0Q7QUFFQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7RUFNQTtFQUNBO0VBQ0E7RUFDQTs7O0FBS0Q7QUFBQTtBQUVBO0VBRUM7QUFBQTtJQUdDOzs7QUFJRjtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0VBTUE7RUFDQTtFQUNBO0VBQ0E7OztBQU1EO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0FBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDO0FBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztBQUVDO0FBQUE7QUFBQTtBQUFBO0lBSUE7SUFDQTtJQUNBOzs7QUFJRjtFQUVDO0lBRUM7OztBQUlGO0FBRUM7QUFBQTtBQUFBO0FBQUE7RUFJQTtJQUVDO0lBQ0E7O0VBR0Q7SUFFQzs7RUFHRDtJQUVDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7QUFHRDtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtFQVNBO0lBRUM7SUFDQTs7RUFHRDtJQUVDOztFQUdEO0lBRUM7OztBQ3hURjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWFBO0VBRUM7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtBQUNBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7SUFFQztJQUNBOztFQUlEO0lBRUM7OztBQU1GO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVVBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTs7O0FBSUQ7RUFFQztJQUVDO0lBQ0E7SUFDQTs7RUFJRDtJQUVDOztFQUlEO0lBRUM7O0VBSUQ7SUFFQzs7RUFJRDtJQUVDOzs7QUNyUEY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtBO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVBO0lBRUU7OztBQzdFRjtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0FBQUE7QUFBQTtBQUdBO0VBRUM7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7QUFBQTtBQUVBO0VBRUM7OztBQUdEO0VBRUM7SUFFQzs7O0FBSUY7RUFFQztJQUVDO0lBQ0E7SUFDQTs7RUFHRDtJQUVDOzs7QUN0REY7QUFBQTtBQUFBO0FBSUE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQztJQUVDOztFQUlEO0lBRUM7OztBQUtGO0VBRUM7OztBQUlEO0VBRUM7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7OztBQUlEO0VBRUM7SUFFQzs7RUFJRDtJQUVDO0lBQ0E7SUFDQTs7O0FDN0tGO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZUE7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtBQUFBO0FBQUE7QUFBQTtBQUlBO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7SUFFQzs7RUFHRDtJQUVDO0lBQ0E7O0VBR0Q7SUFFQzs7O0FDbEtGO0FBQUE7QUFBQTtBQUFBO0FBSUE7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7QUFBQTtBQUFBO0FBR0E7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUFBO0VBRUE7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS0E7QUFBQTtFQUdDOzs7QUNwRUQ7QUFFQTtFQUVDOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFVRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQzs7O0FDMUNEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVUE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0lBRUM7SUFDQTtJQUNBOztFQUdEO0lBRUM7SUFDQTtJQUNBOztFQUdEO0lBRUM7OztBQzNDRjtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtBO0FBQUE7RUFHQztFQUNBO0VBQ0E7OztBQUdEO0FBQUE7RUFHQzs7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFJQTtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFBQTtFQUdDOzs7QUFHRDtBQUFBO0FBQUE7QUFBQTtBQUlBO0VBRUM7OztBQUdEO0FBQUE7QUFBQTtBQUdBO0VBRUM7OztBQUdEO0VBRUM7SUFFQzs7O0FBSUY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtBO0VBRUM7OztBQUdEO0FBQUE7QUFBQTtBQUdBO0VBRUM7OztBQUdEO0VBRUM7SUFFQzs7RUFHRDtBQUFBO0lBR0M7O0VBR0Q7SUFFQztJQUNBO0lBQ0E7SUFDQTs7O0FBSUY7RUFFQztJQUVDOztFQUdEO0lBRUM7O0VBR0Q7SUFFQzs7O0FDNUpGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZUE7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7QUFBQTtBQUFBO0FBR0E7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQzFJRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFpQkE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0FBQUE7RUFHQztFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7QUFBQTtFQUdDO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FDdEVEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNBO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0FBQUE7QUFBQTtBQUFBO0FBSUE7RUFFQzs7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0lBRUM7OztBQzVLRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBeUJBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtBQUFBO0VBR0M7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0FBQ0E7RUFFQztJQUVDOztFQUdEO0lBRUM7O0VBR0Q7SUFFQztJQUNBO0lBQ0E7OztBQ3hKRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBYUE7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7QUFBQTtFQUdDO0VBQ0E7OztBQUdEO0VBRUM7SUFFQzs7O0FDdEVGO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBdUJBO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDOzs7QUFHRDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXNCQTtBQUFBO0VBR0M7OztBQUlEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQTtFQUVDO0FBRUE7QUFBQTtBQUFBO0VBR0E7OztBQUdEO0FBQUE7QUFBQTtBQUdBO0VBRUM7OztBQUdEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT0E7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7OztBQ25IRDtBQUNBO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWFBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtBQUFBO0FBQUE7QUFHQTtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0lBRUM7OztBQzVHRjtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQU9EO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0FBQUE7QUFBQTtBQUFBO0FBSUE7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0FBQUE7QUFFQTtFQUVDO0lBRUM7SUFDQTtJQUNBOztFQUdEO0lBRUM7SUFDQTtJQUNBOztFQUdEO0lBRUM7SUFDQTs7RUFHRDtJQUVDO0lBQ0E7O0VBR0Q7QUFBQTtJQUdDO0lBQ0E7SUFDQTs7RUFHRDtJQUVDO0lBQ0E7OztBQzNLRjtBQUFBO0FBQUE7QUFHQTtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtBQUFBO0FBQUE7QUFHQTtFQUVDOzs7QUFHRDtBQUFBO0FBRUE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUFBO0VBR0M7OztBQ3BFRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBbUJBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtBQUFBO0FBQUE7QUFHQTtFQUVDOzs7QUFHRDtFQUVDOzs7QUM3REQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBd0JBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtBQUFBO0FBQUE7QUFHQTtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztJQUVDOztFQUdEO0lBRUM7SUFDQTs7RUFHRDtJQUVDOztFQUdEO0lBRUM7O0VBR0Q7SUFFQzs7O0FBSUY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFRQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS0E7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDOzs7QUMvTUQ7QUFBQTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUErQkE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7QUFBQTtBQUFBO0FBR0E7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0FBQUE7QUFBQTtBQUFBO0FBSUE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUFJRDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBaUJBO0VBRUM7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQVFEO0VBRUM7SUFFQzs7O0FDaFBGO0FBQUE7QUFBQTtBQUFBO0FBS0E7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFrQkE7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS0E7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVBO0lBRUU7O0VBR0Y7SUFFRTtJQUNBO0lBQ0E7O0VBR0Y7SUFFRTs7O0FBSUY7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVdBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFRQTtFQUVDOzs7QUFHRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTQTtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQVNBO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUM5T0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT0E7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQTtJQUVFOzs7QUN2REY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFRQTtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQy9ERDtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0JBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtBO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDO0lBRUM7O0VBR0Q7SUFFQztJQUNBO0lBQ0E7SUFDQTtJQUNBOztFQUdEO0lBRUM7SUFDQTs7O0FBSUY7RUFFQztJQUVDO0lBQ0E7O0VBR0Q7SUFFQzs7RUFHRDtJQUVDOzs7QUFJRjs7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQVFBO0VBRUM7RUFDQTtFQUNBOzs7QUN4UUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQ3pERDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBbUJBO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7QUFBQTtJQUdDOzs7QUNsR0Y7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFTRDtBQUFBO0VBR0M7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7QUFBQTtBQUFBO0VBTUM7OztBQUlEO0FBQUE7QUFBQTtBQUFBO0VBS0M7OztBQzdGRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPQTtFQUVDO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0lBRUM7O0VBSUQ7SUFFQzs7O0FDaENGO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQ3pERDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU0E7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7SUFFQzs7O0FBS0Y7RUFFQztJQUVDOzs7QUNuREY7RUFFQztFQUNBO0VBQ0E7OztBQ0pEO0FBQUE7QUFBQTtBQUlBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0lBRUM7O0VBSUQ7SUFFQzs7O0FDcEpGO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBdUJBO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0JBO0VBRUM7RUFDQTtFQUNBOzs7QUNyREQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT0E7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0lBRUM7OztBQzFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQy9FRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBWUE7RUFFQztFQUNBO0VBQ0E7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7OztBQ3pFRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdCQTtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtBQUFBO0VBR0M7RUFDQTs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQztFQUVBO0VBQ0E7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQztJQUVDOzs7QUFLRjtFQUVDO0lBRUM7SUFDQTs7RUFJRDtJQUVDOzs7QUMxSUY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWNBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQztBQUFBO0lBR0M7O0VBSUQ7SUFFQztJQUNBO0lBQ0E7SUFDQTtJQUNBOztFQUlEO0lBRUM7SUFDQTs7O0FDdkxGO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQzFCRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7SUFFQzs7O0FDdERGO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU9BO0VBRUM7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztJQUVDOzs7QUFJRjtBQUFBO0FBQUE7QUFBQTtBQUlBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtBQUFBO0FBQUE7QUFHQTtFQUVDOzs7QUFHRDtFQUVDO0lBRUM7OztBQ2pHRjtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQ1ZEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQTtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtBQUNBO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztJQUVDOztFQUdEO0lBRUM7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7O0FDcEVGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQWlCQTtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7SUFFQztJQUNBOztFQUlEO0FBQUE7SUFHQzs7RUFJRDtJQUVDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7O0VBSUQ7SUFFQztJQUNBOztFQUlEO0lBRUM7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBOztFQUlEO0lBRUM7SUFDQTs7O0FDdExGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWVBO0VBRUM7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7SUFFQzs7RUFJRDtJQUVDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBOztFQUlEO0lBRUM7O0VBSUQ7SUFFQztJQUNBOztFQUlEO0lBRUM7OztBQ3ZFRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFVQTtBQUFBO0FBQUE7QUFJQTtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7RUFDQTs7O0FDeEVEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFjQTtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTs7O0FBSUQ7RUFFQztJQUVDOztFQUlEO0lBRUM7OztBQ3pJRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPQTtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQzs7O0FDM0REO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBYUE7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztJQUVDOztFQUdEO0lBRUM7OztBQzNDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPQTtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQzs7O0FDekNEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWNBO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7QUFDQTtFQUVDO0lBRUM7SUFDQTs7RUFHRDtJQUVDO0lBQ0E7O0VBR0Q7SUFFQzs7RUFHRDtJQUVDOztFQUdEO0lBRUM7SUFDQTs7RUFHRDtJQUVDO0lBQ0E7SUFDQTs7O0FDOUpGO0FBQ0E7RUFFQztFQUtBO0VBUUE7RUFFQTs7O0FBT0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFFQTs7O0FBSUQ7QUFDQTtFQVNDO0VBQ0E7RUFFQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7OztBQUlEO0VBRUM7OztBQUlEO0FBQ0E7RUFFQztFQUNBO0VBRUE7RUFFQTs7O0FBSUQ7RUFFQzs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7OztBQUlEO0VBRUM7OztBQU1EO0VBRUM7OztBQUlEO0VBRUM7RUFDQTs7O0FBSUQ7RUFFQzs7O0FBT0Q7RUFFQztJQU1DO0lBQ0E7OztBQ3ZKRjtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0lBRUM7SUFDQTs7RUFHRDtJQUVDOzs7QUN4REY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtBO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUE7SUFFRTs7O0FBSUY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWNBO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQTtJQUVFO0lBQ0E7SUFDQTs7RUFHRjtJQUVFOzs7QUFJRjtFQUVBO0lBRUU7OztBQ3RIRjtBQUVBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQVFEO0VBRUM7RUFDQTs7O0FDdkNEO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBdUJBO0FBQUE7QUFBQTtBQUFBO0FBS0E7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT0E7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFvQkE7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQUE7RUFHQzs7O0FBR0Q7RUFFQztJQUVDOztBQUdEO0FBQUE7QUFBQTtFQUdBO0lBRUM7O0FBR0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0VBV0E7SUFFQztJQUNBOztFQUdEO0lBRUM7OztBQU1GOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtCQTtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0lBRUM7OztBQUlGOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWFBO0FBQ0E7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQ3RNRDtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTRCQTtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7RUFJQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtFQU1BO0VBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0VBS0E7RUFDQTs7O0FBR0Q7QUFBQTtBQUVBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFRQTtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7SUFFQzs7O0FDakpGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFVQTtFQUVDO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDO0FBQUE7SUFHQzs7O0FDdkdGO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtFQUVDO0VBQ0E7OztBQ3RDRDtBQUFBO0FBQUE7QUFJQTtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0lBRUM7O0VBSUQ7SUFFQztJQUNBOztFQUlEO0lBRUM7O0VBSUQ7SUFFQztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7O0VBSUQ7SUFFQzs7RUFJRDtJQUVDOzs7QUNqSUY7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFvQkE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWlCQTtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtBQUFBO0FBQUE7QUFBQTtBQUlBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7OztBQUdEO0VBRUM7SUFFQzs7O0FBSUY7RUFFQztJQUVDOztFQUdEO0lBRUM7OztBQ3pIRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFlQTtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBOzs7QUFTRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0FBQUE7RUFHQztFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0lBRUM7OztBQUtGO0VBRUM7SUFFQzs7RUFJRDtJQUVDOztFQUlEO0lBRUM7O0VBSUQ7SUFFQzs7RUFJRDtJQUVDOzs7QUM5S0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFRQTtFQUVDOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlEO0VBRUM7OztBQUlEO0VBRUM7RUFDQTtFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUQ7RUFFQztJQUVDO0lBQ0E7OztBQzdFRjtBQUFBO0FBQUE7RUFJQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTs7O0FBS0Q7QUFBQTtBQUFBO0VBSUM7RUFDQTtFQUNBOzs7QUFRRDtBQUFBO0VBR0M7OztBQy9ERDtBQUNBO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7RUFFQzs7O0FBR0Q7RUFFQzs7O0E3SHlIRDtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBOEhqSkE7RUFHQztFQUVBOzs7QUFJRDtFQUlDOzs7QUNJRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUtEO0VBRUM7RUFDQTtFQUNBOzs7QUFVRDtFQUVDO0VBQ0E7RUFDQTs7O0FBT0Q7RUFFQzs7O0FBT0Q7RUFFQzs7O0FBSUQ7RUFFQzs7O0FDbEREO0VBRUM7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7QUFBQTtBQUFBO0FBR0E7RUFFQztFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Q7QUFBQTtBQUVBO0VBRUM7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7RUFFQztFQUNBOzs7QUFHRDtBQUFBO0FBQUE7QUFHQTtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdEO0VBRUM7RUFDQTs7O0FBR0Q7QUFBQTtBQUVBO0VBRUM7RUFDQTtFQUNBOzs7QUFHRDtFQUVDOzs7QUFHRDtFQUVDO0lBRUM7O0VBR0Q7SUFFQzs7RUFHRDtJQUVDOzs7QUMvSUY7RUFFQzs7O0FBRUE7RUFFQztFQUNBOzs7QUNORjtFQUVDOzs7QUFNRDtFQUVDOzs7QUFLRDtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUNUQTtFQUVDO0VBQ0E7RUFNQTs7O0FBSUQ7RUFFQztFQUNBOzs7QUFJRDtFQUVDO0VBQ0E7OztBQUlEO0VBRUM7RUFDQTs7O0FBSUQ7RUFFQztFQUNBOzs7QUFJRDtBQUFBO0VBR0M7RUFDQTs7O0FDbEREO0VBRUM7OztBQUVBO0VBRUM7OztBQU1GO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQ2xCRDtFQUVDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUVBO0VBRUM7OztBQVFEO0VBRUM7OztBQUlEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FDakNGO0VBRUM7RUFDQTtFQUNBOzs7QUFJRDtFQUVDOzs7QUFJRDtFQUVDOzs7QUNmRDtFQUVDO0VBQ0E7RUFDQTs7O0FBS0Q7RUFFQzs7O0FDSkQ7RUFFQzs7O0FBRUE7RUFFQztFQUNBO0VBQ0E7RUFDQTs7O0FBY0Q7RUFFQztFQUNBOzs7QUFJRDtBQUFBO0VBR0M7OztBQVFEO0VBRUM7RUFDQTtFQUNBO0VBQ0E7OztBQVFEO0VBRUM7OztBQUlEO0VBRUM7RUFDQTs7O0FDL0NGO0VBQWlDOzs7QUFDakM7RUFBaUM7OztBQUNqQztFQUFpQzs7O0FBQ2pDO0VBQWlDOzs7QUFDakM7RUFBaUM7OztBQUVqQztFQUF3Qzs7O0FBQ3hDO0VBQXdDOzs7QUFDeEM7RUFBd0M7OztBQUN4QztFQUF3Qzs7O0FBQ3hDO0VBQXdDOzs7QXpJOEl4QztBMEkvSkM7QUFBQTtBQUFBO0FBQUE7RUFLQTtFQUNBO0VBQ0E7RUFDQTtFQUVBO0VBQ0E7RUFDQTtFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUVBO0VBQ0E7RUFDQTtBQUVBO0FBQUE7QUFBQTtFQUlBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUVBO0FBQUE7QUFBQTtFQU1BO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtFQU9BO0VBQ0E7RUFDQTtFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFNQTtFQUNBO0VBQ0E7RUFDQTtFQUVBO0VBQ0E7QUFFQTtBQUFBO0FBQUE7RUFJQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtFQU9BO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQTtFQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtFQVNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7RUFPQTtFQUNBO0VBQ0EiLCJmaWxlIjoicGFyYWdvbi5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcXFxuXHRSRVNFVFxuXFwqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuKixcbio6OmJlZm9yZSxcbio6OmFmdGVyIHtcblxuXHRib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXG59XG5cbmh0bWwge1xuXG5cdC1tb3otdGV4dC1zaXplLWFkanVzdDogbm9uZTtcblx0LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiBub25lO1xuXHR0ZXh0LXNpemUtYWRqdXN0OiBub25lO1xuXG59XG5cbmJvZHkge1xuXG5cdG1hcmdpbjogMDtcblx0bWluLWhlaWdodDogMTAwdmg7XG5cbn1cblxuYm9keSwgaDEsIGgyLCBoMywgaDQsXG5wLCBmaWd1cmUsIGJsb2NrcXVvdGUsIGRsLCBkZCB7XG5cblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiAwO1xuXHRtYXJnaW4tYmxvY2stZW5kOiAwO1xuXG59XG5cbmgxLCBoMiwgaDMsIGg0IHtcblxuXHR0ZXh0LXdyYXA6IHByZXR0eTtcblxufVxuXG51bCxcbm9sIHtcblxuXHRtYXJnaW46IHVuc2V0O1xuXHRwYWRkaW5nOiB1bnNldDtcblx0bGlzdC1zdHlsZTogbm9uZTtcblxufVxuXG5hOm5vdChbY2xhc3NdKSB7XG5cblx0dGV4dC1kZWNvcmF0aW9uLXNraXAtaW5rOiBhdXRvO1xuXG59XG5cbi8vIGBoZWlnaHQ6IGF1dG9gIEJFU0lERSBgbWF4LXdpZHRoYCwgYWx3YXlzLiBXb3JkUHJlc3MgYW5kIFdvb0NvbW1lcmNlIHByaW50IGltYWdlc1xuLy8gd2l0aCB3aWR0aCBhbmQgaGVpZ2h0IGF0dHJpYnV0ZXMgKGEgcHJvZHVjdCB0aHVtYm5haWwgaXMgaGVpZ2h0PVwiMzAwXCIpLCBhbmRcbi8vIG1heC13aWR0aCBhbG9uZSBuYXJyb3dzIHRoZSBib3ggd2hpbGUgdGhlIGF0dHJpYnV0ZSBrZWVwcyBpdHMgaGVpZ2h0IOKAlCBzbyBvbiBhXG4vLyBwaG9uZSBldmVyeSBuYXJyb3dlZCBpbWFnZSBiZWNhbWUgYSB0YWxsIGZyYW1lIHdpdGggdGhlIHBpY3R1cmUgZmxvYXRpbmcgaW4gaXQuXG4vLyBGb3VyIFBhcmFnb24gY29tcG9uZW50cyAoYmFza2V0LCBjaGVja291dCBhbmQgY29uZmlybWF0aW9uIGxpbmVzLCB0aGUgcHJvZHVjdFxuLy8gZ2FsbGVyeSkgaGFkIGVhY2ggcGF0Y2hlZCB0aGlzIGxvY2FsbHkgYmVmb3JlIGl0IHdhcyBmaXhlZCBoZXJlICgyMDI2LTA5LTI3KS4gWmVybyBzcGVjaWZpY2l0eTogYW55IGNvbXBvbmVudCB0aGF0IHNpemVzIGFuIGltYWdlIHRvIGZpbGwgaXRzXG4vLyBmcmFtZSAoaGVpZ2h0OiAxMDAlLCBvYmplY3QtZml0OiBjb3Zlcikgc3RpbGwgd2lucy5cbmltZyxcbnBpY3R1cmUge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHRtYXgtd2lkdGg6IDEwMCU7XG5cdGhlaWdodDogYXV0bztcblxufVxuXG5pbnB1dCwgYnV0dG9uLFxudGV4dGFyZWEsIHNlbGVjdCB7XG5cblx0Zm9udC1mYW1pbHk6IGluaGVyaXQ7XG5cdGZvbnQtc2l6ZTogaW5oZXJpdDtcblxufVxuXG5idXR0b24ge1xuXG5cdHBhZGRpbmc6IDA7XG5cdGJvcmRlcjogbm9uZTtcblx0YmFja2dyb3VuZDogbm9uZTtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXG59XG5cbi8vIERpc2FibGVkIGNvbnRyb2xzIG11c3QgbmV2ZXIgcHJlc2VudCBhcyBjbGlja2FibGUuIFRoaXMgaXMgdGhlIHVuaXZlcnNhbCBoYWxmXG4vLyBvZiBhIGRpc2FibGVkIHN0YXRlIOKAlCB0cnVlIG9mIGFueSBjb250cm9sIGluIGFueSBkZXNpZ24sIGFuZCB0aGUgb25lIHRoaW5nIG5vXG4vLyBicmFuZCBzaG91bGQgZXZlciBvdmVycmlkZSBhd2F5LiBIT1cgYSBkaXNhYmxlZCBjb250cm9sIGxvb2tzIChkaW1taW5nLCBtdXRlZFxuLy8gYWNjZW50LCBkcm9wcGVkIGdsb3cpIGlzIGJyYW5kIGlkZW50aXR5IGFuZCBiZWxvbmdzIGluIHRoZSBicmFuZCBzaWxvJ3Mgb3duXG4vLyBjb21wb25lbnQuXG4vL1xuLy8gSXQgbGl2ZXMgaW4gdGhlIHJlc2V0IHJhdGhlciB0aGFuIGEgZ2xvYmFsIGJ1dHRvbiBjb21wb25lbnQgZm9yIHR3byByZWFzb25zOlxuLy8gdGhlIDIwMjYtMDctMzAgY2xlYW51cCBkZWxpYmVyYXRlbHkgbW92ZWQgYGJ1dHRvbmAgb3V0IG9mIHRoZSBnbG9iYWwgc2lsbywgc29cbi8vIHJlLWFkZGluZyBpdCB0aGVyZSB3b3VsZCByZXZlcnNlIGEgc2V0dGxlZCBkZWNpc2lvbjsgYW5kIHRoaXMgYXBwbGllcyBlcXVhbGx5XG4vLyB0byBpbnB1dHMsIHNlbGVjdHMgYW5kIHRleHRhcmVhcywgd2hpY2ggYSBidXR0b24gY29tcG9uZW50IGNvdWxkIG5vdCBjb3Zlci5cbi8vXG4vLyBgW2FyaWEtZGlzYWJsZWRdYCBpcyBpbmNsdWRlZCBiZWNhdXNlIGFuIDxhPiBzdHlsZWQgYXMgYSBidXR0b24gY2Fubm90IGNhcnJ5XG4vLyB0aGUgcmVhbCBgZGlzYWJsZWRgIGF0dHJpYnV0ZS5cbmJ1dHRvbixcbmlucHV0LFxuc2VsZWN0LFxudGV4dGFyZWEge1xuXG5cdCY6ZGlzYWJsZWQsXG5cdCZbYXJpYS1kaXNhYmxlZD0ndHJ1ZSddIHtcblxuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cblx0fVxuXG59XG5cbmFbYXJpYS1kaXNhYmxlZD0ndHJ1ZSddIHtcblxuXHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXG59XG5cbmZpZWxkc2V0IHtcblxuXHRib3JkZXI6IG5vbmU7XG5cdHBhZGRpbmc6IDA7XG5cbn1cblxudGV4dGFyZWEge1xuXG5cdG1heC13aWR0aDogMTAwJTtcblx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcblxufVxuXG50ZXh0YXJlYTpub3QoW3Jvd3NdKSB7XG5cblx0bWluLWhlaWdodDogMTBlbTtcblxufVxuXG4vLyBQb3BvdmVyIHJlc2V0IOKAlCBkcm9wIHRoZSBVQS1kZWZhdWx0IHNvbGlkIGJvcmRlciArIDAuMjVlbSBwYWRkaW5nIG9ubHkuXG4vLyBTaXppbmcgKHdpZHRoL2hlaWdodCkgaXMgdGhlIHBvcG92ZXIncyBvd24gY29uY2VybjsgdGhlIG1lbnUgcG9wb3ZlcnNcbi8vIChkZXNrdG9wLW5hdiwgbW9iaWxlLW5hdikgc2V0IHRoZWlyIG93biB3aWR0aDoxMDAlOyBoZWlnaHQ6MTAwJSBleHBsaWNpdGx5LFxuLy8gYW5kIHRoZSBjYXJ0LWRyYXdlciArIGZ1dHVyZSBzaWRlLXBhbmVsIHBvcG92ZXJzIG5lZWQgdGhlaXIgb3duIGRpbWVuc2lvbnMuXG4vL1xuLy8gYDp3aGVyZSgpYCBrZWVwcyB0aGlzIGF0IHplcm8gc3BlY2lmaWNpdHkgc28gYW55IGNvbXBvbmVudCBydWxlIGJlYXRzIGl0LlxuLy8gQXMgYCpbcG9wb3Zlcl1gIGl0IHRpZWQgd2l0aCBhIHNpbmdsZSBjbGFzcywgYW5kIGJyYW5kIHNoZWV0cyByZS1lbWl0IHRoZVxuLy8gcmVzZXQgYWZ0ZXIgdGhlIGdsb2JhbCDigJQgc28gaXQgemVyb2VkIGAuZGVza3RvcC1uYXZgJ3MgcmlnaHQgcGFkZGluZyBvblxuLy8gZXZlcnkgYnJhbmQuIFplcm8gc3BlY2lmaWNpdHkgc3RpbGwgYmVhdHMgdGhlIGJyb3dzZXIncyBvd24gcG9wb3ZlclxuLy8gZGVmYXVsdHM6IGF1dGhvciBzdHlsZXMgd2luIG92ZXIgdGhlIHVzZXItYWdlbnQgc2hlZXQgYXQgYW55IHNwZWNpZmljaXR5LlxuOndoZXJlKFtwb3BvdmVyXSkge1xuXG5cdGJvcmRlcjogbm9uZTtcblx0cGFkZGluZzogMDtcblxufVxuXG46dGFyZ2V0IHtcblxuXHRzY3JvbGwtbWFyZ2luLWJsb2NrOiA1ZXg7XG5cbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlxcXG5cdE1FRElBIFFVRVJZXG5cblx0V3JhcHMgY29udGVudCBpbiB0aGUgYXBwcm9wcmlhdGUgbWVkaWEgcXVlcnkuXG5cblx0VXNhZ2U6XG5cdC5ibG9jayB7XG5cdFx0QGluY2x1ZGUgbWVkaWEtcXVlcnkoJzc2OCcpIHsgLi4uIH1cblx0fVxuXG5cdEF2YWlsYWJsZSBhbGlhc2VzOlxuXHRwb3J0cmFpdCwgbGFuZHNjYXBlXG5cdDc2OCwgNzY4LXBsdXNcblx0OTAwLCA5MDAtcGx1c1xuXHQxMDI0LCAxMDI0LXBsdXNcblx0MTQ0MCwgMTQ0MC1wbHVzXG5cdDE5MjAsIDE5MjAtcGx1c1xuXFwqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuJGJyZWFrcG9pbnQtLXBvcnRyYWl0OiAgICAnKG9yaWVudGF0aW9uOiBwb3J0cmFpdCknO1xuJGJyZWFrcG9pbnQtLWxhbmRzY2FwZTogICAnKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpJztcblxuJGJyZWFrcG9pbnQtLTc2ODogICAgICAgICAnKG1heC13aWR0aDogNzY3cHgpJztcbiRicmVha3BvaW50LS03NjgtcGx1czogICAgJyhtaW4td2lkdGg6IDc2OHB4KSc7XG5cbiRicmVha3BvaW50LS05MDA6ICAgICAgICAgJyhtYXgtd2lkdGg6IDkwMHB4KSc7XG4kYnJlYWtwb2ludC0tOTAwLXBsdXM6ICAgICcobWluLXdpZHRoOiA5MDFweCknO1xuXG4kYnJlYWtwb2ludC0tMTAyNDogICAgICAgICcobWF4LXdpZHRoOiAxMDI0cHgpJztcbiRicmVha3BvaW50LS0xMDI0LXBsdXM6ICAgJyhtaW4td2lkdGg6IDEwMjVweCknO1xuXG4kYnJlYWtwb2ludC0tMTIwMDogICAgICAgICcobWF4LXdpZHRoOiAxMTk5cHgpJztcbiRicmVha3BvaW50LS0xMjAwLXBsdXM6ICAgJyhtaW4td2lkdGg6IDEyMDBweCknO1xuXG4kYnJlYWtwb2ludC0tMTQ0MDogICAgICAgICcobWF4LXdpZHRoOiAxNDM5cHgpJztcbiRicmVha3BvaW50LS0xNDQwLXBsdXM6ICAgJyhtaW4td2lkdGg6IDE0NDBweCknO1xuXG4kYnJlYWtwb2ludC0tMTkyMDogICAgICAgICcobWF4LXdpZHRoOiAxOTE5cHgpJztcbiRicmVha3BvaW50LS0xOTIwLXBsdXM6ICAgJyhtaW4td2lkdGg6IDE5MjBweCknO1xuXG5AbWl4aW4gbWVkaWEtcXVlcnkoJGFsaWFzLCAkc2NyZWVuLW9ubHk6IHRydWUpIHtcblxuXHQkY2FsY3VsYXRlZC1icmVha3BvaW50OiAnJztcblxuXHRAaWYgKCRhbGlhcyA9PSAncG9ydHJhaXQnKSAgICB7ICRjYWxjdWxhdGVkLWJyZWFrcG9pbnQ6ICRicmVha3BvaW50LS1wb3J0cmFpdDsgfVxuXHRAaWYgKCRhbGlhcyA9PSAnbGFuZHNjYXBlJykgICB7ICRjYWxjdWxhdGVkLWJyZWFrcG9pbnQ6ICRicmVha3BvaW50LS1sYW5kc2NhcGU7IH1cblxuXHRAaWYgKCRhbGlhcyA9PSAnNzY4JykgICAgICAgICB7ICRjYWxjdWxhdGVkLWJyZWFrcG9pbnQ6ICRicmVha3BvaW50LS03Njg7IH1cblx0QGlmICgkYWxpYXMgPT0gJzc2OC1wbHVzJykgICAgeyAkY2FsY3VsYXRlZC1icmVha3BvaW50OiAkYnJlYWtwb2ludC0tNzY4LXBsdXM7IH1cblxuXHRAaWYgKCRhbGlhcyA9PSAnOTAwJykgICAgICAgICB7ICRjYWxjdWxhdGVkLWJyZWFrcG9pbnQ6ICRicmVha3BvaW50LS05MDA7IH1cblx0QGlmICgkYWxpYXMgPT0gJzkwMC1wbHVzJykgICAgeyAkY2FsY3VsYXRlZC1icmVha3BvaW50OiAkYnJlYWtwb2ludC0tOTAwLXBsdXM7IH1cblxuXHRAaWYgKCRhbGlhcyA9PSAnMTAyNCcpICAgICAgICB7ICRjYWxjdWxhdGVkLWJyZWFrcG9pbnQ6ICRicmVha3BvaW50LS0xMDI0OyB9XG5cdEBpZiAoJGFsaWFzID09ICcxMDI0LXBsdXMnKSAgIHsgJGNhbGN1bGF0ZWQtYnJlYWtwb2ludDogJGJyZWFrcG9pbnQtLTEwMjQtcGx1czsgfVxuXG5cdEBpZiAoJGFsaWFzID09ICcxMjAwJykgICAgICAgIHsgJGNhbGN1bGF0ZWQtYnJlYWtwb2ludDogJGJyZWFrcG9pbnQtLTEyMDA7IH1cblx0QGlmICgkYWxpYXMgPT0gJzEyMDAtcGx1cycpICAgeyAkY2FsY3VsYXRlZC1icmVha3BvaW50OiAkYnJlYWtwb2ludC0tMTIwMC1wbHVzOyB9XG5cblx0QGlmICgkYWxpYXMgPT0gJzE0NDAnKSAgICAgICAgeyAkY2FsY3VsYXRlZC1icmVha3BvaW50OiAkYnJlYWtwb2ludC0tMTQ0MDsgfVxuXHRAaWYgKCRhbGlhcyA9PSAnMTQ0MC1wbHVzJykgICB7ICRjYWxjdWxhdGVkLWJyZWFrcG9pbnQ6ICRicmVha3BvaW50LS0xNDQwLXBsdXM7IH1cblxuXHRAaWYgKCRhbGlhcyA9PSAnMTkyMCcpICAgICAgICB7ICRjYWxjdWxhdGVkLWJyZWFrcG9pbnQ6ICRicmVha3BvaW50LS0xOTIwOyB9XG5cdEBpZiAoJGFsaWFzID09ICcxOTIwLXBsdXMnKSAgIHsgJGNhbGN1bGF0ZWQtYnJlYWtwb2ludDogJGJyZWFrcG9pbnQtLTE5MjAtcGx1czsgfVxuXG5cdEBpZiAoJGNhbGN1bGF0ZWQtYnJlYWtwb2ludCAhPSAnJykge1xuXG5cdFx0QGlmICgkc2NyZWVuLW9ubHkgPT0gdHJ1ZSkge1xuXG5cdFx0XHRAbWVkaWEgc2NyZWVuIGFuZCAjeyRjYWxjdWxhdGVkLWJyZWFrcG9pbnR9IHtcblxuXHRcdFx0XHRAY29udGVudDtcblxuXHRcdFx0fVxuXG5cdFx0fSBAZWxzZSB7XG5cblx0XHRcdEBtZWRpYSBhbGwgYW5kICN7JGNhbGN1bGF0ZWQtYnJlYWtwb2ludH0ge1xuXG5cdFx0XHRcdEBjb250ZW50O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG59XG4iLCJAdXNlICcuLi9mdW5jdGlvbnMvbWVkaWEtcXVlcnknIGFzICo7XG5cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlxcXG5cdEdSSURcblxcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbi5ncmlkIHtcblxuXHQvLyBgZ3JpZC1jb2x1bW46IDEgLyAtMWAgbWFrZXMgYSBncmlkIHNwYW4gaXRzIHBhcmVudCdzIGZ1bGwgdHJhY2sgc2V0LCB3aGljaFxuXHQvLyBpcyByaWdodCBmb3IgdGhlIGNvbW1vbiBjYXNlIOKAlCBhIGdyaWQgZHJvcHBlZCBpbnRvIGEgYmFuZCBvY2N1cGllcyB0aGVcblx0Ly8gYmFuZC4gSXQgaXMgd3JvbmcgZm9yIGEgZ3JpZCBuZXN0ZWQgSU5TSURFIG9uZSBjZWxsIG9mIGFub3RoZXIgZ3JpZCwgYW5kXG5cdC8vIHRoZSB3YXkgaXQgaXMgd3JvbmcgaXMgdmVyeSBoYXJkIHRvIHJlYWQ6IHRoZSBpbm5lciBncmlkIHNwYW5zIGV2ZXJ5IGNvbHVtblxuXHQvLyBvZiBpdHMgcGFyZW50IGFuZCBwdXNoZXMgaXRzZWxmIG9udG8gYSBzZWNvbmQgcm93LCBhbmQgd2hhdGV2ZXIgd2FzIG1lYW50XG5cdC8vIHRvIHNpdCBiZXNpZGUgaXQgdGhlbiBzaXplcyB0byBpdHMgb3duIGNvbnRlbnQuXG5cdC8vXG5cdC8vIEl0IGxvb2tzIGV4YWN0bHkgbGlrZSBhIGhlaWdodCB0aGF0IGZhaWxlZCB0byBzdHJldGNoLCB3aGljaCBpcyB3aGF0IG1ha2VzXG5cdC8vIGl0IGV4cGVuc2l2ZS4gT24gTVBHMSB0aGUgZmlyc3QgZml4IGF0dGVtcHRlZCB3YXMgYSBzdHJldGNoIGZpeCBhbmQgd2FzXG5cdC8vIHdyb25nIGZvciB0aGF0IHJlYXNvbjsgdGhlIHRlbGwgd2FzIGBncmlkLXRlbXBsYXRlLXJvd3NgIHJlcG9ydGluZyBUV08gcm93c1xuXHQvLyBvbiBhIHBhcmVudCB0aGF0IHNob3VsZCBoYXZlIGhhZCBvbmUuIENoZWNrIHRoZSByb3cgY291bnQgYmVmb3JlIHJlYWNoaW5nXG5cdC8vIGZvciBhbGlnbi1pdGVtcy5cblx0Ly9cblx0Ly8gVXNlIGAuZ3JpZC0taW4tY2VsbGAgZm9yIHRoYXQgY2FzZS4gQWRkaXRpdmUg4oCUIGl0IGNoYW5nZXMgbm90aGluZyB0aGF0IGRvZXNcblx0Ly8gbm90IG9wdCBpbiwgd2hpY2ggaXMgd2h5IGl0IGlzIGhlcmUgcmF0aGVyIHRoYW4gYSBjaGFuZ2UgdG8gdGhlIGJhc2UgdGhhdFxuXHQvLyB3b3VsZCBtb3ZlIGZvdXIgYnJhbmRzIGF0IG9uY2UuXG5cdGRpc3BsYXk6IGdyaWQ7XG5cdGdyaWQtY29sdW1uOiAxIC8gLTE7XG5cdHJvdy1nYXA6IHZhcigtLWdyaWQtZ2FwLCAyNXB4KTtcblx0Y29sdW1uLWdhcDogdmFyKC0tZ3JpZC1nYXAsIDI1cHgpO1xuXHR3aWR0aDogMTAwJTtcblxuXHQvLyBBIGdyaWQgdGhhdCBvY2N1cGllcyBPTkUgQ0VMTCBvZiBpdHMgcGFyZW50IGdyaWQgcmF0aGVyIHRoYW4gc3Bhbm5pbmcgaXQuXG5cdCYtLWluLWNlbGwge1xuXG5cdFx0Z3JpZC1jb2x1bW46IGF1dG87XG5cblx0fVxuXG5cdCYtLTEge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxMDAlO1xuXG5cdH1cblxuXHQmLS0yIHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTtcblxuXHRcdEBpbmNsdWRlIG1lZGlhLXF1ZXJ5KCc3NjgnKSB7XG5cblx0XHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogMTAwJTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ji0tMyB7XG5cblx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLCBtaW5tYXgoMCwgMWZyKSk7XG5cblx0XHRAaW5jbHVkZSBtZWRpYS1xdWVyeSgnNzY4Jykge1xuXG5cdFx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCBtaW5tYXgoMCwgMWZyKSk7XG5cblx0XHR9XG5cblx0fVxuXG5cdCYtLTQge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoNCwgbWlubWF4KDAsIDFmcikpO1xuXG5cdFx0QGluY2x1ZGUgbWVkaWEtcXVlcnkoJzc2OCcpIHtcblxuXHRcdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxMDAlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQmLS01IHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDUsIG1pbm1heCgwLCAxZnIpKTtcblxuXHRcdEBpbmNsdWRlIG1lZGlhLXF1ZXJ5KCc3NjgnKSB7XG5cblx0XHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ji0tNiB7XG5cblx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCg2LCBtaW5tYXgoMCwgMWZyKSk7XG5cblx0XHRAaW5jbHVkZSBtZWRpYS1xdWVyeSgnMTAyNCcpIHtcblxuXHRcdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgbWlubWF4KDAsIDFmcikpO1xuXG5cdFx0fVxuXG5cdFx0QGluY2x1ZGUgbWVkaWEtcXVlcnkoJzc2OCcpIHtcblxuXHRcdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgbWlubWF4KDAsIDFmcikpO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBBc3ltbWV0cmljIHR3by1jb2x1bW4gc3BsaXQuIENvbHVtbiByYXRpbyB2aWEgdGhlIGAtLWdyaWQtY29sdW1uc2Bcblx0Ly8gY3VzdG9tIHByb3Agb24gdGhlIGdyaWQgZWxlbWVudDpcblx0Ly8gICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLS1zcGxpdFwiIHN0eWxlPVwiLS1ncmlkLWNvbHVtbnM6IDEuMTVmciAwLjg1ZnI7XCI+XG5cdC8vIERlZmF1bHQgaXMgYSBwbGFpbiAxOjEgc3BsaXQgKGVxdWl2YWxlbnQgdG8gYC5ncmlkLS0yYCksIHNvIHRoZVxuXHQvLyBtb2RpZmllciBpcyBzdGlsbCB1c2VmdWwgd2hlbiB0aGUgY29sdW1ucyBjb21lIGZyb20gSlMgb3IgYW5cblx0Ly8gdXBzdHJlYW0gY3VzdG9tIHByb3AuIENvbGxhcHNlcyB0byBzaW5nbGUtY29sdW1uIGF0IDEwMjQg4oCUIHNlZSB0aGVcblx0Ly8gc2hhcmVkIGAmLS1zcGxpdCwgJi0tMi0xYCBydWxlIGJlbG93IGZvciB0aGUgY29sbGFwc2UgYnJlYWtwb2ludC5cblx0Ji0tc3BsaXQge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiB2YXIoLS1ncmlkLWNvbHVtbnMsIDFmciAxZnIpO1xuXG5cdH1cblxuXHQvLyBBc3ltbWV0cmljIHR3by1jb2x1bW4gaW50ZWdlciByYXRpb3MuIE5hbWVkIGJ5IGZyIHVuaXRzIOKAlCB0aGUgY2xhc3Ncblx0Ly8gc3VmZml4IHJlYWRzIGFzIHRoZSBncmlkLXRlbXBsYXRlLWNvbHVtbnMgdmFsdWUgZGlyZWN0bHk6XG5cdC8vIGAuZ3JpZC0tMi0xYCBpcyBgMmZyIDFmcmAgKHdpZGVyLWxlZnQsIG5hcnJvd2VyLXJpZ2h0IOKAlCB0aGUgcHJvc2UgL1xuXHQvLyBhc2lkZSBzaGFwZSB1c2VkIG9uIGVkaXRvcmlhbCBiYW5kcykuIFJlY2lwcm9jYWwgcmF0aW9zIChgLS0xLTJgXG5cdC8vIGFzaWRlLWxlZnQsIGAtLTMtMWAsIGAtLTEtM2AsIGAtLTMtMmAsIGV0Yy4pIGZvbGxvdyB0aGUgc2FtZSBzaGFwZVxuXHQvLyBhbmQgZ2V0IGFkZGVkIGJlbG93IHdoZW4gYSB3YWxrIG5lZWRzIHRoZW0g4oCUIGRvbid0IHNlZWQgc3BlY3VsYXRpdmVseS5cblx0Ly8gRm9yIG5vbi1pbnRlZ2VyIHJhdGlvcywgdXNlIGAuZ3JpZC0tc3BsaXRgIHdpdGggYC0tZ3JpZC1jb2x1bW5zYC5cblx0Ly8gQWxsIG5hbWVkLXJhdGlvIG1vZGlmaWVycyBzaGFyZSB0aGUgc2FtZSBzaW5nbGUtY29sdW1uLWF0LTEwMjRcblx0Ly8gY29sbGFwc2UgYXMgYC5ncmlkLS1zcGxpdGAg4oCUIGdyb3VwZWQgdG9nZXRoZXIgYmVsb3cgc28gdGhlIGNvbXBpbGVkXG5cdC8vIENTUyBlbWl0cyBvbmUgYEBtZWRpYWAgYmxvY2sgaW5zdGVhZCBvZiBvbmUgcGVyIG1vZGlmaWVyLlxuXHQmLS0yLTEge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAyZnIgMWZyO1xuXG5cdH1cblxuXHQvLyBUaGUgcmVjaXByb2NhbCDigJQgbmFycm93ZXItbGVmdCwgd2lkZXItcmlnaHQuIEFkZGVkIGJ5IHRoZSBQYXJhZ29uR2FtaW5nXG5cdC8vIE1QRzEgaG9tZXBhZ2Ugd2FsayAoMjAyNi0wOS0xNiksIHdoaWNoIG5lZWRlZCBpdCBmb3IgYSBCZXN0IFNlbGxlcnMgYmFuZFxuXHQvLyBwYWlyaW5nIG9uZSB0YWxsIHByb21vdGlvbmFsIHRpbGUgd2l0aCBhIDJ4MiBwcm9kdWN0IGdyaWQuXG5cdCYtLTEtMiB7XG5cblx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAyZnI7XG5cblx0fVxuXG5cdCYtLXNwbGl0LFxuXHQmLS0yLTEsXG5cdCYtLTEtMiB7XG5cblx0XHRAaW5jbHVkZSBtZWRpYS1xdWVyeSgnMTAyNCcpIHtcblxuXHRcdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxMDAlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBDZW50ZXIgZ3JpZCBjaGlsZHJlbiB2ZXJ0aWNhbGx5IGluc2lkZSB0aGVpciBjZWxscy4gVXNlZCB3aGVuIGFcblx0Ly8gbGVmdC1oYW5kIHByb3NlIGNvbHVtbiBwYWlycyB3aXRoIGEgcmlnaHQtaGFuZCBmb3JtIC8gY29udHJvbCBwYW5lbFxuXHQvLyBvZiBkaWZmZXJlbnQgaGVpZ2h0cyBhbmQgYm90aCBzaG91bGQgc2l0IGNlbnRyZWQuXG5cdCYtLWNlbnRlciB7XG5cblx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xuXG5cdH1cblxuXHQvLyBUb3AtYWxpZ24gZ3JpZCBjaGlsZHJlbiBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHN0cmV0Y2guIFVzZWQgd2hlbiBhXG5cdC8vIHRhbGwgbGVmdC1oYW5kIGZvcm0gY29sdW1uIHBhaXJzIHdpdGggYSBzaG9ydGVyIHJpZ2h0LWhhbmQgc3RpY2t5XG5cdC8vIHN1bW1hcnkgYXNpZGUg4oCUIHRoZSBzdW1tYXJ5IHNpdHMgYXQgaXRzIG5hdHVyYWwgaGVpZ2h0IGF0IHRoZSB0b3Bcblx0Ly8gb2YgaXRzIGNlbGwgaW5zdGVhZCBvZiBzdHJldGNoaW5nIHRvIG1hdGNoIHRoZSBmb3JtIGNvbHVtbi5cblx0Ji0tYWxpZ24tc3RhcnQge1xuXG5cdFx0YWxpZ24taXRlbXM6IHN0YXJ0O1xuXG5cdH1cblxufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXFxcblx0QlJFQVRIRSDigJQgdmVydGljYWwtcmh5dGhtIHV0aWxpdHlcblxcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbi8vIC5icmVhdGhlIGlzIGEgY2xhc3MtbWl4IHV0aWxpdHkgdGhhdCBhZGRzIHRvcC9ib3R0b20gbWFyZ2luIHRvIGFueVxuLy8gZWxlbWVudCwgaW5kZXBlbmRlbnQgb2YgdGhlIGJsb2NrJ3Mgb3duIG1hcmdpbiBydWxlcy4gTGF5ZXJlZCBvbnRvXG4vLyBhbnl0aGluZyB0aGF0IG5lZWRzIGl0cyBvd24gdmVydGljYWwgcmh5dGhtIHdpdGhvdXQgaW50cm9kdWNpbmcgYVxuLy8gZGVkaWNhdGVkIG1vZGlmaWVyIG9uIHRoZSBob3N0IGJsb2NrLlxuLy9cbi8vIFVzYWdlOlxuLy8gICA8ZGl2IGNsYXNzPVwiaGVybyBicmVhdGhlIGJyZWF0aGUtLWJvdHRvbS1sYXJnZVwiPuKApjwvZGl2PlxuLy8gICA8cCBjbGFzcz1cImVkaXRvcmlhbC1wcm9zZSBicmVhdGhlLS10b3AtdGlueSBicmVhdGhlLS1ib3R0b21cIj7igKY8L3A+XG4vL1xuLy8gUnVsZXM6XG4vLyAgIC0gTm8gbW9kaWZpZXIg4oeSIDI0cHggdG9wICsgMjRweCBib3R0b20gKGAuYnJlYXRoZWAgYWxvbmUpLlxuLy8gICAtIFdpdGggYW55IC0tdG9wLSogb3IgLS1ib3R0b20tKiBtb2RpZmllciwgdGhlIGJhc2UgcnVsZSBpcyBzdXBwcmVzc2VkXG4vLyAgICAgc28gdGhlIG1vZGlmaWVyJ3MgdmFsdWUgaXMgYXV0aG9yaXRhdGl2ZS4gQ29tYmluZSB0b3AgKyBib3R0b21cbi8vICAgICBtb2RpZmllcnMgYXMgbmVlZGVkLlxuLy8gICAtIE1vZGlmaWVycyB1c2UgIWltcG9ydGFudCB0byBkZWZlYXQgaG9zdC1ibG9jayBtYXJnaW4gcnVsZXM7IHRoZVxuLy8gICAgIHdob2xlIHBvaW50IG9mIHRoaXMgdXRpbGl0eSBpcyB0byBvdmVycmlkZSB0aGUgYmxvY2ssIG5vdCBsb3NlIHRvIGl0LlxuLy8gICAtIEZvciBjdXN0b20gLyBvbmUtb2ZmIHNwYWNpbmcsIHNldCAtLWJyZWF0aGUtdG9wIG9yIC0tYnJlYXRoZS1ib3R0b21cbi8vICAgICBhcyBhIENTUyBjdXN0b20gcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgKHNlZSB0aGUgZXNjYXBlIGhhdGNoIGJlbG93KS5cbi8vXG4vLyBNb2RpZmllciBzY2FsZSAobWF0Y2hlcyB0aGUgZnJhbWV3b3JrJ3MgdXN1YWwgcmh5dGhtKTpcbi8vICAgdGlueSAgID0gNHB4XG4vLyAgIG1pbmkgICA9IDhweFxuLy8gICBzbWFsbCAgPSAxMnB4XG4vLyAgIChiYXNlKSA9IDI0cHhcbi8vICAgbGFyZ2UgID0gNDBweFxuLy8gICBodWdlICAgPSA2NHB4XG4vLyAgIGF1dG8gICA9IGF1dG8gKGZvciBwdXNoaW5nIGFuIGVsZW1lbnQgdG8gYm90dG9tIG9mIGEgZmxleCBjb250YWluZXIpXG5cbi5icmVhdGhlIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblxuXHQvLyBEZWZhdWx0IHRvcCtib3R0b20gcmh5dGhtIOKAlCBraWNrcyBpbiBvbmx5IHdoZW4gbm8gLS10b3AtKiBvclxuXHQvLyAtLWJvdHRvbS0qIG1vZGlmaWVyIGlzIHByZXNlbnQuXG5cdCY6bm90KFtjbGFzcyo9J2JyZWF0aGUtLSddKSB7XG5cblx0XHRtYXJnaW4tdG9wOiAyNHB4O1xuXHRcdG1hcmdpbi1ib3R0b206IDI0cHg7XG5cblx0fVxuXG5cdC8vIEVzY2FwZS1oYXRjaCBDU1MgY3VzdG9tIHByb3BlcnRpZXMg4oCUIHNldCAtLWJyZWF0aGUtdG9wIG9yXG5cdC8vIC0tYnJlYXRoZS1ib3R0b20gb24gdGhlIGVsZW1lbnQgZm9yIG9uZS1vZmYgc3BhY2luZyB3aXRob3V0IGFkZGluZ1xuXHQvLyBhIG5ldyBtb2RpZmllciBjbGFzcy4gT3ZlcnJpZGRlbiBieSBleHBsaWNpdCAtLXRvcC0qIC8gLS1ib3R0b20tKlxuXHQvLyBtb2RpZmllcnMgYmVsb3cuXG5cdCZbc3R5bGUqPVwiLS1icmVhdGhlLXRvcFwiXSB7XG5cblx0XHRtYXJnaW4tdG9wOiB2YXIoLS1icmVhdGhlLXRvcCk7XG5cblx0fVxuXG5cdCZbc3R5bGUqPVwiLS1icmVhdGhlLWJvdHRvbVwiXSB7XG5cblx0XHRtYXJnaW4tYm90dG9tOiB2YXIoLS1icmVhdGhlLWJvdHRvbSk7XG5cblx0fVxuXG5cdCYtLXRvcCAgICAgICB7IG1hcmdpbi10b3A6IDI0cHggIWltcG9ydGFudDsgfVxuXHQmLS10b3AtdGlueSAgeyBtYXJnaW4tdG9wOiA0cHggICFpbXBvcnRhbnQ7IH1cblx0Ji0tdG9wLW1pbmkgIHsgbWFyZ2luLXRvcDogOHB4ICAhaW1wb3J0YW50OyB9XG5cdCYtLXRvcC1zbWFsbCB7IG1hcmdpbi10b3A6IDEycHggIWltcG9ydGFudDsgfVxuXHQmLS10b3AtbGFyZ2UgeyBtYXJnaW4tdG9wOiA0MHB4ICFpbXBvcnRhbnQ7IH1cblx0Ji0tdG9wLWh1Z2UgIHsgbWFyZ2luLXRvcDogNjRweCAhaW1wb3J0YW50OyB9XG5cdCYtLXRvcC1hdXRvICB7IG1hcmdpbi10b3A6IGF1dG8gIWltcG9ydGFudDsgfVxuXG5cdCYtLWJvdHRvbSAgICAgICB7IG1hcmdpbi1ib3R0b206IDI0cHggIWltcG9ydGFudDsgfVxuXHQmLS1ib3R0b20tdGlueSAgeyBtYXJnaW4tYm90dG9tOiA0cHggICFpbXBvcnRhbnQ7IH1cblx0Ji0tYm90dG9tLW1pbmkgIHsgbWFyZ2luLWJvdHRvbTogOHB4ICAhaW1wb3J0YW50OyB9XG5cdCYtLWJvdHRvbS1zbWFsbCB7IG1hcmdpbi1ib3R0b206IDEycHggIWltcG9ydGFudDsgfVxuXHQmLS1ib3R0b20tbGFyZ2UgeyBtYXJnaW4tYm90dG9tOiA0MHB4ICFpbXBvcnRhbnQ7IH1cblx0Ji0tYm90dG9tLWh1Z2UgIHsgbWFyZ2luLWJvdHRvbTogNjRweCAhaW1wb3J0YW50OyB9XG5cdCYtLWJvdHRvbS1hdXRvICB7IG1hcmdpbi1ib3R0b206IGF1dG8gIWltcG9ydGFudDsgfVxuXG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcXFxuXHRJTUFHRVNcblxcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbkB1c2UgJy4uL2Z1bmN0aW9ucy90cmFuc2l0aW9ucycgYXMgKjtcblxuLmhvdmVyLXpvb20ge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xuXG5cdGltZyB7XG5cblx0XHRAaW5jbHVkZSB0cmFuc2l0aW9uLWFsbDtcblxuXHRcdHdpZHRoOiAxMDAlO1xuXHRcdGhlaWdodDogYXV0bztcblxuXHR9XG5cblx0Jjpob3ZlciB7XG5cblx0XHRpbWcge1xuXG5cdFx0XHR0cmFuc2Zvcm06IHNjYWxlKDEuMDgpO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG4uaW1nIHtcblxuXHQmLS1jb3ZlciB7XG5cblx0XHRvYmplY3QtZml0OiBjb3Zlcjtcblx0XHR3aWR0aDogMTAwJTtcblx0XHRoZWlnaHQ6IDEwMCU7XG5cblx0fVxuXG5cdCYtLWNvbnRhaW4ge1xuXG5cdFx0b2JqZWN0LWZpdDogY29udGFpbjtcblx0XHR3aWR0aDogMTAwJTtcblx0XHRoZWlnaHQ6IDEwMCU7XG5cblx0fVxuXG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcXFxuXHRUUkFOU0lUSU9OU1xuXFwqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuQG1peGluIHRyYW5zaXRpb24tYWxsIHtcblxuXHR0cmFuc2l0aW9uOiBhbGwgMzAwbXMgZWFzZTtcblxufVxuXG5AbWl4aW4gdHJhbnNpdGlvbi1hbGwtLXNsb3cge1xuXG5cdHRyYW5zaXRpb246IGFsbCA0MDBtcyBlYXNlO1xuXG59XG5cbkBtaXhpbiB0cmFuc2l0aW9uLWFsbC0tcXVpY2sge1xuXG5cdHRyYW5zaXRpb246IGFsbCAxODBtcyBlYXNlO1xuXG59XG5cbkBtaXhpbiB0cmFuc2l0aW9uLWFsbC0tcmFwaWQge1xuXG5cdHRyYW5zaXRpb246IG9wYWNpdHkgMTAwbXMsIHZpc2liaWxpdHkgMG1zO1xuXG59XG5cbkBtaXhpbiB0cmFuc2l0aW9uLWFsbC0taW4tc2xvdyB7XG5cblx0dHJhbnNpdGlvbjogYWxsIDQwMG1zIGVhc2UtaW47XG5cbn1cbiIsIkB1c2UgJy4uL2Z1bmN0aW9ucy9tZWRpYS1xdWVyeScgYXMgKjtcblxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXFxcblx0VklTSUJJTElUWVxuXFwqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuLmlzLWhpZGRlbiB7XG5cblx0ZGlzcGxheTogbm9uZTtcblxuXHQmLS1tb2JpbGUge1xuXG5cdFx0QGluY2x1ZGUgbWVkaWEtcXVlcnkoJzc2OCcpIHtcblxuXHRcdFx0ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuXG5cdFx0fVxuXG5cdH1cblxuXHQmLS10YWJsZXQge1xuXG5cdFx0QGluY2x1ZGUgbWVkaWEtcXVlcnkoJzEwMjQnKSB7XG5cblx0XHRcdGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcblxuXHRcdH1cblxuXHR9XG5cblx0Ji0tZGVza3RvcCB7XG5cblx0XHRAaW5jbHVkZSBtZWRpYS1xdWVyeSgnMTAyNC1wbHVzJykge1xuXG5cdFx0XHRkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG5cblx0XHR9XG5cblx0fVxuXG5cdCYtLXBvcnRyYWl0IHtcblxuXHRcdEBtZWRpYSAob3JpZW50YXRpb246IHBvcnRyYWl0KSB7XG5cblx0XHRcdGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcblxuXHRcdH1cblxuXHR9XG5cblx0Ji0tbGFuZHNjYXBlIHtcblxuXHRcdEBtZWRpYSAob3JpZW50YXRpb246IGxhbmRzY2FwZSkge1xuXG5cdFx0XHRkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG5cblx0XHR9XG5cblx0fVxuXG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcXFxuXHRIT1ZFUlxuXG5cdEdlbmVyYXRlcyBob3ZlciwgZm9jdXMsIGFuZCBhY3RpdmUgc3RhdGVzLlxuXHRQYXNzICRpbmNsdWRlLWFjdGl2ZTogdHJ1ZSB0byBhbHNvIGluY2x1ZGVcblx0OmFjdGl2ZSBhbmQgLmlzLWFjdGl2ZSBzdGF0ZXMuXG5cXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5AbWl4aW4gaG92ZXIoJGluY2x1ZGUtYWN0aXZlOiBmYWxzZSkge1xuXG5cdEBpZiAoJGluY2x1ZGUtYWN0aXZlKSB7XG5cblx0XHQmOnRhcmdldCxcblx0XHQmOmFjdGl2ZSxcblx0XHQmOmhvdmVyLFxuXHRcdCY6Zm9jdXMsXG5cdFx0Ji5pcy1hY3RpdmUge1xuXG5cdFx0XHRAY29udGVudDtcblxuXHRcdH1cblxuXHR9IEBlbHNlIHtcblxuXHRcdCY6dGFyZ2V0LFxuXHRcdCY6Zm9jdXMsXG5cdFx0Jjpob3ZlciB7XG5cblx0XHRcdEBjb250ZW50O1xuXG5cdFx0fVxuXG5cdH1cblxufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXFxcblx0QkFDS0dST1VORFxuXG5cdFNob3J0aGFuZCBmb3IgcmdiYSBiYWNrZ3JvdW5kIHdpdGggb3BhY2l0eS5cblxuXHRVc2FnZTogQGluY2x1ZGUgYmFja2dyb3VuZCgkZGFyay1jaGFyY29hbCwgMC44KTtcblxcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbkBtaXhpbiBiYWNrZ3JvdW5kKCRjb2xvciwgJG9wYWNpdHk6IDAuNSkge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHJnYmEoJGNvbG9yLCAkb3BhY2l0eSk7XG5cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBkb2N1bWVudCBkZWZhdWx0cyBhbmQgdGhlIGludGVyYWN0aW9uIGxheWVyLlxuLy9cbi8vIFR3byB0aGluZ3MgYmVsb25nIGhlcmUgYW5kIG5vdGhpbmcgZWxzZTogd2hhdCB0aGUgZG9jdW1lbnQgaW5oZXJpdHMgYmVmb3JlIGFueVxuLy8gY29tcG9uZW50IHNwZWFrcywgYW5kIGhvdyB0aGUgYnJhbmQgcmVzcG9uZHMgdG8gYSBwb2ludGVyLiBCb3RoIGFyZSBzdGF0ZWRcbi8vIG9uY2UsIGZvciB0aGUgc2FtZSByZWFzb24g4oCUIGEgY29tcG9uZW50IHRoYXQgZGVjaWRlcyB0aGVzZSBmb3IgaXRzZWxmIGlzIGFcbi8vIGNvbXBvbmVudCB0aGF0IGRpc2FncmVlcyB3aXRoIHRoZSBuZXh0IG9uZS5cblxuQHVzZSAnc2V0dGluZ3MnIGFzICo7XG5cbmJvZHkge1xuXG5cdC8vIFRoZSBicmFuZCdzIGJhc2VsaW5lIGZvcmVncm91bmQsIHNldCBvbiBgYm9keWAgc28gaXQgYXJyaXZlcyBieVxuXHQvLyBJTkhFUklUQU5DRS4gQSBydWxlIG9uIHRoZSBibG9jayBjbGFzc2VzIHdvdWxkIGJlYXQgaW5oZXJpdGFuY2UgYW5kXG5cdC8vIHRoZXJlZm9yZSBiZWF0IHRoZSBncm91bmQgYSBibG9jayBzaXRzIG9uOyBpbmhlcml0ZWQsIGEgc2VjdGlvbidzIG93blxuXHQvLyBjb2xvdXIgc3RpbGwgd2lucy4gVGhlIGdyb3VuZCBkZWNpZGVzIHRoZSBjb2xvdXIsIGFuZCB0aGlzIGlzIG9ubHkgd2hhdFxuXHQvLyBzb21ldGhpbmcgZmFsbHMgYmFjayB0byB3aGVuIHRoZXJlIGlzIG5vIGdyb3VuZC5cblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFnZSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1ib2R5KTtcblxuXHQvLyBBIGRpc2Nsb3N1cmUgcGFuZWwgY2FuIG9ubHkgYW5pbWF0ZSB0byBpdHMgb3duIGhlaWdodCBpZiB0aGlzIGlzIHNldCBvblxuXHQvLyBhbiBhbmNlc3RvciDigJQgYGhlaWdodDogYXV0b2Agd2FzIG5vdCBhbiBpbnRlcnBvbGFibGUgdmFsdWUgYmVmb3JlIGl0LlxuXHRpbnRlcnBvbGF0ZS1zaXplOiBhbGxvdy1rZXl3b3JkcztcblxufVxuXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcXFxuXHRJTlRFUkFDVElPTlxuXG5cdEFwcHJvdmVkIG9uIHRoZSBwcm9kdWN0IHBhZ2UgbW9ja3VwIChNUEc5KSBiZWZvcmUgYmVpbmcgd3JpdHRlbiBoZXJlLlxuXG5cdEV2ZXJ5IGhvdmVyIHN0YXRlIG9uIHRoaXMgYnJhbmQgY2hhbmdlcyBhIENPTE9VUiDigJQgdGV4dCwgYmFja2dyb3VuZCBvclxuXHRib3JkZXIg4oCUIGFuZCBub3RoaW5nIG1vdmVzLiBObyBsaWZ0LCBubyBzY2FsZS4gVGhhdCBmb2xsb3dzIHRoZSBzaGFwZSBsYXc6XG5cdGEgY29udHJvbCBpcyBhIGZsYXQgc3F1YXJlIHRoaW5nLCBhbmQgYSBjb250cm9sIHRoYXQgcmlzZXMgb2ZmIHRoZSBwYWdlIGlzXG5cdHByZXRlbmRpbmcgdG8gYmUgYSBzdXJmYWNlLlxuXG5cdFNvIHRoZSBsYXllciBpcyBhIGZhZGUgYXQgLS1tb3Rpb24tcXVpY2ssIGFuZCB0aGUgb25lIHRyYW5zZm9ybSB0aGUgYnJhbmRcblx0d2lsbCB1c2UgKGEgZGlzY2xvc3VyZSBtYXJrZXIgdHVybmluZywgb25jZSBhdXRob3JlZCkgd2lsbCBydW4gYXQgdGhlXG5cdHNhbWUgcmF0ZSwgc28gdGhlIHdob2xlIHBhZ2Ugc2hhcmVzIG9uZSB0ZW1wby5cblxcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmEsXG4uYnV0dG9uLFxuYnV0dG9uLFxuc3VtbWFyeSxcbmlucHV0LFxuc2VsZWN0IHtcblxuXHR0cmFuc2l0aW9uOlxuXHRcdGNvbG9yIHZhcigtLW1vdGlvbi1xdWljaykgdmFyKC0tbW90aW9uLWVhc2UpLFxuXHRcdGJhY2tncm91bmQtY29sb3IgdmFyKC0tbW90aW9uLXF1aWNrKSB2YXIoLS1tb3Rpb24tZWFzZSksXG5cdFx0Ym9yZGVyLWNvbG9yIHZhcigtLW1vdGlvbi1xdWljaykgdmFyKC0tbW90aW9uLWVhc2UpO1xuXG59XG5cbi8vIERpc2Nsb3N1cmUgcGFuZWxzLiBgPGRldGFpbHM+YCBoYWQgbm8gYW5pbWF0YWJsZSBzdGF0ZSB1bnRpbFxuLy8gYDo6ZGV0YWlscy1jb250ZW50YCBhbmQgYGludGVycG9sYXRlLXNpemVgIHNoaXBwZWQ7IGBhbGxvdy1kaXNjcmV0ZWAgY2Fycmllc1xuLy8gYGNvbnRlbnQtdmlzaWJpbGl0eWAgYWNyb3NzIHRoZSBzYW1lIHdpbmRvdyBzbyB0aGUgY29udGVudCBpcyBub3QgY2xpcHBlZCBhd2F5XG4vLyBiZWZvcmUgdGhlIHBhbmVsIGhhcyBmaW5pc2hlZCBjbG9zaW5nLiBCcm93c2VycyB3aXRob3V0IHRoZSBwYWlyIG9wZW5cbi8vIGluc3RhbnRseSwgd2hpY2ggaXMgdGhlIGNvcnJlY3QgZmFsbGJhY2sgcmF0aGVyIHRoYW4gYSBicm9rZW4gb25lLlxuZGV0YWlsczo6ZGV0YWlscy1jb250ZW50IHtcblxuXHRibG9jay1zaXplOiAwO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHR0cmFuc2l0aW9uOlxuXHRcdGJsb2NrLXNpemUgdmFyKC0tbW90aW9uLXF1aWNrKSB2YXIoLS1tb3Rpb24tZWFzZSksXG5cdFx0Y29udGVudC12aXNpYmlsaXR5IHZhcigtLW1vdGlvbi1xdWljaykgdmFyKC0tbW90aW9uLWVhc2UpIGFsbG93LWRpc2NyZXRlO1xuXG59XG5cbmRldGFpbHNbb3Blbl06OmRldGFpbHMtY29udGVudCB7XG5cblx0YmxvY2stc2l6ZTogYXV0bztcblxufVxuXG4vLyBBIGtleWJvYXJkIGhhcyB0byBiZSBhYmxlIHRvIHNlZSB3aGVyZSBpdCBpcy4gQ29tcG9uZW50cyB0aGF0IGRlZmluZSB0aGVpciBvd25cbi8vIGZvY3VzIHJpbmcga2VlcCBpdCDigJQgYSBjbGFzcyBiZWF0cyBhbiBlbGVtZW50IOKAlCBhbmQgdGhpcyBjb3ZlcnMgZXZlcnl0aGluZ1xuLy8gZWxzZS5cbmE6Zm9jdXMtdmlzaWJsZSxcbmJ1dHRvbjpmb2N1cy12aXNpYmxlLFxuc3VtbWFyeTpmb2N1cy12aXNpYmxlLFxuaW5wdXQ6Zm9jdXMtdmlzaWJsZSxcbnNlbGVjdDpmb2N1cy12aXNpYmxlIHtcblxuXHRvdXRsaW5lOiAycHggc29saWQgdmFyKC0tYm9yZGVyLWZvY3VzKTtcblx0b3V0bGluZS1vZmZzZXQ6IDJweDtcblxufVxuXG5AbWVkaWEgKCBwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UgKSB7XG5cblx0OnJvb3Qge1xuXG5cdFx0LS1tb3Rpb24tcXVpY2s6IDBtcztcblx0XHQtLW1vdGlvbi1zdGFuZGFyZDogMG1zO1xuXG5cdH1cblxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGNocm9tZVxuLy9cbi8vIEJyYW5kIGRyZXNzaW5nIGZvciB0aGUgTkVUV09SSyBoZWFkZXIgYW5kIGZvb3Rlci4gVGhlIG1hcmt1cCBiZWxvbmdzIHRvXG4vLyBjYW1jb20tdjIgYW5kIGlzIG5vdCBvdXJzIHRvIGNoYW5nZTsgdGhpcyBwYWludHMgaXQgaW4gUGFyYWdvbidzIGNvbG91cnMuXG4vL1xuLy8gUG9ydGVkIHZlcmJhdGltIGZyb20gYGJ1aWxkLXByb21wdHMvcGFyYWdvbmdhbWluZy9jaHJvbWUvY2hyb21lLmNzc2AsIHdoaWNoXG4vLyB3YXMgd3JpdHRlbiBzbyBldmVyeSBtb2NrdXAgY2FycmllZCB0aGUgcmVhbCBjaHJvbWUgcmF0aGVyIHRoYW4gb25lIHRoZSBkZXNpZ25cbi8vIHBhc3MgaW52ZW50ZWQg4oCUIHRoZSBvcGVyYXRvcidzIGNhbGwsIDIwMjYtMDktMTIuIFRoZSBtb2NrdXBzIGFuZCB0aGUgdGhlbWUgbm93XG4vLyByZWFkIGZyb20gdGhlIHNhbWUgcnVsZXM7IGtlZXAgdGhlbSBpbiBzdGVwIG9yIHJldGlyZSB0aGUgYnVpbGQtcHJvbXB0cyBjb3B5XG4vLyBvbmNlIHRoZSBzdG9yZWZyb250IGlzIHN0YW5kaW5nLlxuLy9cbi8vIEljb25zIHRha2UgYGZpbGxgLCBuZXZlciBgY29sb3JgIOKAlCBhbiBpbmxpbmUgU1ZHIGNvbG91cmVkIHdpdGggYGNvbG9yYFxuLy8gaW5oZXJpdHMgYmxhY2sgYW5kIHJlYWRzIGFzIGEgbWlzc2luZyBpY29uIG9uIGEgZGFyayBncm91bmQuXG5cbi8qIOKUgOKUgCBOb3RpY2UgYmFyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqL1xuXG4uc2l0ZS1oZWFkX19hbGVydHMge1xuXG5cdGJhY2tncm91bmQ6IHZhcigtLWJnLW5vdGljZSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW9uLWJyYW5kKTtcblxufVxuXG4uc2l0ZS1oZWFkX19hbGVydHMgcCB7XG5cblx0bWF4LXdpZHRoOiB2YXIoLS1zaXRlLW1heC13aWR0aCk7XG5cdG1hcmdpbjogMCBhdXRvO1xuXHRwYWRkaW5nOiAxMHB4IHZhcigtLWd1dHRlci1zbWFsbCk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW9uLWJyYW5kKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0dGV4dC1hbGlnbjogY2VudGVyO1xuXG59XG5cbi8qIOKUgOKUgCBIZWFkZXIgYmFyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqL1xuXG4uc2l0ZS1oZWFkX19tYWluIHtcblxuXHRiYWNrZ3JvdW5kOiB2YXIoLS1iZy1jaHJvbWUpO1xuXG59XG5cbi5zaXRlLWhlYWRfX21haW5fX2lubmVyIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogc3RyZXRjaDtcblx0bWF4LXdpZHRoOiB2YXIoLS1zaXRlLW1heC13aWR0aCk7XG5cdG1hcmdpbjogMCBhdXRvO1xuXHRwYWRkaW5nLWxlZnQ6IHZhcigtLWd1dHRlci1zbWFsbCk7XG5cbn1cblxuLnNpdGUtbmF2IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4OiAxO1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDMycHg7XG5cbn1cblxuLnNpdGUtbmF2X19idXJnZXIge1xuXG5cdGRpc3BsYXk6IG5vbmU7XG5cbn1cblxuLnNpdGUtbmF2X19sb2dvIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRwYWRkaW5nOiAxNHB4IDA7XG5cbn1cblxuLnBnLWxvZ28ge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHR3aWR0aDogYXV0bztcblx0aGVpZ2h0OiAzOHB4O1xuXG59XG5cbi5zaXRlLW5hdl9fbWVudSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0Z2FwOiAzNHB4O1xuXHRtYXJnaW4taW5saW5lOiBhdXRvO1xuXG59XG5cbi5zaXRlLW5hdl9fbWVudV9faXRlbSB7XG5cblx0cGFkZGluZzogMDtcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiBub25lO1xuXHRjb2xvcjogdmFyKC0tbmV1dHJhbC00MDApO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1saWdodCk7XG5cdHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG5cdGN1cnNvcjogcG9pbnRlcjtcblxufVxuXG4vKlxuICogVGhlIGNoZXZyb24gaXMgZHJhd24sIG5vdCBhbiBpY29uIOKAlCB0aGUgbmV0d29yayBtYXJrdXAgY2FycmllcyBubyBlbGVtZW50IGZvciBpdC5cbiAqXG4gKiBTY29wZWQgdG8gYGJ1dHRvbmAgc28gaXQgb25seSBhcHBlYXJzIG9uIGl0ZW1zIHRoYXQgYWN0dWFsbHkgb3BlbiBzb21ldGhpbmcuXG4gKiBoZWFkZXIucGhwIHJlbmRlcnMgYSA8YnV0dG9uIHBvcG92ZXJ0YXJnZXQ+IHdoZW4gYSBtZW51IGl0ZW0gSEFTIGNoaWxkcmVuIGFuZFxuICogYSBwbGFpbiA8YSBocmVmPiB3aGVuIGl0IGRvZXMgbm90LCBzbyB0aGUgdGFnIGlzIGFscmVhZHkgdGhlIHRydXRoIGFib3V0XG4gKiB3aGV0aGVyIHRoZXJlIGlzIGEgcGFuZWwgYmVoaW5kIGl0LiBVbnNjb3BlZCwgZXZlcnkgaXRlbSB3b3JlIGEgZHJvcGRvd24gYXJyb3dcbiAqIGFuZCBldmVyeSBjbGljayBqdXN0IG5hdmlnYXRlZCDigJQgdGhlIGFycm93IHByb21pc2VkIGEgbWVudSB0aGF0IGRpZCBub3QgZXhpc3QuXG4gKiBBbGwgdGhyZWUgb2YgdGhpcyBzaXRlJ3MgbmF2IGl0ZW1zIGhhdmUgemVybyBjaGlsZHJlbiB0b2RheS5cbiAqXG4gKiBDb3JyZWN0IHVuZGVyIGJvdGggcmVhZGluZ3Mgb2YgdGhhdCwgd2hpY2ggaXMgd2h5IGl0IGlzIHRoZSB0YWcgYW5kIG5vdCBhXG4gKiBoYW5kLW1haW50YWluZWQgbGlzdDogaWYgdGhlIGRlc2lnbiBpbnRlbmRzIHRob3NlIGl0ZW1zIHRvIGJlIGRyb3Bkb3ducywgdGhleVxuICogZ2FpbiBjaGlsZHJlbiwgaGVhZGVyLnBocCBlbWl0cyBidXR0b25zLCBhbmQgdGhlIGNoZXZyb25zIGNvbWUgYmFjayBvbiB0aGVpclxuICogb3duLiBOb3RoaW5nIGhlcmUgbmVlZHMgcmV2aXNpdGluZyBlaXRoZXIgd2F5LlxuICovXG5idXR0b24uc2l0ZS1uYXZfX21lbnVfX2l0ZW06OmFmdGVyIHtcblxuXHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdHdpZHRoOiA3cHg7XG5cdGhlaWdodDogN3B4O1xuXHRtYXJnaW4tbGVmdDogOXB4O1xuXHRib3JkZXItcmlnaHQ6IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG5cdGJvcmRlci1ib3R0b206IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG5cdHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KSByb3RhdGUoNDVkZWcpO1xuXHRjb250ZW50OiAnJztcblxufVxuXG4uc2l0ZS1uYXZfX21lbnVfX2l0ZW06aG92ZXIge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LW9uLWJyYW5kKTtcblxufVxuXG4vKiDilIDilIAgSGVhZGVyIGFjdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovXG5cbi8qIFRoZSBnZW9tZXRyeSBvZiB0aGVzZSBjb250cm9scyBpcyB0aGUgUEFSRU5UJ3Mg4oCUIGJveCBzaXplLCBpY29uIHNpemUsIHNwYWNpbmdcbiAqIGFuZCB0aGUgYmFza2V0IGNvdW50J3MgcGxhY2VtZW50IGFsbCBjb21lIGZyb21cbiAqIGZyYW1ld29yay12Mi9nbG9iYWwvc2Nzcy9sYXlvdXRzL19zaXRlLWhlYWQuc2Nzcy4gVGhpcyBsYXllciBzZXRzIGNvbG91ci5cbiAqXG4gKiBXaGF0IHVzZWQgdG8gYmUgaGVyZSwgYW5kIHdoeSBub25lIG9mIGl0IHN1cnZpdmVzOiBhIDY2cHggYm94ICh0aGUgcGFyZW50J3NcbiAqIC0tYWN0aW9uLWJveCBpcyA0NHB4LCB0aGUgV0NBRyBBQUEgdGFyZ2V0LCBhbmQgZXZlcnkgYnJhbmQgbm93IGdldHMgaXQpLCBhblxuICogYGFsaWduLWl0ZW1zOiBzdHJldGNoYCB0aGF0IG1hZGUgdGhlIGJveGVzIGZ1bGwgaGVhZGVyIGhlaWdodCwgYW5kIGFcbiAqIGBib3JkZXI6IDA7IGJhY2tncm91bmQ6IG5vbmU7IGN1cnNvcjogcG9pbnRlcmAgcmVzZXQgdGhhdCB0aGUgZ2xvYmFsIGBidXR0b25gXG4gKiByZXNldCBpbiBjb3JlL19yZXNldC5zY3NzIGhhcyBhbHdheXMgcGVyZm9ybWVkLiBUaGUgc2VhcmNoIHBhbmVsIGlzIDQ0cHggdGFsbFxuICogcmF0aGVyIHRoYW4gdGhlIGZ1bGwgNzVweCBiYXIgYXMgYSByZXN1bHQg4oCUIHRoZSBiYWNrZ3JvdW5kIGlzIHN0aWxsIHRoaXNcbiAqIGJyYW5kJ3MsIGl0cyBleHRlbnQgaXMgbm90LlxuICovXG4uc2l0ZS1oZWFkX19hY3Rpb25zX19zZWFyY2gge1xuXG5cdGJhY2tncm91bmQ6IHZhcigtLWJnLWNocm9tZS1kZWVwKTtcblxufVxuXG4vKiBTaGFyZWQgd2l0aCAuZm9vdGVyX19jdGEgLmljb24gYmVsb3cg4oCUIHNhbWUgc2l6ZS9jb2xvdXIgZm9yIGJvdGggaW5saW5lIFNWRyBzeW1ib2xzLlxuICpcbiAqIOKaoCBgLnNpdGUtaGVhZF9fbWFpbmAsIE5PVCBgLnNpdGUtaGVhZGAuIFRoZSBzZWFyY2ggbW9kYWwgbW92ZWQgaW5zaWRlIHRoZVxuICogaGVhZGVyIG9uIDIwMjYtMDktMjEgc28gaXQgY291bGQgYW5jaG9yIHRvIHRoZSBoZWFkZXIncyBib3R0b20gZWRnZSwgYW5kIGl0IGlzXG4gKiBhIFNJQkxJTkcgb2YgYF9fbWFpbmAsIG5vdCBhIGRlc2NlbmRhbnQuIFNjb3BlZCBvbmUgbGV2ZWwgdXAsIHRoaXMgcnVsZSBwYWludGVkXG4gKiB0aGUgbW9kYWwncyBvd24gaWNvbnMgd2hpdGUg4oCUIGFuZCB0aGUgc3VibWl0IG1hZ25pZmllciBzaXRzIG9uIGEgd2hpdGUgZmllbGQsXG4gKiBzbyB0aGUgc2VhcmNoIGJ1dHRvbiB3YXMgaW52aXNpYmxlIG9uIGV2ZXJ5IHBhZ2Ugb2YgdGhlIHNpdGUuIFNhbWUgc3BlY2lmaWNpdHlcbiAqIGFzIHRoZSBmcmFtZXdvcmsncyBgLnNlYXJjaC1mb3JtX19zdWJtaXQgLmljb25gLCBicmFuZCBzaGVldCBsb2FkcyBzZWNvbmQsIGJyYW5kXG4gKiB3b24uIEV2ZXJ5IGhlYWRlciBpY29uIGlzIGluc2lkZSBgX19tYWluYCAoY2FtY29tLXYyL2hlYWRlci5waHA6MzkpLCB3aGljaCBpc1xuICogaG93IE5lcmR3b3JrcyBhbmQgQVJUU0FCRVJTIGFscmVhZHkgc2NvcGUgdGhpcy5cbiAqL1xuLnNpdGUtaGVhZF9fbWFpbiAuaWNvbixcbi5mb290ZXJfX2N0YSAuaWNvbiB7XG5cblx0ZmlsbDogdmFyKC0tdGV4dC1vbi1icmFuZCk7XG5cbn1cblxuLyogRm9vdGVyIGtlZXBzIGl0cyBvd24gc2l6ZTsgdGhlIGhlYWRlcidzIGNvbWVzIGZyb20gdGhlIHBhcmVudCdzIC0taWNvbi1zaXplLlxuICogVGhlIDIycHggdGhpcyB1c2VkIHRvIHNldCBvbiBib3RoLCBwbHVzIGEgMjZweCBleGNlcHRpb24gZm9yIHRoZSBzZWFyY2hcbiAqIG1hZ25pZmllciwgd2FzIHRoaXMgYnJhbmQgcm91dGluZyBhcm91bmQgLS1pY29uLXNpemUgcmF0aGVyIHRoYW4gdXNpbmcgaXQg4oCUXG4gKiBgLnNpdGUtaGVhZF9fbWFpbiAuaWNvbmAgaXMgdHdvIGNsYXNzZXMgYWdhaW5zdCB0aGUgZ2xvYmFsIHByaW1pdGl2ZSdzIG9uZSwgc29cbiAqIGl0IHdvbiBzaWxlbnRseSBhbmQgdGhlIGxldmVyIGxvb2tlZCBicm9rZW4uIEhlYWRlciBpY29ucyBhcmUgMjRweCBub3csIHRoZVxuICogc2FtZSBhcyBldmVyeSBvdGhlciBicmFuZC4gKi9cbi5mb290ZXJfX2N0YSAuaWNvbiB7XG5cblx0d2lkdGg6IDIycHg7XG5cdGhlaWdodDogMjJweDtcblxufVxuXG4uc2l0ZS1oZWFkX19hY3Rpb25zX19iYXNrZXRfX2NvdW50IHtcblxuXHRiYWNrZ3JvdW5kOiB2YXIoLS1jb2xvci1icmFuZCk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW9uLWJyYW5kKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXG59XG5cbi8qIOKUgOKUgCBGb290ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovXG5cbi5mb290ZXIge1xuXG5cdGJhY2tncm91bmQ6IHZhcigtLWJnLWNocm9tZSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW9uLWNocm9tZSk7XG5cbn1cblxuLmZvb3Rlcl9fY3RhIHtcblxuXHRiYWNrZ3JvdW5kOiB2YXIoLS1jb2xvci1icmFuZCk7XG5cbn1cblxuLmZvb3Rlcl9fY3RhX19pbm5lciB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0Z2FwOiAxOHB4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0bWF4LXdpZHRoOiB2YXIoLS1zaXRlLW1heC13aWR0aCk7XG5cdG1hcmdpbjogMCBhdXRvO1xuXHRwYWRkaW5nOiAxOHB4IHZhcigtLWd1dHRlci1zbWFsbCk7XG5cbn1cblxuLmZvb3Rlcl9fY3RhX19saW5rLFxuLmZvb3Rlcl9fY3RhX19mb2xsb3csXG4uZm9vdGVyX19jdGFfX3NlcCxcbi5mb290ZXJfX2N0YV9fc29jaWFsIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1vbi1icmFuZCk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXG59XG5cbi5mb290ZXJfX2N0YV9fbGluayxcbi5mb290ZXJfX2N0YV9fZm9sbG93IHtcblxuXHQvLyAyMnB4IHNpdHMgYmV0d2VlbiAtLWZzLWg0ICgyMCkgYW5kIC0tZnMtaDMgKDI2KSBhbmQgdGhlIGJyYW5kIGhhcyBubyBzdGVwXG5cdC8vIHRoZXJlLiBJdCBpcyB0aGUgbmV0d29yayBmb290ZXIncyBvd24gc2l6ZSwgcG9ydGVkIHZlcmJhdGltIHdpdGggdGhlIHJlc3Qgb2Zcblx0Ly8gdGhlIGNocm9tZTsgaW52ZW50aW5nIGEgLS1mcy1oNC1sZyBmb3Igb25lIGRlY2xhcmF0aW9uLCBpbiBhIGZpbGUgd2hvc2UgbWFya3VwXG5cdC8vIHdlIGRvIG5vdCBvd24sIHdvdWxkIHB1dCBhIHN0ZXAgaW50byB0aGUgYnJhbmQgc2NhbGUgdGhhdCBub3RoaW5nIGVsc2UgdXNlcy5cblx0Ly8gUmV2aXNpdCBpZiBhIHNlY29uZCBjb25zdW1lciBldmVyIHdhbnRzIGl0LlxuXHRmb250LXNpemU6IDIycHg7IC8vIHNjc3MtcnVsZS1saW50OiBhbGxvdy1zaXplIOKAlCBtaXNzaW5nIHRva2VuIHdvdWxkIGJlIC0tZnMtaDQtbGcgKDIycHgpXG5cbn1cblxuLmZvb3Rlcl9fY3RhX19zb2NpYWwge1xuXG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXG59XG5cbi8qIEljb24gc2l6aW5nL2NvbG91ciBzaGFyZWQgd2l0aCAuc2l0ZS1oZWFkX19tYWluIC5pY29uIGFib3ZlLiAqL1xuXG4uZm9vdGVyX19pbm5lciB7XG5cblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAyZnIgMWZyO1xuXHRnYXA6IHZhcigtLXNwYWNlLWNvbnRlbnQtZ2FwKTtcblx0bWF4LXdpZHRoOiB2YXIoLS1zaXRlLW1heC13aWR0aCk7XG5cdG1hcmdpbjogMCBhdXRvO1xuXHRwYWRkaW5nOiA0NHB4IHZhcigtLWd1dHRlci1zbWFsbCk7XG5cbn1cblxuLmZvb3Rlcl9fY29sdW1ucyB7XG5cblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgMWZyKTtcblx0Z2FwOiB2YXIoLS1zcGFjZS1jb250ZW50LWdhcCk7XG5cbn1cblxuLmZvb3Rlcl9fY29sdW1uc19fbGlzdCB7XG5cblx0bWFyZ2luOiAwO1xuXHRwYWRkaW5nOiAwO1xuXHRsaXN0LXN0eWxlOiBub25lO1xuXG59XG5cbi5mb290ZXJfX2NvbHVtbnNfX2xpc3QgLnRpdGxlIHtcblxuXHRtYXJnaW46IDAgMCAxMnB4O1xuXHRjb2xvcjogdmFyKC0tdGV4dC1vbi1icmFuZCk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cbn1cblxuLmZvb3Rlcl9fY29sdW1uc19fbGlzdCAubGluayB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtb24tY2hyb21lKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0bGluZS1oZWlnaHQ6IDI7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblxufVxuXG4uZm9vdGVyX19jb2x1bW5zX19saXN0IC5saW5rOmhvdmVyIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1vbi1icmFuZCk7XG5cbn1cblxuLmZvb3Rlcl9fcHJvbW8ge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTRweDtcblx0YWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuXHR0ZXh0LWFsaWduOiByaWdodDtcblxufVxuXG4ucGctbG9nby0tZm9vdGVyIHtcblxuXHRoZWlnaHQ6IDMycHg7XG5cbn1cblxuLmZvb3Rlcl9fcHJvbW9fX2luZm8gcCxcbi5mb290ZXJfX2xlZ2FsIHAge1xuXG5cdG1hcmdpbjogMDtcblx0Y29sb3I6IHZhcigtLXRleHQtb24tY2hyb21lKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXG59XG5cbi5mb290ZXJfX2xlZ2FsIHtcblxuXHRncmlkLWNvbHVtbjogMSAvIC0xO1xuXHRwYWRkaW5nLXRvcDogMjRweDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLW5ldXRyYWwtNDAwKTtcblxufVxuXG4vKiDilIDilIAgTmFycm93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqL1xuXG4vKlxuICogVGhpcyBicmFuZCBoYW5kcyBvdmVyIExBVEVSIHRoYW4gdGhlIGdsb2JhbCAxMDI0LCBiZWNhdXNlIGl0cyBoZWFkZXIgZG9lcyBub3RcbiAqIGZpdCBhdCAxMDI0LlxuICpcbiAqIE1lYXN1cmVkIGF0IDEwMjU6IGxvZ28gMTYwICsgbmF2IGdhcCAzMiArIG1lbnUgNjIyICsgYWN0aW9ucyAyMjggKyA0MCBvZiBpbm5lclxuICogcGFkZGluZyA9IDEwODJweCBvZiBjb250ZW50IGluIGEgMTAyNXB4IHZpZXdwb3J0LiBgLnNpdGUtbmF2YCBpcyBgZmxleDogMWAgYW5kXG4gKiBpdHMgbWVudSBpdGVtcyBhcmUgYHdoaXRlLXNwYWNlOiBub3dyYXBgLCBzbyBub3RoaW5nIGNvbXByZXNzZXMg4oCUIHRoZSBhY3Rpb25zXG4gKiBjbHVzdGVyIHdhcyBwdXNoZWQgdG8gYSByaWdodCBlZGdlIG9mIDEwNjIgYW5kIHRvb2sgdGhlIHdob2xlIGRvY3VtZW50IGludG9cbiAqIGhvcml6b250YWwgc2Nyb2xsLiBTYW1lIGZhaWx1cmUgQVJUU0FCRVJTIGhpdCBhdCA3NjgsIG9uZSBicmFuZCBhbmQgb25lXG4gKiBicmVha3BvaW50IGFsb25nLlxuICpcbiAqIDExMDAgcmF0aGVyIHRoYW4gMTA4MiBzbyBhIG1lbnUgbGFiZWwgY2FuIGdyb3cgYnkgYSB3b3JkIHdpdGhvdXQgYnJpbmdpbmcgaXRcbiAqIGJhY2suIE1vdmUgaXQgaWYgdGhlIGRlc2lnbiB3b3VsZCByYXRoZXIgc2hyaW5rIHRoZSB0eXBlIG9yIHNob3J0ZW4gdGhlXG4gKiBsYWJlbHMgdGhhbiBjb2xsYXBzZSBlYXJsaWVyIOKAlCB0aGUgbnVtYmVyIGlzIGEgZmxvb3IsIG5vdCBhIHByZWZlcmVuY2UuXG4gKlxuICogVGhpcyBibG9jayBhbHNvIGNhcnJpZXMgdGhlIG1lbnUgaGlkZSB0aGF0IHVzZWQgdG8gZHVwbGljYXRlIGdsb2JhbCdzLiBUaGF0XG4gKiBkdXBsaWNhdGlvbiB3YXMgcmVhbCBhbmQgaXMgZ29uZTsgd2hhdCByZW1haW5zIGlzIGEgZ2VudWluZSBicmFuZCBvdmVycmlkZSxcbiAqIGJlY2F1c2UgZ2xvYmFsIGhpZGVzIHRoZSBtZW51IGF0IDEwMjQgYW5kIHRoaXMgYnJhbmQgbmVlZHMgaXQgaGlkZGVuIHRvIDExMDAuXG4gKiBHbG9iYWwncyBydWxlIGlzIGRvdWJsZWQtY2xhc3Mgc28gaXQgYmVhdHMgYSBicmFuZCBiYXNlIOKAlCB0aGlzIG9uZSBiZWF0cyBpdFxuICogYmFjayBkZWxpYmVyYXRlbHksIGJ5IGJlaW5nIGxhdGVyIGFuZCBlcXVhbGx5IHNwZWNpZmljLlxuICovXG5AbWVkaWEgKG1heC13aWR0aDogMTEwMHB4KSB7XG5cblx0LnNpdGUtbmF2X19tZW51IHtcblxuXHRcdGRpc3BsYXk6IG5vbmU7XG5cblx0fVxuXG5cdC8vIEdsb2JhbCBoaWRlcyB0aGUgYnVyZ2VyIGZyb20gMTAyNSB1cCwgc28gYmV0d2VlbiAxMDI1IGFuZCAxMTAwIHRoaXMgaXNcblx0Ly8gd2hhdCBwdXRzIGl0IGJhY2suIE5vdCByZWR1bmRhbnQgd2l0aCBnbG9iYWwgYXQgYW55IHdpZHRoOiBnbG9iYWwncyBidXJnZXJcblx0Ly8gY2FycmllcyBgZmxleC1kaXJlY3Rpb246IGNvbHVtbmAsIGBtYXJnaW4tcmlnaHQ6IDI1cHhgIGFuZCBgcGFkZGluZzogNXB4YCxcblx0Ly8gbm9uZSBvZiB3aGljaCB0aGlzIGJyYW5kIHdhbnRzLCBhbmQgdGhlIGJhc2UgcnVsZSBmdXJ0aGVyIHVwIHNldHNcblx0Ly8gYGRpc3BsYXk6IG5vbmVgIHdoaWNoIHRoaXMgZXhpc3RzIHRvIHVuZG8uXG5cdC5zaXRlLW5hdl9fYnVyZ2VyIHtcblxuXHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0XHRwYWRkaW5nOiAwO1xuXHRcdGJvcmRlcjogMDtcblx0XHRiYWNrZ3JvdW5kOiBub25lO1xuXHRcdGN1cnNvcjogcG9pbnRlcjtcblxuXHR9XG5cblx0LmZvb3Rlcl9faW5uZXIsXG5cdC5mb290ZXJfX2NvbHVtbnMge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7XG5cblx0fVxuXG5cdC5mb290ZXJfX3Byb21vIHtcblxuXHRcdGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuXHRcdHRleHQtYWxpZ246IGxlZnQ7XG5cblx0fVxuXG59XG5cbi8qIFRoZSA0ODBweCBibG9jayB0aGF0IHVzZWQgdG8gc2l0IGhlcmUgaXMgZ29uZS4gSXQgc3F1ZWV6ZWQgdGhlIGFjdGlvbnMgdG8gNTJweFxuICogYW5kIHNoYXZlZCB0aGUgaW5uZXIgY29udGFpbmVyJ3MgbGVmdCBwYWRkaW5nIHRvIDEycHgsIGJlY2F1c2UgdGhyZWUgNjZweCBib3hlc1xuICogcGx1cyB0aGUgZ3V0dGVyIG92ZXJyYW4gYSAzOTBweCB2aWV3cG9ydCBieSBhIHBpeGVsIGFuZCB0b29rIHRoZSB3aG9sZSBwYWdlIGludG9cbiAqIGhvcml6b250YWwgc2Nyb2xsLiBBdCB0aGUgcGFyZW50J3MgNDRweCDigJQgYW5kIHdpdGggb25seSB0d28gY29udHJvbHMgdmlzaWJsZVxuICogYmVsb3cgNzY4IOKAlCB0aGUgY2x1c3RlciBpcyA5M3B4IG9uIGEgMzkwcHggc2NyZWVuLCBzbyBuZWl0aGVyIHdvcmthcm91bmQgaGFzXG4gKiBhbnl0aGluZyBsZWZ0IHRvIGZpeC4gVmVyaWZpZWQ6IG5vIGhvcml6b250YWwgc2Nyb2xsIGF0IDM5MC4gKi9cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCB0aGUgYnJhbmQncyBwYXJ0IG9mIHRoZSBnbG9iYWwgZ3JpZFxuLy9cbi8vIFRISVMgRE9FUyBOT1QgUkUtREVDTEFSRSBUSEUgR1JJRC4gVGhlIGNvbnRhaW5lciwgdGhlIGdhcCBhbmQgZXZlcnkgY29sdW1uXG4vLyBjb3VudCBjb21lIGZyb20gdGhlIGdsb2JhbCBgLmdyaWRgIGluIGBnbG9iYWwvc2Nzcy9jb3JlL19ncmlkLnNjc3NgLCBhbmQgdGhpc1xuLy8gcGFnZSBjb21wb3NlcyB0aGF0IHByaW1pdGl2ZSBkaXJlY3RseS4gVHdvIHRoaW5ncyBsaXZlIGhlcmU6IHdoZXJlIHRoaXNcbi8vIGJyYW5kJ3MgZ3JpZHMgY29sbGFwc2UsIGFuZCB3aGF0IGhhcHBlbnMgd2hlbiBvbmUgZ3JpZCBzaXRzIGluc2lkZSBhbm90aGVyLlxuLy9cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTkVTVElORyDigJQgYSBgLmdyaWRgIGluc2lkZSBhIGAuZ3JpZGAgdGFrZXMgaXRzIGNlbGwsIG5vdCB0aGUgd2hvbGUgcm93LlxuLy9cbi8vIFRoZSBnbG9iYWwgYC5ncmlkYCBjYXJyaWVzIGBncmlkLWNvbHVtbjogMSAvIC0xYCwgc28gdGhhdCBhIGdyaWQgZHJvcHBlZCBpbnRvXG4vLyBhIHBhZ2UtbGV2ZWwgZ3JpZCBzcGFucyB0aGUgZnVsbCB3aWR0aC4gVGhhdCBpcyByaWdodCBmb3IgdGhlIGNhc2UgaXQgd2FzXG4vLyB3cml0dGVuIGZvciBhbmQgd3JvbmcgZm9yIGEgbmVzdGVkIG9uZTogdGhlIEJlc3QgU2VsbGVycyBiYW5kIGlzIGEgMWZyIDJmclxuLy8gc3BsaXQgaG9sZGluZyBhIHByb21vdGlvbmFsIHRpbGUgYW5kIGEgMngyIHByb2R1Y3QgZ3JpZCwgYW5kIHRoZSBpbm5lciBncmlkXG4vLyBzcGFubmluZyBgMSAvIC0xYCBwdXNoZWQgaXRzZWxmIG9udG8gYSBzZWNvbmQgcm93LiBUaGUgdGlsZSB0aGVuIHNpemVkIHRvIGl0c1xuLy8gb3duIGltYWdlIGFuZCB0aGUgdHdvIG5ldmVyIHNhdCBzaWRlIGJ5IHNpZGUgYXQgYWxsLlxuLy9cbi8vIEl0IHJlYWRzIGFzIGEgY29tcG9uZW50IGZhdWx0IOKAlCB0aGUgdGlsZSBpcyA2MjJweCBhZ2FpbnN0IGEgMTQ0NXB4IG5laWdoYm91cixcbi8vIHdoaWNoIGxvb2tzIGV4YWN0bHkgbGlrZSBhIGhlaWdodCB0aGF0IGZhaWxlZCB0byBzdHJldGNoIOKAlCBhbmQgaXQgaXMgYVxuLy8gbGF5b3V0IG9uZS4gYGdyaWQtdGVtcGxhdGUtcm93c2Agd2FzIHRoZSB0ZWxsOiB0d28gcm93cyB3aGVyZSB0aGUgZGVzaWduIGhhc1xuLy8gb25lLlxuLy9cbi8vIFNjb3BlZCB0byBhIGdyaWQgdGhhdCBpcyBpdHNlbGYgYSBncmlkIGNoaWxkLCBzbyB0aGUgZ2xvYmFsIGJlaGF2aW91ciBpc1xuLy8gdW50b3VjaGVkIGV2ZXJ5d2hlcmUgZWxzZS4gV29ydGggcmFpc2luZyBhcyBhIGdsb2JhbCBxdWVzdGlvbiDigJQgYSBuZXN0ZWQgZ3JpZFxuLy8gd2FudGluZyBpdHMgb3duIGNlbGwgaXMgbm90IHNwZWNpZmljIHRvIHRoaXMgYnJhbmQg4oCUIGJ1dCBub3Qgd29ydGggY2hhbmdpbmdcbi8vIHVuZGVyIGZvdXIgb3RoZXIgYnJhbmRzIG1pZC13YWxrLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL1xuLy8gVGhlIGdsb2JhbCBkZWZhdWx0cyBhbmQgdGhpcyBicmFuZCdzIGFwcHJvdmVkIGRlc2lnbiBkaXNhZ3JlZSwgYW5kIHRoZVxuLy8gZGlzYWdyZWVtZW50IGlzIHZpc2libGUgcmF0aGVyIHRoYW4gdGhlb3JldGljYWw6XG4vL1xuLy8gICBnbG9iYWwgICAgICAgIGAuZ3JpZC0tNGAg4oaSIG9uZSBjb2x1bW4gYXQgNzY4XG4vLyAgIE1QRzEgICAgICAgICAgdHdvIGNvbHVtbnMgYXQgMTEwMCwgb25lIGF0IDY0MFxuLy9cbi8vICAgZ2xvYmFsICAgICAgICBgLmdyaWQtLTVgIOKGkiB0d28gY29sdW1ucyBhdCA3Njhcbi8vICAgTVBHMSAgICAgICAgICB0aHJlZSBjb2x1bW5zIGF0IDExMDAsIG9uZSBhdCA2NDBcbi8vXG4vLyAgIGdsb2JhbCAgICAgICAgYC5ncmlkLS0zYCDihpIgdHdvIGNvbHVtbnMgYXQgNzY4LCBhbmQgc3RheXMgdHdvIGJlbG93IHRoYXRcbi8vICAgTVBHMSAgICAgICAgICB0d28gY29sdW1ucyBhdCA5MDAsIG9uZSBhdCA2NDBcbi8vXG4vLyBMZWZ0IGFsb25lLCB0aGUgZm91ci11cCBjb21wb25lbnQtY2F0ZWdvcnkgcm93IGRyb3BzIHRvIGEgc2luZ2xlIGNvbHVtbiBvbiBhXG4vLyB0YWJsZXQg4oCUIGZvdXIgZnVsbC13aWR0aCBwaG90b2dyYXBocyBzdGFja2VkIHdoZXJlIHRoZSBkZXNpZ24gaGFzIGEgMngyIOKAlCBhbmRcbi8vIHRoZSB0aHJlZS11cCBhbmQgZml2ZS11cCByb3dzIHN0YXkgbXVsdGktY29sdW1uIG9uIGEgcGhvbmUgd2hlcmUgdGhlIGRlc2lnblxuLy8gc3RhY2tzIHRoZW0uXG4vL1xuLy8gVGhlIGdsb2JhbCBjb2xsYXBzZSBwb2ludHMgYXJlIG5vdCB3cm9uZzsgdGhleSBhcmUgZGVmYXVsdHMsIGFuZCBmb3VyIGJyYW5kc1xuLy8gc2hhcmUgdGhlbS4gQ2hhbmdpbmcgdGhlbSB0aGVyZSB0byBzdWl0IHRoaXMgcGFnZSB3b3VsZCBtb3ZlIEFSVFNBQkVSUyxcbi8vIE5lcmR3b3JrcyBhbmQgV2FyIER1bmdlb24gYXQgdGhlIHNhbWUgdGltZS4gU28gdGhlIGJyYW5kIHN0YXRlcyBpdHMgb3duLCBvdmVyXG4vLyB0aGUgZ2xvYmFsIGNvbnRhaW5lciwgd2hpY2ggaXMgdGhlIHNhbWUgc2hhcGUgYXMgZXZlcnkgb3RoZXIgYnJhbmQtbGF5ZXIgcnVsZTpcbi8vIGdsb2JhbCBvd25zIHRoZSBzdHJ1Y3R1cmUsIHRoZSBicmFuZCBvd25zIHRoZSB0cmVhdG1lbnQuXG4vL1xuLy8gQnJlYWtwb2ludHMgYXJlIE1QRzEncyBvd24gKGRlc2lnbiAxNzgxMiksIG5vdCBpbnZlbnRlZCBoZXJlLlxuLy9cbi8vIEF1dGhvcmVkIGZvciB0aGUgTVBHMSBob21lcGFnZSB3YWxrLCAyMDI2LTA5LTE2LlxuXG4uZ3JpZCA+IC5ncmlkIHtcblxuXHRncmlkLWNvbHVtbjogYXV0bztcbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiAxMTAwcHggKSB7XG5cblx0LmdyaWQtLTQge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoIDIsIG1pbm1heCggMCwgMWZyICkgKTtcblx0fVxuXG5cdC5ncmlkLS01IHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KCAzLCBtaW5tYXgoIDAsIDFmciApICk7XG5cdH1cblxuXHQuZ3JpZC0tMS0yIHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KCAwLCAxZnIgKTtcblx0fVxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDkwMHB4ICkge1xuXG5cdC5ncmlkLS0zIHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KCAyLCBtaW5tYXgoIDAsIDFmciApICk7XG5cdH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBUSEUgU1RPUkUgQ09MVU1OIENPTExBUFNFUyBFQVJMSUVSLCBiZWNhdXNlIGl0IGlzIDEwNDJweCBpbnNpZGUgYSAxNDAwcHggcGFnZS5cblxuICAgTVBHMSBhbmQgTVBHOCBzdGF0ZSBkaWZmZXJlbnQgYnJlYWtwb2ludHMgZm9yIHRoZSBzYW1lIHByaW1pdGl2ZXMsIGFuZCBpdCBpc1xuICAgbm90IGEgZGlzYWdyZWVtZW50IGFib3V0IHRhc3RlIOKAlCBpdCBpcyB0aGUgdHdvIHBhZ2VzIG1lYXN1cmluZyBkaWZmZXJlbnRcbiAgIGNvbnRhaW5lcnMuIFRoZSBob21lcGFnZSdzIGdyaWRzIGhhdmUgdGhlIHdob2xlIHBhZ2U7IHRoZSBmdW5uZWwncyBzaXQgaW4gdGhlXG4gICBjb250ZW50IGNvbHVtbiBiZXNpZGUgYSAzMjhweCByYWlsLiBBIHRocmVlLXVwIHRoYXQgc3RpbGwgcmVhZHMgYXQgMTQwMCBpc1xuICAgYWxyZWFkeSB0aWdodCBhdCAxMDQyLCBzbyB0aGUgZnVubmVsIGNvbGxhcHNlcyBpdCBhdCAxMTAwIHdoZXJlIHRoZSBob21lcGFnZVxuICAgd2FpdHMgdW50aWwgOTAwLlxuXG4gICBTY29wZWQgdG8gdGhlIHN0b3JlIGNvbHVtbiByYXRoZXIgdGhhbiByZXN0YXRlZCBwYWdlLXdpZGUsIHNvIGJvdGggYXBwcm92ZWRcbiAgIGRlc2lnbnMgc3RheSBjb3JyZWN0IGF0IG9uY2UuIFRoZSBob25lc3QgZml4IGlzIGEgY29udGFpbmVyIHF1ZXJ5IOKAlCB0aGUgcnVsZVxuICAgaXMgZ2VudWluZWx5IGFib3V0IHRoZSBjb2x1bW4ncyB3aWR0aCBhbmQgbm90IHRoZSB3aW5kb3cncyDigJQgYnV0IHRoYXQgaXMgYVxuICAgY2hhbmdlIHRvIHRoZSBnbG9iYWwgZ3JpZCB1bmRlciBmb3VyIG90aGVyIGJyYW5kcywgYW5kIGl0IGlzIG5vdCB0aGlzIHdhbGsnc1xuICAgdG8gbWFrZS4gUmFpc2VkIGZvciB0aGUgb3BlcmF0b3IncyByZXZpZXcuXG5cbiAgIEJyZWFrcG9pbnRzIGFyZSBNUEc4J3Mgb3duIChkZXNpZ24gMTc5NTUpLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbkBtZWRpYSAoIG1heC13aWR0aDogMTEwMHB4ICkge1xuXG5cdC5zdG9yZS1sYXlvdXRfX2NvbnRlbnQgLmdyaWQtLTMge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoIDIsIG1pbm1heCggMCwgMWZyICkgKTtcblx0fVxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5zdG9yZS1sYXlvdXRfX2NvbnRlbnQgLmdyaWQtLTUge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoIDIsIG1pbm1heCggMCwgMWZyICkgKTtcblx0fVxuXG5cdC8qIFRoZSB0aHJlZS11cCBoYXMgdG8gYmUgcmVzdGF0ZWQgaGVyZSwgYW5kIHRoZSByZWFzb24gaXMgc3BlY2lmaWNpdHkgcmF0aGVyXG5cdCAgIHRoYW4gZGVzaWduOiBgLnN0b3JlLWxheW91dF9fY29udGVudCAuZ3JpZC0tM2AgYWJvdmUgaXMgdHdvIGNsYXNzZXMgYWdhaW5zdFxuXHQgICB0aGUgcGhvbmUgcnVsZSdzIG9uZSwgc28gaXQgd2lucyBhdCBldmVyeSB3aWR0aCBiZWxvdyAxMTAwIG5vIG1hdHRlciB3aGljaFxuXHQgICBtZWRpYSBxdWVyeSBjb21lcyBsYXRlci4gV2l0aG91dCB0aGlzIGxpbmUgdGhlIG1hZ2F6aW5lIHJvdyBzaXRzIGF0IHR3b1xuXHQgICBjb2x1bW5zIG9uIGEgcGhvbmUsIHdoZXJlIE1QRzggc3RhY2tzIGl0IOKAlCBhbmQgaXQgbG9va3MgbGlrZSB0aGUgcGhvbmUgcnVsZVxuXHQgICBpcyBtaXNzaW5nIHdoZW4gaXQgaXMgcHJlc2VudCBhbmQgb3V0cmFua2VkLiAqL1xuXHQuc3RvcmUtbGF5b3V0X19jb250ZW50IC5ncmlkLS0zIHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KCAwLCAxZnIgKTtcblx0fVxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5ncmlkLS0yLFxuXHQuZ3JpZC0tMyxcblx0LmdyaWQtLTQsXG5cdC5ncmlkLS01IHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KCAwLCAxZnIgKTtcblx0fVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIFRIRSBQUk9EVUNUIEdSSUQgSE9MRFMgVEhSRUUtVVAgTE9OR0VSIFRIQU4gVEhFIENPTFVNTidTIFNIQVJFRCBUSFJFRS1VUC5cblxuICAgTVBHNyBjb2xsYXBzZXMgdGhlIGxpc3RpbmcgMyDihpIgMiBhdCA5MDAgYW5kIDIg4oaSIDEgYXQgNjQwLiBNUEc4J3MgYmxvY2sgYWJvdmVcbiAgIGNvbGxhcHNlcyBgLnN0b3JlLWxheW91dF9fY29udGVudCAuZ3JpZC0tM2AgYXQgMTEwMC4gQm90aCBwYWdlcyBzaXQgaW4gdGhlXG4gICBzYW1lIDEwNDJweCBjb2x1bW4sIHNvIHVubGlrZSB0aGUgTVBHMS9NUEc4IGNhc2UgdGhpcyBpcyBub3QgdHdvIGNvbnRhaW5lcnNcbiAgIGJlaW5nIG1lYXN1cmVkIOKAlCBpdCBpcyB0d28ga2luZHMgb2YgY2FyZC4gVGhlIGZ1bm5lbCdzIHRocmVlLXVwIGNhcnJpZXNcbiAgIEFSVElDTEUgY2FyZHMsIHdoaWNoIGhvbGQgYW4gaW1hZ2UsIGEgdGl0bGUgYW5kIGFuIGV4Y2VycHQ7IHRoZSBhcmNoaXZlJ3NcbiAgIGNhcnJpZXMgUFJPRFVDVCBjYXJkcywgd2hpY2ggYXJlIG5hcnJvd2VyIGFuZCBzdGlsbCByZWFkIGF0IDcwMHB4IG9mIGNvbHVtbi5cblxuICAgU28gdGhlIGxpc3RpbmcgY29tcG9zZXMgYC5ncmlkYCBmb3IgaXRzIGRpc3BsYXksIGdhcCBhbmQgd2lkdGggYW5kIHN0YXRlcyBpdHNcbiAgIG93biBjb2x1bW5zIGhlcmUsIHJhdGhlciB0aGFuIHRha2luZyBgLS0zYCBhbmQgZmlnaHRpbmcgdGhlIGNvbHVtbiBydWxlIGZvclxuICAgc3BlY2lmaWNpdHkgYmV0d2VlbiAxMTAwIGFuZCA5MDAuIE5vdGhpbmcgYWJvdmUgY2hhbmdlcywgYW5kIHRoZSBmdW5uZWwnc1xuICAgbWFnYXppbmUgcm93IGlzIHVudG91Y2hlZC5cblxuICAgQnJlYWtwb2ludHMgYXJlIE1QRzcncyBvd24gKGRlc2lnbiAxNzkyOSkuIFJhaXNlZCBmb3IgdGhlIG9wZXJhdG9yJ3MgcmV2aWV3OlxuICAgd2hldGhlciB0aGUgc3RvcmUgY29sdW1uIHNob3VsZCBjb2xsYXBzZSBieSBDT05URU5UIFRZUEUsIGFzIGl0IGRvZXMgbm93LCBvclxuICAgdW5pZm9ybWx5LCBpcyBhIGJyYW5kIGRlY2lzaW9uIGFuZCBub3QgdGhpcyB3YWxrJ3MgdG8gdGFrZS5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4ucHJvZHVjdC1ncmlkIHtcblxuXHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCggMywgbWlubWF4KCAwLCAxZnIgKSApO1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDkwMHB4ICkge1xuXG5cdC5wcm9kdWN0LWdyaWQge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoIDIsIG1pbm1heCggMCwgMWZyICkgKTtcblx0fVxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5wcm9kdWN0LWdyaWQge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoIDAsIDFmciApO1xuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgdGhlbWUgZW50cnkgcG9pbnQuXG4vL1xuLy8gQ29tcGlsZXMgdG8gYHdwLWNvbnRlbnQvdGhlbWVzL3BhcmFnb24vY3NzL3BhcmFnb24uY3NzYCB2aWEgdGhlXG4vLyBgYnVpbGRQYXJhZ29uQ3NzYCBndWxwIHRhc2suIFRoZSB0aGVtZSBlbnF1ZXVlcyB0aGF0IGZpbGUgYWZ0ZXJcbi8vIGBjYW1jb21fZ2xvYmFsYCwgc28gdGhlIGdsb2JhbCBmcmFtZXdvcmsgbGFuZHMgZmlyc3QgYW5kIHRoZSBicmFuZCBsYXllciBzaXRzXG4vLyBvbiB0b3Agb2YgaXQuXG4vL1xuLy8gU2NhZmZvbGRlZCAyMDI2LTA5LTE2LCBiZWZvcmUgdGhlIGZpcnN0IHRlbXBsYXRlIHdhbGsuIENvbXBvbmVudHMgYWNjcnVlIG9uZVxuLy8gYEB1c2VgIGF0IGEgdGltZSBhcyBgL3RmLXdhbGtlcmAgbGFuZHMgZWFjaCBzZWN0aW9uIOKAlCB0aGUgY2F0YWxvZ3VlXG4vLyAoNzIgYmxvY2tzLCBgd3AgdGYgYmxvY2tzIHBhcmFnb25nYW1pbmdgKSBpcyB3aGF0IHRoZXkgZ2V0IGJ1aWx0IGZyb20uXG5cbkB1c2UgJ3NldHRpbmdzJyBhcyAqO1xuQHVzZSAnYnJhbmQtdG9rZW5zJyBhcyAqO1xuXG4vLyBEb2N1bWVudCBkZWZhdWx0cyArIHRoZSBpbnRlcmFjdGlvbiBsYXllci4gTXVzdCBiZSBgQHVzZWBkIHVwIGhlcmUgd2l0aCB0aGVcbi8vIHJlc3Qg4oCUIFNhc3MgcmVqZWN0cyBhIGBAdXNlYCB0aGF0IGZvbGxvd3MgYW55IG90aGVyIHJ1bGUuXG5AdXNlICdiYXNlJztcblxuLy8gVGhlIG5ldHdvcmsgaGVhZGVyIGFuZCBmb290ZXIsIGRyZXNzZWQgaW4gYnJhbmQgY29sb3Vycy5cbkB1c2UgJ2xheW91dHMvY2hyb21lJztcblxuLy8gVGhlIGJyYW5kJ3MgcGFydCBvZiB0aGUgZ2xvYmFsIGdyaWQg4oCUIGNvbGxhcHNlIHBvaW50cyBhbmQgbmVzdGluZy4gU2VlIHRoZSBwYXJ0aWFsLlxuQHVzZSAnbGF5b3V0cy9ncmlkJztcblxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXFxcblx0Q09NUE9ORU5UU1xuXHRPbmUgQHVzZSBwZXIgYXV0aG9yZWQgYnJhbmQgY29tcG9uZW50LCBhbHBoYWJldGljYWwuIFRoZSBNUEc5IHByb2R1Y3QtcGFnZVxuXHR3YWxrIGxhbmRlZCAzMiAoMjQgcG9ydGVkIGZyb20gdGhlIGJyYW5kJ3MgYmxvY2sgY2F0YWxvZ3VlLCA4IGF1dGhvcmVkIGZyb21cblx0dGhlIG1vY2t1cCk7IHRoZSBNUEcxIGhvbWVwYWdlIHdhbGsgYWRkZWQgOCBtb3JlLCBldmVyeSBvbmUgYSBjYXRhbG9ndWUgcG9ydC5cblxcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbkB1c2UgJ2NvbXBvbmVudHMvYWJvdXQtcGFuZWwnO1xuQHVzZSAnY29tcG9uZW50cy9hY2NvdW50LWxvZ2luJztcbkB1c2UgJ2NvbXBvbmVudHMvYWNjb3VudC1vcmRlcnMnO1xuQHVzZSAnY29tcG9uZW50cy9hY2NvdW50LXN3aXRjaCc7XG5AdXNlICdjb21wb25lbnRzL2FjY291bnQtdGlsZSc7XG5AdXNlICdjb21wb25lbnRzL2FkZHJlc3MtY2FyZCc7XG5AdXNlICdjb21wb25lbnRzL2FkZHJlc3MtbG9va3VwJztcbkB1c2UgJ2NvbXBvbmVudHMvYXBwbGllZC1jb2RlJztcbkB1c2UgJ2NvbXBvbmVudHMvYXJjaGl2ZS1mbG93JztcbkB1c2UgJ2NvbXBvbmVudHMvYXJjaGl2ZS1oZWFkZXInO1xuQHVzZSAnY29tcG9uZW50cy9hcnRpY2xlLWNhcmQnO1xuQHVzZSAnY29tcG9uZW50cy9hcnRpY2xlLWRvYyc7XG5AdXNlICdjb21wb25lbnRzL2FydGljbGUtaGVhZGVyJztcbkB1c2UgJ2NvbXBvbmVudHMvYXJ0aWNsZS1oZXJvJztcbkB1c2UgJ2NvbXBvbmVudHMvYXJ0aWNsZS1sYXlvdXQnO1xuQHVzZSAnY29tcG9uZW50cy9hcnRpY2xlLWxlYWQnO1xuQHVzZSAnY29tcG9uZW50cy9hcnRpY2xlLW1hc3RoZWFkJztcbkB1c2UgJ2NvbXBvbmVudHMvYXNzdXJhbmNlLWxpc3QnO1xuQHVzZSAnY29tcG9uZW50cy9hdGMtcXVhbnRpdHknO1xuQHVzZSAnY29tcG9uZW50cy9iYXNrZXQnO1xuQHVzZSAnY29tcG9uZW50cy9iYXNrZXQtbGluZSc7XG5AdXNlICdjb21wb25lbnRzL2Jhc2tldC1ub3RpY2UnO1xuQHVzZSAnY29tcG9uZW50cy9ib3JkZXJlZC1ncm91cCc7XG5AdXNlICdjb21wb25lbnRzL2JyYW5kLWxpc3QnO1xuQHVzZSAnY29tcG9uZW50cy9icmVhZGNydW1icyc7XG5AdXNlICdjb21wb25lbnRzL2JyZWFrb3V0LWZpZ3VyZSc7XG5AdXNlICdjb21wb25lbnRzL2J0bic7XG5AdXNlICdjb21wb25lbnRzL2J1eS1ib3gnO1xuQHVzZSAnY29tcG9uZW50cy9idXktcmVnaW9uJztcbkB1c2UgJ2NvbXBvbmVudHMvY2FyZC1saW5lJztcbkB1c2UgJ2NvbXBvbmVudHMvY2F0ZWdvcnktZWRpdG9yaWFsJztcbkB1c2UgJ2NvbXBvbmVudHMvY2F0ZWdvcnktaGVhZGVyJztcbkB1c2UgJ2NvbXBvbmVudHMvY2F0ZWdvcnktdGlsZSc7XG5AdXNlICdjb21wb25lbnRzL2NoZWNrb3V0LWJhcic7XG5AdXNlICdjb21wb25lbnRzL2NoZWNrb3V0LXN0ZXBzJztcbkB1c2UgJ2NvbXBvbmVudHMvY2hvaWNlJztcbkB1c2UgJ2NvbXBvbmVudHMvY29kZS1kaXNjbG9zdXJlJztcbkB1c2UgJ2NvbXBvbmVudHMvY29uZmlybS1oZXJvJztcbkB1c2UgJ2NvbXBvbmVudHMvY29udGVudCc7XG5AdXNlICdjb21wb25lbnRzL2NvdW50LWxpc3QnO1xuQHVzZSAnY29tcG9uZW50cy9jdGEtYmFuZCc7XG5AdXNlICdjb21wb25lbnRzL2RlY2lzaW9uJztcbkB1c2UgJ2NvbXBvbmVudHMvZGVsaXZlcnktb3B0aW9ucyc7XG5AdXNlICdjb21wb25lbnRzL2Rlc2NyaXB0aW9uLXBhbmVsJztcbkB1c2UgJ2NvbXBvbmVudHMvZG9jLXNlY3Rpb24nO1xuQHVzZSAnY29tcG9uZW50cy9lbXB0eS1zdGF0ZSc7XG5AdXNlICdjb21wb25lbnRzL2Vycm9yLWxpc3QnO1xuQHVzZSAnY29tcG9uZW50cy9leHByZXNzLWNoZWNrb3V0JztcbkB1c2UgJ2NvbXBvbmVudHMvZmFxLWFjY29yZGlvbic7XG5AdXNlICdjb21wb25lbnRzL2ZlYXR1cmUtcGFuZWwnO1xuQHVzZSAnY29tcG9uZW50cy9mZWF0dXJlZC1wcm9kdWN0JztcbkB1c2UgJ2NvbXBvbmVudHMvZmllbGQnO1xuQHVzZSAnY29tcG9uZW50cy9maWVsZC1ncm91cCc7XG5AdXNlICdjb21wb25lbnRzL2ZpZ3VyZS1yb3cnO1xuQHVzZSAnY29tcG9uZW50cy9maWx0ZXItY2hpcHMnO1xuQHVzZSAnY29tcG9uZW50cy9maWx0ZXItZ3JvdXAnO1xuQHVzZSAnY29tcG9uZW50cy9mb3JtLWFjdGlvbnMnO1xuQHVzZSAnY29tcG9uZW50cy9mb3JtLW5vdGUnO1xuQHVzZSAnY29tcG9uZW50cy9oZXJvLXNsaWRlcic7XG5AdXNlICdjb21wb25lbnRzL2hvdXNlLWFkJztcbkB1c2UgJ2NvbXBvbmVudHMvaW5mby1iYW5kJztcbkB1c2UgJ2NvbXBvbmVudHMvaW5saW5lLWZvcm0nO1xuQHVzZSAnY29tcG9uZW50cy9sZWFkLXN0b3J5JztcbkB1c2UgJ2NvbXBvbmVudHMvbGlzdGluZy10b29sYmFyJztcbkB1c2UgJ2NvbXBvbmVudHMvbG95YWx0eS1jYXJkJztcbkB1c2UgJ2NvbXBvbmVudHMvbWVkaWEtZmlndXJlJztcbkB1c2UgJ2NvbXBvbmVudHMvb3JkZXItY2xvc2UnO1xuQHVzZSAnY29tcG9uZW50cy9vcmRlci1sYXlvdXQnO1xuQHVzZSAnY29tcG9uZW50cy9vcmRlci1saW5lcyc7XG5AdXNlICdjb21wb25lbnRzL29yZGVyLXN0YXR1cyc7XG5AdXNlICdjb21wb25lbnRzL29yZGVyLXRvdGFscyc7XG5AdXNlICdjb21wb25lbnRzL3BhY2thZ2UtZGVsaXZlcnknO1xuQHVzZSAnY29tcG9uZW50cy9wYWNrYWdlLWhlYWQnO1xuQHVzZSAnY29tcG9uZW50cy9wYWdlJztcbkB1c2UgJ2NvbXBvbmVudHMvcGFnZS1jb250ZW50cyc7XG5AdXNlICdjb21wb25lbnRzL3BhZ2luYXRpb24nO1xuQHVzZSAnY29tcG9uZW50cy9wYXlsYXRlci1jYXJkJztcbkB1c2UgJ2NvbXBvbmVudHMvcGF5bWVudC1tYXJrcyc7XG5AdXNlICdjb21wb25lbnRzL3BheW1lbnQtbWV0aG9kcyc7XG5AdXNlICdjb21wb25lbnRzL3Byb2R1Y3QtY2FyZCc7XG5AdXNlICdjb21wb25lbnRzL3Byb2R1Y3QtZ2FsbGVyeSc7XG5AdXNlICdjb21wb25lbnRzL3Byb2R1Y3QtaGVhZGluZyc7XG5AdXNlICdjb21wb25lbnRzL3Byb2R1Y3QtbGluZSc7XG5AdXNlICdjb21wb25lbnRzL3Byb2R1Y3QtbGlzdC1yb3cnO1xuQHVzZSAnY29tcG9uZW50cy9wcm9kdWN0LW1pbmknO1xuQHVzZSAnY29tcG9uZW50cy9wcm9tby10aWxlJztcbkB1c2UgJ2NvbXBvbmVudHMvcHJvc2UnO1xuQHVzZSAnY29tcG9uZW50cy9wdWxsLXF1b3RlJztcbkB1c2UgJ2NvbXBvbmVudHMvcmFuZ2UtY2FyZCc7XG5AdXNlICdjb21wb25lbnRzL3JlYWRpbmctcHJvZ3Jlc3MnO1xuQHVzZSAnY29tcG9uZW50cy9yZWNlbnQtcm93JztcbkB1c2UgJ2NvbXBvbmVudHMvcmV2aWV3LWNhcmQnO1xuQHVzZSAnY29tcG9uZW50cy9yb3V0ZS1yb3cnO1xuQHVzZSAnY29tcG9uZW50cy9zY29yZS1iYWRnZSc7XG5AdXNlICdjb21wb25lbnRzL3Njb3JlLWdsYW5jZSc7XG5AdXNlICdjb21wb25lbnRzL3Njb3JlLWxpc3QnO1xuQHVzZSAnY29tcG9uZW50cy9zY29yZS1tZXRlcic7XG5AdXNlICdjb21wb25lbnRzL3Njb3JlLXBhbmVsJztcbkB1c2UgJ2NvbXBvbmVudHMvc2NvcmUtcmluZyc7XG5AdXNlICdjb21wb25lbnRzL3Njb3JlLXN0cmlwJztcbkB1c2UgJ2NvbXBvbmVudHMvc2VjdGlvbi1oZWFkJztcbkB1c2UgJ2NvbXBvbmVudHMvc2VjdGlvbi1saW5rJztcbkB1c2UgJ2NvbXBvbmVudHMvc2VvLWRvYyc7XG5AdXNlICdjb21wb25lbnRzL3Nlcmllcy1iYXInO1xuQHVzZSAnY29tcG9uZW50cy9zZXJpZXMtaW5kZXgnO1xuQHVzZSAnY29tcG9uZW50cy9zZXJpZXMtbWFya2VyJztcbkB1c2UgJ2NvbXBvbmVudHMvc2VyaWVzLW5leHQnO1xuQHVzZSAnY29tcG9uZW50cy9zZXJpZXMtc3RlcHMnO1xuQHVzZSAnY29tcG9uZW50cy9zZXR1cC1iYW5kJztcbkB1c2UgJ2NvbXBvbmVudHMvc2hhcmUtbGlua3MnO1xuQHVzZSAnY29tcG9uZW50cy9zaGlwbWVudC1saXN0JztcbkB1c2UgJ2NvbXBvbmVudHMvc2l0ZS1zZWFyY2gnO1xuQHVzZSAnY29tcG9uZW50cy9zcGVjLWJ1bGxldHMnO1xuQHVzZSAnY29tcG9uZW50cy9zcGVjLWdyaWQnO1xuQHVzZSAnY29tcG9uZW50cy9zdGFyLXJhdGluZyc7XG5AdXNlICdjb21wb25lbnRzL3N0b3JlLWxheW91dCc7XG5AdXNlICdjb21wb25lbnRzL3N0b3JlLW5hdic7XG5AdXNlICdjb21wb25lbnRzL3N1bW1hcnktdG9nZ2xlJztcbkB1c2UgJ2NvbXBvbmVudHMvdGFnLWNsb3VkJztcbkB1c2UgJ2NvbXBvbmVudHMvdGVybS1jaGlwcyc7XG5AdXNlICdjb21wb25lbnRzL3RydXN0LXJvdyc7XG5AdXNlICdjb21wb25lbnRzL3ZlcmRpY3QtYmFuZCc7XG5AdXNlICdjb21wb25lbnRzL3ZpZGVvLWVtYmVkJztcbkB1c2UgJ2NvbXBvbmVudHMvd2Mtbm90aWNlcyc7XG5AdXNlICdjb21wb25lbnRzL3dpZGdldCc7XG5cblxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXFxcblx0Q09SRSBCTE9DS1Ncblx0VGhlIGRlc2NyaXB0aW9uIHJlZ2lvbiBpcyBhIEd1dGVuYmVyZyBibG9jayBhcmVhIChvcGVyYXRvciwgMjAyNi0wOS0xNiksIHNvXG5cdHRoZXNlIGFyZSBub3Qgb3B0aW9uYWwgZGVjb3JhdGlvbiDigJQgdGhleSBhcmUgd2hhdCAzLDkwNCBwcm9kdWN0IGRlc2NyaXB0aW9uc1xuXHRhcmUgbWFkZSBvZi4gVGVuIHBhcnRpYWxzLCBzY29wZWQgYnkgd2hhdCB0aGUgY2F0YWxvZ3VlIGFjdHVhbGx5IHVzZXMuXG5cblx0VGhpcyBncm91cCBjb21waWxlcyBBRlRFUiBjb21wb25lbnRzLCBkZWxpYmVyYXRlbHk6IHNldmVyYWwgYmxvY2sgcnVsZXMgdGllXG5cdG9uIHNwZWNpZmljaXR5IHdpdGggY29tcG9uZW50IHJ1bGVzIGFuZCBhcmUgbWVhbnQgdG8gd2luIG9uIHNvdXJjZSBvcmRlci5cblxcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbkB1c2UgJ2Jsb2Nrcy93cC1ibG9jay1jb2x1bW5zJztcbkB1c2UgJ2Jsb2Nrcy93cC1ibG9jay1jb3Zlcic7XG5AdXNlICdibG9ja3Mvd3AtYmxvY2stZGV0YWlscyc7XG5AdXNlICdibG9ja3Mvd3AtYmxvY2stZW1iZWQnO1xuQHVzZSAnYmxvY2tzL3dwLWJsb2NrLWdyb3VwJztcbkB1c2UgJ2Jsb2Nrcy93cC1ibG9jay1oZWFkaW5nJztcbkB1c2UgJ2Jsb2Nrcy93cC1ibG9jay1pbWFnZSc7XG5AdXNlICdibG9ja3Mvd3AtYmxvY2stbGlzdCc7XG5AdXNlICdibG9ja3Mvd3AtYmxvY2stbWVkaWEtdGV4dCc7XG5AdXNlICdibG9ja3Mvd3AtYmxvY2stcGFyYWdyYXBoJztcblxuLy8gQXV0aG9yZWQgaW4gdGhlIGVkaXRvciwgc3R5bGVkIGhlcmU6IHRoZSBzdGF0IHJvdyBpbiBhIHByb2R1Y3QgZGVzY3JpcHRpb24uXG5AdXNlICdibG9ja3Mvc3BlYy1waWxscyc7XG5cbi8vIENvbnRlbnQgd2UgZGlkIG5vdCBhdXRob3Ig4oCUIHRoZSBvbGQgc3RvcmUncyBwYWxldHRlIHNsdWdzLlxuQHVzZSAnYmxvY2tzL2xlZ2FjeS11Z3AnO1xuXG5cbjpyb290IHtcblxuXHRAaW5jbHVkZSBicmFuZC10b2tlbi12YXJzO1xuXG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgYWJvdXQtcGFuZWxcbi8vXG4vLyBUaGUgY2xvc2luZyBwYW5lbDogYSBoZWFkaW5nIGFuZCB0d28gc2hvcnQgcGFyYWdyYXBocyBhdCB0aGUgZWRpdG9yaWFsXG4vLyByZWFkaW5nIG1lYXN1cmUsIGNhcnJ5aW5nIGxpbmtzIGludG8gdGhlIHJhbmdlcyBhbmQgdGhlIG1hZ2F6aW5lLlxuLy9cbi8vIEl0IGNsb3NlcyB0aGUgcGFnZSB3aXRoIHByb3NlIHJhdGhlciB0aGFuIGFub3RoZXIgZ3JpZCwgYW5kIGl0cyBsaW5rcyBhcmUgdGhlXG4vLyBsYXN0IHJvdXRlcyBvdXQg4oCUIHdoaWNoIGlzIHdoeSB0aGUgYm9keSBpcyBoZWxkIHRvIGAtLWNvbnRhaW5lci1yZWFkaW5nYFxuLy8gd2hpbGUgdGhlIHBhbmVsIGl0c2VsZiBzcGFucyB0aGUgY29sdW1uLlxuLy9cbi8vIFNvdXJjZTogY2F0YWxvZ3VlIGJsb2NrIGBhYm91dC1wYW5lbGAuIFBvcnRlZCBmb3IgdGhlIE1QRzEgaG9tZXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLmFib3V0LXBhbmVsIHtcblxuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS1jYXJkLXBhZGRpbmcpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0Ym94LXNoYWRvdzogdmFyKC0tc2hhZG93LXBhbmVsKTtcbn1cblxuLmFib3V0LXBhbmVsX190aXRsZSB7XG5cblx0bWFyZ2luOiAwIDAgdmFyKC0tc3BhY2UtNik7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1oMik7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1saWdodCk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtaGVhZGluZyk7XG59XG5cbi5hYm91dC1wYW5lbF9fYm9keSB7XG5cblx0bWF4LXdpZHRoOiB2YXIoLS1jb250YWluZXItcmVhZGluZyk7XG59XG5cbi5hYm91dC1wYW5lbF9fYm9keSBwIHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG4uYWJvdXQtcGFuZWxfX2JvZHkgcCArIHAge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtNCk7XG59XG5cbi5hYm91dC1wYW5lbF9fYm9keSBhIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLmFib3V0LXBhbmVsX19ib2R5IGE6aG92ZXIge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmstaG92ZXIpO1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDkwMHB4ICkge1xuXG5cdC5hYm91dC1wYW5lbF9fdGl0bGUge1xuXG5cdFx0Zm9udC1zaXplOiB2YXIoLS1mcy1oMyk7XG5cdH1cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBhY2NvdW50LWxvZ2luXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE15IEFjY291bnQgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxMykgZm9yIHRoZSBhY2NvdW50IHdhbGssXG4vLyBNUEcxMy4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzIHdoYXQgc2hpcHBlZC5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgYWNjb3VudC1sb2dpblxuICAgVGhlIGxvZ2dlZC1vdXQgZm9ybTogb25lIGNlbnRyZWQgcGFuZWwgYXQgdGhlIHJlYWRpbmcgbWVhc3VyZSDigJQgYSBsb2ctaW5cbiAgIGZvcm0gaXMgdHdvIGZpZWxkcyBhbmQgYSBidXR0b24sIGFuZCBhIHBhbmVsIHNwYW5uaW5nIDE0MDBweCB3b3VsZCBzdHJldGNoXG4gICBpdCBpbnRvIGEgYmFubmVyLiBUaGUgbG9zdC1wYXNzd29yZCBhbmQgcmVzZXQtcGFzc3dvcmQgZm9ybXMgdGFrZSB0aGUgc2FtZVxuICAgZnJhbWUsIHNpbmNlIHRoZXkgYXJlIHRoZSBzYW1lIHNpemUgb2YgdGFzay5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLmFjY291bnQtbG9naW4ge1xuXG5cdG1heC13aWR0aDogdmFyKC0tY29udGFpbmVyLXJlYWRpbmcpO1xuXHRtYXJnaW4taW5saW5lOiBhdXRvO1xufVxuXG4vKiBMb3N0IHlvdXIgcGFzc3dvcmQ/IHNpdHMgb24gdGhlIGJ1dHRvbidzIGxpbmUsIGluc2lkZSB0aGUgYWN0aW9ucyByb3cuICovXG4uYWNjb3VudC1sb2dpbiAuZm9ybS1hY3Rpb25zID4gLmZvcm0tbm90ZSB7XG5cblx0bWFyZ2luOiAwO1xufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGFjY291bnQtb3JkZXJzXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE15IEFjY291bnQgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxMykgZm9yIHRoZSBhY2NvdW50IHdhbGssXG4vLyBNUEcxMy4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzIHdoYXQgc2hpcHBlZC4gRGVwYXJ0dXJlcyBmcm9tIGl0IGFyZVxuLy8gY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIGFjY291bnQtb3JkZXJzICAoTkVXKVxuICAgVGhlIGN1c3RvbWVyJ3Mgb3JkZXJzIGFzIGEgdGFibGU6IE9yZGVyLCBEYXRlLCBTdGF0dXMsIFRvdGFsLCBBY3Rpb25zLiBJdCBpc1xuICAgYnVpbHQgdGhlIHdheSB0aGUgYnJhbmQgYnVpbGRzIGV2ZXJ5IHRhYmxlIOKAlCBzcGVjLXRhYmxlJ3MgY29uc3RydWN0aW9uLCBhXG4gICBQYXJhZ29uLWJsdWUgaGVhZGVyIHJvdyB3aXRoIHdoaXRlIGhlYWRpbmctZm9udCBsYWJlbHMgb3ZlciByb3dzIHN0cmlwZWQgaW5cbiAgIHN0cmlwZSBncmV5IGFuZCBwYW5lbCB3aGl0ZSwgdGhlIHdob2xlIGF0IHRoZSBzdXJmYWNlIHJhZGl1cyDigJQgd2lkZW5lZCB0b1xuICAgZml2ZSBjb2x1bW5zLiBOb3Qgc3BlYy10YWJsZSBpdHNlbGY6IHRoYXQgYmxvY2sgaXMgYSB0d28tY29sdW1uIGF0dHJpYnV0ZVxuICAgbGlzdCB3aXRoIGJvbGQgbmFtZXMsIGFuZCBhbiBvcmRlciByb3cgaXMgbm90IGFuIGF0dHJpYnV0ZS5cblxuICAgVGhlIG9yZGVyIG51bWJlciBpcyBhIGxpbmsuIFRoZSB0b3RhbCBpcyBhIHByaWNlLCBzbyBpdCBzZXRzIGluIHRoZVxuICAgY29tbWVyY2UgZmFjZSwgYm9sZCBhbmQgc2xhbnRlZCwgd2l0aCB0aGUgaXRlbSBjb3VudCBhZnRlciBpdCBpbiBzbGF0ZSBib2R5XG4gICB0ZXh0IOKAlCBXb29Db21tZXJjZSdzIG93biBcIsKjNTIwLjgxIGZvciA0IGl0ZW1zXCIuIEFjdGlvbnMgYXJlIGxpbmstYmx1ZSB0ZXh0LFxuICAgbWVkaXVtIHdlaWdodCwgbmV2ZXIgYnV0dG9uczogZml2ZSByb3dzIG9mIGJsdWUgYnV0dG9ucyB3b3VsZCBzaG91dCBsb3VkZXJcbiAgIHRoYW4gdGhlIG9yZGVycy5cblxuICAgUGhvbmU6IGVhY2ggcm93IGJlY29tZXMgYSBzdGFja2VkIGNhcmQsIGxhYmVsIGJlc2lkZSB2YWx1ZSwgdGhlIGxhYmVsc1xuICAgcmVhZCBmcm9tIFdvb0NvbW1lcmNlJ3Mgb3duIGRhdGEtdGl0bGUgYXR0cmlidXRlIG9uIGVhY2ggY2VsbCwgc28gdGhlXG4gICB0ZW1wbGF0ZSBuZWVkcyBubyBzZWNvbmQgbWFya3VwIGZvciB0aGUgc21hbGwgc2NyZWVuLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4uYWNjb3VudC1vcmRlcnMge1xuXG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmFjY291bnQtb3JkZXJzX190YWJsZSB7XG5cblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG5cdHRleHQtYWxpZ246IGxlZnQ7XG59XG5cbi5hY2NvdW50LW9yZGVyc19faGVhZGluZyB7XG5cblx0cGFkZGluZzogdmFyKC0tc3BhY2UtMykgdmFyKC0tc3BhY2UtNik7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWJyYW5kKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1vbi1icmFuZCk7XG5cdHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5hY2NvdW50LW9yZGVyc19fcm93Om50aC1jaGlsZCggb2RkICkge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsLWFsdCk7XG59XG5cbi5hY2NvdW50LW9yZGVyc19fcm93Om50aC1jaGlsZCggZXZlbiApIHtcblxuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbCk7XG59XG5cbi5hY2NvdW50LW9yZGVyc19fY2VsbCB7XG5cblx0cGFkZGluZzogdmFyKC0tc3BhY2UtNCkgdmFyKC0tc3BhY2UtNik7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xuXHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4uYWNjb3VudC1vcmRlcnNfX251bWJlciB7XG5cblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xuXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cdHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5hY2NvdW50LW9yZGVyc19fbnVtYmVyOmhvdmVyIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rLWhvdmVyKTtcbn1cblxuLyogRWFjaCBwYWNrYWdlJ3Mgb3duIG9yZGVyIG51bWJlciwgdW5kZXIgdGhlIGNoZWNrb3V0J3M6IG9yZGVyIHNwbGl0dGluZyBtYWtlcyBvbmVcbiAgIG9yZGVyIHBlciBwYWNrYWdlIGFuZCB0aGUgbGlzdCBzaG93cyB0aGUgY2hlY2tvdXQgb25jZSwgc28gdGhlc2UgYXJlIGhvdyBhIGN1c3RvbWVyXG4gICBtYXRjaGVzIGEgcGFja2FnZSB0byBpdHMgZGlzcGF0Y2ggZW1haWwuIE5vdCBpbiB0aGUgbW9ja3VwLCB3aGljaCBwcmVkYXRlcyB0aGVcbiAgIGdyb3VwaW5nIChvcGVyYXRvciwgMjAyNi0wOS0yNikuICovXG4uYWNjb3VudC1vcmRlcnNfX3BhY2thZ2VzIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS0xKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbn1cblxuLyogQSBsaW5rIHRoYXQgbmFtZXMgc29tZXRoaW5nIHJhdGhlciB0aGFuIG51bWJlcmluZyBpdCDigJQgYSBwcm9kdWN0IGluIHRoZSBhY2NvdW50J3NcbiAgIHN0b2NrIGFsZXJ0cy4gVGhlIG9yZGVyIG51bWJlcidzIGxpbmsgY29sb3VyIGFuZCB3ZWlnaHQsIGJ1dCBpdCBXUkFQUzogYSBwcm9kdWN0XG4gICBuYW1lIGlzIGxvbmcsIGFuZCB0aGUgb3JkZXIgbnVtYmVyJ3Mgbm93cmFwIHB1c2hlZCB0aGUgcm93J3MgYWN0aW9ucyBvdXQgb2YgdGhlXG4gICB0YWJsZSAocmVmaW5lbWVudCBsaXN0LCAyMDI2LTA5LTI3KS4gKi9cbi5hY2NvdW50LW9yZGVyc19fbGluayB7XG5cblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xuXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5hY2NvdW50LW9yZGVyc19fbGluazpob3ZlciB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtbGluay1ob3Zlcik7XG59XG5cbi5hY2NvdW50LW9yZGVyc19fcHJpY2Uge1xuXG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1jaHJvbWUpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctYm9sZCk7XG5cdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG5cdHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5hY2NvdW50LW9yZGVyc19fY291bnQge1xuXG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG5cdHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5hY2NvdW50LW9yZGVyc19fYWN0aW9ucyB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC13cmFwOiB3cmFwO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpIHZhcigtLXNwYWNlLTYpO1xufVxuXG4uYWNjb3VudC1vcmRlcnNfX2FjdGlvbiB7XG5cblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rKTtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXHR3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4uYWNjb3VudC1vcmRlcnNfX2FjdGlvbjpob3ZlciB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtbGluay1ob3Zlcik7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LmFjY291bnQtb3JkZXJzX190YWJsZSxcblx0LmFjY291bnQtb3JkZXJzX19ib2R5LFxuXHQuYWNjb3VudC1vcmRlcnNfX3Jvdyxcblx0LmFjY291bnQtb3JkZXJzX19jZWxsIHtcblxuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdHdpZHRoOiAxMDAlO1xuXHR9XG5cblx0LyogVGhlIGNvbHVtbiBsYWJlbHMgbW92ZSBpbnRvIGVhY2ggY2VsbDsgdGhlIGJsdWUgYmFyIHdvdWxkIGxhYmVsIG5vdGhpbmcuICovXG5cdC5hY2NvdW50LW9yZGVyc19faGVhZCB7XG5cblx0XHRkaXNwbGF5OiBub25lO1xuXHR9XG5cblx0LmFjY291bnQtb3JkZXJzX19yb3cge1xuXG5cdFx0cGFkZGluZy1ibG9jazogdmFyKC0tc3BhY2UtMyk7XG5cdH1cblxuXHQuYWNjb3VudC1vcmRlcnNfX2NlbGwge1xuXG5cdFx0ZGlzcGxheTogZmxleDtcblx0XHRhbGlnbi1pdGVtczogYmFzZWxpbmU7XG5cdFx0anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuXHRcdGdhcDogdmFyKC0tc3BhY2UtNCk7XG5cdFx0cGFkZGluZzogdmFyKC0tc3BhY2UtMikgdmFyKC0tc3BhY2UtNCk7XG5cdFx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdFx0dGV4dC1hbGlnbjogZW5kO1xuXHR9XG5cblx0LmFjY291bnQtb3JkZXJzX19jZWxsOjpiZWZvcmUge1xuXG5cdFx0Y29udGVudDogYXR0ciggZGF0YS10aXRsZSApO1xuXHRcdGZsZXg6IDAgMCBhdXRvO1xuXHRcdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0XHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0XHRjb2xvcjogdmFyKC0tdGV4dC1oZWFkaW5nKTtcblx0XHR0ZXh0LWFsaWduOiBzdGFydDtcblx0fVxuXG5cdC5hY2NvdW50LW9yZGVyc19fYWN0aW9ucyB7XG5cblx0XHRqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuXHR9XG5cblx0LmFjY291bnQtb3JkZXJzX19hY3Rpb24ge1xuXG5cdFx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdH1cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBhY2NvdW50LXN3aXRjaFxuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBNeSBBY2NvdW50IG1vY2t1cCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTMpIGZvciB0aGUgYWNjb3VudCB3YWxrLFxuLy8gTVBHMTMuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpcyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmVcbi8vIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBhY2NvdW50LXN3aXRjaCAgKE5FVylcbiAgIFRoZSBhY2NvdW50IG1lbnUgYXQgcGhvbmUgd2lkdGg6IG9uZSBzZWxlY3Qtc3R5bGUgY29udHJvbCBhdCB0aGUgdG9wIG9mIHRoZVxuICAgY29udGVudCDigJQgXCJEYXNoYm9hcmRcIiB3aXRoIHRoZSBicmFuZCdzIGNoZXZyb24g4oCUIGluc3RlYWQgb2YgbmluZSBsaW5rc1xuICAgc3RhY2tlZCBhYm92ZSBldmVyeSBwYWdlLiBJdCBpcyBhIHJlYWwgYGRldGFpbHNgIGFuZCBgc3VtbWFyeWAsIHRoZSBzYW1lXG4gICBkaXNjbG9zdXJlIHN0b3JlLW5hdiBzZXR0bGVkLCBzbyBpdCB3b3JrcyB3aXRoIG5vIHNjcmlwdC5cblxuICAgQ2xvc2VkLCBpdCBpcyB0aGUgYnJhbmQncyBzZWxlY3QgZXhhY3RseTogc3F1YXJlLCBoYWlybGluZSBib3JkZXIsIHBhbmVsXG4gICB3aGl0ZSwgdGhlIGVuZHBvaW50J3MgbmFtZSBpbiBib2R5IHRleHQgYW5kIHRoZSBQYXJhZ29uLWJsdWUgY2hldnJvbiBhdCB0aGVcbiAgIHJpZ2h0LiBPcGVuLCB0aGUgY29udHJvbCB0YWtlcyB0aGUgZm9jdXMgYm9yZGVyIGFuZCB0aGUgY2hldnJvbiB0dXJucyB1cCxcbiAgIGFuZCB0aGUgbmluZSBzZWN0aW9ucyBkcm9wIGJlbmVhdGggaXQgYXMgYSBwYW5lbC13aGl0ZSBjb3VudC1saXN0IGF0IHRoZVxuICAgc3VyZmFjZSByYWRpdXMg4oCUIHRoZSBzaWRlYmFyJ3Mgb3duIGxpc3QsIGN1cnJlbnQgaXRlbSBtYXJrZWQgdGhlIHNhbWUgd2F5LFxuICAgc28gdGhlIG1lbnUgaXMgb25lIGNvbnN0cnVjdGlvbiBhdCBldmVyeSB3aWR0aC5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLmFjY291bnQtc3dpdGNoIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xufVxuXG4vKiBERVBBUlRVUkU6IHRoZSBsYWJlbCdzIDhweCBib3R0b20gbWFyZ2luIGlzIHRoZSBibG9jaydzIGdhcCBpbnN0ZWFkLCBzbyB0aGUgYmxvY2tcbiAgIHJvb3QgY2FycmllcyBhIHJ1bGUgb2YgaXRzIG93biByYXRoZXIgdGhhbiBiZWluZyBhIG5hbWUgbm90aGluZyBkZWNsYXJlcy4gU2FtZVxuICAgZ2VvbWV0cnkuICovXG4uYWNjb3VudC1zd2l0Y2hfX2xhYmVsIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1oZWFkaW5nKTtcbn1cblxuLmFjY291bnQtc3dpdGNoX19jb250cm9sIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTMpO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItaW5wdXQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtaW5wdXQpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1pbnB1dCk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xuXHRsaXN0LXN0eWxlOiBub25lO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi8qIFRoZSBlbmRwb2ludCdzIG5hbWUuIE5vdCBzdHlsZWQgaW4gdGhlIG1vY2t1cCwgd2hpY2ggb25seSBldmVyIGRyZXcgXCJEYXNoYm9hcmRcIjtcbiAgIHRoZSBsb25nZXN0IHNlY3Rpb24gbmFtZSBoYXMgdG8gaG9sZCBvbmUgbGluZSBiZXNpZGUgdGhlIGNoZXZyb24gYXQgMzIwcHgsIHNvIGl0XG4gICB0cnVuY2F0ZXMgcmF0aGVyIHRoYW4gd3JhcHBpbmcgdGhlIGNvbnRyb2wgdG8gdHdvIGxpbmVzICh3YWxrLWJhY2ssIE1QRzEzKS4gKi9cbi5hY2NvdW50LXN3aXRjaF9fY3VycmVudCB7XG5cblx0bWluLXdpZHRoOiAwO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHR0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcblx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLmFjY291bnQtc3dpdGNoX19jb250cm9sOjotd2Via2l0LWRldGFpbHMtbWFya2VyIHtcblxuXHRkaXNwbGF5OiBub25lO1xufVxuXG4uYWNjb3VudC1zd2l0Y2hfX2NvbnRyb2w6Om1hcmtlciB7XG5cblx0Y29udGVudDogXCJcIjtcbn1cblxuLmFjY291bnQtc3dpdGNoX19jb250cm9sOmZvY3VzLXZpc2libGUge1xuXG5cdGJvcmRlci1jb2xvcjogdmFyKC0tYm9yZGVyLWZvY3VzKTtcblx0b3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWJvcmRlci1mb2N1cyk7XG5cdG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XG5cbi5hY2NvdW50LXN3aXRjaF9fbWVudVtvcGVuXSAuYWNjb3VudC1zd2l0Y2hfX2NvbnRyb2wge1xuXG5cdGJvcmRlci1jb2xvcjogdmFyKC0tYm9yZGVyLWZvY3VzKTtcbn1cblxuLmFjY291bnQtc3dpdGNoX19jaGV2cm9uIHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0d2lkdGg6IDE0cHg7XG5cdGhlaWdodDogMTRweDtcblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xuXHR0cmFuc2Zvcm06IHJvdGF0ZSggOTBkZWcgKTtcbn1cblxuLmFjY291bnQtc3dpdGNoX19tZW51W29wZW5dIC5hY2NvdW50LXN3aXRjaF9fY2hldnJvbiB7XG5cblx0dHJhbnNmb3JtOiByb3RhdGUoIC05MGRlZyApO1xufVxuXG4uYWNjb3VudC1zd2l0Y2hfX3BhbmVsIHtcblxuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTIpO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGFjY291bnQtdGlsZVxuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBNeSBBY2NvdW50IG1vY2t1cCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTMpIGZvciB0aGUgYWNjb3VudCB3YWxrLFxuLy8gTVBHMTMuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpcyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmVcbi8vIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuLy9cbi8vIERFUEFSVFVSRSDigJQgVEhFIENPTlRBSU5FUiBJUyBUSEUgR0xPQkFMIEdSSUQuIFRoZSBtb2NrdXAgKGFuZCBpdHMgaGFydmVzdGVkIGNhdGFsb2d1ZVxuLy8gYmxvY2spIGNhbGxzIHRoaXMgYGFjY291bnQtdGlsZXNgLCBhIGxpc3QgdGhhdCBsYXlzIGl0c2VsZiBvdXQgdGhyZWUgLyB0d28gLyBvbmUgYWNyb3NzLlxuLy8gVGhhdCBpcyBgLmdyaWQuZ3JpZC0tM2AgaW5zaWRlIHRoZSBzdG9yZSBjb2x1bW4sIHdoaWNoIGFscmVhZHkgc3RlcHMgMyDihpIgMiBhdCAxMTAwcHgg4oaSXG4vLyAxIGF0IDY0MHB4IChsYXlvdXRzL19ncmlkLnNjc3MpIOKAlCB0aGUgbW9ja3VwJ3Mgb3duIGJyZWFrcG9pbnRzLiBTbyB0aGUgbGlzdCBpcyB0aGUgZ3JpZFxuLy8gYW5kIHRoaXMgYmxvY2sgaXMgdGhlIHRpbGUgYWxvbmUgKG9wZXJhdG9yLCBNUEcxMyBjaGVja3BvaW50IDIpLiBUaGUgcGhvbmUncyB0aWdodGVyXG4vLyAxNnB4IGdhcCBpcyBub3QgY2FycmllZDogdGhlIGdyaWQncyBvd24gZ2FwIGhvbGRzIGF0IGV2ZXJ5IHdpZHRoLCBhcyBpdCBkb2VzIG9uIGV2ZXJ5XG4vLyBvdGhlciBncmlkIGluIHRoZSBzdG9yZSBjb2x1bW4uXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIGFjY291bnQtdGlsZSAgKE5FVylcbiAgIFRoZSBkYXNoYm9hcmQncyB3YXkgaW50byB0aGUgYWNjb3VudDogb25lIHBsYWluIHBhbmVsLXdoaXRlIHRpbGUgcGVyXG4gICBzZWN0aW9uIHRoYXQgbWF0dGVycyBtb3N0LiBOb3RoaW5nIGluIHRoZSBjYXRhbG9ndWUgZml0cyDigJQgY2F0ZWdvcnktdGlsZSBpc1xuICAgcGhvdG9ncmFwaGljIGFuZCByYW5nZS1jYXJkIGNhcnJpZXMgYSBwcm9kdWN0IGNvdW50IOKAlCBzbyB0aGlzIGlzIG5ldy5cblxuICAgQSB0aWxlIGlzIGEgbGluayBvbiBhIHBhbmVsOiBhIFBhcmFnb24tYmx1ZSBvdXRsaW5lIGljb24gb24gdGhlIGxlZnQsIHRoZVxuICAgc2VjdGlvbiBuYW1lIGluIHRoZSBoZWFkaW5nIGZvbnQgYXQgdGhlIHNtYWxsLXRpdGxlIHNpemUgd2l0aCB0aGUgYnJhbmQnc1xuICAgdHJhaWxpbmcgY2hldnJvbiwgYW5kIG9uZSBzbGF0ZSBsaW5lIHNheWluZyB3aGF0IHRoZSBzZWN0aW9uIGhvbGRzLiBIb3ZlclxuICAgaXMgdGhlIGJyYW5kJ3MgbmF2aWdhdGlvbiB3YXNoIOKAlCB0aGUgc2FtZSBibHVlIHRpbnQgY291bnQtbGlzdCBnaXZlcyBhIHJvdyDigJRcbiAgIGFuZCB0aGUgbmFtZSB0YWtlcyB0aGUgbGluayBibHVlLiBObyBzaGFkb3csIG5vIGxpZnQ6IHRoaXMgYnJhbmQgaXMgZmxhdC5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLmFjY291bnQtdGlsZSB7XG5cblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAzMnB4IG1pbm1heCggMCwgMWZyICk7XG5cdGFsaWduLWl0ZW1zOiBzdGFydDtcblx0Z2FwOiB2YXIoLS1zcGFjZS00KTtcblx0aGVpZ2h0OiAxMDAlO1xuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS02KTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2FyZCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0Ym94LXNoYWRvdzogdmFyKC0tc2hhZG93LWNhcmQpO1xuXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5hY2NvdW50LXRpbGU6aG92ZXIge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWNhcmQtaG92ZXIpO1xufVxuXG4uYWNjb3VudC10aWxlOmZvY3VzLXZpc2libGUge1xuXG5cdG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItZm9jdXMpO1xuXHRvdXRsaW5lLW9mZnNldDogMnB4O1xufVxuXG4uYWNjb3VudC10aWxlX19pY29uIHtcblxuXHR3aWR0aDogMzJweDtcblx0aGVpZ2h0OiAzMnB4O1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG59XG5cbi5hY2NvdW50LXRpbGVfX2ljb24gc3ZnIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdGhlaWdodDogMTAwJTtcbn1cblxuLmFjY291bnQtdGlsZV9fYm9keSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKTtcblx0bWluLXdpZHRoOiAwO1xufVxuXG4uYWNjb3VudC10aWxlX19uYW1lIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1oNCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWhlYWRpbmcpO1xufVxuXG4uYWNjb3VudC10aWxlX19jaGV2cm9uIHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0d2lkdGg6IDE0cHg7XG5cdGhlaWdodDogMTRweDtcblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xufVxuXG4uYWNjb3VudC10aWxlOmhvdmVyIC5hY2NvdW50LXRpbGVfX25hbWUge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xufVxuXG4uYWNjb3VudC10aWxlX190ZXh0IHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LmFjY291bnQtdGlsZSB7XG5cblx0XHRwYWRkaW5nOiB2YXIoLS1zcGFjZS00KTtcblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGFkZHJlc3MtY2FyZFxuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBvcmRlciBjb25maXJtYXRpb24gbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxMiwgb3BlcmF0b3ItYWNjZXB0ZWRcbi8vIDIwMjYtMDktMjQpIGZvciB0aGUgY29uZmlybWF0aW9uIHdhbGssIE1QRzEyLiBUaGUgbW9ja3VwJ3MgcnVsZXMgYXJlIHRoZSBkZXNpZ247IHRoaXMgaXNcbi8vIHdoYXQgc2hpcHBlZC4gRGVwYXJ0dXJlcyBmcm9tIGl0IGFyZSBjb21tZW50ZWQgd2hlcmUgdGhleSBvY2N1ci5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgYWRkcmVzcy1jYXJkICAoTkVXKVxuICAgQSBwb3N0YWwgYWRkcmVzcyByZWFkIGJhY2sgdG8gdGhlIHNob3BwZXI6IHRoZSBuYW1lIGF0IG1lZGl1bSB3ZWlnaHQgYXMgYW5cbiAgIGFkZHJlc3MgbGFiZWwgbGVhZHMsIHRoZW4gdGhlIGxpbmVzIGluIGJvZHkgdGV4dC4gTm90IGFuIGluc2V0IOKAlCBvbiB0aGlzXG4gICBwYWdlIGl0IGlzIHRoZSBmaXJzdCB0aGluZyBpbiBpdHMgbGFiZWxsZWQgcGFuZWwsIG5vdCBhIHZhbHVlIHNpdHRpbmcgaW5zaWRlXG4gICBhIGZvcm0uIFRoZSBibG9jayBjYXJyaWVzIHRoZSBnYXAgYmVuZWF0aCBpdCwgYmVjYXVzZSB3aGF0IGZvbGxvd3MgaXQgKHRoZVxuICAgcGFja2FnZSByb3dzKSBhbHdheXMgbmVlZHMgb25lLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4uYWRkcmVzcy1jYXJkIHtcblxuXHRtYXJnaW46IDAgMCB2YXIoLS1zcGFjZS02KTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXN0eWxlOiBub3JtYWw7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcbn1cblxuLmFkZHJlc3MtY2FyZF9fbmFtZSB7XG5cblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgYWRkcmVzcy1sb29rdXBcbi8vXG4vLyBQb3J0ZWQgZnJvbSB0aGUgY2hlY2tvdXQgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxMSwgb3BlcmF0b3ItYWNjZXB0ZWRcbi8vIDIwMjYtMDktMjMpIGZvciB0aGUgY2hlY2tvdXQgd2FsaywgTVBHMTEuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBhZGRyZXNzLWxvb2t1cCAgKE5FVylcbiAgIFRoZSBkZWxpdmVyeSBhZGRyZXNzIGZvdW5kIGZyb20gdGhlIHBvc3Rjb2RlLCB0aGUgZGVmYXVsdCB3YXkgaW4uIFRocmVlXG4gICBzaGFwZXMgc3RhY2tlZCwgYWxsIG9mIHRoZW0gdGhlIGZvcm0gc3BlY2ltZW4ncyBvd246IHRoZSBQb3N0Y29kZSBmaWVsZCBhbmRcbiAgIEZpbmQgYWRkcmVzcyBidXR0b24gYXMgYW4gaW5saW5lLWZvcm07IHRoZSBhZGRyZXNzZXMgYXQgdGhhdCBwb3N0Y29kZSBpbiBhXG4gICBmaWVsZCBzZWxlY3Q7IGFuZCwgb25jZSBvbmUgaXMgY2hvc2VuLCB0aGUgYWRkcmVzcyBpdHNlbGYgYXMgYSBjb21wYWN0XG4gICBmaWxsZWQgYmxvY2sgd2l0aCBFZGl0LiBBIHF1aWV0IGZvcm0tbm90ZSBsaW5rIGJlbmVhdGggb3BlbnMgdGhlIGZ1bGxcbiAgIG1hbnVhbCBmaWVsZHMgZm9yIGFuIGFkZHJlc3MgdGhlIGxvb2t1cCBkb2VzIG5vdCBrbm93LlxuXG4gICBUaGUgY2hvc2VuIGJsb2NrIGlzIGFuIGluc2V0IHJhdGhlciB0aGFuIGEgY2FyZCDigJQgc3RyaXBlIGdyZXkgd2l0aCB0aGVcbiAgIGhhaXJsaW5lIGF0IHRoZSBzdXJmYWNlIHJhZGl1cyDigJQgYmVjYXVzZSBpdCBpcyBhIHZhbHVlIHRoZSBzaG9wcGVyIGhhc1xuICAgZ2l2ZW4sIHNpdHRpbmcgaW5zaWRlIGEgY2FyZCwgbm90IGEgbmV3IHN1cmZhY2UuIFRoZSBuYW1lIGxlYWRzIGF0IG1lZGl1bVxuICAgd2VpZ2h0LCBhcyBhbiBhZGRyZXNzIGxhYmVsIGRvZXMuXG5cbiAgIFRoZSBibG9jayBvd25zIHRoZSBnYXAgYmV0d2VlbiBpdHMgcGFydHMsIHNvIHRoZSBpbmxpbmUtZm9ybSdzIG93biB0b3BcbiAgIG1hcmdpbiAoc2V0IGZvciB3aGVuIGl0IGZvbGxvd3MgYSBiYXNrZXQncyBpdGVtcykgaXMgaGFuZGVkIGJhY2suXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi5hZGRyZXNzLWxvb2t1cCA+ICoge1xuXG5cdG1hcmdpbi1ibG9jazogMDtcbn1cblxuLmFkZHJlc3MtbG9va3VwID4gKiArICoge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtNCk7XG59XG5cbi8qIFRoZSBGaW5kIGFkZHJlc3MgYnV0dG9uIHN0YXlzIGxldmVsIHdpdGggdGhlIHBvc3Rjb2RlIGJveCB3aGF0ZXZlciBzaXRzIHVuZGVyXG4gICB0aGUgZmllbGQg4oCUIHRoZSBpbmxpbmUgcm93IGFsaWducyB0byBpdHMgYm90dG9tIGVkZ2UsIHdoaWNoIGluIHRoZSBlcnJvciBzdGF0ZSBpc1xuICAgdGhlIGVycm9yIG1lc3NhZ2UgKG9wZXJhdG9yIHJldmlldyBvZiBNUEcxMSkuIE9mZnNldCBieSBleGFjdGx5IG9uZSBsYWJlbCdzIGhlaWdodFxuICAgaW5zdGVhZDsgb24gcGhvbmVzIHRoZSByb3cgc3RhY2tzIGFuZCBuZWVkcyBubyBvZmZzZXQuICovXG4uYWRkcmVzcy1sb29rdXAgLmlubGluZS1mb3JtX19yb3cge1xuXG5cdGFsaWduLWl0ZW1zOiBzdGFydDtcbn1cblxuQG1lZGlhICggbWluLXdpZHRoOiA2NDFweCApIHtcblxuXHQuYWRkcmVzcy1sb29rdXAgLmlubGluZS1mb3JtX19hY3Rpb24ge1xuXG5cdFx0cGFkZGluZy1ibG9jay1zdGFydDogY2FsYyggdmFyKC0tZnMtc21hbGwpICogdmFyKC0tbGgtaGVhZGluZykgKyB2YXIoLS1zcGFjZS0yKSApO1xuXHR9XG59XG5cbi5hZGRyZXNzLWxvb2t1cF9fY2hvc2VuIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblx0anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuXHRnYXA6IHZhcigtLXNwYWNlLTQpO1xuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS00KSB2YXIoLS1zcGFjZS02KTtcblx0Ym9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtY2FyZCk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsLWFsdCk7XG59XG5cbi5hZGRyZXNzLWxvb2t1cF9fYWRkcmVzcyB7XG5cblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtc3R5bGU6IG5vcm1hbDtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG4uYWRkcmVzcy1sb29rdXBfX25hbWUge1xuXG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xufVxuXG4uYWRkcmVzcy1sb29rdXBfX2VkaXQge1xuXG5cdGFwcGVhcmFuY2U6IG5vbmU7XG5cdC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcblx0ZmxleDogMCAwIGF1dG87XG5cdG1hcmdpbjogMDtcblx0cGFkZGluZzogMDtcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiBub25lO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5hZGRyZXNzLWxvb2t1cF9fZWRpdDpob3ZlciB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtbGluay1ob3Zlcik7XG59XG5cbi5hZGRyZXNzLWxvb2t1cF9fZWRpdDpmb2N1cy12aXNpYmxlIHtcblxuXHRvdXRsaW5lOiAycHggc29saWQgdmFyKC0tYm9yZGVyLWZvY3VzKTtcblx0b3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuYWRkcmVzcy1sb29rdXBfX2Nob3NlbiB7XG5cblx0XHRwYWRkaW5nOiB2YXIoLS1zcGFjZS00KTtcblx0fVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIElERUFMIFBPU1RDT0RFUycgQUREUkVTUyBGSU5ERVIgKGNoZWNrb3V0IHdpcmluZywgTVBHMTEpLiBBdXRvY29tcGxldGUgaW4gdGhlXG4gICBwbHVnaW4ncyBzZXBhcmF0ZS1maW5kZXIgbW9kZSAob3BlcmF0b3IsIDIwMjYtMDktMjUpOiBwLmZvcm0tcm93LmlkcGMtZmluZGVyXG4gICBhYm92ZSB0aGUgYWRkcmVzcywgdGhlIHN0cmVldCBmaWVsZHMgaGlkZGVuIHVudGlsIGFuIGFkZHJlc3MgaXMgY2hvc2VuLCB0aGVuXG4gICBmb2xkZWQgaW50byBgYWRkcmVzcy1sb29rdXBfX2Nob3NlbmAgd2l0aCBFZGl0IGJ5IHRoZSBwYXJlbnQncyBXb29Db21tZXJjZSBtb2R1bGVcbiAgIChhZGRyZXNzRmluZGVyU3VtbWFyeSkuIFRoZSBmaW5kZXIncyBsYWJlbCBhbmQgYm94IHRha2UgdGhlIGJyYW5kIGZpZWxkIHJ1bGVzXG4gICAoX2ZpZWxkLnNjc3MpOyBpdHMgc3VnZ2VzdGlvbiBsaXN0IGlzIGRyZXNzZWQgaGVyZS4gVGhlIHBvc3Rjb2RlLWFuZC1idXR0b25cbiAgIGxvb2t1cCB0aGUgbW9ja3VwIGRyZXcgaXMgb2ZmIOKAlCBhdXRvY29tcGxldGUgcmVwbGFjZXMgaXQuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi5pZHBjLWZpbmRlciB7XG5cblx0Z3JpZC1jb2x1bW46IDEgLyAtMTtcblx0bWFyZ2luOiAwO1xufVxuXG4uaWRwYy1maW5kZXIgLmlkcGNfYWYge1xuXG5cdHotaW5kZXg6IDMwO1xuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTEpO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xuXHRib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5pZHBjLWZpbmRlciAuaWRwY191bCB7XG5cblx0bWFyZ2luOiAwO1xuXHRwYWRkaW5nOiAwO1xuXHRsaXN0LXN0eWxlOiBub25lO1xufVxuXG4uaWRwYy1maW5kZXIgLmlkcGNfdWwgbGkge1xuXG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTMpIHZhcigtLXNwYWNlLTQpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG5cdGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmlkcGMtZmluZGVyIC5pZHBjX3VsIGxpICsgbGkge1xuXG5cdGJvcmRlci1ibG9jay1zdGFydDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcbn1cblxuLmlkcGMtZmluZGVyIC5pZHBjX3VsIGxpOmhvdmVyLFxuLmlkcGMtZmluZGVyIC5pZHBjX3VsIGxpW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdIHtcblxuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1icmFuZC1zb2Z0KTtcbn1cblxuLmlkcGMtbWFudWFsLWVudHJ5LWxpbmsge1xuXG5cdGdyaWQtY29sdW1uOiAxIC8gLTE7XG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1ib2R5KTtcblx0Y29sb3I6IHZhcigtLXRleHQtbGluayk7XG5cdGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmlkcGMtbWFudWFsLWVudHJ5LWxpbms6aG92ZXIge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmstaG92ZXIpO1xufVxuXG4uYWRkcmVzcy1sb29rdXBfX2Nob3NlbiB7XG5cblx0Z3JpZC1jb2x1bW46IDEgLyAtMTtcbn1cblxuLyogLS1mb2xkZWQ6IHRoZSBhZGRyZXNzIGdyaWQgb25jZSBhbiBhZGRyZXNzIGlzIGNob3NlbiDigJQgdGhlIHN0cmVldCByb3dzIGZvbGQgaW50b1xuICAgdGhlIGNob3NlbiBibG9jayAocGFyZW50IFdvb0NvbW1lcmNlIG1vZHVsZSwgYWRkcmVzc0ZpbmRlclN1bW1hcnkpLiBUaGUgcGx1Z2luIGFuZFxuICAgV29vQ29tbWVyY2UncyBhZGRyZXNzIHNjcmlwdCBib3RoIHNldCB0aGVzZSByb3dzJyBpbmxpbmUgZGlzcGxheSBhZnRlciBhIHBpY2ssIHNvXG4gICB0aGUgZm9sZCBob2xkcyB3aXRoICFpbXBvcnRhbnQgZm9yIGFzIGxvbmcgYXMgdGhlIGNsYXNzIGlzIG9uLiBFZGl0IHJlbW92ZXMgaXQuICovXG4uYWRkcmVzcy1sb29rdXAtLWZvbGRlZCA+IC5hZGRyZXNzLWZpZWxkOm5vdCggW2lkJD1cIl9jb3VudHJ5X2ZpZWxkXCJdICksXG4uYWRkcmVzcy1sb29rdXAtLWZvbGRlZCAuaWRwYy1tYW51YWwtZW50cnktbGluayB7XG5cblx0ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgYXBwbGllZC1jb2RlXG4vL1xuLy8gUG9ydGVkIGZyb20gY2F0YWxvZ3VlIGJsb2NrIGBhcHBsaWVkLWNvZGVgIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxMCwgb3BlcmF0b3ItYWNjZXB0ZWRcbi8vIDIwMjYtMDktMjQpIGZvciB0aGUgYmFza2V0IHdhbGssIE1QRzEwLiBUaGUgY2F0YWxvZ3VlIHJvdyBpcyB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIGFwcGxpZWQtY29kZSAgKE5FVylcbiAgIEEgZGlzY291bnQgY29kZSB0aGF0IGhhcyBiZWVuIGFjY2VwdGVkLCBzaG93biBhcyBhIHJlbW92YWJsZSBjaGlwIGJlbmVhdGggdGhlXG4gICBjb2RlIGZpZWxkLiBBIGNoaXAgaXMgYSBjb250cm9sLCBzbyBpdCBpcyBzcXVhcmU7IGl0IGNhcnJpZXMgdGhlIGJyYW5kJ3NcbiAgIG91dGxpbmUgYW5kIHdhc2ggc28gaXQgcmVhZHMgYXMgXCJ5b3VycywgYW5kIGxpdmVcIiB3aXRob3V0IGJvcnJvd2luZyB0aGVcbiAgIGdyZWVuLCB3aGljaCB0aGlzIGJyYW5kIGtlZXBzIGZvciBjb25maXJtYXRpb25zLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4uYXBwbGllZC1jb2RlIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LXdyYXA6IHdyYXA7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdG1hcmdpbjogdmFyKC0tc3BhY2UtNCkgMCAwO1xufVxuXG4uYXBwbGllZC1jb2RlX19sYWJlbCB7XG5cblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtaGVhZGluZyk7XG59XG5cbi5hcHBsaWVkLWNvZGVfX2NoaXAge1xuXG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTMpO1xuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS0xKSB2YXIoLS1zcGFjZS0xKSB2YXIoLS1zcGFjZS0xKSB2YXIoLS1zcGFjZS0zKTtcblx0Ym9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWJyYW5kKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWJ0bik7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWNhcmQtaG92ZXIpO1xufVxuXG4uYXBwbGllZC1jb2RlX19jb2RlIHtcblxuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRsZXR0ZXItc3BhY2luZzogMC4wNmVtO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcbn1cblxuLmFwcGxpZWQtY29kZV9fcmVtb3ZlIHtcblxuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdHdpZHRoOiAyOHB4O1xuXHRoZWlnaHQ6IDI4cHg7XG5cdHBhZGRpbmc6IDA7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWJ0bik7XG5cdGJhY2tncm91bmQ6IG5vbmU7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJyYW5kKTtcblx0Y3Vyc29yOiBwb2ludGVyO1xufVxuXG4uYXBwbGllZC1jb2RlX19yZW1vdmU6aG92ZXIge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsKTtcbn1cblxuLmFwcGxpZWQtY29kZV9fcmVtb3ZlIHN2ZyB7XG5cblx0d2lkdGg6IDEycHg7XG5cdGhlaWdodDogMTJweDtcbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBhcmNoaXZlLWZsb3dcbi8vXG4vLyBQb3J0ZWQgZnJvbSB0aGUgTWFnYXppbmUgU2VjdGlvbiBMYW5kaW5nIG1vY2t1cCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTUsIG9wZXJhdG9yLVxuLy8gYXBwcm92ZWQgMjAyNi0wOS0yOCkgZm9yIHRoZSBzZWN0aW9uIGxhbmRpbmcgd2FsaywgTVBHMTUuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlXG4vLyBkZXNpZ247IHRoaXMgaXMgd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG5cblxuLmFyY2hpdmUtZmxvdyB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0Z2FwOiB2YXIoLS1zcGFjZS1jb250ZW50LWdhcCk7XG5cdG1pbi13aWR0aDogMDtcblxufVxuXG4uYXJjaGl2ZS1mbG93X19saXN0IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLWNvbnRlbnQtZ2FwKTtcblx0bWFyZ2luOiAwO1xuXHRwYWRkaW5nOiAwO1xuXG59XG5cbi5hcmNoaXZlLWZsb3dfX3Bob25lIHtcblxuXHRkaXNwbGF5OiBub25lO1xuXG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogMTEwMHB4ICkge1xuXG5cdC5hcmNoaXZlLWZsb3dfX3Bob25lIHtcblxuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXG5cdH1cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuYXJjaGl2ZS1mbG93LFxuXHQuYXJjaGl2ZS1mbG93X19saXN0IHtcblxuXHRcdGdhcDogdmFyKC0tc3BhY2UtNik7XG5cblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGFyY2hpdmUtaGVhZGVyXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE1hZ2F6aW5lIFNlY3Rpb24gTGFuZGluZyBtb2NrdXAgKGRlc2lnbiBvZiByZWNvcmQ6IE1QRzE1LCBvcGVyYXRvci1cbi8vIGFwcHJvdmVkIDIwMjYtMDktMjgpIGZvciB0aGUgc2VjdGlvbiBsYW5kaW5nIHdhbGssIE1QRzE1LiBUaGUgbW9ja3VwJ3MgcnVsZXMgYXJlIHRoZVxuLy8gZGVzaWduOyB0aGlzIGlzIHdoYXQgc2hpcHBlZC4gRGVwYXJ0dXJlcyBmcm9tIGl0IGFyZSBjb21tZW50ZWQgd2hlcmUgdGhleSBvY2N1ci5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgYXJjaGl2ZS1oZWFkZXIgIChSRVVTRUQsIHZlcmJhdGltKVxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi5hcmNoaXZlLWhlYWRlciB7XG5cblx0bWF4LXdpZHRoOiB2YXIoLS1jb250YWluZXItcmVhZGluZyk7XG5cbn1cblxuLmFyY2hpdmUtaGVhZGVyX19zdGFuZGZpcnN0IHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5LWxnKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LWxpZ2h0KTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblxufVxuXG4uYXJjaGl2ZS1oZWFkZXJfX2NvdW50IHtcblxuXHRtYXJnaW46IHZhcigtLXNwYWNlLTMpIDAgMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcblxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGFydGljbGUtY2FyZFxuLy9cbi8vIEEgbWFnYXppbmUgY2FyZDogbGVhZCBpbWFnZSwgYSBzbWFsbCBQYXJhZ29uLWJsdWUga2lja2VyIG5hbWluZyB0aGUgc2VjdGlvbixcbi8vIHRoZSB0aXRsZSBpbiB0aGUgaGVhZGluZyBmYWNlIHNldCBsaWdodCwgYW5kIHRoZSBkYXRlLiBBIHJldmlldyBhbHNvIGNhcnJpZXNcbi8vIGl0cyBgc2NvcmUtcmluZ2Agb3ZlciB0aGUgaW1hZ2UuXG4vL1xuLy8gVGhlIG1hZ2F6aW5lIGlzIGhhbGYgb2Ygd2hhdCB0aGlzIHNpdGUgaXMg4oCUIDQ2MCBwb3N0cyBhY3Jvc3MgbmV3cywgcmV2aWV3c1xuLy8gYW5kIGZlYXR1cmVzIGNhbWUgb3ZlciB3aXRoIHRoZSBtaWdyYXRpb24g4oCUIHNvIGl0cyBjYXJkcyBhcmUgYSBzdG9yZS1zdXJmYWNlXG4vLyBjb21wb25lbnQsIG5vdCBlZGl0b3JpYWwgZGVjb3JhdGlvbi5cbi8vXG4vLyBEaXN0aW5jdCBmcm9tIGBwcm9kdWN0LWNhcmRgOiBubyBwcmljZSwgbm8gc3RvY2ssIG5vIGJ1eSBhY3Rpb24uXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYGFydGljbGUtY2FyZGAuIFBvcnRlZCBmb3IgdGhlIE1QRzEgaG9tZXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLmFydGljbGUtY2FyZCB7XG5cblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jYXJkKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHRib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctY2FyZCk7XG59XG5cbi5hcnRpY2xlLWNhcmRfX21lZGlhIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdGFzcGVjdC1yYXRpbzogMTYgLyA5O1xuXHRvYmplY3QtZml0OiBjb3Zlcjtcbn1cblxuLmFydGljbGUtY2FyZF9fYm9keSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0zKTtcblx0cGFkZGluZzogdmFyKC0tc3BhY2UtY2FyZC1wYWRkaW5nKTtcbn1cblxuLmFydGljbGUtY2FyZF9fa2lja2VyIHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1leWVicm93KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiAxO1xuXHRsZXR0ZXItc3BhY2luZzogMC4xMmVtO1xuXHR0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG59XG5cbi5hcnRpY2xlLWNhcmRfX3RpdGxlIHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1oNCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0Zm9udC1zdHlsZTogaXRhbGljO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG59XG5cbi5hcnRpY2xlLWNhcmRfX3RpdGxlIGEge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJyYW5kKTtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG4uYXJ0aWNsZS1jYXJkX190aXRsZSBhOmhvdmVyIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rLWhvdmVyKTtcbn1cblxuLmFydGljbGUtY2FyZF9fZGF0ZSB7XG5cblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbn1cblxuLmFydGljbGUtY2FyZF9fc2NvcmUge1xuXG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0aW5zZXQtYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTQpO1xuXHRpbnNldC1pbmxpbmUtZW5kOiB2YXIoLS1zcGFjZS00KTtcbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBhcnRpY2xlLWRvY1xuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBNYWdhemluZSBBcnRpY2xlIG1vY2t1cCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTYsIG9wZXJhdG9yLWFwcHJvdmVkXG4vLyAyMDI2LTA5LTI4KSBmb3IgdGhlIGFydGljbGUgd2FsaywgTVBHMTYuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBhcnRpY2xlLWRvYyAgKE5FVylcbiAgIERpc3RpbmN0IGZyb20gZGVzY3JpcHRpb24tcGFuZWwsIHdoaWNoIGNhcnJpZXMgYSBwcm9kdWN0IGRlc2NyaXB0aW9uIGF0IG9uZVxuICAgdW5pZm9ybSBnYXAuIEFuIGFydGljbGUgbmVlZHMgdHdvIHRoaW5ncyBhIHByb2R1Y3QgZGVzY3JpcHRpb24gZG9lcyBub3Q6IGl0c1xuICAgb3duIG1lYXN1cmUg4oCUIHRoZSBwYW5lbCBpcyBzaXplZCB0byB0aGUgc3R5bGVndWlkZSdzIHJlYWRpbmcgd2lkdGgsIG5vdCB0b1xuICAgdGhlIGNvbnRlbnQgY29sdW1uLCBzbyB0aGUgY29weSBpbnNpZGUgbGFuZHMgYXQgdGhlIHJlYWRpbmcgbWVhc3VyZSB3aXRoIHRoZVxuICAgcGFuZWwncyBwYWRkaW5nIG91dHNpZGUgaXQg4oCUIGFuZCBoZWFkaW5nLWF3YXJlIHNwYWNpbmcsIGJlY2F1c2UgYSBoZWFkaW5nXG4gICBoYXMgdG8gYmluZCB0byB0aGUgdGV4dCBiZW5lYXRoIGl0IGFuZCBiZSBwdXNoZWQgYXdheSBmcm9tIHRoZSB0ZXh0IGFib3ZlLlxuXG4gICBFdmVyeSBnYXAgaGVyZSBpcyBhIHRvcCBtYXJnaW4gYW5kIG5ldmVyIGEgYm90dG9tIG9uZSwgc28gbm90aGluZyBjb2xsYXBzZXNcbiAgIHVucHJlZGljdGFibHkuIFRoZSByaHl0aG0gcnVsZSBzZXRzIHRoZSBkZWZhdWx0OyB0aGUgdHdvIFwid2hhdCBmb2xsb3dzIGFcbiAgIGhlYWRpbmdcIiBydWxlcyBicmluZyB0aGUgc3BhY2UgYmVuZWF0aCBhIGhlYWRpbmcgZG93bjsgdGhlIHR3byBoZWFkaW5nIHJ1bGVzXG4gICB0YWtlIHRoZSBzcGFjZSBhYm92ZSBpdCB1cC4gU291cmNlIG9yZGVyIGlzIGxvYWQtYmVhcmluZyDigJQgdGhlIGhlYWRpbmcgcnVsZXNcbiAgIHNpdCBsYXN0IHNvIGEgaGVhZGluZyBhbHdheXMgd2lucyBpdHMgb3duIHNwYWNlLlxuXG4gICBOb3RlIHRoZSBzcGVjaWZpY2l0eTogYD4gKiArICpgIGNvdW50cyBhcyBvbmUgY2xhc3MsIGJlY2F1c2UgYCpgIGNvdW50cyBhc1xuICAgbm90aGluZy4gQSBibG9jayBkcm9wcGVkIGluIGhlcmUgdGhhdCBzdGF0ZXMgYSBiYXJlIGBtYXJnaW46IDBgIHRpZXMgdGhhdFxuICAgcnVsZSBhbmQgd2lucyBvbiBzb3VyY2Ugb3JkZXIsIGxhbmRpbmcgZmx1c2ggYWdhaW5zdCBpdHMgbmVpZ2hib3VyLiBCbG9ja3NcbiAgIHdyaXR0ZW4gZm9yIHRoaXMgZG9jdW1lbnQgc3RhdGUgdGhlIHJoeXRobSB2YWx1ZSBvdXRyaWdodCBpbnN0ZWFkIOKAlCB0aGUgd2F5XG4gICBtZWRpYS1maWd1cmUgYW5kIGZpZ3VyZS1yb3cgYWxyZWFkeSBkby4gVGhlIGZvdXIgaGVhZGluZyBydWxlcyBjYXJyeSB0d29cbiAgIGNsYXNzZXMgYW5kIHdpbiBvdXRyaWdodC5cblxuICAgVGhlIHRocmVlIGRlcHRocyBhcmUgdGhlIHdob2xlIHBvaW50IG9mIHRoZSBibG9jazogdGhlIHRpdGxlIGF0IHRoZSBoMSBzaXplXG4gICBzZXQgbGlnaHQgYW5kIGl0YWxpYyBpbiB0aGUgaGVhZGVyIGFib3ZlLCBzZWN0aW9ucyBhdCB0aGUgaDIgc2l6ZSBzZXQgbGlnaHQsXG4gICBzdWItc2VjdGlvbnMgYXQgdGhlIGg0IHNpemUgc2V0IG1lZGl1bS4gVGhlIGg0IHNpemUgZm9yIGEgdGhpcmQtbGV2ZWxcbiAgIGhlYWRpbmcgaXMgdGhlIHNldHRpbmcgZmVhdHVyZS1wYW5lbCBhbHJlYWR5IHVzZXMsIHNvIHRoZSBicmFuZCBjYXJyaWVzIG9uZVxuICAgaW4tZG9jdW1lbnQgc3ViLWhlYWRpbmcgYW5kIG5vdCB0d28uXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgYXJ0aWNsZS1kb2MgIChVUERBVEVEIOKAlCBzZWdtZW50cylcbiAgIFdpdGggYnJlYWstb3V0IGltYWdlcyB0aGUgYXJ0aWNsZSBpcyBzZXZlcmFsIGFydGljbGUtZG9jIHBhbmVscyBpbiBhIHJvdyxcbiAgIGFuZCBhIHBhbmVsIGNhbiBub3cgb3BlbiBvbiBhIGhlYWRpbmcgb3IgYW4gYWR2ZXJ0LiBXaGF0ZXZlciBjb21lcyBmaXJzdFxuICAgc2l0cyBmbHVzaCB3aXRoIHRoZSBwYW5lbCdzIHBhZGRpbmcgcmF0aGVyIHRoYW4gY2FycnlpbmcgdGhlIHNwYWNlIGl0XG4gICB3b3VsZCB0YWtlIGFmdGVyIGEgcGFyYWdyYXBoLiBMYXN0IGFtb25nIHRoZSBhcnRpY2xlLWRvYyBydWxlcywgYW5kIGF0IHRoZVxuICAgc2FtZSB0d28tY2xhc3Mgd2VpZ2h0LCBzbyBpdCB3aW5zLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi5hcnRpY2xlLWRvYyB7XG5cblx0bWF4LXdpZHRoOiBjYWxjKCB2YXIoLS1jb250YWluZXItYXJ0aWNsZSkgKyAoIHZhcigtLXNwYWNlLWNhcmQtcGFkZGluZykgKiAyICkgKTtcblx0bWFyZ2luLWlubGluZTogYXV0bztcblx0cGFkZGluZzogdmFyKC0tc3BhY2UtY2FyZC1wYWRkaW5nKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtY2FyZCk7XG5cdGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1wYW5lbCk7XG5cbn1cblxuLmFydGljbGUtZG9jID4gKiB7XG5cblx0bWFyZ2luLWJsb2NrOiAwO1xuXG59XG5cbi5hcnRpY2xlLWRvYyA+ICogKyAqIHtcblxuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTgpO1xuXG59XG5cbi5hcnRpY2xlLWRvY19faDIge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWgyKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LWxpZ2h0KTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1oZWFkaW5nKTtcblxufVxuXG4uYXJ0aWNsZS1kb2NfX2gzIHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1oNCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWhlYWRpbmcpO1xuXG59XG5cbi5hcnRpY2xlLWRvYyA+IC5hcnRpY2xlLWRvY19faDIgKyAqIHtcblxuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTQpO1xuXG59XG5cbi5hcnRpY2xlLWRvYyA+IC5hcnRpY2xlLWRvY19faDMgKyAqIHtcblxuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTMpO1xuXG59XG5cbi5hcnRpY2xlLWRvYyA+IC5hcnRpY2xlLWRvY19faDIge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtMTIpO1xuXG59XG5cbi5hcnRpY2xlLWRvYyA+IC5hcnRpY2xlLWRvY19faDMge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtOCk7XG5cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA5MDBweCApIHtcblxuXHQuYXJ0aWNsZS1kb2NfX2gyIHtcblxuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDMpO1xuXG5cdH1cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuYXJ0aWNsZS1kb2Mge1xuXG5cdFx0cGFkZGluZzogdmFyKC0tc3BhY2UtNik7XG5cblx0fVxufVxuXG4uYXJ0aWNsZS1kb2MgPiA6Zmlyc3QtY2hpbGQge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogMDtcblxufVxuXG4vLyBQcm9zZSBpbnNpZGUgdGhlIGFydGljbGUgdGFrZXMgdGhlIGFydGljbGUncyBjb2x1bW4sIG5vdCB0aGUgc2l0ZSdzIHJlYWRpbmdcbi8vIG1lYXN1cmUgaXQgY2FwcyBpdHNlbGYgYXQgZWxzZXdoZXJlLlxuLmFydGljbGUtZG9jIC5wcm9zZSB7XG5cblx0bWF4LXdpZHRoOiBub25lO1xuXG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgYXJ0aWNsZS1oZWFkZXJcbi8vXG4vLyBQb3J0ZWQgZnJvbSB0aGUgTWFnYXppbmUgQXJ0aWNsZSBtb2NrdXAgKGRlc2lnbiBvZiByZWNvcmQ6IE1QRzE2LCBvcGVyYXRvci1hcHByb3ZlZFxuLy8gMjAyNi0wOS0yOCkgZm9yIHRoZSBhcnRpY2xlIHdhbGssIE1QRzE2LiBUaGUgbW9ja3VwJ3MgcnVsZXMgYXJlIHRoZSBkZXNpZ247IHRoaXMgaXNcbi8vIHdoYXQgc2hpcHBlZC4gRGVwYXJ0dXJlcyBmcm9tIGl0IGFyZSBjb21tZW50ZWQgd2hlcmUgdGhleSBvY2N1ci5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgYXJ0aWNsZS1oZWFkZXIgIChORVcpXG4gICBUaGUgbWFnYXppbmUncyBtYXN0aGVhZC4gVGhlIHRpdGxlIHNldHMgdGhlIGhlYWRpbmcgZm9udCBsaWdodCBhbmQgaXRhbGljIGluXG4gICBQYXJhZ29uIGJsdWUgcGVyIHRoZSBkZXNpZ24gYnJpZWYg4oCUIG9uZSB3ZWlnaHQgbGlnaHRlciB0aGFuIHRoZSBzdG9yZSBzZXRzXG4gICB0aGUgc2FtZSBzaXplLCBiZWNhdXNlIHRoZSBlZGl0b3JpYWwgc2lkZSBzcGVha3MgbW9yZSBxdWlldGx5IHRoYW4gdGhlIHNob3AuXG4gICBUaGUgYnlsaW5lIHNpdHMgdW5kZXIgYSBoYWlybGluZSBzbyB0aGUgdGhyZWUgZmFjdHMgcmVhZCBhcyBmdXJuaXR1cmUgcmF0aGVyXG4gICB0aGFuIGFzIGFub3RoZXIgbGluZSBvZiB0aGUgc3RhbmRmaXJzdC5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBhcnRpY2xlLWhlYWRlciAgKFVQREFURUQg4oCUIC0tb24taW1hZ2UpXG4gICBUaGUgc2FtZSBtYXN0aGVhZCByZXZlcnNlZCBmb3IgdGhlIGhlcm8uIFRpdGxlIGluIHBhbmVsIHdoaXRlIGF0IG1lZGl1bVxuICAgd2VpZ2h0IOKAlCB0aGUgc3R5bGVndWlkZSdzIGxlZ2liaWxpdHkgZXhjZXB0aW9uIGZvciBhbnkgdGl0bGUgbGFpZCBvdmVyXG4gICBwaG90b2dyYXBoeSDigJQgYW5kIHN0aWxsIGl0YWxpYywgc28gaXQgaXMgcmVjb2duaXNhYmx5IHRoZSBtYWdhemluZSdzLlxuICAgVGhlIGtpY2tlciB0YWtlcyBsaWdodCBibHVlLCB0aGUgZWRpdG9yaWFsIGxpZ2h0IGFjY2VudCwgYmVjYXVzZSBQYXJhZ29uXG4gICBibHVlIGlzIHRvbyBkYXJrIHRvIHJlYWQgb24gdGhlIHNjcmltLiBCeWxpbmUgaW4gbWlzdCBvdmVyIGEgcXVpZXQgcnVsZS5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4uYXJ0aWNsZS1oZWFkZXIge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXG59XG5cbi5hcnRpY2xlLWhlYWRlcl9fa2lja2VyIHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1leWVicm93KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiAxO1xuXHRsZXR0ZXItc3BhY2luZzogMC4xMmVtO1xuXHR0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG5cbn1cblxuLmFydGljbGUtaGVhZGVyX19raWNrZXIgYSB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xuXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cbn1cblxuLmFydGljbGUtaGVhZGVyX19raWNrZXIgYTpob3ZlciB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtbGluay1ob3Zlcik7XG5cbn1cblxuLmFydGljbGUtaGVhZGVyX19raWNrZXItc2VwIHtcblxuXHRtYXJnaW4taW5saW5lOiB2YXIoLS1zcGFjZS0yKTtcblx0Y29sb3I6IHZhcigtLW5ldXRyYWwtNTAwKTtcblxufVxuXG4uYXJ0aWNsZS1oZWFkZXJfX3RpdGxlIHtcblxuXHRtYXJnaW46IHZhcigtLXNwYWNlLTQpIDAgMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWgxKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LWxpZ2h0KTtcblx0Zm9udC1zdHlsZTogaXRhbGljO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJyYW5kKTtcblxufVxuXG4uYXJ0aWNsZS1oZWFkZXJfX3N0YW5kZmlyc3Qge1xuXG5cdG1heC13aWR0aDogdmFyKC0tY29udGFpbmVyLWFydGljbGUpO1xuXHRtYXJnaW46IHZhcigtLXNwYWNlLTYpIDAgMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHktbGcpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbGlnaHQpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xuXG59XG5cbi5hcnRpY2xlLWhlYWRlcl9fYnlsaW5lIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LXdyYXA6IHdyYXA7XG5cdGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKSB2YXIoLS1zcGFjZS02KTtcblx0bWFyZ2luOiB2YXIoLS1zcGFjZS02KSAwIDA7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTQpIDAgMDtcblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xuXHRsaXN0LXN0eWxlOiBub25lO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuXG59XG5cbi5hcnRpY2xlLWhlYWRlcl9fYXV0aG9yIHtcblxuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG5cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA5MDBweCApIHtcblxuXHQuYXJ0aWNsZS1oZWFkZXJfX3RpdGxlIHtcblxuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDIpO1xuXG5cdH1cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuYXJ0aWNsZS1oZWFkZXJfX3RpdGxlIHtcblxuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDMpO1xuXG5cdH1cblxuXHQuYXJ0aWNsZS1oZWFkZXJfX3N0YW5kZmlyc3Qge1xuXG5cdFx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblxuXHR9XG59XG5cbi5hcnRpY2xlLWhlYWRlci0tb24taW1hZ2UgLmFydGljbGUtaGVhZGVyX19raWNrZXIsXG4uYXJ0aWNsZS1oZWFkZXItLW9uLWltYWdlIC5hcnRpY2xlLWhlYWRlcl9fa2lja2VyIGEge1xuXG5cdGNvbG9yOiB2YXIoLS1wYXJhZ29uLTMwMCk7XG5cbn1cblxuLmFydGljbGUtaGVhZGVyLS1vbi1pbWFnZSAuYXJ0aWNsZS1oZWFkZXJfX2tpY2tlciBhOmhvdmVyIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1vbi1icmFuZCk7XG5cbn1cblxuLmFydGljbGUtaGVhZGVyLS1vbi1pbWFnZSAuYXJ0aWNsZS1oZWFkZXJfX3RpdGxlIHtcblxuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0Y29sb3I6IHZhcigtLXRleHQtb24tYnJhbmQpO1xuXG59XG5cbi5hcnRpY2xlLWhlYWRlci0tb24taW1hZ2UgLmFydGljbGUtaGVhZGVyX19zdGFuZGZpcnN0IHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1vbi1icmFuZCk7XG5cbn1cblxuLmFydGljbGUtaGVhZGVyLS1vbi1pbWFnZSAuYXJ0aWNsZS1oZWFkZXJfX2J5bGluZSB7XG5cblx0Ym9yZGVyLWJsb2NrLXN0YXJ0LWNvbG9yOiB2YXIoLS1uZXV0cmFsLTYwMCk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW9uLWNocm9tZSk7XG5cbn1cblxuLmFydGljbGUtaGVhZGVyLS1vbi1pbWFnZSAuYXJ0aWNsZS1oZWFkZXJfX2F1dGhvciB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtb24tYnJhbmQpO1xuXG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgYXJ0aWNsZS1oZXJvXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE1hZ2F6aW5lIEFydGljbGUgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxNiwgb3BlcmF0b3ItYXBwcm92ZWRcbi8vIDIwMjYtMDktMjgpIGZvciB0aGUgYXJ0aWNsZSB3YWxrLCBNUEcxNi4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIGFydGljbGUtaGVybyAgKE5FVywgbGF5b3V0KVxuICAgVGhlIGFydGljbGUncyBrZXkgYXJ0LCBlZGdlIHRvIGVkZ2UsIGFuZCBpdCBJUyB0aGUgYXJ0aWNsZSdzIGhlYWRlcjogNjAlXG4gICBvZiB0aGUgdmlld3BvcnQgdGFsbCwgYSBjaGFyY29hbCBzY3JpbSByaXNpbmcgZnJvbSB0aGUgYm90dG9tICh0aGUgY2hyb21lXG4gICBjb2xvdXIsIG5ldmVyIGEgY29sb3VyIGNhc3QpLCBhbmQgb24gaXQg4oCUIGJvdHRvbSBsZWZ0LCBvbiB0aGUgcmVhZGluZ1xuICAgY29sdW1uJ3MgdGV4dCBlZGdlIOKAlCB0aGUgYnJlYWRjcnVtYnMsIHRoZSBtYXN0aGVhZCBhbmQgdGhlIGJ5bGluZS4gT24gYVxuICAgcmV2aWV3IHRoZSBzY29yZSBtZXRlciBzaXRzIGF0IHRoZSByaWdodCwgb3ZlciB0aGUgcmFpbCBjb2x1bW4sIHdpdGhcbiAgIFwiSnVtcCB0byB2ZXJkaWN0XCIgYmVuZWF0aCBpdC5cblxuICAgVGhlIGZyYW1lIGluc2lkZSBpcyB0aGUgYXJ0aWNsZS1sYXlvdXQncyBvd24gdHdvIGNvbHVtbnMsIHNvIHRoZSB0aXRsZVxuICAgbGFuZHMgZXhhY3RseSBhYm92ZSB0aGUgZmlyc3QgbGluZSBvZiB0aGUgYXJ0aWNsZSBhbmQgdGhlIG1ldGVyIGV4YWN0bHlcbiAgIGFib3ZlIHRoZSByYWlsJ3MgZmlyc3QgcGFuZWwuIFRoZSBib3R0b20gcGFkZGluZyByZXNlcnZlcyB0aGUgb3ZlcmxhcCB0aGVcbiAgIHJlYWRpbmcgY2FyZCBwdWxscyB1cCBpbnRvLCBwbHVzIGEgZ2FwLCBzbyBubyB0ZXh0IGlzIGV2ZXIgdW5kZXIgdGhlIGNhcmQuXG5cbiAgIE9ubHkgdXNlZCB3aGVuIHRoZSBmZWF0dXJlZCBpbWFnZSBpcyBhdCBsZWFzdCB+MTYwMHB4IHdpZGUuIFNtYWxsZXIgYXJ0XG4gICBmYWxscyBiYWNrIHRvIHRoZSBjb250YWluZWQgbGF5b3V0OiBoZWFkZXIgaW4gdGhlIGNhcmQsIGFydGljbGUtbGVhZFxuICAgaW5zaWRlIHRoZSBjb2x1bW4uXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLmFydGljbGUtaGVybyB7XG5cblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuXHRtaW4taGVpZ2h0OiA2MHZoO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jaHJvbWUpO1xuXG59XG5cbi5hcnRpY2xlLWhlcm9fX21lZGlhIHtcblxuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdGluc2V0OiAwO1xuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdGhlaWdodDogMTAwJTtcblx0b2JqZWN0LWZpdDogY292ZXI7XG5cdG9iamVjdC1wb3NpdGlvbjogY2VudGVyIDU1JTtcblxufVxuXG4uYXJ0aWNsZS1oZXJvX19zY3JpbSB7XG5cblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRpbnNldDogMDtcblx0Ly8gREVQQVJUVVJFOiBhIHNlY29uZCwgc2lkZS1vbiBncmFkaWVudCBiZWhpbmQgdGhlIHRleHQgY29sdW1uLiBUaGUgbW9ja3VwJ3Ncblx0Ly8gc2NyaW0gcm9zZSBmcm9tIHRoZSBmb290IG9ubHksIGFuZCB0aGUgdGl0bGUgc2l0cyBtaWQtaGVpZ2h0IG9uIHRoZSBsZWZ0IOKAlFxuXHQvLyBvbiBrZXkgYXJ0IHdpdGggYSBicmlnaHQgbG9nbyBvciBza3kgdGhlcmUgKFN0YXJmaWVsZCkgdGhlIHRpdGxlIGxvc3QgaXRzXG5cdC8vIGNvbnRyYXN0LiBEYXJrZXN0IGJlaGluZCB0aGUgY29weSwgY2xlYXIgYnkgODAlIHNvIHRoZSBhcnQgc3RheXMgYnJpZ2h0IHdoZXJlXG5cdC8vIG5vIHRleHQgc2l0cyAob3BlcmF0b3IsIDIwMjYtMDktMjgpLlxuXHRiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoXG5cdFx0OTBkZWcsXG5cdFx0Y29sb3ItbWl4KCBpbiBzcmdiLCB2YXIoLS1iZy1jaHJvbWUpIDgwJSwgdHJhbnNwYXJlbnQgKSAwJSxcblx0XHRjb2xvci1taXgoIGluIHNyZ2IsIHZhcigtLWJnLWNocm9tZSkgNjUlLCB0cmFuc3BhcmVudCApIDM1JSxcblx0XHRjb2xvci1taXgoIGluIHNyZ2IsIHZhcigtLWJnLWNocm9tZSkgMjUlLCB0cmFuc3BhcmVudCApIDYwJSxcblx0XHR0cmFuc3BhcmVudCA4MCVcblx0KSwgbGluZWFyLWdyYWRpZW50KFxuXHRcdDBkZWcsXG5cdFx0dmFyKC0tYmctY2hyb21lKSAwJSxcblx0XHRjb2xvci1taXgoIGluIHNyZ2IsIHZhcigtLWJnLWNocm9tZSkgODglLCB0cmFuc3BhcmVudCApIDIyJSxcblx0XHRjb2xvci1taXgoIGluIHNyZ2IsIHZhcigtLWJnLWNocm9tZSkgNTUlLCB0cmFuc3BhcmVudCApIDUyJSxcblx0XHR0cmFuc3BhcmVudCA4MiVcblx0KTtcblxufVxuXG4uYXJ0aWNsZS1oZXJvX19pbm5lciB7XG5cblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHR3aWR0aDogMTAwJTtcblx0bWF4LXdpZHRoOiBjYWxjKCB2YXIoLS1zaXRlLW1heC13aWR0aCkgKyAoIHZhcigtLWd1dHRlci1zbWFsbCkgKiAyICkgKTtcblx0bWFyZ2luLWlubGluZTogYXV0bztcblx0cGFkZGluZzogdmFyKC0tc3BhY2UtMTYpIHZhcigtLWd1dHRlci1zbWFsbCkgY2FsYyggdmFyKC0tc3BhY2UtMTYpICsgdmFyKC0tc3BhY2UtOCkgKyB2YXIoLS1zcGFjZS04KSApO1xuXG59XG5cbi5hcnRpY2xlLWhlcm9fX2ZyYW1lIHtcblxuXHRkaXNwbGF5OiBncmlkO1xuXHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCggMCwgY2FsYyggdmFyKC0tY29udGFpbmVyLWFydGljbGUpICsgKCB2YXIoLS1zcGFjZS1jYXJkLXBhZGRpbmcpICogMiApICkgKSB2YXIoLS13aWR0aC1zaWRlYmFyKTtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGFsaWduLWl0ZW1zOiBlbmQ7XG5cdGdhcDogdmFyKC0tc3BhY2UtY29udGVudC1nYXApIHZhcigtLXNwYWNlLTE2KTtcblxufVxuXG4uYXJ0aWNsZS1oZXJvX19oZWFkIHtcblxuXHRtaW4td2lkdGg6IDA7XG5cdHBhZGRpbmctaW5saW5lOiB2YXIoLS1zcGFjZS1jYXJkLXBhZGRpbmcpO1xuXG59XG5cbi5hcnRpY2xlLWhlcm9fX3NlcmllcyB7XG5cblx0bWFyZ2luLWJsb2NrLWVuZDogdmFyKC0tc3BhY2UtNCk7XG5cbn1cblxuLmFydGljbGUtaGVyb19fc2NvcmUge1xuXG5cdGp1c3RpZnktc2VsZjogZW5kO1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTMpO1xuXG59XG5cbi5hcnRpY2xlLWhlcm9fX2p1bXAge1xuXG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1leWVicm93KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0bGV0dGVyLXNwYWNpbmc6IDAuMTJlbTtcblx0dGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcblx0Y29sb3I6IHZhcigtLXRleHQtb24tYnJhbmQpO1xuXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cbn1cblxuLmFydGljbGUtaGVyb19fanVtcDpob3ZlciB7XG5cblx0Y29sb3I6IHZhcigtLXBhcmFnb24tMzAwKTtcblxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDExMDBweCApIHtcblxuXHQuYXJ0aWNsZS1oZXJvX19mcmFtZSB7XG5cblx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCggMCwgY2FsYyggdmFyKC0tY29udGFpbmVyLWFydGljbGUpICsgKCB2YXIoLS1zcGFjZS1jYXJkLXBhZGRpbmcpICogMiApICkgKTtcblxuXHR9XG5cblx0LmFydGljbGUtaGVyb19fc2NvcmUge1xuXG5cdFx0ZGlzcGxheTogbm9uZTtcblxuXHR9XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LmFydGljbGUtaGVybyB7XG5cblx0XHRtaW4taGVpZ2h0OiA1NXZoO1xuXG5cdH1cblxuXHQuYXJ0aWNsZS1oZXJvX19pbm5lciB7XG5cblx0XHRwYWRkaW5nOiB2YXIoLS1zcGFjZS0xMikgdmFyKC0tZ3V0dGVyLXNtYWxsKSBjYWxjKCB2YXIoLS1zcGFjZS0xMikgKyB2YXIoLS1zcGFjZS02KSApO1xuXG5cdH1cblxuXHQvLyBERVBBUlRVUkU6IG9uIGEgcGhvbmUgdGhlIHRpdGxlIGJsb2NrIGZpbGxzIHRoZSBoZXJvIHRvcCB0byBib3R0b20sIHNvIHRoZSBzY3JpbVxuXHQvLyBuZXZlciBmYWRlcyBvdXQg4oCUIHRoZSBicmVhZGNydW1icyBhbmQga2lja2VyIHNpdCB3aGVyZSB0aGUgZGVza3RvcCBhcnQgaXMgY2xlYXIsXG5cdC8vIGFuZCBvdmVyIGEgYnJpZ2h0IHNreSB0aGV5IGRpZCBub3QgcmVhZC4gTVBHMTYgUGhhc2UgRCwgMzkwcHggY2hlY2suXG5cdC5hcnRpY2xlLWhlcm9fX3NjcmltIHtcblxuXHRcdGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudChcblx0XHRcdDBkZWcsXG5cdFx0XHR2YXIoLS1iZy1jaHJvbWUpIDAlLFxuXHRcdFx0Y29sb3ItbWl4KCBpbiBzcmdiLCB2YXIoLS1iZy1jaHJvbWUpIDg1JSwgdHJhbnNwYXJlbnQgKSAzMCUsXG5cdFx0XHRjb2xvci1taXgoIGluIHNyZ2IsIHZhcigtLWJnLWNocm9tZSkgNjAlLCB0cmFuc3BhcmVudCApIDEwMCVcblx0XHQpO1xuXG5cdH1cblxuXHQuYXJ0aWNsZS1oZXJvX19oZWFkIHtcblxuXHRcdHBhZGRpbmctaW5saW5lOiAwO1xuXG5cdH1cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBhcnRpY2xlLWxheW91dFxuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBNYWdhemluZSBBcnRpY2xlIG1vY2t1cCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTYsIG9wZXJhdG9yLWFwcHJvdmVkXG4vLyAyMDI2LTA5LTI4KSBmb3IgdGhlIGFydGljbGUgd2FsaywgTVBHMTYuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBhcnRpY2xlLWxheW91dCAgKE5FVywgbGF5b3V0KVxuICAgVGhlIGFydGljbGUncyB0d28gY29sdW1ucyBpbnNpZGUgdGhlIGNvbnRlbnQgY29sdW1uOiB0aGUgcmVhZGluZyBjb2x1bW5cbiAgICh0aGUgcmVhZGluZyBtZWFzdXJlIHBsdXMgdGhlIHBhbmVsJ3MgcGFkZGluZyBlaXRoZXIgc2lkZSwgc28gdGhlIGNvcHlcbiAgIGxhbmRzIGF0IDY4MCkgYW5kIHRoZSByaWdodCByYWlsIGF0IHRoZSBzdHlsZWd1aWRlJ3Mgc2lkZWJhciB3aWR0aCwgd2l0aCBhXG4gICB3aWRlIGd1dHRlciBzbyB0aGUgcmFpbCBuZXZlciBjcm93ZHMgdGhlIHRleHQuIFRoZSBwYWlyIGlzIGNlbnRyZWQgaW4gdGhlXG4gICAxNDAwIGNvbHVtbi4gLS1zaW5nbGUgc3BhbnMgdGhlIHNhbWUgZnJhbWUgYXMgb25lIGNvbHVtbiwgc28gdGhlIGJhbmRzXG4gICBhZnRlciB0aGUgYXJ0aWNsZSAoYnV5IGl0LCB0YWdzIGFuZCBhdXRob3IsIGtlZXAgcmVhZGluZykgc2hhcmUgaXRzIGVkZ2VzLlxuXG4gICBfX3JhaWwgaXMgb2Zmc2V0IGRvd24gYnkgdGhlIGJyZWFkY3J1bWIgdHJhaWwncyBoZWlnaHQgc28gaXRzIGZpcnN0IHBhbmVsXG4gICBsaW5lcyB1cCB3aXRoIHRoZSB0b3Agb2YgdGhlIGFydGljbGUgcGFuZWwsIG5vdCB3aXRoIHRoZSBicmVhZGNydW1icy5cbiAgIF9fc3RpY2t5IGlzIHRoZSBwYXJ0IG9mIHRoZSByYWlsIHRoYXQgc3RheXMgaW4gdmlldzogdGhlIHJhaWwgYXMgYSB3aG9sZSBpc1xuICAgdGFsbGVyIHRoYW4gYSBsYXB0b3Agd2luZG93LCBzbyB0aGUgdmVyZGljdCBhbmQgdGhlIGdhbWUncyBwcm9kdWN0cyBzY3JvbGxcbiAgIHdpdGggdGhlIGhlYWRlciB0aGV5IHNpdCBiZXNpZGUgYW5kIHRoZSBob3VzZSBhZHZlcnQgcGlucyBiZW5lYXRoIHRoZW0uXG5cbiAgIEJlbG93IDExMDBweCB0aGUgcmFpbCBpcyBkcm9wcGVkOiBpdHMgcGFuZWxzIG1vdmUgaW50byB0aGUgZmxvdyAodGhlIHNjb3JlXG4gICBzdHJpcCB1bmRlciB0aGUgYnlsaW5lLCB0aGUgcHJvZHVjdHMgaW50byBCdXkgaXQpIGFuZCBub3RoaW5nIGlzIHN0aWNreS5cbiAgIF9faW5mbG93IGNhcnJpZXMgYW55dGhpbmcgdGhhdCBvbmx5IGFwcGVhcnMgb25jZSB0aGUgcmFpbCBoYXMgZ29uZS5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBhcnRpY2xlLWxheW91dCAgKFVQREFURUQg4oCUIC0taGVybyBhbmQgX19icmVhaylcbiAgIC0taGVybyBsaWZ0cyB0aGUgd2hvbGUgZnJhbWUgOTZweCB1cCBpbnRvIHRoZSBib3R0b20gb2YgdGhlIGFydGljbGUgaGVybyxcbiAgIHNvIHRoZSByZWFkaW5nIGNhcmQgYW5kIHRoZSByYWlsJ3MgZmlyc3QgcGFuZWwgYm90aCBzdGFydCBvbiB0aGUga2V5IGFydFxuICAgYW5kIHRoZSBwYWdlIHJlYWRzIGFzIG9uZSBwaWVjZS4gSXQgc3RhY2tzIGFib3ZlIHRoZSBoZXJvLCB3aGljaCBpcyBhXG4gICBwb3NpdGlvbmVkIGVsZW1lbnQgYW5kIHdvdWxkIG90aGVyd2lzZSBwYWludCBvdmVyIHRoZSBvdmVybGFwLiBUaGUgcmFpbFxuICAgbG9zZXMgaXRzIGJyZWFkY3J1bWIgb2Zmc2V0IGJlY2F1c2UgdGhlIGJyZWFkY3J1bWJzIG5vdyBsaXZlIG9uIHRoZSBoZXJvLlxuXG4gICBfX2JyZWFrIGlzIGEgcm93IHRoYXQgc3BhbnMgdGhlIHJlYWRpbmcgY29sdW1uIEFORCB0aGUgcmFpbC4gVGhlIGdyaWRcbiAgIGF1dG8tcGxhY2VzIGluIHNvdXJjZSBvcmRlciwgc28gYSBicmVhayBiZXR3ZWVuIHR3byBzZWdtZW50cyBvZiB0aGVcbiAgIGFydGljbGUgZW5kcyB0aGUgcmFpbCBhYm92ZSBpdCBhbmQgc3RhcnRzIGEgZnJlc2ggcmFpbCBjZWxsIGJlbG93IGl0IOKAlFxuICAgdGhlIHJhaWwgc3RlcHMgYXNpZGUgZm9yIHRoZSBpbWFnZSByYXRoZXIgdGhhbiBzaXR0aW5nIHVuZGVyIGl0LiBBIHJhaWxcbiAgIGNlbGwgc3RyZXRjaGVzIHRvIGl0cyByb3csIHNvIGEgc3RpY2t5IHBhbmVsIGluIGl0IHBpbnMgZm9yIGV4YWN0bHkgdGhlXG4gICBsZW5ndGggb2YgdGhlIHNlZ21lbnQgYmVzaWRlIGl0LlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi5hcnRpY2xlLWxheW91dCB7XG5cblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoIDAsIGNhbGMoIHZhcigtLWNvbnRhaW5lci1hcnRpY2xlKSArICggdmFyKC0tc3BhY2UtY2FyZC1wYWRkaW5nKSAqIDIgKSApICkgdmFyKC0td2lkdGgtc2lkZWJhcik7XG5cdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLWNvbnRlbnQtZ2FwKSB2YXIoLS1zcGFjZS0xNik7XG5cbn1cblxuLmFydGljbGUtbGF5b3V0LS1zaW5nbGUge1xuXG5cdGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KCAwLCBjYWxjKCB2YXIoLS1jb250YWluZXItYXJ0aWNsZSkgKyAoIHZhcigtLXNwYWNlLWNhcmQtcGFkZGluZykgKiAyICkgKyB2YXIoLS1zcGFjZS0xNikgKyB2YXIoLS13aWR0aC1zaWRlYmFyKSApICk7XG5cbn1cblxuLmFydGljbGUtbGF5b3V0X19tYWluIHtcblxuXHRtaW4td2lkdGg6IDA7XG5cbn1cblxuLy8gUGFuZWxzIGFuZCBmbG9hdGVkIGltYWdlcyBpbnNpZGUgb25lIGNvbHVtbiBzdGVwIGFwYXJ0IGxpa2UgdGhlIGFydGljbGUnc1xuLy8gb3RoZXIgYmxvY2tzIChicmVha291dC1maWd1cmUgLS1jb2x1bW4pLlxuLmFydGljbGUtbGF5b3V0X19tYWluID4gLmJyZWFrb3V0LWZpZ3VyZSxcbi5hcnRpY2xlLWxheW91dF9fbWFpbiA+IC5icmVha291dC1maWd1cmUgKyAuYXJ0aWNsZS1kb2Mge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtY29udGVudC1nYXApO1xuXG59XG5cbi5hcnRpY2xlLWxheW91dF9fYWZ0ZXIge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtY29udGVudC1nYXApO1xuXG59XG5cbi5hcnRpY2xlLWxheW91dF9fcmFpbCB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0Z2FwOiB2YXIoLS1zcGFjZS1jb250ZW50LWdhcCk7XG5cdHBhZGRpbmctYmxvY2stc3RhcnQ6IGNhbGMoICggdmFyKC0tZnMtc21hbGwpICogdmFyKC0tbGgtaGVhZGluZykgKSArIHZhcigtLXNwYWNlLTQpICk7XG5cbn1cblxuLmFydGljbGUtbGF5b3V0X19zdGlja3kge1xuXG5cdHBvc2l0aW9uOiBzdGlja3k7XG5cdGluc2V0LWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS02KTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0Z2FwOiB2YXIoLS1zcGFjZS1jb250ZW50LWdhcCk7XG5cbn1cblxuLmFydGljbGUtbGF5b3V0X19pbmZsb3cge1xuXG5cdGRpc3BsYXk6IG5vbmU7XG5cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiAxMTAwcHggKSB7XG5cblx0LmFydGljbGUtbGF5b3V0IHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KCAwLCBjYWxjKCB2YXIoLS1jb250YWluZXItYXJ0aWNsZSkgKyAoIHZhcigtLXNwYWNlLWNhcmQtcGFkZGluZykgKiAyICkgKSApO1xuXG5cdH1cblxuXHQuYXJ0aWNsZS1sYXlvdXQtLXNpbmdsZSB7XG5cblx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCggMCwgMWZyICk7XG5cblx0fVxuXG5cdC5hcnRpY2xlLWxheW91dF9fcmFpbCB7XG5cblx0XHRkaXNwbGF5OiBub25lO1xuXG5cdH1cblxuXHQuYXJ0aWNsZS1sYXlvdXRfX2luZmxvdyB7XG5cblx0XHRkaXNwbGF5OiBibG9jaztcblxuXHR9XG59XG5cbi5hcnRpY2xlLWxheW91dC0taGVybyB7XG5cblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHR6LWluZGV4OiAxO1xuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IGNhbGMoIC0xICogKCB2YXIoLS1zcGFjZS0xNikgKyB2YXIoLS1zcGFjZS04KSApICk7XG5cbn1cblxuLmFydGljbGUtbGF5b3V0LS1oZXJvIC5hcnRpY2xlLWxheW91dF9fcmFpbCB7XG5cblx0cGFkZGluZy1ibG9jay1zdGFydDogMDtcblxufVxuXG4uYXJ0aWNsZS1sYXlvdXRfX2JyZWFrIHtcblxuXHRncmlkLWNvbHVtbjogMSAvIC0xO1xuXHRtaW4td2lkdGg6IDA7XG5cdG1hcmdpbi1ibG9jazogdmFyKC0tc3BhY2UtNik7XG5cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuYXJ0aWNsZS1sYXlvdXQtLWhlcm8ge1xuXG5cdFx0bWFyZ2luLWJsb2NrLXN0YXJ0OiBjYWxjKCAtMSAqIHZhcigtLXNwYWNlLTEyKSApO1xuXG5cdH1cblxuXHQuYXJ0aWNsZS1sYXlvdXRfX2JyZWFrIHtcblxuXHRcdG1hcmdpbi1ibG9jazogMDtcblxuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgYXJ0aWNsZS1sZWFkXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE1hZ2F6aW5lIEFydGljbGUgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxNiwgb3BlcmF0b3ItYXBwcm92ZWRcbi8vIDIwMjYtMDktMjgpIGZvciB0aGUgYXJ0aWNsZSB3YWxrLCBNUEcxNi4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIGFydGljbGUtbGVhZCAgKE5FVylcbiAgIFRoZSBsZWFkIGltYWdlIElOU0lERSB0aGUgcmVhZGluZyBjb2x1bW4sIHJlcGxhY2luZyB0aGUgZnVsbC1ibGVlZFxuICAgbGVhZC1pbWFnZSBvbiBhcnRpY2xlIHBhZ2VzLiBJdHMgaGVpZ2h0IGlzIHNldCBieSB0aGUgZm9sZDogYXQgMTQ0MCB4IDkwMCxcbiAgIHVuZGVyIHRoZSBuZXR3b3JrIGhlYWRlciwgdGl0bGUsIHN0YW5kZmlyc3QgYW5kIGJ5bGluZSwgYW4gODozIGltYWdlIGF0IHRoZVxuICAgcmVhZGluZyBtZWFzdXJlICgyNTVweCkgaXMgdGhlIHRhbGxlc3QgdGhhdCBzdGlsbCBsZXRzIHRoZSBmaXJzdCBwYXJhZ3JhcGhcbiAgIGxhbmQgYWJvdmUgdGhlIGZvbGQuIDE2OjkgYXQgdGhpcyBtZWFzdXJlIGlzIDM4M3B4IGFuZCBwdXNoZXMgdGhlIG9wZW5pbmdcbiAgIHBhcmFncmFwaCBiZWxvdyBpdC4gT24gYSBwaG9uZSwgd2hlcmUgdGhlIGZvbGQgaXMgYSBkaWZmZXJlbnQgcXVlc3Rpb24sIGl0XG4gICByZXR1cm5zIHRvIDE2OjkuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLmFydGljbGUtbGVhZCB7XG5cblx0bWFyZ2luOiB2YXIoLS1zcGFjZS02KSAwIDA7XG5cbn1cblxuLmFydGljbGUtbGVhZF9fbWVkaWEge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHR3aWR0aDogMTAwJTtcblx0YXNwZWN0LXJhdGlvOiA4IC8gMztcblx0b2JqZWN0LWZpdDogY292ZXI7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbmV1dHJhbC04MDApO1xuXG59XG5cbi5hcnRpY2xlLWxlYWRfX2NhcHRpb24ge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtMik7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG5cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuYXJ0aWNsZS1sZWFkX19tZWRpYSB7XG5cblx0XHRhc3BlY3QtcmF0aW86IDE2IC8gOTtcblxuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgYXJ0aWNsZS1tYXN0aGVhZFxuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBNYWdhemluZSBBcnRpY2xlIG1vY2t1cCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTYsIG9wZXJhdG9yLWFwcHJvdmVkXG4vLyAyMDI2LTA5LTI4KSBmb3IgdGhlIGFydGljbGUgd2FsaywgTVBHMTYuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBhcnRpY2xlLW1hc3RoZWFkICAoTkVXKVxuICAgU2V0cyB0aGUgY2F0YWxvZ3VlJ3MgYXJ0aWNsZS1oZWFkZXIgYmVzaWRlIGEgY29tcGFjdCBzY29yZSBiYWRnZSwgc28gYVxuICAgcmV2aWV3IGFuc3dlcnMgXCJpcyBpdCBhbnkgZ29vZD9cIiBpbiB0aGUgc2FtZSBnbGFuY2UgYXMgaXRzIHRpdGxlIHdpdGhvdXRcbiAgIGFkZGluZyBhIGxpbmUgb2YgaGVpZ2h0IGFib3ZlIHRoZSBmb2xkLiBUaGUgYmFkZ2UgY29sdW1uIGlzIG9ubHkgYXMgd2lkZVxuICAgYXMgdGhlIHJpbmc7IHdpdGggbm8gYmFkZ2UgKG5ld3MsIGZlYXR1cmVzKSB0aGUgaGVhZGVyIHRha2VzIHRoZSB3aWR0aC5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4uYXJ0aWNsZS1tYXN0aGVhZCB7XG5cblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoIDAsIDFmciApIGF1dG87XG5cdGFsaWduLWl0ZW1zOiBzdGFydDtcblx0Z2FwOiB2YXIoLS1zcGFjZS02KTtcblxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDExMDBweCApIHtcblxuXHQuYXJ0aWNsZS1tYXN0aGVhZCB7XG5cblx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCggMCwgMWZyICk7XG5cblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGFzc3VyYW5jZS1saXN0XG4vL1xuLy8gUG9ydGVkIGZyb20gY2F0YWxvZ3VlIGJsb2NrIGBhc3N1cmFuY2UtbGlzdGAgKGRlc2lnbiBvZiByZWNvcmQ6IE1QRzEwLCBvcGVyYXRvci1hY2NlcHRlZFxuLy8gMjAyNi0wOS0yNCkgZm9yIHRoZSBiYXNrZXQgd2FsaywgTVBHMTAuIFRoZSBjYXRhbG9ndWUgcm93IGlzIHRoZSBkZXNpZ247IHRoaXMgaXNcbi8vIHdoYXQgc2hpcHBlZC4gRGVwYXJ0dXJlcyBmcm9tIGl0IGFyZSBjb21tZW50ZWQgd2hlcmUgdGhleSBvY2N1ci5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgYXNzdXJhbmNlLWxpc3QgIChORVcpXG4gICBUaGUgcm93cyBpbnNpZGUgdGhlIEdvb2QgdG8gS25vdyBncm91cDogYW4gb3V0bGluZSBpY29uIGluIFBhcmFnb24gYmx1ZSwgYVxuICAgc3RhdGVtZW50IGluIHRoZSBoZWFkaW5nIGZvbnQgYXQgbWVkaXVtIHdlaWdodCDigJQgdGhlIHN0eWxlZ3VpZGUgZ2l2ZXMgdGhlXG4gICBoZWFkaW5nIGZvbnQgdGhlIHRydXN0IHN0YXRlbWVudHMg4oCUIGFuZCBvbmUgc2hvcnQgc2xhdGUgbGluZSB1bmRlciBpdC4gUm93c1xuICAgYXJlIGRpdmlkZWQgYnkgdGhlIGhhaXJsaW5lLCBhcyByb3dzIGluc2lkZSBhIHBhbmVsIGFyZS4gQ29udGVudHMgb25seTogdGhlXG4gICBzdXJmYWNlIGlzIGJvcmRlcmVkLWdyb3VwLCB0aGUgYnJhbmQncyBvbmUgbGFiZWxsZWQtcGFuZWwgdHJlYXRtZW50LCBhc1xuICAgb3JkZXItdG90YWxzIGlzIGZvciB0aGUgc3VtbWFyeSBhYm92ZSBpdC5cblxuICAgRGVsaWJlcmF0ZWx5IG5vdCB0cnVzdC1zdHJpcDogdGhhdCBpcyBhIHJvdyBvZiBzZXBhcmF0ZSBjYXJkcyBvbiB0aGVcbiAgIGNhbnZhczsgdGhpcyBpcyBhIGxpc3QgaW5zaWRlIG9uZSBwYW5lbCwgYXQgYSBzaWRlYmFyJ3Mgd2lkdGguXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi5hc3N1cmFuY2UtbGlzdCB7XG5cblx0bWFyZ2luOiAwO1xuXHRwYWRkaW5nOiAwO1xuXHRsaXN0LXN0eWxlOiBub25lO1xufVxuXG4uYXNzdXJhbmNlLWxpc3RfX2l0ZW0ge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuXHRnYXA6IHZhcigtLXNwYWNlLTMpO1xufVxuXG4uYXNzdXJhbmNlLWxpc3RfX2l0ZW0gKyAuYXNzdXJhbmNlLWxpc3RfX2l0ZW0ge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtNCk7XG5cdHBhZGRpbmctYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTQpO1xuXHRib3JkZXItYmxvY2stc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG59XG5cbi5hc3N1cmFuY2UtbGlzdF9faWNvbiB7XG5cblx0ZmxleDogMCAwIGF1dG87XG5cdHdpZHRoOiAyOHB4O1xuXHRoZWlnaHQ6IDI4cHg7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJyYW5kKTtcbn1cblxuLmFzc3VyYW5jZS1saXN0X19pY29uIHN2ZyB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdHdpZHRoOiAxMDAlO1xuXHRoZWlnaHQ6IDEwMCU7XG59XG5cbi5hc3N1cmFuY2UtbGlzdF9fdGl0bGUge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWhlYWRpbmcpO1xufVxuXG4uYXNzdXJhbmNlLWxpc3RfX3RleHQge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTEpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1ib2R5KTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuXG4uYXNzdXJhbmNlLWxpc3RfX3RleHQgYSB7XG5cblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xuXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5hc3N1cmFuY2UtbGlzdF9fdGV4dCBhOmhvdmVyIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rLWhvdmVyKTtcbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBxdWFudGl0eSBzdGVwcGVyXG4vL1xuLy8gVGhlIHNoYXJlZCBjb250cm9sIHJlbmRlcmVkIGJ5IHRoZSBwYXJlbnQgdGhlbWUnc1xuLy8gYHdvb2NvbW1lcmNlL2dsb2JhbC9xdWFudGl0eS1pbnB1dC5waHBgOiBhIG1pbnVzIGJ1dHRvbiwgYSBudW1iZXIgaW5wdXQgYW5kIGFcbi8vIHBsdXMgYnV0dG9uLCBib3VuZCBieSBgZGF0YS1pbmNyZW1lbnRgIGluIHRoZSBnbG9iYWwgV29vQ29tbWVyY2UgSlMgbW9kdWxlLlxuLy9cbi8vIEl0cyBob21lIGlzIGhlcmUgcmF0aGVyIHRoYW4gaW4gX2J1eS1ib3guc2NzcyBzbyBldmVyeSBzdXJmYWNlIHRoZSB0ZW1wbGF0ZVxuLy8gYXBwZWFycyBvbiDigJQgdGhlIHByb2R1Y3QgcGFnZSdzIGJ1eSBib3gsIHRoZSBiYXNrZXQg4oCUIGdldHMgdGhlIHNhbWUgY29udHJvbC5cbi8vIFRoZSBsb29rIGlzIHRoZSBidXkgYm94J3Mgb3JpZ2luYWwgc3RlcHBlciwgbW92ZWQgb250byB0aGUgcGFyZW50J3MgY2xhc3Nlc1xuLy8gd2hlbiB0aGUgcHJvZHVjdCBwYWdlIHdhcyB3aXJlZCAoMjAyNi0wOS0yMykuXG4vL1xuLy8gQW5hdG9teTpcbi8vICAgLmF0Y19fcXVhbnRpdHkgICAgICAgICAgICAgIOKAlCBbLV0gdmFsdWUgWytdLCBvbmUgYm9yZGVyZWQgZmllbGRcbi8vICAgICBfX2J1dHRvbiAgICAgICAgICAgICAgICAgIOKAlCB0aGUgc3RlcHBlcnM7IC0tbWludXMgLyAtLXBsdXNcbi8vICAgICBfX2lucHV0ICAgICAgICAgICAgICAgICAgIOKAlCB0aGUgdmFsdWU7IHNwaW5uZXJzIHN1cHByZXNzZWQuIEFkZGVkIHRvIHRoZVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBieSB0aGUgcGFyZW50J3Mgb3duXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB3b29jb21tZXJjZV9xdWFudGl0eV9pbnB1dF9jbGFzc2VzYCBmaWx0ZXJcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbWNvbS12Mi9pbmNsdWRlcy93b29jb21tZXJjZS1maWx0ZXJzLnBocClcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oCUIHRoZSBzZWFtIGl0IGJ1aWx0IGZvciB0aGlzLCBub3QgV29vQ29tbWVyY2Unc1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd24gYC5xdHlgIGNsYXNzLlxuXG4uYXRjX19xdWFudGl0eSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IHN0cmV0Y2g7XG5cdGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1pbnB1dCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1pbnB1dCk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWlucHV0KTtcblxufVxuXG4uYXRjX19xdWFudGl0eV9fYnV0dG9uIHtcblxuXHR3aWR0aDogMzZweDtcblx0cGFkZGluZzogMDtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtYnRuKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cblx0Jjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG5cblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jYXJkLWhvdmVyKTtcblxuXHR9XG5cblx0JjpkaXNhYmxlZCB7XG5cblx0XHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG5cdFx0Y3Vyc29yOiBkZWZhdWx0O1xuXG5cdH1cblxufVxuXG4uYXRjX19xdWFudGl0eV9faW5wdXQge1xuXG5cdHdpZHRoOiA1MnB4O1xuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS0yKSAwO1xuXHRib3JkZXI6IDA7XG5cdGJvcmRlci1pbmxpbmU6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItaW5wdXQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtaW5wdXQpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1pbnB1dCk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG5cdHRleHQtYWxpZ246IGNlbnRlcjtcblx0LW1vei1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XG5cblx0Jjo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbixcblx0Jjo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7XG5cblx0XHRtYXJnaW46IDA7XG5cdFx0LXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuXG5cdH1cblxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGJhc2tldFxuLy9cbi8vIFBvcnRlZCBmcm9tIGNhdGFsb2d1ZSBibG9jayBgYmFza2V0YCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTAgKGJhc2tldCksIG9wZXJhdG9yLWFjY2VwdGVkXG4vLyAyMDI2LTA5LTI0KSBmb3IgdGhlIGJhc2tldCB3YWxrLCBNUEcxMC4gVGhlIGNhdGFsb2d1ZSByb3cgaXMgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBiYXNrZXQgIChORVcpXG4gICBUaGUgb25lIHdoaXRlIHBhbmVsIHRoZSBvbGQgc3RvcmUncyBgY2FydC5waHBgIHB1dCBldmVyeSBsaW5lIG9uLCB3aXRoIHRoZVxuICAgZGVsaXZlcnkgY2hvaWNlIGFuZCB0aGUgZGlzY291bnQgY29kZSBpbnNpZGUgaXQgcmF0aGVyIHRoYW4gaW4gc2VwYXJhdGVcbiAgIGNhcmRzLiBJdHMgcGFydHMgYXJlIHNlcGFyYXRlZCBieSB0aGUgYnJhbmQncyBoYWlybGluZSDigJQgcnVsZXMgYXJlIGFsbG93ZWRcbiAgIElOU0lERSBhIHBhbmVsOyBpdCBpcyBvbmx5IGJldHdlZW4gYmFuZHMgb24gdGhlIGNhbnZhcyB0aGF0IHRoZXkgYXJlIG5vdC5cblxuICAgQXQgcGhvbmUgd2lkdGggdGhlIHBhbmVsIGRpc3NvbHZlcyBhbmQgZWFjaCBvZiBpdHMgcGFydHMgYmVjb21lcyBpdHMgb3duXG4gICBwYW5lbC13aGl0ZSBjYXJkLCB3aGljaCBpcyB3aGF0IHRoZSBidWlsZCBicmllZiBtZWFucyBieSBcIml0ZW1zIHN0YWNrIGFzXG4gICBjYXJkc1wiOiB0aGUgZ3JvdW5kIHNob3dzIGJldHdlZW4gdGhlbSwgc28gYSBsb25nIGJhc2tldCByZWFkcyBhcyBhIGxpc3Qgb2ZcbiAgIHRoaW5ncyByYXRoZXIgdGhhbiBvbmUgdGFsbCBzaGVldC5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLmJhc2tldCB7XG5cblx0cGFkZGluZzogdmFyKC0tc3BhY2UtY2FyZC1wYWRkaW5nKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtY2FyZCk7XG5cdGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1wYW5lbCk7XG59XG5cbi5iYXNrZXQgPiAqICsgKiB7XG5cblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS02KTtcblx0cGFkZGluZy1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtNik7XG5cdGJvcmRlci1ibG9jay1zdGFydDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcbn1cblxuLyogVGhlIGNvbHVtbiBsYWJlbHMgc2hhcmUgdGhlIGxpbmUncyBvd24gdHJhY2sgc2l6ZXMsIHNvIHRoZSBsYWJlbHMgc2l0IG92ZXJcbiAgIHRoZSB0aGluZ3MgdGhleSBuYW1lIHdoYXRldmVyIHRoZSB0aXRsZXMgZG8uICovXG4uYmFza2V0X19jb2x1bW5zIHtcblxuXHRkaXNwbGF5OiBncmlkO1xuXHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDk2cHggbWlubWF4KCAwLCAxZnIgKSAxNDBweCAxMjBweDtcblx0Z2FwOiB2YXIoLS1zcGFjZS02KTtcblx0bWFyZ2luOiAwO1xuXHRwYWRkaW5nLWJsb2NrLWVuZDogdmFyKC0tc3BhY2UtMyk7XG5cdGJvcmRlci1ibG9jay1lbmQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1leWVicm93KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0bGV0dGVyLXNwYWNpbmc6IDAuMTJlbTtcblx0dGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuXG4uYmFza2V0X19jb2x1bW5zICsgLmJhc2tldF9fbGluZXMge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogMDtcblx0cGFkZGluZy1ibG9jay1zdGFydDogMDtcblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAwO1xufVxuXG4uYmFza2V0X19jb2x1bW4tLXByb2R1Y3Qge1xuXG5cdGdyaWQtY29sdW1uOiAxIC8gMztcbn1cblxuLmJhc2tldF9fY29sdW1uLS10b3RhbCB7XG5cblx0dGV4dC1hbGlnbjogZW5kO1xufVxuXG4uYmFza2V0X19saW5lcyB7XG5cblx0bWFyZ2luOiAwO1xuXHRwYWRkaW5nOiAwO1xuXHRsaXN0LXN0eWxlOiBub25lO1xufVxuXG4uYmFza2V0X19pdGVtIHtcblxuXHRwYWRkaW5nLWJsb2NrOiB2YXIoLS1zcGFjZS02KTtcbn1cblxuLmJhc2tldF9faXRlbSArIC5iYXNrZXRfX2l0ZW0ge1xuXG5cdGJvcmRlci1ibG9jay1zdGFydDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcbn1cblxuLmJhc2tldF9faXRlbTpsYXN0LWNoaWxkIHtcblxuXHRwYWRkaW5nLWJsb2NrLWVuZDogMDtcbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA5MDBweCApIHtcblxuXHQuYmFza2V0X19jb2x1bW5zIHtcblxuXHRcdGRpc3BsYXk6IG5vbmU7XG5cdH1cblxuXHQuYmFza2V0X19pdGVtOmZpcnN0LWNoaWxkIHtcblxuXHRcdHBhZGRpbmctYmxvY2stc3RhcnQ6IDA7XG5cdH1cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuYmFza2V0IHtcblxuXHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0XHRnYXA6IHZhcigtLXNwYWNlLTQpO1xuXHRcdHBhZGRpbmc6IDA7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cdFx0Ym9yZGVyLXJhZGl1czogMDtcblx0fVxuXG5cdC5iYXNrZXQgPiAqICsgKiB7XG5cblx0XHRtYXJnaW4tYmxvY2stc3RhcnQ6IDA7XG5cdFx0cGFkZGluZy1ibG9jay1zdGFydDogMDtcblx0XHRib3JkZXItYmxvY2stc3RhcnQ6IDA7XG5cdH1cblxuXHQuYmFza2V0X19saW5lcyB7XG5cblx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdFx0Z2FwOiB2YXIoLS1zcGFjZS00KTtcblx0fVxuXG5cdC5iYXNrZXRfX2l0ZW0sXG5cdC5iYXNrZXRfX3NlY3Rpb24sXG5cdC5iYXNrZXRfX2Zvb3Qge1xuXG5cdFx0cGFkZGluZzogdmFyKC0tc3BhY2UtNik7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xuXHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0fVxuXG5cdC5iYXNrZXRfX2l0ZW0gKyAuYmFza2V0X19pdGVtIHtcblxuXHRcdGJvcmRlci1ibG9jay1zdGFydDogMDtcblx0fVxuXG5cdC5iYXNrZXRfX2l0ZW06Zmlyc3QtY2hpbGQsXG5cdC5iYXNrZXRfX2l0ZW06bGFzdC1jaGlsZCB7XG5cblx0XHRwYWRkaW5nLWJsb2NrOiB2YXIoLS1zcGFjZS02KTtcblx0fVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBiYXNrZXQgIChFWFRFTkRFRCDigJQgYGJhc2tldC0tcGFja2FnZWApXG4gICBUaGUgYmFza2V0IHdhcyBvbmUgd2hpdGUgcGFuZWw7IGFuIG9yZGVyIHRoYXQgc2hpcHMgaW4gcGFja2FnZXMgaXMgbm93IG9uZVxuICAgcGFuZWwgUEVSIFBBQ0tBR0UsIGVhY2ggb3BlbmluZyB3aXRoIGEgcGFja2FnZS1oZWFkLiBUaGUgcGFuZWwgaXRzZWxmIGlzXG4gICB1bmNoYW5nZWQuIFR3byB0aGluZ3MgdGhlIG1vZGlmaWVyIGFkZHM6XG5cbiAgIC0gVGhlIGZpcnN0IGxpbmUgc2l0cyBzdHJhaWdodCB1bmRlciB0aGUgaGVhZC4gVGhlIHVubW9kaWZpZWQgcGFuZWwgb25seVxuICAgICBzdXBwcmVzc2VkIHRoZSBsaW5lJ3MgdG9wIHBhZGRpbmcgYWZ0ZXIgaXRzIGNvbHVtbiBsYWJlbHM7IGEgcGFja2FnZVxuICAgICBwYW5lbCBoYXMgbm8gY29sdW1uIGxhYmVscyAodGhyZWUgc2V0cywgb25lIHBlciBwYW5lbCwgcmVhZCBhcyBhIHRhYmxlXG4gICAgIHJlcGVhdGVkIHRocmVlIHRpbWVzKSwgc28gdGhlIGhlYWQgdGFrZXMgdGhlaXIgcGxhY2UuXG4gICAtIEl0IGRvZXMgTk9UIGRpc3NvbHZlIGF0IHBob25lIHdpZHRoLiBUaGUgdW5tb2RpZmllZCBiYXNrZXQgYnJlYWtzIGludG8gb25lXG4gICAgIGNhcmQgcGVyIHBhcnQgdGhlcmUg4oCUIHJpZ2h0IGZvciBhIHNpbmdsZSBzaGVldCBvZiBsaW5lcywgd3JvbmcgZm9yXG4gICAgIHBhY2thZ2VzLCB3aGljaCB0aGUgYnJpZWYgc2F5cyBcInN0YWNrIGFzIGNhcmRzXCI6IGEgcGFja2FnZSBJUyB0aGUgY2FyZCxcbiAgICAgYW5kIGJyZWFraW5nIGl0IHVwIHdvdWxkIGxlYXZlIGl0cyBoZWFkIG9uIHRoZSBiYXJlIGNhbnZhcyBhbmQgbG9zZSB3aGljaFxuICAgICBsaW5lcyB0cmF2ZWwgdG9nZXRoZXIuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi8qIFRoZSBsaW5lcyBsaXN0J3Mgb3duIGBtYXJnaW46IDA7IHBhZGRpbmc6IDBgIGNvbWVzIGFmdGVyIHRoZSBwYW5lbCdzXG4gICBgPiAqICsgKmAgcmh5dGhtIGluIHNvdXJjZSBhbmQgdGllcyBpdCBvbiBzcGVjaWZpY2l0eSwgc28gdGhlIGhhaXJsaW5lIHVuZGVyXG4gICB0aGUgaGVhZCB3b3VsZCBzaXQgZmx1c2ggb24gdGhlIGZpcnN0IGxpbmUuIFN0YXRlZCBvdXRyaWdodCBoZXJlLiAqL1xuLmJhc2tldC0tcGFja2FnZSAuYmFza2V0X19saW5lcyB7XG5cblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS02KTtcblx0cGFkZGluZy1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtNik7XG59XG5cbi5iYXNrZXQtLXBhY2thZ2UgLmJhc2tldF9faXRlbTpmaXJzdC1jaGlsZCB7XG5cblx0cGFkZGluZy1ibG9jay1zdGFydDogMDtcbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuYmFza2V0LS1wYWNrYWdlIHtcblxuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdHBhZGRpbmc6IHZhcigtLXNwYWNlLTYpO1xuXHRcdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsKTtcblx0XHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtY2FyZCk7XG5cdH1cblxuXHQuYmFza2V0LS1wYWNrYWdlID4gKiArICoge1xuXG5cdFx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS02KTtcblx0XHRwYWRkaW5nLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS02KTtcblx0XHRib3JkZXItYmxvY2stc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cdH1cblxuXHQuYmFza2V0LS1wYWNrYWdlIC5iYXNrZXRfX2xpbmVzIHtcblxuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXHR9XG5cblx0LmJhc2tldC0tcGFja2FnZSAuYmFza2V0X19pdGVtLFxuXHQuYmFza2V0LS1wYWNrYWdlIC5iYXNrZXRfX3NlY3Rpb24sXG5cdC5iYXNrZXQtLXBhY2thZ2UgLmJhc2tldF9fZm9vdCB7XG5cblx0XHRwYWRkaW5nOiAwO1xuXHRcdGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuXHRcdGJvcmRlci1yYWRpdXM6IDA7XG5cdH1cblxuXHQuYmFza2V0LS1wYWNrYWdlIC5iYXNrZXRfX2l0ZW0ge1xuXG5cdFx0cGFkZGluZy1ibG9jazogdmFyKC0tc3BhY2UtNik7XG5cdH1cblxuXHQuYmFza2V0LS1wYWNrYWdlIC5iYXNrZXRfX2l0ZW0gKyAuYmFza2V0X19pdGVtIHtcblxuXHRcdGJvcmRlci1ibG9jay1zdGFydDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcblx0fVxuXG5cdC5iYXNrZXQtLXBhY2thZ2UgLmJhc2tldF9faXRlbTpmaXJzdC1jaGlsZCB7XG5cblx0XHRwYWRkaW5nLWJsb2NrLXN0YXJ0OiAwO1xuXHR9XG5cblx0LmJhc2tldC0tcGFja2FnZSAuYmFza2V0X19pdGVtOmxhc3QtY2hpbGQge1xuXG5cdFx0cGFkZGluZy1ibG9jay1lbmQ6IDA7XG5cdH1cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBiYXNrZXQtbGluZVxuLy9cbi8vIFBvcnRlZCBmcm9tIGNhdGFsb2d1ZSBibG9jayBgYmFza2V0LWxpbmVgIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxMCwgb3BlcmF0b3ItYWNjZXB0ZWRcbi8vIDIwMjYtMDktMjQpIGZvciB0aGUgYmFza2V0IHdhbGssIE1QRzEwLiBUaGUgY2F0YWxvZ3VlIHJvdyBpcyB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIGJhc2tldC1saW5lICAoTkVXKVxuICAgT25lIGxpbmUgb2YgdGhlIGJhc2tldDogdGhlIG1hbnVmYWN0dXJlciBzaG90IG9uIGEgc3F1YXJlIHRpbGUsIHRoZSB0aXRsZSBpblxuICAgdGhlIGNvbW1lcmNlIGZhY2UgYXQgdGhlIHByb2R1Y3QgY2FyZCdzIHRpdGxlIHNpemUsIHRoZSBTS1UgYW5kIHRoZSBzdG9ja1xuICAgc3RhdGUgYmVuZWF0aCBpdCwgdGhlIHF1YW50aXR5IHN0ZXBwZXIgd2l0aCBhIHF1aWV0IFJlbW92ZSwgYW5kIHRoZSBsaW5lXG4gICB0b3RhbC4gTm8gcGVyLWxpbmUgdXBkYXRlIGJ1dHRvbiDigJQgY2hhbmdpbmcgdGhlIHF1YW50aXR5IHVwZGF0ZXMgdGhlIGJhc2tldC5cblxuICAgVGhlIGZvdXIgdHJhY2tzIG1hdGNoIGBiYXNrZXRfX2NvbHVtbnNgIGV4YWN0bHksIHNvIHRoZSBsYWJlbHMgb3ZlciB0aGVtXG4gICBzdGF5IHRydWUuIEF0IHRhYmxldCB3aWR0aCB0aGUgc3RlcHBlciBhbmQgdG90YWwgZHJvcCB0byBhIHNlY29uZCByb3cgdW5kZXJcbiAgIHRoZSB0aXRsZTsgYXQgcGhvbmUgd2lkdGggdGhlIGltYWdlIHNocmlua3MgYW5kIHRoZSBzYW1lIHNlY29uZCByb3cgaG9sZHMuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi5iYXNrZXQtbGluZSB7XG5cblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA5NnB4IG1pbm1heCggMCwgMWZyICkgMTQwcHggMTIwcHg7XG5cdGFsaWduLWl0ZW1zOiBzdGFydDtcblx0Z2FwOiB2YXIoLS1zcGFjZS02KTtcbn1cblxuLmJhc2tldC1saW5lX19tZWRpYSB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTIpO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2FyZCk7XG59XG5cbi5iYXNrZXQtbGluZV9fbWVkaWEgaW1nIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdGFzcGVjdC1yYXRpbzogMSAvIDE7XG5cdG9iamVjdC1maXQ6IGNvbnRhaW47XG59XG5cbi5iYXNrZXQtbGluZV9faW5mbyB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKTtcblx0bWluLXdpZHRoOiAwO1xufVxuXG4uYmFza2V0LWxpbmVfX3RpdGxlIHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1jaHJvbWUpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWg0KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LWJvbGQpO1xuXHRmb250LXN0eWxlOiBpdGFsaWM7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0bGV0dGVyLXNwYWNpbmc6IDAuMDFlbTtcbn1cblxuLmJhc2tldC1saW5lX190aXRsZSBhIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1oZWFkaW5nKTtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG4uYmFza2V0LWxpbmVfX3RpdGxlIGE6aG92ZXIge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xufVxuXG4uYmFza2V0LWxpbmVfX3NrdSB7XG5cblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuXHRvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTtcbn1cblxuLmJhc2tldC1saW5lX19zdG9jayB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKTtcblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcbn1cblxuLmJhc2tldC1saW5lX19zdG9jay1kb3Qge1xuXG5cdGZsZXg6IDAgMCBhdXRvO1xuXHR3aWR0aDogOHB4O1xuXHRoZWlnaHQ6IDhweDtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXBpbGwpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1wb3NpdGl2ZSk7XG59XG5cbi5iYXNrZXQtbGluZS0tb3V0LW9mLXN0b2NrIC5iYXNrZXQtbGluZV9fc3RvY2stZG90IHtcblxuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1uZWdhdGl2ZSk7XG59XG5cbi5iYXNrZXQtbGluZV9fcXVhbnRpdHkge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xufVxuXG4uYmFza2V0LWxpbmVfX3JlbW92ZSB7XG5cblx0cGFkZGluZzogMDtcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiBub25lO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5iYXNrZXQtbGluZV9fcmVtb3ZlOmhvdmVyIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rKTtcbn1cblxuLmJhc2tldC1saW5lX190b3RhbCB7XG5cblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtY2hyb21lKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1oNCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1ib2xkKTtcblx0Zm9udC1zdHlsZTogaXRhbGljO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xuXHR0ZXh0LWFsaWduOiBlbmQ7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogOTAwcHggKSB7XG5cblx0LmJhc2tldC1saW5lIHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogOTZweCBtaW5tYXgoIDAsIDFmciApIGF1dG87XG5cdFx0cm93LWdhcDogdmFyKC0tc3BhY2UtNCk7XG5cdH1cblxuXHQuYmFza2V0LWxpbmVfX2luZm8ge1xuXG5cdFx0Z3JpZC1jb2x1bW46IDIgLyAtMTtcblx0fVxuXG5cdC5iYXNrZXQtbGluZV9fcXVhbnRpdHkge1xuXG5cdFx0Z3JpZC1jb2x1bW46IDI7XG5cdFx0ZmxleC1kaXJlY3Rpb246IHJvdztcblx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRcdGdhcDogdmFyKC0tc3BhY2UtNCk7XG5cdH1cblxuXHQuYmFza2V0LWxpbmVfX3RvdGFsIHtcblxuXHRcdGdyaWQtY29sdW1uOiAzO1xuXHRcdGFsaWduLXNlbGY6IGNlbnRlcjtcblx0fVxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5iYXNrZXQtbGluZSB7XG5cblx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDcycHggbWlubWF4KCAwLCAxZnIgKSBhdXRvO1xuXHRcdGNvbHVtbi1nYXA6IHZhcigtLXNwYWNlLTQpO1xuXHR9XG5cblx0LmJhc2tldC1saW5lX190aXRsZSB7XG5cblx0XHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHR9XG5cblx0LmJhc2tldC1saW5lX19xdWFudGl0eSB7XG5cblx0XHRncmlkLWNvbHVtbjogMSAvIDM7XG5cdH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgYmFza2V0LWxpbmUgIChFWFRFTkRFRCDigJQgYGJhc2tldC1saW5lLS1wcmUtb3JkZXJgKVxuICAgQSBwcmUtb3JkZXIgbGluZSByZWFkcyBgUHJlLW9yZGVyYCB3aGVyZSBhIHN0b2NrZWQgbGluZSByZWFkcyBgSW4gc3RvY2tgLFxuICAgYW5kIGl0cyBkb3QgdGFrZXMgdGhlIGJyYW5kIGJsdWU6IGdyZWVuIHNheXMgXCJvbiB0aGUgc2hlbGZcIiwgd2hpY2ggYVxuICAgcHJlLW9yZGVyIGlzIG5vdCwgYW5kIHJlZCBpcyByZXNlcnZlZCBmb3Igb3V0IG9mIHN0b2NrIGFuZCBlcnJvcnMuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi5iYXNrZXQtbGluZS0tcHJlLW9yZGVyIC5iYXNrZXQtbGluZV9fc3RvY2stZG90IHtcblxuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1icmFuZCk7XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgYmFza2V0LW5vdGljZVxuLy9cbi8vIFBvcnRlZCBmcm9tIGNhdGFsb2d1ZSBibG9jayBgYmFza2V0LW5vdGljZWAgKGRlc2lnbiBvZiByZWNvcmQ6IE1QRzEwLCBvcGVyYXRvci1hY2NlcHRlZFxuLy8gMjAyNi0wOS0yNCkgZm9yIHRoZSBiYXNrZXQgd2FsaywgTVBHMTAuIFRoZSBjYXRhbG9ndWUgcm93IGlzIHRoZSBkZXNpZ247IHRoaXMgaXNcbi8vIHdoYXQgc2hpcHBlZC4gRGVwYXJ0dXJlcyBmcm9tIGl0IGFyZSBjb21tZW50ZWQgd2hlcmUgdGhleSBvY2N1ci5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgYmFza2V0LW5vdGljZSAgKE5FVylcbiAgIE9uZSBzdGFuZGluZyBsaW5lIGFib3V0IHRoZSB3aG9sZSBiYXNrZXQg4oCUIHRoYXQgaXQgc2hpcHMgaW4gc2V2ZXJhbFxuICAgcGFja2FnZXMsIG9yIHRoZSBkaXNwYXRjaCBydWxlIOKAlCBvbiBpdHMgb3duIHNsaW0gcGFuZWwtd2hpdGUgY2FyZCwgYmVjYXVzZVxuICAgdGhlIGRlc2lnbiBicmllZiBkb2VzIG5vdCBsZXQgY29udGVudCBzaXQgb24gdGhlIGNhbnZhcyBob3dldmVyIHNsaWdodCBpdFxuICAgaXMuIEFuIG91dGxpbmUgaWNvbiBpbiBQYXJhZ29uIGJsdWUsIHRoZSBsaW5lIGF0IGJvZHkgc2l6ZSwgYW5kIGFuIG9wdGlvbmFsXG4gICBxdWlldGVyIHNlY29uZCBsaW5lIGZvciB0aGUgZGV0YWlsIHRoYXQgcXVhbGlmaWVzIGl0LlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4uYmFza2V0LW5vdGljZSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTQpIHZhcigtLXNwYWNlLTYpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0Ym94LXNoYWRvdzogdmFyKC0tc2hhZG93LXBhbmVsKTtcbn1cblxuLmJhc2tldC1ub3RpY2VfX2ljb24ge1xuXG5cdGZsZXg6IDAgMCBhdXRvO1xuXHR3aWR0aDogMjRweDtcblx0aGVpZ2h0OiAyNHB4O1xuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IDAuMWVtO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG59XG5cbi5iYXNrZXQtbm90aWNlX19pY29uIHN2ZyB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdHdpZHRoOiAxMDAlO1xuXHRoZWlnaHQ6IDEwMCU7XG59XG5cbi5iYXNrZXQtbm90aWNlX190ZXh0IHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1ib2R5KTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG59XG5cbi5iYXNrZXQtbm90aWNlX19kZXRhaWwge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgYm9yZGVyZWQtZ3JvdXBcbi8vXG4vLyBUaGUgYnJhbmQncyBib3JkZXJlZCBncm91cCDigJQgYSAycHggb3V0bGluZSBhdCB0aGUgc3VyZmFjZSByYWRpdXMgd2l0aCB0aGVcbi8vIGdyb3VwIHRpdGxlIGJyZWFraW5nIHRoZSB0b3AgYm9yZGVyLiBQYXJhZ29uIGJsdWUgYnkgZGVmYXVsdCAobG95YWx0eVxuLy8gcG9pbnRzLCBrZXkgaW5mb3JtYXRpb24pOyAtLW5lZ2F0aXZlIGZvciBhIHZhbGlkYXRpb24gc3VtbWFyeSwgLS1wb3NpdGl2ZVxuLy8gZm9yIGEgY29uZmlybWF0aW9uLiBUaGUgbW9kaWZpZXJzIGNoYW5nZSBjb2xvdXIgYW5kIG5vdGhpbmcgZWxzZS5cbi8vXG4vLyBTb3VyY2U6IGNhdGFsb2d1ZSBibG9jayBgYm9yZGVyZWQtZ3JvdXBgLiBQb3J0ZWQgZm9yIHRoZSBNUEc5IHByb2R1Y3QtcGFnZSB3YWxrLCAyMDI2LTA5LTE2LlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBib3JkZXJlZC1ncm91cCAgKE5FVylcbiAgIEEgbGFiZWxsZWQgcGFuZWw6IGEgZnVsbC13aWR0aCB0aXRsZSBiYXIgb3ZlciBhIGJvcmRlcmVkIHdoaXRlIGJvZHkuIFRoaXMgaXNcbiAgIHRoZSBzYW1lIGNvbnN0cnVjdGlvbiBhcyBgd2lkZ2V0YCDigJQgdGhlIGJyYW5kJ3Mgc2lkZWJhciBmdXJuaXR1cmUg4oCUIHJldXNlZFxuICAgaGVyZSBvbiBwdXJwb3NlIHNvIHRoZSBicmFuZCBjYXJyaWVzIE9ORSBsYWJlbGxlZC1wYW5lbCB0cmVhdG1lbnQgcmF0aGVyXG4gICB0aGFuIHR3byBzaW1pbGFyIG9uZXMuIE9wZXJhdG9yLCAyMDI2LTA5LTE0LiBQYXJhZ29uIGJsdWUgYnkgZGVmYXVsdCxcbiAgIC0tbmVnYXRpdmUgZm9yIGEgdmFsaWRhdGlvbiBzdW1tYXJ5LCAtLXBvc2l0aXZlIGZvciBhIGNvbmZpcm1hdGlvbjsgY29sb3VyXG4gICBpcyB0aGUgb25seSB0aGluZyB0aGUgbW9kaWZpZXJzIGNoYW5nZS5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4uYm9yZGVyZWQtZ3JvdXAge1xuXG5cdGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLWJvcmRlci1icmFuZCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uYm9yZGVyZWQtZ3JvdXBfX3RpdGxlIHtcblxuXHRtYXJnaW46IDA7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTMpIHZhcigtLXNwYWNlLTYpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1icmFuZCk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtb24tYnJhbmQpO1xufVxuXG4uYm9yZGVyZWQtZ3JvdXBfX2JvZHkge1xuXG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTYpO1xufVxuXG4uYm9yZGVyZWQtZ3JvdXBfX3RleHQge1xuXG5cdG1hcmdpbjogMDtcblx0bWF4LXdpZHRoOiB2YXIoLS1jb250YWluZXItcmVhZGluZyk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG4uYm9yZGVyZWQtZ3JvdXAtLW5lZ2F0aXZlIHtcblxuXHRib3JkZXItY29sb3I6IHZhcigtLWNvbG9yLW5lZ2F0aXZlKTtcbn1cblxuLmJvcmRlcmVkLWdyb3VwLS1uZWdhdGl2ZSAuYm9yZGVyZWQtZ3JvdXBfX3RpdGxlIHtcblxuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1uZWdhdGl2ZSk7XG59XG5cbi8qIEFuIGVycm9yIHN1bW1hcnkgY2FycmllcyBgcm9sZT1cImFsZXJ0XCJgIGFuZCBgdGFiaW5kZXg9XCItMVwiYCwgYW5kIFdvb0NvbW1lcmNlJ3Mgc2NyaXB0XG4gICBtb3ZlcyBmb2N1cyB0byBpdCBvbiBsb2FkIHNvIGEgc2NyZWVuIHJlYWRlciBhbm5vdW5jZXMgaXQuIE5vYm9keSB0YWJiZWQgdGhlcmUsIHNvIHRoZVxuICAgYnJvd3NlcidzIGZvY3VzIHJpbmcgd291bGQgb25seSBkcmF3IGEgZGFyayBsaW5lIG92ZXIgdGhlIHJlZCBib3JkZXIg4oCUIHRoZSBwYW5lbCBJU1xuICAgdGhlIHNpZ25hbC4gU2NvcGVkIHRvIHRhYmluZGV4IC0xLCB3aGljaCB0aGUga2V5Ym9hcmQgY2FuIG5ldmVyIHJlYWNoIChNUEcxMyB3aXJpbmcpLiAqL1xuLmJvcmRlcmVkLWdyb3VwW3RhYmluZGV4PVwiLTFcIl06Zm9jdXMge1xuXG5cdG91dGxpbmU6IG5vbmU7XG59XG5cbi5ib3JkZXJlZC1ncm91cC0tcG9zaXRpdmUge1xuXG5cdGJvcmRlci1jb2xvcjogdmFyKC0tY29sb3ItcG9zaXRpdmUpO1xufVxuXG4uYm9yZGVyZWQtZ3JvdXAtLXBvc2l0aXZlIC5ib3JkZXJlZC1ncm91cF9fdGl0bGUge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLXBvc2l0aXZlKTtcbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBicmFuZC1saXN0XG4vL1xuLy8gVGhlIHF1aWV0IGJyYW5kIHNpZ25wb3N0OiBvbmUgcGFuZWwtd2hpdGUgcm93IG9mIGV2ZW5seSBzcGFjZWQgYnJhbmQgbmFtZXMuXG4vL1xuLy8gRGVsaWJlcmF0ZWx5IE5PVCBhIGZlYXR1cmUuIEJyYW5kLWxlZCBzaG9wcGVycyBhcmUgYSByZWFsIHJvdXRlIGludG8gYVxuLy8gY29tcG9uZW50cyBjYXRhbG9ndWUsIGFuZCBhIHJvdyBvZiB3b3JkbWFya3Mgd291bGQgY29tcGV0ZSB3aXRoIHRoZSByYW5nZXNcbi8vIGFib3ZlIGl0IGZvciB0aGUgc2FtZSBhdHRlbnRpb24uIFBsYWluIHRleHQgaW4gYSBzaW5nbGUgcm93IGlzIHRoZSB3aG9sZVxuLy8gZGVzaWduIGRlY2lzaW9uLlxuLy9cbi8vIFNvdXJjZTogY2F0YWxvZ3VlIGJsb2NrIGBicmFuZC1saXN0YC4gUG9ydGVkIGZvciB0aGUgTVBHMSBob21lcGFnZSB3YWxrLCAyMDI2LTA5LTE2LlxuXG4uYnJhbmQtbGlzdCB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC13cmFwOiB3cmFwO1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cdGdhcDogdmFyKC0tc3BhY2UtNik7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLWNhcmQtcGFkZGluZyk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctcGFuZWwpO1xufVxuXG4uYnJhbmQtbGlzdF9faXRlbSB7XG5cblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXHR3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4uYnJhbmQtbGlzdF9faXRlbTpob3ZlciB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtbGluayk7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LmJyYW5kLWxpc3Qge1xuXG5cdFx0anVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuXHRcdGdhcDogdmFyKC0tc3BhY2UtNCk7XG5cdH1cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBicmVhZGNydW1ic1xuLy9cbi8vIFRoZSB0cmFpbCBhYm92ZSB0aGUgc3RvcmUgbGF5b3V0LiBTYW1lIHRyZWF0bWVudCB0aGUgbW9ja3VwIGRyYXdzIOKAlCBtdXRlZFxuLy8gc21hbGwgYm9keSB0ZXh0LCBhIHNsYXNoIGJldHdlZW4gaXRlbXMsIHRoZSBjdXJyZW50IHBhZ2Ugbm90IGEgbGluayDigJQgYnV0XG4vLyBhZ2FpbnN0IERJRkZFUkVOVCBNQVJLVVAsIGRlbGliZXJhdGVseS5cbi8vXG4vLyBUaGUgbW9ja3VwIGF1dGhvcnMgYW4gYDxvbCBjbGFzcz1cImJyZWFkY3J1bWJzXCI+YCB3aXRoIGBfX2l0ZW1gIC8gYF9fbGlua2Bcbi8vIGNoaWxkcmVuLCB3aGljaCBpcyB0aGUgcmlnaHQgc2hhcGUgdG8gZGVzaWduIGFnYWluc3QgYW5kIGlzIG5vdCB3aGF0IHRoZSBzaXRlXG4vLyBlbWl0cy4gQnJlYWRjcnVtYnMgaGVyZSBjb21lIGZyb20gYGNhbWNvbV9icmVhZGNydW1icygpYCBpbiB0aGUgcGFyZW50IHRoZW1lLFxuLy8gd2hpY2ggZGVsZWdhdGVzIHRvIFJhbmsgTWF0aCBhbmQgb3V0cHV0czpcbi8vXG4vLyAgIDxuYXYgY2xhc3M9XCJyYW5rLW1hdGgtYnJlYWRjcnVtYiBicmVhZGNydW1ic1wiPlxuLy8gICAgIDxwPjxhPkhvbWU8L2E+PHNwYW4gY2xhc3M9XCJzZXBhcmF0b3JcIj4gLyA8L3NwYW4+PGE+UEMgQ29tcG9uZW50czwvYT7igKZcbi8vXG4vLyBTbyB0aGUgc2VwYXJhdG9yIGlzIFJhbmsgTWF0aCdzIG93biBgPHNwYW4gY2xhc3M9XCJzZXBhcmF0b3JcIj5gIGNhcnJ5aW5nIGl0c1xuLy8gc2xhc2ggYXMgdGV4dCwgcmF0aGVyIHRoYW4gYW4gYDo6YWZ0ZXJgIG9uIGVhY2ggaXRlbSwgYW5kIHRoZSB0cmFpbCBpcyBhIGA8cD5gXG4vLyBvZiBpbmxpbmUgYW5jaG9ycyByYXRoZXIgdGhhbiBhIGxpc3QuIFBvcnRpbmcgdGhlIG1vY2t1cCdzIHNlbGVjdG9ycyB2ZXJiYXRpbVxuLy8gd291bGQgaGF2ZSBwcm9kdWNlZCBhIHBhcnRpYWwgdGhhdCBzdHlsZXMgbm90aGluZyDigJQgdGhlIGNsYXNzZXMgaXQgbmFtZXMgZG9cbi8vIG5vdCBleGlzdCBvbiBhbnkgcmVuZGVyZWQgcGFnZS5cbi8vXG4vLyBEZXBhcnR1cmVzIGZyb20gdGhlIGNhdGFsb2d1ZSBibG9jaywgZWFjaCBkZWxpYmVyYXRlOlxuLy8gICAtIGAuYnJlYWRjcnVtYnNfX2l0ZW06OmFmdGVyYCBkcm9wcGVkOyBSYW5rIE1hdGggc2hpcHMgdGhlIHNlcGFyYXRvci5cbi8vICAgLSBmbGV4IG9uIHRoZSBgPHA+YCwgbm90IHRoZSBgPG5hdj5gIOKAlCB0aGUgbmF2IGlzIHRoZSB3cmFwcGVyIFJhbmsgTWF0aFxuLy8gICAgIGdpdmVzIHRoZSBjbGFzcyB0bywgYW5kIGl0cyBvbmx5IGNoaWxkIGlzIHRoYXQgcGFyYWdyYXBoLlxuLy8gICAtIHRoZSBsYXN0IGFuY2hvciBpcyB0aGUgY3VycmVudCBwYWdlIGFuZCBSYW5rIE1hdGggbGVhdmVzIGl0IGEgbGluaywgc28gaXRcbi8vICAgICBpcyB0b25lZCBkb3duIGJ5IHBvc2l0aW9uIHJhdGhlciB0aGFuIGJ5IGEgYF9fY3VycmVudGAgY2xhc3MuXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYGJyZWFkY3J1bWJzYCBmb3IgdGhlIHRyZWF0bWVudCwgbGl2ZSBSYW5rIE1hdGggbWFya3VwXG4vLyBmb3IgdGhlIGFuYXRvbXkuIFBvcnRlZCBmb3IgdGhlIE1QRzkgcHJvZHVjdC1wYWdlIHdhbGssIDIwMjYtMDktMTYuXG5cbi5icmVhZGNydW1icyB7XG5cblx0bWFyZ2luOiAwIDAgdmFyKC0tc3BhY2UtNCk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG59XG5cbi5icmVhZGNydW1icyBwIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LXdyYXA6IHdyYXA7XG5cdGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKTtcblx0bWFyZ2luOiAwO1xufVxuXG4uYnJlYWRjcnVtYnMgYSB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5icmVhZGNydW1icyBhOmhvdmVyIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rLWhvdmVyKTtcbn1cblxuLy8gVGhlIGN1cnJlbnQgcGFnZSwgdGhlIHRyYWlsJ3MgbGFzdCBpdGVtOiBSYW5rIE1hdGggcHJpbnRzIGl0IHVubGlua2VkIGFzXG4vLyBgc3Bhbi5sYXN0YCwgaW4gdGhlIGJvZHkgY29sb3VyIOKAlCB0aGUgZGVzdGluYXRpb24gcmF0aGVyIHRoYW4gYSByb3V0ZS5cbi8vIChUaGlzIHRhcmdldGVkIGBhOmxhc3Qtb2YtdHlwZWAgd2hpbGUgUmFuayBNYXRoJ3MgXCJyZW1vdmUgcG9zdCB0aXRsZVwiIHdhcyBvbiBhbmRcbi8vIHRoZSBsYXN0IGNydW1iIHdhcyBhIGxpbms7IGNhbWNvbV9icmVhZGNydW1ic19rZWVwX2N1cnJlbnRfdGl0bGUoKSBub3cga2VlcHMgdGhlXG4vLyBjdXJyZW50IHBhZ2UgaW4gZXZlcnkgdHJhaWwsIHNvIHRoZSBsYXN0IExJTksgaXMgYSByZWFsIHBhcmVudCBhbmQgbXVzdCBzdGF5IG9uZS4pXG4uYnJlYWRjcnVtYnMgLmxhc3Qge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG4uYnJlYWRjcnVtYnMgLnNlcGFyYXRvciB7XG5cblx0Y29sb3I6IHZhcigtLW5ldXRyYWwtNTAwKTtcbn1cblxuLy8gLS1vbi1pbWFnZTogdGhlIHRyYWlsIG92ZXIgdGhlIGFydGljbGUgaGVybydzIGtleSBhcnQgKE1QRzE2KS4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZVxuLy8gd3JpdHRlbiBmb3IgaXRzIG93biBgX19saW5rYCAvIGBfX2N1cnJlbnRgIG1hcmt1cDsgdGhlc2UgYXJlIHRoZSBzYW1lIGNvbG91cnMgb24gUmFua1xuLy8gTWF0aCdzIG1hcmt1cCDigJQgbGlua3MsIHRoZSBjdXJyZW50IGBzcGFuLmxhc3RgLCBhbmQgaXRzIHNlcGFyYXRvci5cbi5icmVhZGNydW1icy0tb24taW1hZ2UsXG4uYnJlYWRjcnVtYnMtLW9uLWltYWdlIGEsXG4uYnJlYWRjcnVtYnMtLW9uLWltYWdlIC5sYXN0IHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1vbi1jaHJvbWUpO1xufVxuXG4uYnJlYWRjcnVtYnMtLW9uLWltYWdlIC5zZXBhcmF0b3Ige1xuXG5cdGNvbG9yOiB2YXIoLS1uZXV0cmFsLTYwMCk7XG59XG5cbi5icmVhZGNydW1icy0tb24taW1hZ2UgYTpob3ZlciB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtb24tYnJhbmQpO1xufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGJyZWFrb3V0LWZpZ3VyZVxuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBNYWdhemluZSBBcnRpY2xlIG1vY2t1cCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTYsIG9wZXJhdG9yLWFwcHJvdmVkXG4vLyAyMDI2LTA5LTI4KSBmb3IgdGhlIGFydGljbGUgd2FsaywgTVBHMTYuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBicmVha291dC1maWd1cmUgIChORVcpXG4gICBBbiBpbi1ib2R5IGltYWdlIHRoYXQgcnVucyB3aWRlciB0aGFuIHRoZSByZWFkaW5nIGNvbHVtbiwgc28gYSBsb25nXG4gICBhcnRpY2xlIGRvZXMgbm90IHJlYWQgYXMgb25lIGdyZXkgc3RyaXAuIFNpdHMgaW4gYXJ0aWNsZS1sYXlvdXRfX2JyZWFrLlxuXG4gICAtLXdpZGUgc3BhbnMgdGhlIHJlYWRpbmcgY29sdW1uIGFuZCB0aGUgcmFpbDogdGhlIGltYWdlIGluc2lkZSBhIHBhbmVsLVxuICAgd2hpdGUgZnJhbWUgYXQgdGhlIHN1cmZhY2UgcmFkaXVzIHdpdGggaXRzIGNhcHRpb24gb24gdGhlIHBhbmVsIGJlbmVhdGgg4oCUXG4gICB0aGUgY2F0ZWdvcnkgYmFubmVyJ3MgY29uc3RydWN0aW9uLCBzbyB0aGUgY2FwdGlvbiBuZXZlciBzaXRzIG9uIHRoZVxuICAgY2FudmFzLiAtLWJsZWVkIHJ1bnMgZWRnZSB0byBlZGdlLCBsaWtlIHRoZSBoZXJvOiBubyByYWRpdXMgKGl0IGhhcyBub1xuICAgZWRnZSB0byByb3VuZCksIGFuZCB0aGUgY2FwdGlvbiBvbiBhIGNoYXJjb2FsIGZvb3Qgc2NyaW0sIGFsaWduZWQgdG8gdGhlXG4gICByZWFkaW5nIGNvbHVtbidzIHRleHQgZWRnZS4gT24gYSBwaG9uZSBib3RoIGdvIHRvIHRoZSBmdWxsIHNjcmVlbiB3aWR0aC5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4uYnJlYWtvdXQtZmlndXJlIHtcblxuXHRtYXJnaW46IDA7XG5cbn1cblxuLmJyZWFrb3V0LWZpZ3VyZV9fbWVkaWEge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHR3aWR0aDogMTAwJTtcblx0b2JqZWN0LWZpdDogY292ZXI7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLW5ldXRyYWwtODAwKTtcblxufVxuXG4uYnJlYWtvdXQtZmlndXJlX19jYXB0aW9uIHtcblxuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1ib2R5KTtcblxufVxuXG4uYnJlYWtvdXQtZmlndXJlLS13aWRlIHtcblxuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblxufVxuXG4uYnJlYWtvdXQtZmlndXJlLS13aWRlIC5icmVha291dC1maWd1cmVfX21lZGlhIHtcblxuXHRhc3BlY3QtcmF0aW86IDEyIC8gNTtcblxufVxuXG4uYnJlYWtvdXQtZmlndXJlLS13aWRlIC5icmVha291dC1maWd1cmVfX2NhcHRpb24ge1xuXG5cdG1heC13aWR0aDogY2FsYyggdmFyKC0tY29udGFpbmVyLWFydGljbGUpICsgKCB2YXIoLS1zcGFjZS1jYXJkLXBhZGRpbmcpICogMiApICk7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTQpIHZhcigtLXNwYWNlLWNhcmQtcGFkZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcblxufVxuXG4uYnJlYWtvdXQtZmlndXJlLS1ibGVlZCB7XG5cblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHR3aWR0aDogMTAwdnc7XG5cdG1hcmdpbi1pbmxpbmU6IGNhbGMoIDUwJSAtIDUwdncgKTtcblxufVxuXG4uYnJlYWtvdXQtZmlndXJlLS1ibGVlZCAuYnJlYWtvdXQtZmlndXJlX19tZWRpYSB7XG5cblx0YXNwZWN0LXJhdGlvOiAzIC8gMTtcblx0bWluLWhlaWdodDogMzYwcHg7XG5cdG1heC1oZWlnaHQ6IDgwdmg7XG5cbn1cblxuLmJyZWFrb3V0LWZpZ3VyZS0tYmxlZWQgLmJyZWFrb3V0LWZpZ3VyZV9fY2FwdGlvbiB7XG5cblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRpbnNldC1pbmxpbmU6IDA7XG5cdGluc2V0LWJsb2NrLWVuZDogMDtcblx0cGFkZGluZy1ibG9jazogdmFyKC0tc3BhY2UtMTYpIHZhcigtLXNwYWNlLTYpO1xuXHRwYWRkaW5nLWlubGluZTogY2FsYyggbWF4KCB2YXIoLS1ndXR0ZXItc21hbGwpLCAoIDEwMCUgLSAoIHZhcigtLWNvbnRhaW5lci1hcnRpY2xlKSArICggdmFyKC0tc3BhY2UtY2FyZC1wYWRkaW5nKSAqIDIgKSArIHZhcigtLXNwYWNlLTE2KSArIHZhcigtLXdpZHRoLXNpZGViYXIpICkgKSAvIDIgKSArIHZhcigtLXNwYWNlLWNhcmQtcGFkZGluZykgKTtcblx0YmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCAwZGVnLCBjb2xvci1taXgoIGluIHNyZ2IsIHZhcigtLWJnLWNocm9tZSkgOTAlLCB0cmFuc3BhcmVudCApIDAlLCB0cmFuc3BhcmVudCAxMDAlICk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW9uLWJyYW5kKTtcblxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDExMDBweCApIHtcblxuXHQuYnJlYWtvdXQtZmlndXJlLS1ibGVlZCAuYnJlYWtvdXQtZmlndXJlX19jYXB0aW9uIHtcblxuXHRcdHBhZGRpbmctaW5saW5lOiBjYWxjKCBtYXgoIHZhcigtLWd1dHRlci1zbWFsbCksICggMTAwJSAtICggdmFyKC0tY29udGFpbmVyLWFydGljbGUpICsgKCB2YXIoLS1zcGFjZS1jYXJkLXBhZGRpbmcpICogMiApICkgKSAvIDIgKSArIHZhcigtLXNwYWNlLWNhcmQtcGFkZGluZykgKTtcblxuXHR9XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LmJyZWFrb3V0LWZpZ3VyZS0td2lkZSB7XG5cblx0XHR3aWR0aDogMTAwdnc7XG5cdFx0bWFyZ2luLWlubGluZTogY2FsYyggNTAlIC0gNTB2dyApO1xuXHRcdGJvcmRlci1yYWRpdXM6IDA7XG5cblx0fVxuXG5cdC5icmVha291dC1maWd1cmUtLXdpZGUgLmJyZWFrb3V0LWZpZ3VyZV9fbWVkaWEge1xuXG5cdFx0YXNwZWN0LXJhdGlvOiA0IC8gMztcblxuXHR9XG5cblx0LmJyZWFrb3V0LWZpZ3VyZS0td2lkZSAuYnJlYWtvdXQtZmlndXJlX19jYXB0aW9uIHtcblxuXHRcdHBhZGRpbmctaW5saW5lOiB2YXIoLS1ndXR0ZXItc21hbGwpO1xuXG5cdH1cblxuXHQuYnJlYWtvdXQtZmlndXJlLS1ibGVlZCAuYnJlYWtvdXQtZmlndXJlX19tZWRpYSB7XG5cblx0XHRhc3BlY3QtcmF0aW86IDQgLyAzO1xuXHRcdG1pbi1oZWlnaHQ6IDA7XG5cblx0fVxuXG5cdC5icmVha291dC1maWd1cmUtLWJsZWVkIC5icmVha291dC1maWd1cmVfX2NhcHRpb24ge1xuXG5cdFx0cGFkZGluZzogdmFyKC0tc3BhY2UtMTIpIHZhcigtLWd1dHRlci1zbWFsbCkgdmFyKC0tc3BhY2UtNCk7XG5cblx0fVxufVxuXG4vLyAtLWNvbHVtbiDigJQgYW4gaW4tYm9keSBpbWFnZSBmbG9hdGVkIGF0IHRoZSByZWFkaW5nIGNvbHVtbidzIHdpZHRoLCBhZGRlZCBpbiB0aGVcbi8vIHdpcmluZyAob3BlcmF0b3IsIDIwMjYtMDktMjgpOiB0aGUgcmVhZGluZyBwYW5lbCBjbG9zZXMgYWJvdmUgaXQgYW5kIHJlb3BlbnNcbi8vIGJlbG93LCBzbyB0aGUgaW1hZ2Ugc2l0cyBvbiB0aGUgcGFnZSBvbiBpdHMgb3duIGFuZCB0aGUgcmFpbCBjYXJyaWVzIG9uIGJlc2lkZVxuLy8gaXQuIFRoZSAtLXdpZGUgZnJhbWUsIGF0IHRoZSBjb2x1bW4ncyB3aWR0aCBhbmQgdGhlIGltYWdlJ3MgbmF0dXJhbCBoZWlnaHQg4oCUXG4vLyBhIHNjcmVlbnNob3QgaXMgbm90IGNyb3BwZWQgdG8gYSBzdHJpcC5cblxuLmJyZWFrb3V0LWZpZ3VyZS0tY29sdW1uIHtcblxuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0Ym94LXNoYWRvdzogdmFyKC0tc2hhZG93LXBhbmVsKTtcblxufVxuXG4uYnJlYWtvdXQtZmlndXJlLS1jb2x1bW4gLmJyZWFrb3V0LWZpZ3VyZV9fbWVkaWEge1xuXG5cdGhlaWdodDogYXV0bztcblxufVxuXG4uYnJlYWtvdXQtZmlndXJlLS1jb2x1bW4gLmJyZWFrb3V0LWZpZ3VyZV9fY2FwdGlvbiB7XG5cblx0cGFkZGluZzogdmFyKC0tc3BhY2UtNCkgdmFyKC0tc3BhY2UtY2FyZC1wYWRkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuXG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgYnRuXG4vL1xuLy8gVGhlIHN0b3JlIGJ1dHRvbi4gU3F1YXJlLCBmbGF0LCBQYXJhZ29uLWJsdWUgZmlsbCB3aXRoIGEgd2hpdGUgbGFiZWwuXG4vLyAtLXByaW1hcnkgc2V0cyBpdHMgbGFiZWwgaW4gdGhlIGhlYWRpbmcgZm9udCBhdCBtZWRpdW0gd2VpZ2h0IChzaG9wLFxuLy8gc3VibWl0LCBhcHBseSk7IC0tY29tbWVyY2Ugc2V0cyBpdCBpbiB0aGUgY29tbWVyY2UgZm9udCwgYm9sZCwgc2xhbnRlZCBhbmRcbi8vIHVwcGVyY2FzZSAoYWRkIHRvIGJhc2tldCkuXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYGJ0bmAuIFBvcnRlZCBmb3IgdGhlIE1QRzkgcHJvZHVjdC1wYWdlIHdhbGssIDIwMjYtMDktMTYuXG5cbi5idG4ge1xuXG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKTtcblx0cGFkZGluZy1ibG9jazogdmFyKC0tc3BhY2UtMyk7XG5cdHBhZGRpbmctaW5saW5lOiB2YXIoLS1zcGFjZS02KTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtYnRuKTtcblx0Ym94LXNoYWRvdzogdmFyKC0tc2hhZG93LWNhcmQpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdHRleHQtYWxpZ246IGNlbnRlcjtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5idG4tLXByaW1hcnkge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJ0bi1wcmltYXJ5LWJnKTtcblx0Y29sb3I6IHZhcigtLWJ0bi1wcmltYXJ5LXRleHQpO1xufVxuXG4uYnRuLS1wcmltYXJ5OmhvdmVyIHtcblxuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1idG4tcHJpbWFyeS1iZy1ob3Zlcik7XG5cdGNvbG9yOiB2YXIoLS1idG4tcHJpbWFyeS10ZXh0KTtcbn1cblxuLmJ0bi0tY29tbWVyY2Uge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJ0bi1wcmltYXJ5LWJnKTtcblx0Y29sb3I6IHZhcigtLWJ0bi1wcmltYXJ5LXRleHQpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtY2hyb21lKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LWJvbGQpO1xuXHRmb250LXN0eWxlOiBpdGFsaWM7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGxldHRlci1zcGFjaW5nOiAwLjA0ZW07XG5cdHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG5cdHBhZGRpbmctaW5saW5lOiB2YXIoLS1zcGFjZS00KTtcbn1cblxuLmJ0bi0tY29tbWVyY2U6aG92ZXIge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJ0bi1wcmltYXJ5LWJnLWhvdmVyKTtcblx0Y29sb3I6IHZhcigtLWJ0bi1wcmltYXJ5LXRleHQpO1xufVxuXG4uYnRuLS1ibG9jayB7XG5cblx0d2lkdGg6IDEwMCU7XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgYnV5LWJveFxuLy9cbi8vIFRoZSBjb250ZW50cyBvZiB0aGUgT3JkZXIgTm93IHBhbmVsOiBwcmljZSwgc3RvY2ssIHRoZSBkZWxpdmVyeSBsaW5lLFxuLy8gcXVhbnRpdHksIGJhc2tldCBhbmQgd2lzaGxpc3QuIEl0IHN1cHBsaWVzIGNvbnRlbnRzIG9ubHkg4oCUIHRoZSBzdXJmYWNlXG4vLyBhcm91bmQgaXQgaXMgYm9yZGVyZWQtZ3JvdXAsIHRoZSBicmFuZCdzIG9uZSBsYWJlbGxlZC1wYW5lbCB0cmVhdG1lbnQuIEl0XG4vLyBjYXJyaWVzIE5PIHBheS1sYXRlciBsaW5lIGFuZCBOTyByYXRpbmc6IENsZWFycGF5IGlzIGNsYWltZWQgb25jZSBvbiB0aGVcbi8vIHBhZ2UgYnkgcGF5bGF0ZXItY2FyZCwgYW5kIGV2ZXJ5IHByb2R1Y3QgaW4gdGhpcyBjYXRhbG9ndWUgaGFzIHplcm9cbi8vIHJldmlld3MsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gc2hvdyBhbmQgbm8gZW1wdHkgc3RhdGUgd29ydGggcHJpbnRpbmcgb25cbi8vIDMsOTEyIHBhZ2VzLiBUaGUgZGVsaXZlcnkgbGluZSByZWFkcyB0aGUgcHJvZHVjdCdzIHNoaXBwaW5nIGNsYXNzLCB3aGljaCBpc1xuLy8gd2hlcmUgdGhpcyBicmFuZCBrZWVwcyBkZWxpdmVyeSB3aW5kb3dzLlxuLy9cbi8vIFNvdXJjZTogY2F0YWxvZ3VlIGJsb2NrIGBidXktYm94YC4gUG9ydGVkIGZvciB0aGUgTVBHOSBwcm9kdWN0LXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgYnV5LWJveCAgKFVQREFURUQg4oCUIGEgZGVsaXZlcnkgbGluZSwgYSB3YXMtcHJpY2UsIG5vIGludmVudGVkIHByb21pc2UpXG4gICBUaGUgb25lIHJlZ2lvbiB0aGF0IGRlY2lkZXMgd2hldGhlciB0aGUgc3RvcmUgdHJhZGVzLlxuXG4gICBUSFJFRSBDSEFOR0VTIGZyb20gdGhlIGZpcnN0IGRyYWZ0LCBlYWNoIG9mIHRoZW0gYSBmYWN0IHJhdGhlciB0aGFuIGEgdGFzdGU6XG5cbiAgIDEuIFRoZSBkaXNwYXRjaCBsaW5lIHNhaWQgXCJPcmRlciBiZWZvcmUgMnBtIGZvciBzYW1lLWRheSBkaXNwYXRjaFwiLiBOb3RoaW5nXG4gICAgICBpbiB0aGUgbWlncmF0ZWQgZGF0YSBzdXBwb3J0cyBpdCBhbmQgbm8gb3BlcmF0b3Igc3RhdGVkIGl0LCBzbyBpdCBpc1xuICAgICAgZ29uZS4gSXRzIHBsYWNlIGlzIHRha2VuIGJ5IGEgREVMSVZFUlkgbGluZSByZWFkIGZyb20gdGhlIHByb2R1Y3Qnc1xuICAgICAgc2hpcHBpbmcgY2xhc3MsIHdoaWNoIGlzIHdoZXJlIHRoaXMgYnJhbmQga2VlcHMgZGVsaXZlcnkgd2luZG93cyDigJRcbiAgICAgIG9wZXJhdG9yLWVkaXRhYmxlIHRlcm0gbWV0YSwgb25lIHZhbHVlIHBlciBjbGFzcy4gQWxsIGVsZXZlbiBjbGFzc2VzIGFyZVxuICAgICAgY3VycmVudGx5IGVtcHR5LCBzbyB0aGUgbW9ja3VwIHNob3dzIHRoZSBzaGFwZSB3aXRoIGEgbWFya2VkIHBsYWNlaG9sZGVyXG4gICAgICByYXRoZXIgdGhhbiBhIG51bWJlciBub2JvZHkgaGFzIGFncmVlZC5cblxuICAgICAgVGhlIGNsYXNzIG5hbWVzIGFyZSBTVVBQTElFUiBuYW1lcyAoU3BpcmUgVGVjaG5vbG9neSwgRXhlcnRpcyBVSywgVGFyZ2V0XG4gICAgICBDb21wb25lbnRzKS4gVGhlIHNob3BwZXIgc2VlcyB0aGUgd2luZG93LCBuZXZlciB0aGUgc3VwcGxpZXIuXG5cbiAgIDIuIEEgd2FzLXByaWNlIGFuZCBhIHNhdmluZywgZm9yIHRoZSAzNDggcHJvZHVjdHMgb2YgMyw5MTIgdGhhdCBjYXJyeSBhIHNhbGVcbiAgICAgIHByaWNlLiBBYnNlbnQgb24gdGhlIG90aGVyIDkxJSwgd2hlcmUgdGhlIHByaWNlIHN0YW5kcyBhbG9uZS5cblxuICAgMy4gTm8gcmF0aW5nIGFuZCBubyByZXZpZXcgY291bnQgYW55d2hlcmUuIEV2ZXJ5IHByb2R1Y3QgaW4gdGhlIGNhdGFsb2d1ZVxuICAgICAgcmVhZHMgemVybyByZXZpZXdzIGFuZCB6ZXJvIGF2ZXJhZ2UgcmF0aW5nIOKAlCBub3QgbG93LCBuaWwg4oCUIHNvIHRoZXJlIGlzXG4gICAgICBub3RoaW5nIHRvIHNob3cgYW5kIG5vIGVtcHR5IHN0YXRlIHdvcnRoIHByaW50aW5nIG9uIDMsOTEyIHBhZ2VzLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi5idXktYm94IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLTYpO1xufVxuXG4uYnV5LWJveF9fcHJpY2VzIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LXdyYXA6IHdyYXA7XG5cdGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcblx0Z2FwOiB2YXIoLS1zcGFjZS0zKTtcbn1cblxuLmJ1eS1ib3hfX3ByaWNlIHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1jaHJvbWUpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWgyKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LWJvbGQpO1xuXHRmb250LXN0eWxlOiBpdGFsaWM7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0bGV0dGVyLXNwYWNpbmc6IDAuMDFlbTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG59XG5cbi5idXktYm94X193YXMge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG59XG5cbi5idXktYm94X19zYXZlIHtcblxuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS0xKSB2YXIoLS1zcGFjZS0zKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXBpbGwpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1icmFuZCk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW9uLWJyYW5kKTtcbn1cblxuLmJ1eS1ib3hfX2ZhY3RzIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLTMpO1xufVxuXG4uYnV5LWJveF9fc3RvY2sge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMik7XG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcbn1cblxuLmJ1eS1ib3hfX3N0b2NrLWRvdCB7XG5cblx0ZmxleDogMCAwIGF1dG87XG5cdHdpZHRoOiA4cHg7XG5cdGhlaWdodDogOHB4O1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtcGlsbCk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLXBvc2l0aXZlKTtcbn1cblxuLmJ1eS1ib3gtLW91dC1vZi1zdG9jayAuYnV5LWJveF9fc3RvY2stZG90IHtcblxuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1uZWdhdGl2ZSk7XG59XG5cbi5idXktYm94X19kZWxpdmVyeSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKTtcblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG59XG5cbi5idXktYm94X19kZWxpdmVyeS1pY29uIHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0d2lkdGg6IDQwcHg7XG5cdGhlaWdodDogNDBweDtcblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xufVxuXG4uYnV5LWJveF9fZGVsaXZlcnktaWNvbiBzdmcge1xuXG5cdHdpZHRoOiAxMDAlO1xuXHRoZWlnaHQ6IDEwMCU7XG59XG5cbi5idXktYm94X19wdXJjaGFzZSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0zKTtcbn1cblxuLmJ1eS1ib3hfX3F1YW50aXR5IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LXdyYXA6IHdyYXA7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG59XG5cbi8qIFRoZSBzdG9jayBzdGF0ZSBxdWFsaWZpZXMgdGhlIGNvbnRyb2wgYmVzaWRlIGl0IHJhdGhlciB0aGFuIHRoZSBwcm9kdWN0IGFib3ZlXG4gICBpdCwgc28gaXQgcmlkZXMgdGhlIHF1YW50aXR5IHJvdyBhbmQgc2l0cyBhdCBpdHMgZW5kLiBgYXV0b2AgcmF0aGVyIHRoYW5cbiAgIHNwYWNlLWJldHdlZW4sIHNvIHRoZSBsYWJlbCBhbmQgc3RlcHBlciBzdGF5IHRvZ2V0aGVyIHdoZW4gdGhlIHJvdyBpcyB3aWRlLiAqL1xuLmJ1eS1ib3hfX3F1YW50aXR5IC5idXktYm94X19zdG9jayB7XG5cblx0bWFyZ2luLWlubGluZS1zdGFydDogYXV0bztcbn1cblxuLmJ1eS1ib3hfX3F1YW50aXR5LWxhYmVsIHtcblxuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcbn1cblxuLmJ1eS1ib3hfX2FjdGlvbnMge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xufVxuXG4uYnV5LWJveF9fYWN0aW9ucyAuYnRuIHtcblxuXHRmbGV4OiAxIDEgYXV0bztcbn1cblxuLmJ1eS1ib3hfX3dpc2hsaXN0IHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0ZGlzcGxheTogaW5saW5lLWZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXHR3aWR0aDogNDZweDtcblx0cGFkZGluZzogMDtcblx0Ym9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtYnRuKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2FyZCk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJyYW5kKTtcblx0Y3Vyc29yOiBwb2ludGVyO1xufVxuXG4uYnV5LWJveF9fd2lzaGxpc3Q6aG92ZXIge1xuXG5cdGJvcmRlci1jb2xvcjogdmFyKC0tYm9yZGVyLWJyYW5kKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2FyZC1ob3Zlcik7XG59XG5cbi5idXktYm94X193aXNobGlzdCBzdmcge1xuXG5cdHdpZHRoOiAyNnB4O1xuXHRoZWlnaHQ6IDI2cHg7XG59XG5cbi5idXktYm94X19wYXktbGF0ZXIge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xufVxuXG4uYnV5LWJveF9fcGF5LWxhdGVyLWxhYmVsIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0bWFyZ2luOiAwIDAgdmFyKC0tc3BhY2UtMik7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1leWVicm93KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0bGV0dGVyLXNwYWNpbmc6IDAuMWVtO1xuXHR0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG59XG5cbi5idXktYm94X19pbnN0YWxtZW50cyB7XG5cblx0ZmxleC1iYXNpczogMTAwJTtcblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1ib2R5KTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuXG4uYnV5LWJveF9fbG95YWx0eSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0zKTtcbn1cblxuLmJ1eS1ib3hfX2xveWFsdHktaWNvbiB7XG5cblx0ZmxleDogMCAwIGF1dG87XG5cdHdpZHRoOiAzNHB4O1xuXHRoZWlnaHQ6IDM0cHg7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJyYW5kKTtcbn1cblxuLmJ1eS1ib3hfX2xveWFsdHktaWNvbiBzdmcge1xuXG5cdHdpZHRoOiAxMDAlO1xuXHRoZWlnaHQ6IDEwMCU7XG59XG5cbi5idXktYm94X19maWd1cmUge1xuXG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgYnV5LXJlZ2lvblxuLy9cbi8vIFRoZSBoZXJvIHJlZ2lvbjogb25lIGZ1bGwtd2lkdGggcGFuZWwgaG9sZGluZyB0aGUgZ2FsbGVyeSBhbmQgYnV5IGJveCBhc1xuLy8gdHdvIGhhbHZlcyB3aXRoIG5vIGd1dHRlciwgY2xvc2VkIGJ5IGEgZnVsbC13aWR0aCBpZGVudGl0eSBzdHJpcCwgd2l0aCB0aGVcbi8vIHBheS1sYXRlciBhbmQgbG95YWx0eSBjYXJkcyBvbiB0aGUgb3BlbiBncm91bmQgYmVuZWF0aCBpdCBhcyB0aGVpciBvd25cbi8vIDUwLzUwIHJvdy4gVGhlIG1lcmdlIGlzIG9ubHkgc2FmZSBiZWNhdXNlIHRoZSBoYWx2ZXMgd2VyZSBmaXJzdCBicm91Z2h0XG4vLyB3aXRoaW4gfjQ0cHggb2YgZWFjaCBvdGhlciDigJQgYSBwYW5lbCBzcGFubmluZyB0d28gY29sdW1ucyBpcyBvbmx5IGFzIHRhbGxcbi8vIGFzIGl0cyB0YWxsZXIgaGFsZi5cbi8vXG4vLyBTb3VyY2U6IE1QRzkgbW9ja3VwIChkZXNpZ24gMTc5NjcpLCBubyBjYXRhbG9ndWUgcm93LiBQb3J0ZWQgZm9yIHRoZSBNUEc5IHByb2R1Y3QtcGFnZSB3YWxrLCAyMDI2LTA5LTE2LlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIFBBR0UgTEFZT1VUIOKAlCB0aGUgc2hlbGwsIHRoZSByYWlsIGFuZCB0aGUgcmVnaW9uIGdyaWRzLlxuXG4gICBCVUlMVCAyMDI2LTA5LTE1IGZyb20gc2l4IHBpZWNlcyBvZiBvcGVyYXRvciBmZWVkYmFjaywgYWZ0ZXIgdGhyZWUgZGVzaWduc1xuICAgd2VyZSByZWplY3RlZC4gRWFjaCBvZiB0aGUgc2l4IGlzIGFuc3dlcmVkIGluIG9uZSBwbGFjZSBhbmQgdGhlIHBsYWNlIGlzXG4gICBuYW1lZCwgc28gYSBsYXRlciBzZXNzaW9uIGNhbiBzZWUgd2hpY2ggY2hvaWNlcyBhcmUgbG9hZC1iZWFyaW5nOlxuXG4gICAxLiBUaGUgc2hvcnQgZGVzY3JpcHRpb24gZ29lcyBCRUZPUkUgdGhlIGJ1eSBib3ggICAg4oaSIC5idXktcmVnaW9uX19zdW1tYXJ5XG4gICAyLiBMb3lhbHR5IHBvaW50cyBzaXQgQUZURVIgdGhlIGJ1eSBib3ggICAgICAgICAgICAg4oaSIC5idXktcmVnaW9uX19zdW1tYXJ5XG4gICAzLiBTdGF0IHBpbGxzIGxpdmUgaW5zaWRlIHRoZSBwcm9kdWN0IGRlc2NyaXB0aW9uICAg4oaSIC5kb2MtZmlndXJlc1xuICAgNC4gVGhlIGRlc2NyaXB0aW9uIHRha2VzIHRoZSBsaXZlIHNpdGUncyBjb2x1bW4gICAgIOKGkiAuc3RvcmUtbGF5b3V0XG4gICA1LiBBZGQgdG8gQmFza2V0IG5ldmVyIHdyYXBzIHRvIHR3byBsaW5lcyAgICAgICAgICAg4oaSIC5idG4tLWNvbW1lcmNlLCAucm91dGUtcm93XG4gICA2LiBUaGUgbmF2aWdhdGlvbiByYWlsIGNvbWVzIGJhY2ssIGRlc2t0b3Agb25seSAgICAg4oaSIC5zdG9yZS1sYXlvdXRfX3NpZGViYXJcblxuICAgVEhFIENPTFVNTiBJUyAxMDQycHggQU5EIFRIQVQgSVMgVEhFIFBPSU5UIE9GICg0KS4gSXQgaXMgd2hhdCB0aGUgbGl2ZSBzdG9yZVxuICAgZ2l2ZXMgaXRzIGNvbnRlbnQ6IGEgMTQwMCBwYWdlLCBhIDMyOCByYWlsLCBhIDMwIGdhcC4gVGhyZWUgZHJhZnRzIHB1dCB0aGVcbiAgIGRlc2NyaXB0aW9uIGF0IDY4MCBvciA3NDAgYmVjYXVzZSB0aGF0IGlzIHRoZSBzdHlsZWd1aWRlJ3MgUkVBRElORyBtZWFzdXJlLFxuICAgYW5kIGFsbCB0aHJlZSByZWFkIGFzIGNyYW1wZWQg4oCUIGJlY2F1c2UgdGhlIG1lYXN1cmUgd2FzIHNldCBmb3IgZWRpdG9yaWFsXG4gICBwYWdlcywgd2hlcmUgcHJvc2UgaXMgYWxvbmUgb24gdGhlIHBhZ2UuIEEgcHJvZHVjdCBkZXNjcmlwdGlvbiBpcyBub3QgYWxvbmU6XG4gICBpdCBjYXJyaWVzIHN0YXQgYmxvY2tzLCBzcGVjIHRhYmxlcyBhbmQgZmVhdHVyZSByb3dzLCBhbmQgaXQgd2FudHMgdGhlIHJvb21cbiAgIHRoZSBzdG9yZSBhbHJlYWR5IGdpdmVzIGl0LiBUaGUgNjgwIG1lYXN1cmUgc3RpbGwgZ292ZXJucyBhcnRpY2xlIHBhZ2VzLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi5wYWdlX19pbm5lciB7XG5cblx0bWF4LXdpZHRoOiBjYWxjKCB2YXIoLS1zaXRlLW1heC13aWR0aCkgKyAoIHZhcigtLWd1dHRlci1zbWFsbCkgKiAyICkgKTtcblx0bWFyZ2luLWlubGluZTogYXV0bztcblx0cGFkZGluZy1pbmxpbmU6IHZhcigtLWd1dHRlci1zbWFsbCk7XG59XG5cbi8qIC0tLS0gdGhlIGJ1eWluZyByZWdpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICBUV08gUEFORUxTLCBOT1QgT05FLiBUaGUgZ2FsbGVyeSBhbmQgdGhlIHN1bW1hcnkgY2FycnkgdmVyeSBkaWZmZXJlbnRcbiAgIGFtb3VudHMsIGFuZCBhIHNpbmdsZSBwYW5lbCBzcGFubmluZyBib3RoIHdvdWxkIGJlIGFzIHRhbGwgYXMgdGhlIHRhbGxlciBhbmRcbiAgIHNob3cgdGhlIGRpZmZlcmVuY2UgYXMgZW1wdHkgd2hpdGUg4oCUIHRoZSBmYXVsdCB0aGF0IHNhbmsgdGhlIGZpcnN0IHR3b1xuICAgZHJhZnRzLiBTaXplZCBzZXBhcmF0ZWx5IHRoZXkgZWFjaCBlbmQgd2hlcmUgdGhlaXIgY29udGVudCBlbmRzLCBhbmQgd2hhdFxuICAgc2hvd3MgYmVuZWF0aCB0aGUgc2hvcnRlciBvbmUgaXMgdGhlIHBhZ2UncyBvd24gZ3JvdW5kLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi5idXktcmVnaW9uIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLWNvbnRlbnQtZ2FwKTtcbn1cblxuLyogVGhlIHR3byBoYWx2ZXMgb2YgdGhlIG9uZSBwYW5lbC4gVGhlcmUgaXMgbm8gZ3JleSBiZXR3ZWVuIHRoZW0g4oCUIHRoZSBwYW5lbCdzXG4gICBvd24gcGFkZGluZyBpcyB0aGUgb3V0ZXIgZWRnZSBhbmQgdGhpcyBnYXAgaXMgdGhlIG9ubHkgc2VwYXJhdGlvbiwgd2hpY2ggaXNcbiAgIHdoYXQgbWFrZXMgdGhlbSByZWFkIGFzIG9uZSBjYXJkIHJhdGhlciB0aGFuIHR3by4gKi9cbi5idXktcmVnaW9uX19ncmlkIHtcblxuXHRkaXNwbGF5OiBncmlkO1xuXHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCggMiwgbWlubWF4KCAwLCAxZnIgKSApO1xuXHRhbGlnbi1pdGVtczogc3RhcnQ7XG5cdGdhcDogdmFyKC0tc3BhY2UtY29udGVudC1nYXApO1xufVxuXG4vKiBUaGUgcGF5LWxhdGVyIGFuZCBsb3lhbHR5IGNhcmRzLCBvbiB0aGUgZ3JvdW5kIGJlbmVhdGgsIG9uZSB1bmRlciBlYWNoIGhhbGYuICovXG4uYnV5LXJlZ2lvbl9fY2FyZHMge1xuXG5cdGRpc3BsYXk6IGdyaWQ7XG5cdGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KCAyLCBtaW5tYXgoIDAsIDFmciApICk7XG5cdGdhcDogdmFyKC0tc3BhY2UtY29udGVudC1nYXApO1xufVxuXG4vKiAoMSkgYW5kICgyKSBhcmUgYm90aCB0aGlzIHN0YWNrJ3MgT1JERVIsIGFuZCBpdCBpcyB0aGUgd2hvbGUgb2Ygd2hhdCB0aGV5XG4gICBhc2tlZCBmb3I6IHRpdGxlLCB0aGVuIHRoZSBzaG9ydCBkZXNjcmlwdGlvbiwgdGhlbiB0aGUgYnV5IGJveCwgdGhlbiB0aGVcbiAgIGxveWFsdHkgcGFuZWwsIHRoZW4gdGhlIGlkZW50aXR5IGxpbmUuIFRoZSBsb3lhbHR5IGdyb3VwIHVzZWQgdG8gYmUgbmVzdGVkXG4gICBpbnNpZGUgdGhlIGJ1eSBib3ggYXQgaXRzIGZvb3Q7IGl0IGlzIG5vdyBpdHMgb3duIHBhbmVsIGFmdGVyIGl0LCB3aGljaCBpc1xuICAgYWxzbyB3aHkgaXQgY2FuIGtlZXAgdGhlIGxhYmVsbGVkLXBhbmVsIHRyZWF0bWVudCB3aXRob3V0IGJlaW5nIGEgYm94IGluc2lkZVxuICAgYSBib3ggaW5zaWRlIGEgYm94LiAqL1xuLmJ1eS1yZWdpb25fX3N1bW1hcnkge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogdmFyKC0tc3BhY2UtNik7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogOTAwcHggKSB7XG5cbi5idXktcmVnaW9uX19ncmlkLFxuXHQuYnV5LXJlZ2lvbl9fY2FyZHMge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoIDAsIDFmciApO1xuXHR9XG59XG5cbi8qIFRoZSBpZGVudGl0eSBsaW5lIGNsb3NlcyB0aGUgaGVybyBjYXJkLCBydW5uaW5nIGl0cyB3aG9sZSB3aWR0aC4gQnJhbmQsIFNLVSxcbiAgIG1hbnVmYWN0dXJlciBwYXJ0IGFuZCBiYXJjb2RlIHRoZW4gc2l0IG9uIE9ORSBsaW5lIOKAlCBpbiBhIGhhbGYtd2lkdGggY29sdW1uXG4gICB0aGV5IHdyYXBwZWQgdG8gdHdvLCB3aGljaCBpcyB3aGF0IG1hZGUgdGhlIGdhbGxlcnkgc2lkZSB0aGUgdGFsbGVyIGhhbGYuICovXG4uYnV5LXJlZ2lvbiAuZGVzY3JpcHRpb24tcGFuZWwgPiAuZGVjaXNpb25fX2lkZW50aXR5IHtcblxuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTYpO1xufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGNhcmQtbGluZVxuLy9cbi8vIFRoZSBxdWlldCBsaW5lIHVuZGVyIGEgY2FyZCdzIHRpdGxlOiBhIHByb2R1Y3QgY291bnQgb24gYSByb3V0ZSBjYXJkLCBhIHByaWNlXG4vLyBvbiBhIHByb2R1Y3Qgb25lLiBTbWFsbCwgcmVndWxhciB3ZWlnaHQsIGJvZHkgY29sb3VyLlxuLy9cbi8vIElUIFNUQVRFUyBJVFMgT1dOIERJU1BMQVkgQU5EIE1BUkdJTiByYXRoZXIgdGhhbiByZXNldHRpbmcgdG8gemVybywgc28gaXRcbi8vIGNhbm5vdCBiZSBjYXVnaHQgYnkgYSBkb2N1bWVudCdzIGA+ICogKyAqYCByaHl0aG0gcnVsZSBhbmQgd2luIG9uIHNvdXJjZSBvcmRlci5cbi8vXG4vLyBNSVNTRUQgQVQgRU5VTUVSQVRJT04gYW5kIGF1dGhvcmVkIGR1cmluZyBjb21wb3NpdGlvbiAod2Fsay1iYWNrLCBQaGFzZSBEIOKGklxuLy8gQykuIEl0IGlzIGEgb25lLXJ1bGUgY29tcG9uZW50IHNpdHRpbmcgaW5zaWRlIHJhbmdlLWNhcmQgYW5kIHByb2R1Y3QtbWluaSwgYW5kXG4vLyB0aGUgZW51bWVyYXRpb24gd2Fsa2VkIHRoZSBiYW5kIHdyYXBwZXJzIHJhdGhlciB0aGFuIHRoZSB0ZXh0IGluc2lkZSB0aGUgY2FyZHNcbi8vIOKAlCB0aGUgc2FtZSBzaGFwZSBvZiBtaXNzIEIuMWEgZGVzY3JpYmVzIGZvciBiYW5kIGhlYWRzLCBvbmUgbGV2ZWwgZnVydGhlciBpbi5cbi8vXG4vLyBTb3VyY2U6IGNhdGFsb2d1ZSBibG9jayBgY2FyZC1saW5lYCwgcmVjb25jaWxlZCBhZ2FpbnN0IE1QRzggKGRlc2lnbiAxNzk1NSkuXG4vLyBQb3J0ZWQgZm9yIHRoZSBNUEc4IGNhdGVnb3J5LWZ1bm5lbCB3YWxrLCAyMDI2LTA5LTE2LlxuXG4uY2FyZC1saW5lIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS0zKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGNhdGVnb3J5LWVkaXRvcmlhbFxuLy9cbi8vIEEgY2F0ZWdvcnkncyBvd24gbG9uZy1mb3JtIGNvcHksIGFsdGVybmF0aW5nIHRleHQgYW5kIHBob3RvZ3JhcGggZG93biBpdHMgb3duXG4vLyBwYW5lbCBhbmQgcmV1c2luZyBgZmVhdHVyZS1wYW5lbGAgZm9yIGVhY2ggcGFpci4gSXQgaXMgd2hhdCBhIGNhdGVnb3J5IHBhZ2Vcbi8vIGNvbXBldGVzIG9uOiB0aGUgZ3JpZCBhbnN3ZXJzICdzaG93IG1lIGNvbnRyb2xsZXJzJywgdGhpcyBhbnN3ZXJzICd3aGljaFxuLy8gY29udHJvbGxlciBzaG91bGQgSSBidXknLlxuLy9cbi8vIENvbXBvc2VzIHdpdGg6IC5mZWF0dXJlLXBhbmVsIChzaGlwcGVkLCBNUEc5KSwgLnNlY3Rpb24tbGluayAoc2hpcHBlZCkuXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYGNhdGVnb3J5LWVkaXRvcmlhbGAsIGhhcnZlc3RlZCBmcm9tIFRISVMgbW9ja3VwIGFuZFxuLy8gc3VwZXJzZWRlZCAyMDI2LTA5LTE1LiBQb3J0ZWQgZm9yIHRoZSBNUEc3IGNhdGVnb3J5LWFyY2hpdmUgd2FsaywgMjAyNi0wOS0xNi5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBDQVRFR09SWSBFRElUT1JJQUwgIChORVcsIGxheW91dClcbiAgIFRoZSBjYXRlZ29yeSdzIG93biBsb25nLWZvcm0gY29weSwgYWx0ZXJuYXRpbmcgdGV4dCBhbmQgcGhvdG9ncmFwaCBkb3duIHRoZVxuICAgcGFnZS4gSXQgaXMgd2hhdCBhIGNhdGVnb3J5IHBhZ2UgY29tcGV0ZXMgb246IHRoZSBncmlkIGFuc3dlcnMgXCJzaG93IG1lXG4gICBjb250cm9sbGVyc1wiLCB0aGlzIGFuc3dlcnMgXCJ3aGljaCBjb250cm9sbGVyIHNob3VsZCBJIGJ1eVwiLCB3aGljaCBpcyB0aGVcbiAgIHF1ZXJ5IHdpdGggdGhlIHZvbHVtZSBiZWhpbmQgaXQuXG5cbiAgIElUIElTIE5PVCBUSEUgUE9MSUNZIEJBTkQgSU4gQSBCSUdHRVIgRk9STUFULiBUaGUgYmFuZCBiZWxvdyByZXBlYXRzIG9uXG4gICBldmVyeSBhcmNoaXZlIGFuZCBzdGF5cyBzaG9ydCBvbiBwdXJwb3NlOyB0aGlzIGlzIHVuaXF1ZSBwZXIgY2F0ZWdvcnkgYW5kIGlzXG4gICB0aGUgY29udGVudCB0aGF0IGNhcnJpZXMgdGhlIHBhZ2UuIFNvdXJjZSBpcyB0aGUgY2F0ZWdvcnkncyBvd25cbiAgIGBib3R0b21fY29udGVudF9wYWdlYCwgd2hpY2ggaG9sZHMgcmVhbCBtaWdyYXRlZCBjb3B5IG9uIDMzIG9mIDI4NFxuICAgY2F0ZWdvcmllcyDigJQgQ29udHJvbGxlcnMgcnVucyB0byBhYm91dCBhIHRob3VzYW5kIHdvcmRzIHVuZGVyIG9uZSBoMiBhbmRcbiAgIHRocmVlIGgzcywgd2hpY2ggaXMgZXhhY3RseSB0aGlzIHNoYXBlLlxuXG4gICBUaGUgcGFuZWxzIHJldXNlIGBmZWF0dXJlLXBhbmVsYCBmcm9tIHRoZSBjYXRhbG9ndWUsIGFsdGVybmF0aW5nIHdpdGggaXRzXG4gICBvd24gYC0tcmV2ZXJzZWAgbW9kaWZpZXIuIE5vIG5ldyBibG9jay5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4uY2F0ZWdvcnktZWRpdG9yaWFsIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLTEyKTtcblx0cGFkZGluZzogdmFyKC0tc3BhY2UtY2FyZC1wYWRkaW5nKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtY2FyZCk7XG5cdGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1wYW5lbCk7XG59XG5cbi5jYXRlZ29yeS1lZGl0b3JpYWxfX2xlZGUge1xuXG5cdG1hcmdpbjogMDtcblx0bWF4LXdpZHRoOiB2YXIoLS1jb250YWluZXItcmVhZGluZyk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBjYXRlZ29yeS1oZWFkZXJcbi8vXG4vLyBBIHJhbmdlJ3Mgb3BlbmluZyBmdXJuaXR1cmU6IGEgYmFubmVyIGNhcnJ5aW5nIHRoZSByYW5nZSBwaG90b2dyYXBoLCBhIHNjcmltXG4vLyBhbmQgdGhlIHBhZ2UncyBvbmUgaDEsIHRoZW4gdGhlIGJvZHkgYmVuZWF0aCBpdCB3aXRoIHRoZSBsaW5lIHRoYXQgc2F5cyB3aGF0XG4vLyB0aGUgcmFuZ2UgaXMgYW5kIHRoZSBmb3VyIHByb21pc2VzIHRoZSBzdG9yZSBtYWtlcyBvbiBldmVyeSBwYWdlIG9mIGl0LlxuLy9cbi8vIFRoZSBzY3JpbSBpcyBhIHNlcGFyYXRlIGVsZW1lbnQgcmF0aGVyIHRoYW4gYSBncmFkaWVudCBvbiB0aGUgYmFubmVyIGJlY2F1c2Vcbi8vIHRoZSBwaG90b2dyYXBoIGlzIGFuIDxpbWc+IGFuZCBub3QgYSBiYWNrZ3JvdW5kIOKAlCBpdCBoYXMgdG8gYmUsIHNvIHRoZSByYW5nZVxuLy8gYXJ0d29yayBjYW4gYmUgYSByZWFsIGF0dGFjaG1lbnQgd2l0aCBhIHJlYWwgYWx0IGxpbmUgcmF0aGVyIHRoYW4gYSBDU1MgVVJMLlxuLy9cbi8vIFNvdXJjZTogY2F0YWxvZ3VlIGJsb2NrIGBjYXRlZ29yeS1oZWFkZXJgLCByZWNvbmNpbGVkIGFnYWluc3QgTVBHOCAoZGVzaWduXG4vLyAxNzk1NSkuIFBvcnRlZCBmb3IgdGhlIE1QRzggY2F0ZWdvcnktZnVubmVsIHdhbGssIDIwMjYtMDktMTYuXG5cbi8qIC0tLS0gY2F0ZWdvcnktaGVhZGVyIChyZXVzZWQgZnJvbSB0aGUgYnJhbmQgY2F0YWxvZ3VlLCB2ZXJiYXRpbSkgLS0tLSAqL1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgY2F0ZWdvcnktaGVhZGVyICAoTkVXKVxuICAgVGhlIGhlcm8gdGhhdCBoZWFkcyBldmVyeSBjYXRlZ29yeSBwYWdlOiBhIHdpZGUgcGhvdG9ncmFwaGljIGJhbm5lciBjYXJyeWluZ1xuICAgdGhlIGNhdGVnb3J5IG5hbWUsIHdpdGggdGhlIGludHJvIGFuZCB0aGUgc3RvcmUncyBmb3VyIHByb21pc2VzIGJlbmVhdGggaXRcbiAgIG9uIHdoaXRlLiBDaG9zZW4gYnkgdGhlIG9wZXJhdG9yIDIwMjYtMDktMTQgb3ZlciBhIHBob3RvZ3JhcGgtYmVzaWRlLWNvcHlcbiAgIHRyZWF0bWVudCwgd2hpY2ggaXMga2VwdCBvbiByZWNvcmQgYmVjYXVzZSBpdCBpcyB3aGF0IHdvcmtzIHdoZW4gYSBjYXRlZ29yeVxuICAgb3ducyBvbmx5IGEgY3V0LW91dCByYXRoZXIgdGhhbiBhIHNjZW5lLlxuXG4gICBUaGUgYmFubmVyIG5lZWRzIGEgREFSSywgV0lERSBpbWFnZS4gVGhlIG9uZSBoZXJlIGlzIHJlYWwg4oCUIGEgY29udHJvbGxlciBpblxuICAgbG93IGxpZ2h0LCAyNTYweDEwODIg4oCUIGJ1dCBpdCBpcyBhdHRhY2hlZCB0byBhIHByb2R1Y3QsIG5vdCB0byB0aGUgY2F0ZWdvcnksXG4gICBzbyB0aGUgdGVtcGxhdGUgbmVlZHMgYSBjYXRlZ29yeSBiYW5uZXIgZmllbGQgb2YgaXRzIG93biByYXRoZXIgdGhhbiBhXG4gICBwaG90b2dyYXBoIHBpY2tlZCBhdCByYW5kb20gZnJvbSB0aGUgY2F0YWxvZ3VlLlxuXG4gICBUZXh0IG92ZXIgcGhvdG9ncmFwaHkgaXMgY2FycmllZCBieSBhIHNjcmltIHJpc2luZyBmcm9tIHRoZSBmb290IG9mIHRoZVxuICAgYmFubmVyLCB3aGljaCBpcyB0aGUgc2FtZSBydWxlIHRoZSBob21lcGFnZSBoZXJvIGFscmVhZHkgZm9sbG93cy5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiAtLS0tIHNoYXJlZCBvdmVyLWltYWdlIHR5cG9ncmFwaHkgLS0tLSAqL1xuLmNhdGVnb3J5LWhlYWRlcl9fdGl0bGUge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWgxKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtb24tYnJhbmQpO1xufVxuXG4vKiAtLS0tIEg6IGJhbm5lciBvdmVyIGNvcHkgLS0tLSAqL1xuXG4uY2F0ZWdvcnktaGVhZGVyIHtcblxuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmNhdGVnb3J5LWhlYWRlcl9fYmFubmVyIHtcblxuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcblx0bWluLWhlaWdodDogMjIwcHg7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWNocm9tZSk7XG59XG5cbi5jYXRlZ29yeS1oZWFkZXJfX21lZGlhIHtcblxuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdGluc2V0OiAwO1xuXHR3aWR0aDogMTAwJTtcblx0aGVpZ2h0OiAxMDAlO1xuXHRvYmplY3QtZml0OiBjb3Zlcjtcbn1cblxuLmNhdGVnb3J5LWhlYWRlcl9fc2NyaW0ge1xuXG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0aW5zZXQ6IDA7XG5cdGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCggMGRlZywgdmFyKC0tYmctb3ZlcmxheSkgMCA0NiUsIHRyYW5zcGFyZW50IDkwJSApO1xufVxuXG4uY2F0ZWdvcnktaGVhZGVyX190aXRsZSB7XG5cblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS02KSB2YXIoLS1zcGFjZS1jYXJkLXBhZGRpbmcpO1xufVxuXG4uY2F0ZWdvcnktaGVhZGVyX19ib2R5IHtcblxuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS02KSB2YXIoLS1zcGFjZS1jYXJkLXBhZGRpbmcpO1xufVxuXG4uY2F0ZWdvcnktaGVhZGVyX19pbnRybyB7XG5cblx0bWFyZ2luOiAwO1xuXHRtYXgtd2lkdGg6IHZhcigtLWNvbnRhaW5lci1yZWFkaW5nKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHktbGcpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbGlnaHQpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG4uY2F0ZWdvcnktaGVhZGVyX19wcm9taXNlcyB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC13cmFwOiB3cmFwO1xuXHRnYXA6IHZhcigtLXNwYWNlLTMpIHZhcigtLXNwYWNlLTgpO1xuXHRtYXJnaW46IHZhcigtLXNwYWNlLTQpIDAgMDtcblx0cGFkZGluZzogdmFyKC0tc3BhY2UtNCkgMCAwO1xuXHRib3JkZXItYmxvY2stc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cdGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi8qIC0tLS0gdGhlIHByb21pc2Ugcm93IC0tLS0gKi9cbi5jYXRlZ29yeS1oZWFkZXJfX3Byb21pc2Uge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMik7XG5cdG1pbi13aWR0aDogMDtcbn1cblxuLmNhdGVnb3J5LWhlYWRlcl9fcHJvbWlzZS1pY29uIHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0d2lkdGg6IDI0cHg7XG5cdGhlaWdodDogMjRweDtcblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xufVxuXG4uY2F0ZWdvcnktaGVhZGVyX19wcm9taXNlLWljb24gc3ZnIHtcblxuXHR3aWR0aDogMTAwJTtcblx0aGVpZ2h0OiAxMDAlO1xufVxuXG4uY2F0ZWdvcnktaGVhZGVyX19wcm9taXNlLWxhYmVsIHtcblxuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLyogV2hpdGUgb24gdGhlIHBob3RvZ3JhcGguIFdyaXR0ZW4gYXMgYSBkZXNjZW5kYW50IHNvIGl0IG91dHJhbmtzIHRoZSBzaGFyZWRcbiAgIHByb21pc2UgcnVsZSBiZWxvdyByYXRoZXIgdGhhbiB0eWluZyBpdCBhbmQgbG9zaW5nIG9uIHNvdXJjZSBvcmRlci4gKi9cbi5jYXRlZ29yeS1oZWFkZXJfX2Jhbm5lciAuY2F0ZWdvcnktaGVhZGVyX190aXRsZSB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtb24tYnJhbmQpO1xufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGNhdGVnb3J5LXRpbGVcbi8vXG4vLyBBIHJhbmdlIGVudHJ5IHBvaW50OiBhIHBob3RvZ3JhcGggYXQgdGhlIGNhcmQgcmFkaXVzIHdpdGggaXRzIHRpdGxlIGNlbnRyZWRcbi8vIGluIHdoaXRlIG92ZXIgYSBzY3JpbS4gVXNlZCB0d2ljZSBvbiB0aGUgaG9tZXBhZ2UgYXQgdHdvIGRlbnNpdGllcyDigJRcbi8vIGF0bW9zcGhlcmljIHBob3RvZ3JhcGh5IGZvciB0aGUgdGhyZWUgdG9wLWxldmVsIHJhbmdlcywgYW5kIGAtLWNvbXBhY3RgIGZvclxuLy8gdGhlIGRlbnNlciBmb3VyLXVwIHJvdyBvZiBQQyBjb21wb25lbnQgdHlwZXMsIHdoaWNoIGNyb3BzIHNob3J0ZXIuXG4vL1xuLy8gRGlzdGluY3QgZnJvbSBgcmFuZ2UtY2FyZGAsIHdoaWNoIGlzIGEgcGFuZWwtd2hpdGUgY2FyZCBjYXJyeWluZyBhIHByb2R1Y3Rcbi8vIGNvdW50IGJlbG93IGl0cyBpbWFnZS4gQSB0aWxlIGlzIGEgcGhvdG9ncmFwaCB5b3UgY2xpY2s7IGEgcmFuZ2UgY2FyZCBpcyBhXG4vLyBjYXJkIHRoYXQgdGVsbHMgeW91IGhvdyBtdWNoIGlzIGJlaGluZCBpdC5cbi8vXG4vLyBTb3VyY2U6IGNhdGFsb2d1ZSBibG9jayBgY2F0ZWdvcnktdGlsZWAuIFBvcnRlZCBmb3IgdGhlIE1QRzEgaG9tZXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLmNhdGVnb3J5LXRpbGUge1xuXG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0ZGlzcGxheTogYmxvY2s7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbmV1dHJhbC04MDApO1xuXHRib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctY2FyZCk7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLmNhdGVnb3J5LXRpbGVfX21lZGlhIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdGFzcGVjdC1yYXRpbzogMyAvIDI7XG5cdG9iamVjdC1maXQ6IGNvdmVyO1xufVxuXG4uY2F0ZWdvcnktdGlsZS0tY29tcGFjdCAuY2F0ZWdvcnktdGlsZV9fbWVkaWEge1xuXG5cdGFzcGVjdC1yYXRpbzogNCAvIDM7XG59XG5cbi5jYXRlZ29yeS10aWxlX19zY3JpbSB7XG5cblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRpbnNldDogMDtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctb3ZlcmxheSk7XG59XG5cbi5jYXRlZ29yeS10aWxlX190aXRsZSB7XG5cblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRpbnNldDogMDtcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdHBhZGRpbmctaW5saW5lOiB2YXIoLS1zcGFjZS02KTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWg0KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtb24tYnJhbmQpO1xuXHR0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi5jYXRlZ29yeS10aWxlOmhvdmVyIC5jYXRlZ29yeS10aWxlX190aXRsZSB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtb24tYnJhbmQpO1xufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGNoZWNrb3V0LWJhclxuLy9cbi8vIFBvcnRlZCBmcm9tIGNhdGFsb2d1ZSBibG9jayBgY2hlY2tvdXQtYmFyYCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTAsIG9wZXJhdG9yLWFjY2VwdGVkXG4vLyAyMDI2LTA5LTI0KSBmb3IgdGhlIGJhc2tldCB3YWxrLCBNUEcxMC4gVGhlIGNhdGFsb2d1ZSByb3cgaXMgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBjaGVja291dC1iYXIgIChORVcpXG4gICBBdCBwaG9uZSB3aWR0aCB0aGUgT3JkZXIgU3VtbWFyeSBoYXMgZHJvcHBlZCBiZWxvdyB0aGUgaXRlbXMsIHNvIHRoZSB3YXkgb25cbiAgIGlzIHBpbm5lZCB0byB0aGUgZm9vdCBvZiB0aGUgdmlld3BvcnQgd2l0aCB0aGUgdG90YWwgYmVzaWRlIGl0IOKAlCB0aGUgc2hvcHBlclxuICAgbmV2ZXIgaGFzIHRvIHNjcm9sbCBwYXN0IGEgbG9uZyBiYXNrZXQgdG8gcGF5LiBIaWRkZW4gYWJvdmUgcGhvbmUgd2lkdGgsXG4gICB3aGVyZSB0aGUgc3VtbWFyeSBpcyBzdGlja3kgaW4gaXRzIG93biBjb2x1bW4uIFRoZSBvbmUgcGxhY2UgdGhlIGJyYW5kJ3NcbiAgIHNpbmdsZSBzaGFkb3cgaXMgdXNlZCBvbiB0aGlzIHBhZ2U6IGl0IGlzIGZsb2F0aW5nIFVJLlxuXG4gICAtLXNwZWNpbWVuIHBpbnMgaXQgaW4gdGhlIGZsb3cgaW5zdGVhZCwgc28gaXQgY2FuIGJlIGp1ZGdlZCBhdCBkZXNrdG9wIGluXG4gICB0aGUgYXBwcm92YWwgc3RyaXAuIE5vdCBmb3IgcHJvZHVjdGlvbi5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLmNoZWNrb3V0LWJhciB7XG5cblx0cG9zaXRpb246IGZpeGVkO1xuXHRpbnNldC1pbmxpbmU6IDA7XG5cdGluc2V0LWJsb2NrLWVuZDogMDtcblx0ei1pbmRleDogMjA7XG5cdGRpc3BsYXk6IG5vbmU7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjtcblx0Z2FwOiB2YXIoLS1zcGFjZS00KTtcblx0cGFkZGluZzogdmFyKC0tc3BhY2UtMykgdmFyKC0tZ3V0dGVyLXNtYWxsKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xuXHRib3JkZXItYmxvY2stc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cdGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy0xKTtcbn1cblxuLmNoZWNrb3V0LWJhcl9fdG90YWwge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XG5cbi5jaGVja291dC1iYXJfX2xhYmVsIHtcblxuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtZXllYnJvdyk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGxldHRlci1zcGFjaW5nOiAwLjEyZW07XG5cdHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbn1cblxuLmNoZWNrb3V0LWJhcl9fdmFsdWUge1xuXG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1jaHJvbWUpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWg0KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LWJvbGQpO1xuXHRmb250LXN0eWxlOiBpdGFsaWM7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG59XG5cbi5jaGVja291dC1iYXIgLmJ0biB7XG5cblx0ZmxleDogMCAwIGF1dG87XG59XG5cbi5jaGVja291dC1iYXItLXNwZWNpbWVuIHtcblxuXHRwb3NpdGlvbjogc3RhdGljO1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRtYXgtd2lkdGg6IDM5MHB4O1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LmNoZWNrb3V0LWJhciB7XG5cblx0XHRkaXNwbGF5OiBmbGV4O1xuXHR9XG59XG5cbi8qIERFUEFSVFVSRSDigJQgdGhlIHBhZ2UtbGV2ZWwgcnVsZXMgdGhlIG1vY2t1cCBrZXB0IG91dHNpZGUgYW55IGJsb2NrLCBtb3ZlZCBoZXJlXG4gICBiZWNhdXNlIHRoZSBiYXIgaXMgd2hhdCBjcmVhdGVzIHRoZSBuZWVkOiBhdCBwaG9uZSB3aWR0aCB0aGUgYmFyIHJlcGxhY2VzIHRoZVxuICAgc3VtbWFyeSdzIG93biBhY3Rpb24sIGFuZCB0aGUgcGFnZSBsZWF2ZXMgcm9vbSBhdCBpdHMgZm9vdCBzbyB0aGUgcGlubmVkIGJhclxuICAgbmV2ZXIgY292ZXJzIHRoZSBsYXN0IHBhbmVsLiBTY29wZWQgd2l0aCA6aGFzKCkgc28gb25seSBhIHBhZ2UgY2FycnlpbmcgdGhlXG4gICBiYXIgaXMgYWZmZWN0ZWQuICovXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5wYWdlX19ib2R5OmhhcyggLmNoZWNrb3V0LWJhciApIHtcblxuXHRcdHBhZGRpbmctYmxvY2stZW5kOiBjYWxjKCB2YXIoLS1zcGFjZS0xNikgKyB2YXIoLS1zcGFjZS0xNikgKTtcblx0fVxuXG5cdC5wYWdlX19ib2R5OmhhcyggLmNoZWNrb3V0LWJhciApIC5vcmRlci10b3RhbHNfX2FjdGlvbiB7XG5cblx0XHRkaXNwbGF5OiBub25lO1xuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgY2hlY2tvdXQtc3RlcHNcbi8vXG4vLyBQb3J0ZWQgZnJvbSBjYXRhbG9ndWUgYmxvY2sgYGNoZWNrb3V0LXN0ZXBzYCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTEgKGNoZWNrb3V0KSwgb3BlcmF0b3ItYWNjZXB0ZWRcbi8vIDIwMjYtMDktMjQpIGZvciB0aGUgYmFza2V0IHdhbGssIE1QRzEwLiBUaGUgY2F0YWxvZ3VlIHJvdyBpcyB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIGNoZWNrb3V0LXN0ZXBzICAoTkVXKVxuICAgV2hlcmUgdGhlIHNob3BwZXIgaXMgaW4gdGhlIG9yZGVyIGZ1bm5lbDogQmFza2V0LCBEZXRhaWxzICYgUGF5bWVudCxcbiAgIENvbmZpcm1hdGlvbi4gT24gaXRzIG93biBzbGltIHBhbmVsLXdoaXRlIGNhcmQsIGJlY2F1c2UgdGhlIGRlc2lnbiBicmllZlxuICAgZG9lcyBub3QgbGV0IGNvbnRlbnQgc2l0IG9uIHRoZSBjYW52YXMgaG93ZXZlciBzbGlnaHQgaXQgaXMuXG5cbiAgIEEgc3RlcCBpcyBhIHJvdW5kIGluZGljYXRvciAocm91bmQgaW5kaWNhdG9ycyB0YWtlIHRoZSBwaWxsIHJhZGl1cykgYW5kIGFcbiAgIGxhYmVsLCBqb2luZWQgdG8gdGhlIG5leHQgc3RlcCBieSB0aGUgYnJhbmQncyBoYWlybGluZS4gQSBmaW5pc2hlZCBzdGVwIGlzXG4gICBhIFBhcmFnb24tYmx1ZSBvdXRsaW5lIHdpdGggYSB0aWNrLCBpdHMgbGFiZWwgYSBsaW5rIGJhY2s7IHRoZSBjdXJyZW50IHN0ZXBcbiAgIGlzIGZpbGxlZCBQYXJhZ29uIGJsdWUsIGl0cyBsYWJlbCBpbmsgYXQgbWVkaXVtIHdlaWdodDsgYSBzdGVwIHN0aWxsIHRvXG4gICBjb21lIGlzIHRoZSBoYWlybGluZSBncmV5IHdpdGggYSBzbGF0ZSBudW1iZXIuIFRoZSBydWxlIG91dCBvZiBhIGZpbmlzaGVkXG4gICBzdGVwIHRha2VzIHRoZSBicmFuZCBibHVlLCBzbyB0aGUgbGluZSByZWFkcyBhcyB0cmF2ZWxsZWQgdXAgdG8gXCJ5b3UgYXJlXG4gICBoZXJlXCIuIE5vIGdyZWVuOiBhIGZpbmlzaGVkIHN0ZXAgaXMgbm90IGEgY29uZmlybWF0aW9uLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4uY2hlY2tvdXQtc3RlcHMge1xuXG5cdGRpc3BsYXk6IGdyaWQ7XG5cdGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KCAzLCBtaW5tYXgoIDAsIDFmciApICk7XG5cdG1hcmdpbjogMDtcblx0cGFkZGluZzogdmFyKC0tc3BhY2UtNCkgdmFyKC0tc3BhY2UtNik7XG5cdGxpc3Qtc3R5bGU6IG5vbmU7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctcGFuZWwpO1xufVxuXG4uY2hlY2tvdXQtc3RlcHNfX2l0ZW0ge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdG1pbi13aWR0aDogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuXG4vKiBUaGUgam9pbmluZyBydWxlIGZpbGxzIHdoYXRldmVyIHRoZSBzdGVwJ3Mgb3duIGNvbnRlbnQgbGVhdmVzLiAqL1xuLmNoZWNrb3V0LXN0ZXBzX19pdGVtOm5vdCggOmxhc3QtY2hpbGQgKTo6YWZ0ZXIge1xuXG5cdGNvbnRlbnQ6IFwiXCI7XG5cdGZsZXg6IDEgMSBhdXRvO1xuXHRtaW4td2lkdGg6IHZhcigtLXNwYWNlLTQpO1xuXHRtYXJnaW4taW5saW5lOiB2YXIoLS1zcGFjZS0yKSB2YXIoLS1zcGFjZS00KTtcblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xufVxuXG4uY2hlY2tvdXQtc3RlcHNfX2l0ZW0tLWRvbmU6bm90KCA6bGFzdC1jaGlsZCApOjphZnRlciB7XG5cblx0Ym9yZGVyLWJsb2NrLXN0YXJ0LWNvbG9yOiB2YXIoLS1ib3JkZXItYnJhbmQpO1xufVxuXG4uY2hlY2tvdXQtc3RlcHNfX21hcmtlciB7XG5cblx0ZmxleDogMCAwIGF1dG87XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0d2lkdGg6IDMycHg7XG5cdGhlaWdodDogMzJweDtcblx0Ym9yZGVyOiAycHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtcGlsbCk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiAxO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG59XG5cbi5jaGVja291dC1zdGVwc19fbWFya2VyIHN2ZyB7XG5cblx0d2lkdGg6IDE0cHg7XG5cdGhlaWdodDogMTRweDtcbn1cblxuLmNoZWNrb3V0LXN0ZXBzX19pdGVtLS1kb25lIC5jaGVja291dC1zdGVwc19fbWFya2VyIHtcblxuXHRib3JkZXItY29sb3I6IHZhcigtLWJvcmRlci1icmFuZCk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJyYW5kKTtcbn1cblxuLmNoZWNrb3V0LXN0ZXBzX19pdGVtLS1jdXJyZW50IC5jaGVja291dC1zdGVwc19fbWFya2VyIHtcblxuXHRib3JkZXItY29sb3I6IHZhcigtLWJvcmRlci1icmFuZCk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWJyYW5kKTtcblx0Y29sb3I6IHZhcigtLXRleHQtb24tYnJhbmQpO1xufVxuXG4uY2hlY2tvdXQtc3RlcHNfX2xhYmVsIHtcblxuXHRmbGV4OiAwIDEgYXV0bztcblx0bWluLXdpZHRoOiAwO1xufVxuXG4uY2hlY2tvdXQtc3RlcHNfX2xpbmsge1xuXG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rKTtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG4uY2hlY2tvdXQtc3RlcHNfX2xpbms6aG92ZXIge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmstaG92ZXIpO1xufVxuXG4uY2hlY2tvdXQtc3RlcHNfX2l0ZW0tLWN1cnJlbnQgLmNoZWNrb3V0LXN0ZXBzX19sYWJlbCB7XG5cblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWhlYWRpbmcpO1xufVxuXG4vKiBQaG9uZTogZWFjaCBzdGVwIHN0YWNrcyBpdHMgbWFya2VyIG92ZXIgaXRzIGxhYmVsIGFuZCB0aGUgam9pbmluZyBydWxlc1xuICAgc3RhbmQgZG93biDigJQgdGhyZWUgbGFiZWxzIHNpZGUgYnkgc2lkZSBhdCAzOTBweCBoYXZlIG5vIHJvb20gZm9yIHRoZW0uICovXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5jaGVja291dC1zdGVwcyB7XG5cblx0XHRnYXA6IHZhcigtLXNwYWNlLTIpO1xuXHRcdHBhZGRpbmc6IHZhcigtLXNwYWNlLTMpIHZhcigtLXNwYWNlLTQpO1xuXHR9XG5cblx0LmNoZWNrb3V0LXN0ZXBzX19pdGVtIHtcblxuXHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0XHRnYXA6IHZhcigtLXNwYWNlLTIpO1xuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0fVxuXG5cdC5jaGVja291dC1zdGVwc19faXRlbTpub3QoIDpsYXN0LWNoaWxkICk6OmFmdGVyIHtcblxuXHRcdGNvbnRlbnQ6IG5vbmU7XG5cdH1cblxuXHQuY2hlY2tvdXQtc3RlcHNfX21hcmtlciB7XG5cblx0XHR3aWR0aDogMjhweDtcblx0XHRoZWlnaHQ6IDI4cHg7XG5cdH1cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBjaG9pY2Vcbi8vXG4vLyBBIGNoZWNrYm94IG9yIHJhZGlvIGFuZCBpdHMgbGFiZWwgYXMgb25lIGNsaWNrYWJsZSByb3cuIFRoZSBjb250cm9sIGlzXG4vLyBhdXRob3JlZCByYXRoZXIgdGhhbiBuYXRpdmUg4oCUIHNxdWFyZSBhdCB0aGUgaW5wdXQgcmFkaXVzIGZvciBhIGNoZWNrYm94LCB0aGVcbi8vIHBpbGwgcmFkaXVzIGZvciBhIHJhZGlvIOKAlCBzbyB0aGUgYnJhbmQncyBvbmUtcmFkaXVzIGxhdyByZWFjaGVzIHRoZSBmb3JtLlxuLy9cbi8vIFJlYWNoZWQgdGhlIHRoZW1lIHZpYSB0aGUgYXJjaGl2ZSdzIGluLXN0b2NrIGZpbHRlci4gUkVVU0VEIFZFUkJBVElNIGZyb20gdGhlXG4vLyBmb3JtIHNwZWNpbWVuLCBzYW1lIGFzIGBmaWVsZGAuXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYGNob2ljZWAuIFBvcnRlZCBmb3IgdGhlIE1QRzcgY2F0ZWdvcnktYXJjaGl2ZSB3YWxrLCAyMDI2LTA5LTE2LlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBjaG9pY2UgIChSRVVTRUQsIHZlcmJhdGltKVxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi5jaG9pY2Uge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuXHRnYXA6IHZhcigtLXNwYWNlLTMpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblx0Y3Vyc29yOiBwb2ludGVyO1xufVxuLmNob2ljZV9fY29udHJvbCB7XG5cblx0YXBwZWFyYW5jZTogbm9uZTtcblx0LXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuXHRmbGV4OiAwIDAgYXV0bztcblx0d2lkdGg6IDIwcHg7XG5cdGhlaWdodDogMjBweDtcblx0bWFyZ2luOiAwO1xuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IDAuM2VtO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItaW5wdXQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtaW5wdXQpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1pbnB1dCk7XG5cdGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG5cdGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xufVxuLmNob2ljZV9fY29udHJvbFt0eXBlPVwicmFkaW9cIl0ge1xuXG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1waWxsKTtcbn1cbi5jaG9pY2VfX2NvbnRyb2w6Y2hlY2tlZCB7XG5cblx0Ym9yZGVyLWNvbG9yOiB2YXIoLS1jb2xvci1icmFuZCk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWJyYW5kKTtcblx0YmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxNiAxNiclM0UlM0NwYXRoIGQ9J00zIDguNCBMNi40IDExLjggTDEzIDQuNicgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNGRkZGRkYnIHN0cm9rZS13aWR0aD0nMi40JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9zdmclM0VcIik7XG5cdGJhY2tncm91bmQtc2l6ZTogMTNweCBhdXRvO1xufVxuLmNob2ljZV9fY29udHJvbFt0eXBlPVwicmFkaW9cIl06Y2hlY2tlZCB7XG5cblx0YmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA4IDgnJTNFJTNDY2lyY2xlIGN4PSc0JyBjeT0nNCcgcj0nNCcgZmlsbD0nJTIzRkZGRkZGJy8lM0UlM0Mvc3ZnJTNFXCIpO1xuXHRiYWNrZ3JvdW5kLXNpemU6IDhweCBhdXRvO1xufVxuLmNob2ljZV9fY29udHJvbDpmb2N1cyxcbi5jaG9pY2VfX2NvbnRyb2w6Zm9jdXMtdmlzaWJsZSxcbi5jaG9pY2VfX2NvbnRyb2wtLWZvY3VzIHtcblxuXHRib3JkZXItY29sb3I6IHZhcigtLWJvcmRlci1mb2N1cyk7XG5cdG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItZm9jdXMpO1xuXHRvdXRsaW5lLW9mZnNldDogMnB4O1xufVxuLmNob2ljZV9fY29udHJvbDpkaXNhYmxlZCB7XG5cblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFnZSk7XG5cdGJvcmRlci1jb2xvcjogdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xuXHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuLmNob2ljZV9fY29udHJvbDpkaXNhYmxlZCArIC5jaG9pY2VfX2xhYmVsIHtcblxuXHRjb2xvcjogdmFyKC0tbmV1dHJhbC01MDApO1xufVxuLmNob2ljZV9fbGFiZWwge1xuXG5cdG1pbi13aWR0aDogMDtcbn1cbi5maWVsZC0tZXJyb3IgLmNob2ljZV9fY29udHJvbCB7XG5cblx0Ym9yZGVyOiAycHggc29saWQgdmFyKC0tY29sb3ItbmVnYXRpdmUpO1xufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGNvZGUtZGlzY2xvc3VyZVxuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBjaGVja291dCBtb2NrdXAgKGRlc2lnbiBvZiByZWNvcmQ6IE1QRzExLCBvcGVyYXRvci1hY2NlcHRlZFxuLy8gMjAyNi0wOS0yMykgZm9yIHRoZSBjaGVja291dCB3YWxrLCBNUEcxMS4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIGNvZGUtZGlzY2xvc3VyZSAgKE5FVylcbiAgIFwiSGF2ZSBhIGRpc2NvdW50IGNvZGU/XCIgZm9sZGVkIHNodXQsIG9wZW5pbmcgdGhlIGJhc2tldCdzIG93biBpbmxpbmUtZm9ybS5cbiAgIE1vc3Qgc2hvcHBlcnMgYXQgY2hlY2tvdXQgaGF2ZSBubyBjb2RlLCBhbmQgYW4gb3BlbiBlbXB0eSBmaWVsZCBhdCB0aGVcbiAgIG1vbWVudCBvZiBwYXlpbmcgcmVhZHMgYXMgXCJ5b3UgYXJlIG1pc3NpbmcgYSBkaXNjb3VudFwiLiBBIHJlYWwgZGlzY2xvc3VyZSDigJRcbiAgIGBkZXRhaWxzYCBhbmQgYHN1bW1hcnlgIOKAlCBzbyBpdCB3b3JrcyB3aXRoIG5vIHNjcmlwdC5cblxuICAgQ2xvc2VkLCBpdCBpcyBvbmUgbGluZSBvZiBsaW5rLWJsdWUgYm9keSB0ZXh0IHdpdGggdGhlIGJyYW5kJ3MgY2hldnJvbiBhdFxuICAgdGhlIGZhciBlbmQsIHBvaW50aW5nIGRvd247IG9wZW4sIHRoZSBjaGV2cm9uIHBvaW50cyB1cC4gVGhlIHNhbWUgY2hldnJvbixcbiAgIHR1cm5lZCB0aGUgc2FtZSB3YXksIGFzIGZhcS1hY2NvcmRpb24uIEluc2lkZSBhIHNpZGViYXIgdGhlIGlubGluZS1mb3JtJ3NcbiAgIHR3by10cmFjayByb3cgaXMgdG9vIHdpZGUsIHNvIHRoZSBmaWVsZCBhbmQgdGhlIGJ1dHRvbiBzaGFyZSB0aGUgY29sdW1uIOKAlFxuICAgdGhlIGZpZWxkIHRha2VzIHdoYXQgdGhlIGJ1dHRvbiBsZWF2ZXMuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi5jb2RlLWRpc2Nsb3N1cmUge1xuXG5cdG1hcmdpbjogdmFyKC0tc3BhY2UtNCkgMCAwO1xuXHRwYWRkaW5nLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS00KTtcblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xufVxuXG4uY29kZS1kaXNjbG9zdXJlX19zdW1tYXJ5IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdGxpc3Qtc3R5bGU6IG5vbmU7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rKTtcbn1cblxuLmNvZGUtZGlzY2xvc3VyZV9fc3VtbWFyeTo6LXdlYmtpdC1kZXRhaWxzLW1hcmtlciB7XG5cblx0ZGlzcGxheTogbm9uZTtcbn1cblxuLmNvZGUtZGlzY2xvc3VyZV9fc3VtbWFyeTo6bWFya2VyIHtcblxuXHRjb250ZW50OiBcIlwiO1xufVxuXG4uY29kZS1kaXNjbG9zdXJlX19zdW1tYXJ5OmhvdmVyIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rLWhvdmVyKTtcbn1cblxuLmNvZGUtZGlzY2xvc3VyZV9fc3VtbWFyeTpmb2N1cy12aXNpYmxlIHtcblxuXHRvdXRsaW5lOiAycHggc29saWQgdmFyKC0tYm9yZGVyLWZvY3VzKTtcblx0b3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cblxuLmNvZGUtZGlzY2xvc3VyZV9fbWFya2VyIHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0ZGlzcGxheTogaW5saW5lLWZsZXg7XG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJyYW5kKTtcbn1cblxuLmNvZGUtZGlzY2xvc3VyZV9fbWFya2VyIHN2ZyB7XG5cblx0d2lkdGg6IDEwMCU7XG5cdGhlaWdodDogMTAwJTtcblx0dHJhbnNmb3JtOiByb3RhdGUoIDkwZGVnICk7XG59XG5cbi5jb2RlLWRpc2Nsb3N1cmVbb3Blbl0gLmNvZGUtZGlzY2xvc3VyZV9fbWFya2VyIHN2ZyB7XG5cblx0dHJhbnNmb3JtOiByb3RhdGUoIC05MGRlZyApO1xufVxuXG4uY29kZS1kaXNjbG9zdXJlIC5pbmxpbmUtZm9ybSB7XG5cblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS00KTtcbn1cblxuLmNvZGUtZGlzY2xvc3VyZSAuaW5saW5lLWZvcm1fX3JvdyB7XG5cblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoIDAsIDFmciApIGF1dG87XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgY29uZmlybS1oZXJvXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIG9yZGVyIGNvbmZpcm1hdGlvbiBtb2NrdXAgKGRlc2lnbiBvZiByZWNvcmQ6IE1QRzEyLCBvcGVyYXRvci1hY2NlcHRlZFxuLy8gMjAyNi0wOS0yNCkgZm9yIHRoZSBjb25maXJtYXRpb24gd2FsaywgTVBHMTIuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBjb25maXJtLWhlcm8gIChORVcpXG4gICBUaGUgc3VjY2VzcyBzdGF0ZSdzIG9wZW5pbmc6IGEgYnJhbmQgcGhvdG9ncmFwaCwgZGFya2VuZWQsIGNhcnJ5aW5nIGEgZ3JlZW5cbiAgIGNoZWNrIG1hcmssIHRoZSB0aGFuay15b3UgdGl0bGUgYW5kIHRoZSBvcmRlciBsaW5lLiBUaGUgb3BlcmF0b3IgYXNrZWQgZm9yXG4gICBcImEgYml0IG1vcmUgbGlmZVwiOyB0aGUgcGFnZSBzdGlsbCBoYXMgdG8gc2hvdyB3aGF0IGhhcHBlbnMgbmV4dCBhYm92ZSB0aGVcbiAgIGZvbGQgb24gYSA5MDBweC10YWxsIGxhcHRvcCwgc28gdGhpcyBpcyB0aGUgY29tcGFjdCBjb3VzaW4gb2YgdGhlIGhvbWVwYWdlJ3NcbiAgIGhlcm8tc2xpZGVyIHJhdGhlciB0aGFuIGEgY29weSBvZiBpdCDigJQgaGVyby1zbGlkZXIgaXMgMTQwMCAvIDUyMCB3aXRoIGFcbiAgIDM4MHB4IGZsb29yLCBhbmQgb3ZlcmxheS1iYW5kIGFuZCBjdGEtYmFuZCBib3RoIGZsb29yIGF0IDMwMHB4IG9yIG1vcmUgYmVmb3JlXG4gICB0aGVpciBhc3BlY3QgcmF0aW8gYWRkcyBoZWlnaHQuIE5vbmUgb2YgdGhlbSBjYW4gYmUgaGVsZCB0byAzMDBweCB3aXRob3V0XG4gICBvdmVycmlkaW5nIHRoZSBydWxlIHRoYXQgZGVmaW5lcyB0aGVtLlxuXG4gICBXaGF0IGl0IHRha2VzIGZyb20gaGVyby1zbGlkZXIsIHVuY2hhbmdlZDogdGhlIHN1cmZhY2UgKGNhcmQgcmFkaXVzLCB0aGVcbiAgIG5ldXRyYWwtODAwIGdyb3VuZCB1bmRlciB0aGUgcGhvdG9ncmFwaCwgY2xpcHBlZCksIHRoZSBsZWFkaW5nLWVkZ2Ugc2NyaW0gYXRcbiAgIHRoZSBzYW1lIHN0b3BzLCB0aGUgdGl0bGUgaW4gdGhlIGhlYWRpbmcgZm9udCBhdCBtZWRpdW0gd2VpZ2h0IOKAlCB0aGVcbiAgIHN0eWxlZ3VpZGUncyBleGNlcHRpb24gZm9yIGEgdGl0bGUgb3ZlciBwaG90b2dyYXBoeSDigJQgYW5kIHRoZSBsZWFkIGluIHRoZVxuICAgYm9keSBmb250LCBsaWdodCwgYXQgdGhlIGxhcmdlIHNpemUsIGJvdGggd2hpdGUuIEF0IHBob25lIHdpZHRoIHRoZSBzY3JpbVxuICAgZmxpcHMgYm90dG9tLXVwIGFuZCB0aGUgdGV4dCBzaXRzIGF0IHRoZSBmb290LCBhcyBoZXJvLXNsaWRlciBkb2VzLlxuXG4gICBIZWlnaHQ6IGV4YWN0bHkgMzAwcHggb24gZGVza3RvcC4gVGhlIHBob3RvZ3JhcGggaXMgYWJzb2x1dGVseSBwbGFjZWQsIHNvXG4gICB0aGUgaW1hZ2UncyBvd24gcHJvcG9ydGlvbnMgbmV2ZXIgYWRkIGhlaWdodDsgdGhlIGNvbnRlbnQgaXMgY2VudHJlZCBpblxuICAgdGhlIGZpeGVkIGJveC4gQXQgcGhvbmUgd2lkdGggdGhlIGJveCBncm93cyB3aXRoIGl0cyB0ZXh0IGluc3RlYWQsIGZyb20gYVxuICAgMzIwcHggZmxvb3IsIGJlY2F1c2UgYSB3cmFwcGVkIGVtYWlsIGFkZHJlc3MgbXVzdCBuZXZlciBiZSBjbGlwcGVkLlxuXG4gICBUaGUgY2hlY2sgbWFyayBpcyBhIHJvdW5kIGluZGljYXRvciwgc28gaXQgdGFrZXMgdGhlIHBpbGwgcmFkaXVzLCBmaWxsZWQgZ29cbiAgIGdyZWVuIOKAlCB0aGUgc3R5bGVndWlkZSdzIGNvbG91ciBmb3IgYSBwb3NpdGl2ZSBjb25maXJtYXRpb24g4oCUIHdpdGggYSB3aGl0ZVxuICAgdGljay4gSXQgaXMgdGhlIG9ubHkgZ3JlZW4gb24gdGhlIGhlcm8uXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi5jb25maXJtLWhlcm8ge1xuXG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0aGVpZ2h0OiAzMDBweDtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1uZXV0cmFsLTgwMCk7XG5cdGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1jYXJkKTtcbn1cblxuLmNvbmZpcm0taGVyb19fbWVkaWEge1xuXG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0aW5zZXQ6IDA7XG5cdGRpc3BsYXk6IGJsb2NrO1xuXHR3aWR0aDogMTAwJTtcblx0aGVpZ2h0OiAxMDAlO1xuXHRvYmplY3QtZml0OiBjb3Zlcjtcblx0b2JqZWN0LXBvc2l0aW9uOiA1MCUgNTUlO1xufVxuXG4uY29uZmlybS1oZXJvX19zY3JpbSB7XG5cblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRpbnNldDogMDtcblx0YmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCA5MGRlZywgdmFyKC0tYmctb3ZlcmxheSkgMCUsIHZhcigtLWJnLW92ZXJsYXkpIDQwJSwgdHJhbnNwYXJlbnQgNzglICk7XG59XG5cbi5jb25maXJtLWhlcm9fX2NvbnRlbnQge1xuXG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0YWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdG1heC13aWR0aDogNzIwcHg7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTgpIHZhcigtLXNwYWNlLTEyKTtcblx0dGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLmNvbmZpcm0taGVyb19fbWFyayB7XG5cblx0ZGlzcGxheTogaW5saW5lLWZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXHR3aWR0aDogNDhweDtcblx0aGVpZ2h0OiA0OHB4O1xuXHRtYXJnaW4tYmxvY2stZW5kOiB2YXIoLS1zcGFjZS0xKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXBpbGwpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1wb3NpdGl2ZSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW9uLWJyYW5kKTtcbn1cblxuLmNvbmZpcm0taGVyb19fbWFyayBzdmcge1xuXG5cdHdpZHRoOiAyNnB4O1xuXHRoZWlnaHQ6IDI2cHg7XG59XG5cbi5jb25maXJtLWhlcm9fX3RpdGxlIHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1oMSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW9uLWJyYW5kKTtcbn1cblxuLmNvbmZpcm0taGVyb19fbGVhZCB7XG5cblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keS1sZyk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1saWdodCk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1ib2R5KTtcblx0Y29sb3I6IHZhcigtLXRleHQtb24tYnJhbmQpO1xuXHRvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTtcbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA5MDBweCApIHtcblxuXHQuY29uZmlybS1oZXJvX19jb250ZW50IHtcblxuXHRcdHBhZGRpbmc6IHZhcigtLXNwYWNlLTYpIHZhcigtLXNwYWNlLTgpO1xuXHRcdG1heC13aWR0aDogNzUlO1xuXHR9XG5cblx0LmNvbmZpcm0taGVyb19fdGl0bGUge1xuXG5cdFx0Zm9udC1zaXplOiB2YXIoLS1mcy1oMik7XG5cdH1cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuY29uZmlybS1oZXJvIHtcblxuXHRcdGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcblx0XHRoZWlnaHQ6IGF1dG87XG5cdFx0bWluLWhlaWdodDogMzIwcHg7XG5cdH1cblxuXHQvKiBUaGUgc291cmNlIHBob3RvZ3JhcGggaXMgc3F1YXJlIHdpdGggd2hpdGUgbGV0dGVyYm94IGJhcnM7IGF0IGEgbmVhci1zcXVhcmVcblx0ICAgY3JvcCB0aGUgc2NhbGUga2VlcHMgdGhlbSBvdXQgb2YgZnJhbWUuIEEgcHJvcGVybHkgY3JvcHBlZCBicmFuZCBpbWFnZSBhdFxuXHQgICBidWlsZCBtYWtlcyB0aGlzIHJ1bGUgYSBuby1vcC4gKi9cblx0LmNvbmZpcm0taGVyb19fbWVkaWEge1xuXG5cdFx0dHJhbnNmb3JtOiBzY2FsZSggMS41ICk7XG5cdH1cblxuXHQuY29uZmlybS1oZXJvX19zY3JpbSB7XG5cblx0XHRiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoIDBkZWcsIHZhcigtLWJnLW92ZXJsYXkpIDAlLCB2YXIoLS1iZy1vdmVybGF5KSA1NSUsIHRyYW5zcGFyZW50IDk1JSApO1xuXHR9XG5cblx0LmNvbmZpcm0taGVyb19fY29udGVudCB7XG5cblx0XHRtYXgtd2lkdGg6IG5vbmU7XG5cdFx0cGFkZGluZzogdmFyKC0tc3BhY2UtMTYpIHZhcigtLXNwYWNlLTYpIHZhcigtLXNwYWNlLTYpO1xuXHRcdGdhcDogdmFyKC0tc3BhY2UtMik7XG5cdH1cblxuXHQuY29uZmlybS1oZXJvX19tYXJrIHtcblxuXHRcdHdpZHRoOiA0MHB4O1xuXHRcdGhlaWdodDogNDBweDtcblx0fVxuXG5cdC5jb25maXJtLWhlcm9fX21hcmsgc3ZnIHtcblxuXHRcdHdpZHRoOiAyMnB4O1xuXHRcdGhlaWdodDogMjJweDtcblx0fVxuXG5cdC5jb25maXJtLWhlcm9fX3RpdGxlIHtcblxuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDMpO1xuXHR9XG5cblx0LmNvbmZpcm0taGVyb19fbGVhZCB7XG5cblx0XHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgY29udGVudFxuLy9cbi8vIFRoZSBwcm9kdWN0IGRlc2NyaXB0aW9uJ3MgYmxvY2sgYXJlYS4gQSBjb250YWluZXIsIG5vdCBhIHR5cG9ncmFwaGljIHdyYXBwZXI6XG4vLyB3aGF0IGdvZXMgaW5zaWRlIGl0IGlzIEd1dGVuYmVyZydzIG93biBibG9ja3MsIGFuZCB0aG9zZSB0YWtlIHRoZWlyIHR5cGUsXG4vLyBjb2xvdXIgYW5kIHNwYWNpbmcgZnJvbSB0aGUgYmxvY2sgc2lsbywgbm90IGZyb20gaGVyZS5cbi8vXG4vLyBJdCB0YWtlcyB0aGUgRlVMTCB3aWR0aCBvZiB0aGUgcGFuZWwgaXQgc2l0cyBpbiwgZGVsaWJlcmF0ZWx5LiBUaGUgNjgwcHhcbi8vIHJlYWRpbmcgbWVhc3VyZSBpcyBmb3IgZWRpdG9yaWFsIHBhZ2VzIHdoZXJlIHByb3NlIGlzIGFsb25lIG9uIHRoZSBwYWdlIOKAlCBpdFxuLy8gc3RpbGwgZ292ZXJucyBhcnRpY2xlIHRlbXBsYXRlcyDigJQgYW5kIGEgcHJvZHVjdCBkZXNjcmlwdGlvbiBjYXJyaWVzIHN0YXRcbi8vIGJsb2NrcywgYSBzcGVjIHRhYmxlIGFuZCBmZWF0dXJlIHJvd3MsIHdoaWNoIHJlYWQgYXMgY3JhbXBlZCBpbnNpZGUgaXQuIFRocmVlXG4vLyBkcmFmdHMgb2YgdGhpcyBwYWdlIGRpZWQgb2YgZXhhY3RseSB0aGF0IGJlZm9yZSB0aGUgb3BlcmF0b3Igc2V0dGxlZCBpdCBvblxuLy8gMjAyNi0wOS0xNS5cbi8vXG4vLyBOYW1lZCBgLmNvbnRlbnRgIHRvIG1hdGNoIHRoZSBwYXJlbnQgdGhlbWUncyBvd24gZGVzY3JpcHRpb24gc2xvdCByYXRoZXIgdGhhblxuLy8gdGhlIG1vY2t1cCdzIGAucHJvc2VgOyBvcGVyYXRvcidzIGNhbGwsIDIwMjYtMDktMTYuXG4vL1xuLy8gU291cmNlOiBNUEc5IHdhbGsgZm9sbG93LXVwLCAyMDI2LTA5LTE2LlxuXG4uY29udGVudCB7XG5cblx0d2lkdGg6IDEwMCU7XG5cblx0Ly8gQkxPQ0sgRkxPVy4gQSBjbGFzc2ljIHRoZW1lIHdpdGggbm8gYHRoZW1lLmpzb25gIGZpbGUgZ2V0cyBOTyBjb3JlIGxheW91dFxuXHQvLyBDU1Mg4oCUIG5vIGBpcy1sYXlvdXQtZmxvdyA+ICogKyAqYCBydWxlLCBubyBgLS13cC0tc3R5bGUtLWJsb2NrLWdhcGAuIFRoZVxuXHQvLyBmaWxlIHN0YXlzIGJhbm5lZCBhY3Jvc3MgdGhpcyB0aGVtZSBsaW5lIGJlY2F1c2UgaXQgYmxlZWRzIGludG8gd3AtYWRtaW4sXG5cdC8vIHNvIHRoZSBmbG93IHJoeXRobSBoYXMgdG8gYmUgc3VwcGxpZWQgaGVyZSBvciBjb25zZWN1dGl2ZSBibG9ja3Mgc2l0IGZsdXNoXG5cdC8vIGFnYWluc3QgZWFjaCBvdGhlci4gRXZlcnkgcGFyYWdyYXBoIGFuZCBoZWFkaW5nIGluIHRoZSBkZXNjcmlwdGlvbiBtZWFzdXJlZFxuXHQvLyBtYXJnaW4gMCBiZWZvcmUgdGhpcy5cblx0Ly9cblx0Ly8gYDp3aGVyZSgpYCBrZWVwcyBpdCBhdCB6ZXJvIHNwZWNpZmljaXR5LCBzbyBhIGJsb2NrIHBhcnRpYWwgd2FudGluZyBhIGJpZ2dlclxuXHQvLyBzZXBhcmF0aW9uIOKAlCBjb2x1bW5zLCBjb3ZlciwgbWVkaWEtdGV4dCwgdGhlIHNwZWMgcGlsbHMg4oCUIHN0aWxsIHdpbnMuXG5cdD4gOndoZXJlKCAqICsgKiApIHtcblxuXHRcdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtNik7XG5cblx0fVxuXG5cdC8vIEEgZnVsbC13aWR0aCBibG9jayBpbnNpZGUgdGhlIGRlc2NyaXB0aW9uIGhhcyB0byBlc2NhcGUgdGhlIHBhbmVsJ3Ncblx0Ly8gcGFkZGluZywgb3IgaXQgcmVuZGVycyBhcyBhIGJhbmQgd2l0aCBhIDMwcHggd2hpdGUgbWFyZ2luIGVpdGhlciBzaWRlIOKAlFxuXHQvLyB3aGljaCByZWFkcyBhcyBhIG1pc3Rha2UgcmF0aGVyIHRoYW4gYXMgYSBiYW5kLiBgd2lkdGg6IGF1dG9gIHdpdGggdGhlXG5cdC8vIG5lZ2F0aXZlIGlubGluZSBtYXJnaW4gaXMgdGhlIHBhaXIgdGhhdCBkb2VzIGl0OyBlaXRoZXIgYWxvbmUgbGVhdmVzIHRoZVxuXHQvLyBibG9jayBhdCBpdHMgb2xkIHdpZHRoIG9yIG92ZXJmbG93aW5nLlxuXHQ+IC5hbGlnbmZ1bGwge1xuXG5cdFx0d2lkdGg6IGF1dG87XG5cdFx0bWFyZ2luLWlubGluZTogY2FsYyggdmFyKC0tc3BhY2UtY2FyZC1wYWRkaW5nKSAqIC0xICk7XG5cblx0fVxuXG5cdC8vIFdpZGUgYmxvY2tzIHN0b3Agc2hvcnQgb2YgdGhlIHBhbmVsIGVkZ2UgcmF0aGVyIHRoYW4gcmVhY2hpbmcgaXQuXG5cdD4gLmFsaWdud2lkZSB7XG5cblx0XHR3aWR0aDogYXV0bztcblx0XHRtYXJnaW4taW5saW5lOiBjYWxjKCB2YXIoLS1zcGFjZS1jYXJkLXBhZGRpbmcpICogLTAuNSApO1xuXG5cdH1cblxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGNvdW50LWxpc3Rcbi8vXG4vLyBBIGxpc3Qgb2YgbGlua3Mgd2l0aCBhIGNvdW50IGFnYWluc3QgZWFjaCDigJQgdGhlIHNoYXBlIGJvdGggQ2F0ZWdvcmllcyBhbmRcbi8vIEFyY2hpdmVzIGJ5IG1vbnRoIHRha2UsIHNvIGEgc2lkZWJhciBjYXJyaWVzIG9uZSBsaXN0IHRyZWF0bWVudCBhbmQgbm90XG4vLyB0d28uIEhhaXJsaW5lIHNlcGFyYXRvcnMsIGJsdWUtdGludCB3YXNoIG9uIGhvdmVyLCAtLWN1cnJlbnQgbWFya2VkIHdpdGhcbi8vIHRoZSB3YXNoIHBsdXMgdGhlIFBhcmFnb24tYmx1ZSBydWxlIHRoZSBzdG9yZSBzaWRlYmFyIHVzZXMuIC0tbW9yZSBjbG9zZXMgYVxuLy8gY2FwcGVkIGxpc3QgYW5kIHNlbmRzIHRoZSBvdmVyZmxvdyB0byBhbiBpbmRleCBwYWdlLlxuLy9cbi8vIFNvdXJjZTogY2F0YWxvZ3VlIGJsb2NrIGBjb3VudC1saXN0YC4gUG9ydGVkIGZvciB0aGUgTVBHOSBwcm9kdWN0LXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLmNvdW50LWxpc3Qge1xuXG5cdG1hcmdpbjogMDtcblx0cGFkZGluZzogMDtcblx0bGlzdC1zdHlsZTogbm9uZTtcbn1cblxuLmNvdW50LWxpc3RfX2l0ZW0gKyAuY291bnQtbGlzdF9faXRlbSB7XG5cblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xufVxuXG4uY291bnQtbGlzdF9fbGluayB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGJhc2VsaW5lO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTMpIHZhcigtLXNwYWNlLTYpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG4uY291bnQtbGlzdF9fbGluazpob3ZlciB7XG5cblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2FyZC1ob3Zlcik7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xufVxuXG4vKiBUaGUgY2F0ZWdvcnkgbmFtZS4gVGhlIGNvdW50IGlzIGZpeGVkIGFuZCB0aGlzIGhhbGYgdGFrZXMgd2hhdCBpcyBsZWZ0LCBzbyB0aGVcbiAgIGZsb29yIGRlY2lkZXMgd2hhdCBoYXBwZW5zIHRvIGEgbG9uZyBuYW1lIGluIGEgMzI4cHggcmFpbDogd3JhcCB1bmRlciBpdHNlbGYsXG4gICByYXRoZXIgdGhhbiBob2xkIHRoZSByb3cgb3BlbiBhbmQgcHVzaCB0aGUgY291bnQgb2ZmIHRoZSBlbmQgb2YgdGhlIHBhbmVsLlxuICAgQ2F0ZWdvcnkgbmFtZXMgaGVyZSBydW4gdG8gJ0dhbWluZyBDaGFpcnMgJiBBY2Nlc3NvcmllcycgYW5kIGxvbmdlci4gKi9cbi5jb3VudC1saXN0X19sYWJlbCB7XG5cblx0bWluLXdpZHRoOiAwO1xufVxuXG4uY291bnQtbGlzdF9fY291bnQge1xuXG5cdGZsZXg6IDAgMCBhdXRvO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuXG4uY291bnQtbGlzdF9fbGluazpob3ZlciAuY291bnQtbGlzdF9fY291bnQge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xufVxuXG4uY291bnQtbGlzdF9faXRlbS0tY3VycmVudCB7XG5cblx0Ym9yZGVyLWlubGluZS1zdGFydDogM3B4IHNvbGlkIHZhcigtLWNvbG9yLWJyYW5kKTtcbn1cblxuLmNvdW50LWxpc3RfX2l0ZW0tLWN1cnJlbnQgLmNvdW50LWxpc3RfX2xpbmsge1xuXG5cdHBhZGRpbmctaW5saW5lLXN0YXJ0OiBjYWxjKCB2YXIoLS1zcGFjZS02KSAtIDNweCApO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jYXJkLWhvdmVyKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xufVxuXG4uY291bnQtbGlzdF9fbW9yZSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKTtcblx0cGFkZGluZzogdmFyKC0tc3BhY2UtMykgdmFyKC0tc3BhY2UtNik7XG5cdGJvcmRlci1ibG9jay1zdGFydDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbGluayk7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLmNvdW50LWxpc3RfX21vcmU6aG92ZXIge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWNhcmQtaG92ZXIpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rLWhvdmVyKTtcbn1cblxuLmNvdW50LWxpc3RfX21vcmUgc3ZnIHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0d2lkdGg6IDE0cHg7XG5cdGhlaWdodDogMTRweDtcbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBjdGEtYmFuZFxuLy9cbi8vIFRoZSBpbWFnZS1sZWQgYmFuZCB0aGF0IGNsb3NlcyBhIGxpc3Rpbmcg4oCUIHBob3RvZ3JhcGgsIGxlYWRpbmctZWRnZSBzY3JpbSwgYVxuLy8gdGl0bGUgc2V0IG1lZGl1bSBmb3IgbGVnaWJpbGl0eSBvdmVyIHRoZSBpbWFnZSwgb25lIGxpbmUgYW5kIG9uZSBidXR0b24uXG4vLyBJbWFnZS1sZWQgcmF0aGVyIHRoYW4gdGludGVkIGJlY2F1c2UgdGhpcyBicmFuZCBoYXMgb25lIGdyb3VuZCBhbmQgYmFuc1xuLy8gYWx0ZXJuYXRpbmcgYmFuZCB0b25lcywgc28gYSBzZWN0aW9uIGJyZWFrIGlzIGNhcnJpZWQgYnkgYSBwaG90b2dyYXBoLlxuLy9cbi8vIFRISVMgSVMgQSBCQU5ELCBOT1QgQSBDT01QT05FTlQg4oCUIGl0IElTIHRoZSBzZWN0aW9uLCBhbmQgaXMgY29tcG9zZWQgYXMgaXRzXG4vLyBvd24gPHNlY3Rpb24+IHJhdGhlciB0aGFuIGRyb3BwZWQgaW5zaWRlIG9uZS4gSXRzIENTUyBsaXZlcyBoZXJlIGJlY2F1c2UgdGhlXG4vLyBiYW5kIHJoeXRobSBhbmQgZ3JvdW5kIGFyZSB0aGUgYnJhbmQncy5cbi8vXG4vLyBTb3VyY2U6IGNhdGFsb2d1ZSBibG9jayBgY3RhLWJhbmRgLiBQb3J0ZWQgZm9yIHRoZSBNUEc3IGNhdGVnb3J5LWFyY2hpdmUgd2FsaywgMjAyNi0wOS0xNi5cbi8vIFJlY29uY2lsZWQgYWdhaW5zdCB0aGUgTVBHNyBtb2NrdXAncyBvd24gc3R5bGVzaGVldDogYnl0ZS1pZGVudGljYWwsIG5vIGRlcGFydHVyZXMuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIGN0YS1iYW5kICAoTkVXLCBsYXlvdXQpXG4gICBUaGUgYmFuZCB0aGF0IGNsb3NlcyBhIGxpc3RpbmcuIFRoZSBzaG9wcGVyIGhhcyBicm93c2VkIGFuZCBlaXRoZXIgZm91bmRcbiAgIHNvbWV0aGluZyBvciBoYXMgbm90LCBhbmQgdGhhdCBpcyB0aGUgcG9pbnQgYXQgd2hpY2ggdG8gb2ZmZXIgdGhlIG5leHQgc3RlcC5cblxuICAgSXQgaXMgaW1hZ2UtbGVkIHJhdGhlciB0aGFuIHRpbnRlZCwgYW5kIHRoYXQgaXMgYnJhbmQgbGF3IHJhdGhlciB0aGFuIHRhc3RlOlxuICAgdGhpcyBicmFuZCBoYXMgb25lIGdyb3VuZCBhbmQgYmFucyBhbHRlcm5hdGluZyBiYW5kIHRvbmVzLCB3aGljaCBpcyBob3cgbW9zdFxuICAgc3RvcmVzIG1hcmsgYSBzZWN0aW9uIGJyZWFrLiBIZXJlIHRoZSBicmVhayBpcyBjYXJyaWVkIGJ5IHRoZSBwaG90b2dyYXBoLlxuXG4gICBBIGJhbmQsIHNvIGl0IGlzIHRoZSBmdWxsIHdpZHRoIG9mIHRoZSBjb2x1bW4gaXQgY2xvc2VzOyBhIHN1cmZhY2UsIHNvIGl0XG4gICB0YWtlcyB0aGUgY2FyZCByYWRpdXMgbGlrZSBldmVyeSBvdGhlciBzdXJmYWNlLiBUaGUgc2NyaW0gaXMgd2VpZ2h0ZWQgdG8gdGhlXG4gICBsZWFkaW5nIGVkZ2Ugb24gZGVza3RvcCBhbmQgZmxpcHBlZCBib3R0b20tdXAgYXQgcGhvbmUgd2lkdGgsIHRoZSBzYW1lIHdheVxuICAgdGhlIGJyYW5kJ3Mgb3RoZXIgb3ZlcmxhaWQgaW1hZ2UgYmVoYXZlcy4gVGhlIHRpdGxlIHNldHMgbWVkaXVtLCB3aGljaCBpc1xuICAgdGhlIHN0eWxlZ3VpZGUncyBsZWdpYmlsaXR5IGV4Y2VwdGlvbiBmb3IgYSB0aXRsZSBsYWlkIG92ZXIgcGhvdG9ncmFwaHkuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLmN0YS1iYW5kIHtcblxuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdGRpc3BsYXk6IGJsb2NrO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtY2FyZCk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLW5ldXRyYWwtODAwKTtcbn1cblxuLmN0YS1iYW5kX19tZWRpYSB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdHdpZHRoOiAxMDAlO1xuXHRhc3BlY3QtcmF0aW86IDE0MDAgLyA0MjA7XG5cdG1pbi1oZWlnaHQ6IDMyMHB4O1xuXHRvYmplY3QtZml0OiBjb3Zlcjtcbn1cblxuLmN0YS1iYW5kX19zY3JpbSB7XG5cblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRpbnNldDogMDtcblx0YmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCA5MGRlZywgdmFyKC0tYmctb3ZlcmxheSkgMCUsIHZhcigtLWJnLW92ZXJsYXkpIDUwJSwgdHJhbnNwYXJlbnQgOTAlICk7XG59XG5cbi5jdGEtYmFuZF9fY29udGVudCB7XG5cblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRpbnNldC1ibG9jazogMDtcblx0aW5zZXQtaW5saW5lLXN0YXJ0OiAwO1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdG1heC13aWR0aDogNjIwcHg7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTgpIHZhcigtLXNwYWNlLTEyKTtcbn1cblxuLmN0YS1iYW5kX190aXRsZSB7XG5cblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDIpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1vbi1icmFuZCk7XG59XG5cbi5jdGEtYmFuZF9fdGV4dCB7XG5cblx0bWFyZ2luOiB2YXIoLS1zcGFjZS0zKSAwIHZhcigtLXNwYWNlLTYpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keS1sZyk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1saWdodCk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1ib2R5KTtcblx0Y29sb3I6IHZhcigtLXRleHQtb24tYnJhbmQpO1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDkwMHB4ICkge1xuXG5cdC5jdGEtYmFuZF9fY29udGVudCB7XG5cblx0XHRtYXgtd2lkdGg6IDc1JTtcblx0XHRwYWRkaW5nOiB2YXIoLS1zcGFjZS02KSB2YXIoLS1zcGFjZS04KTtcblx0fVxuXG5cdC5jdGEtYmFuZF9fdGl0bGUge1xuXG5cdFx0Zm9udC1zaXplOiB2YXIoLS1mcy1oMyk7XG5cdH1cblxuXHQuY3RhLWJhbmRfX3RleHQge1xuXG5cdFx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0fVxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5jdGEtYmFuZF9fbWVkaWEge1xuXG5cdFx0YXNwZWN0LXJhdGlvOiAzIC8gNDtcblx0XHRtaW4taGVpZ2h0OiA0NDBweDtcblx0fVxuXG5cdC5jdGEtYmFuZF9fc2NyaW0ge1xuXG5cdFx0YmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCAwZGVnLCB2YXIoLS1iZy1vdmVybGF5KSAwJSwgdmFyKC0tYmctb3ZlcmxheSkgNjIlLCB0cmFuc3BhcmVudCA5NiUgKTtcblx0fVxuXG5cdC5jdGEtYmFuZF9fY29udGVudCB7XG5cblx0XHRqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuXHRcdG1heC13aWR0aDogbm9uZTtcblx0XHRwYWRkaW5nOiB2YXIoLS1zcGFjZS02KTtcblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGRlY2lzaW9uXG4vL1xuLy8gVGhlIGlkZW50aXR5IHN0cmlwIGNsb3NpbmcgdGhlIGhlcm8gcGFuZWwg4oCUIGJyYW5kLCBTS1UsIG1hbnVmYWN0dXJlciBwYXJ0XG4vLyBhbmQgYmFyY29kZSBvbiBPTkUgbGluZSBhdCA5ODJweC4gSW4gYSBoYWxmLXdpZHRoIGNvbHVtbiB0aGVzZSB3cmFwcGVkIHRvXG4vLyB0d28sIHdoaWNoIGlzIHdoYXQgaGFkIG1hZGUgdGhlIGdhbGxlcnkgc2lkZSB0aGUgdGFsbGVyIGhhbGYuXG4vL1xuLy8gU291cmNlOiBNUEc5IG1vY2t1cCAoZGVzaWduIDE3OTY3KSwgbm8gY2F0YWxvZ3VlIHJvdy4gUG9ydGVkIGZvciB0aGUgTVBHOSBwcm9kdWN0LXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgZGVjaXNpb24gIChORVcpXG4gICBUaGUgcmlnaHQtaGFuZCBjb2x1bW4gb2YgdGhlIGhlYWRlciBwYW5lbDogd2hvIG1ha2VzIGl0LCB3aGF0IGl0IGlzLCB3aGF0IGl0XG4gICBjb3N0cywgd2hldGhlciBpdCBpcyBoZXJlLCB3aGVuIGl0IGFycml2ZXMsIGFuZCB0aGUgYmFza2V0IOKAlCBpbiB0aGF0IG9yZGVyLFxuICAgYmVjYXVzZSB0aGF0IGlzIHRoZSBvcmRlciB0aGUgcXVlc3Rpb25zIGFycml2ZSBpbi5cblxuICAgSXQgaXMgYSBzdGFjayB3aXRoIGEgZ2FwIHJhdGhlciB0aGFuIGEgc2V0IG9mIG1hcmdpbnMsIHNvIG5vdGhpbmcgaW5zaWRlIGl0XG4gICBjYW4gdGllIHRoZSBkb2N1bWVudCdzIG93biByaHl0aG0gcnVsZSBhbmQgd2luIG9uIHNvdXJjZSBvcmRlci5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4uZGVjaXNpb24ge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogdmFyKC0tc3BhY2UtNik7XG59XG5cbi8qIEJyYW5kLCBTS1UgYW5kIG1hbnVmYWN0dXJlciBwYXJ0LCBhdCB0aGUgZm9vdCBhbmQgZGVsaWJlcmF0ZWx5IHF1aWV0LiBBXG4gICBjb21wb25lbnQgYnV5ZXIgY3Jvc3MtcmVmZXJlbmNlcyBhbGwgdGhyZWUgYWdhaW5zdCBhIGJ1aWxkIGxpc3Qgb3IgYVxuICAgY29tcGF0aWJpbGl0eSBjaGVja2VyOyB0aGUgb2xkIHN0b3JlIGJ1cmllZCB0aGVtIGluIGEgdGFiLiAqL1xuLmRlY2lzaW9uX19pZGVudGl0eSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC13cmFwOiB3cmFwO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpIHZhcigtLXNwYWNlLTYpO1xuXHRwYWRkaW5nLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS00KTtcblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xufVxuXG4uZGVjaXNpb25fX2lkZW50aXR5LXBhaXIge1xuXG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuXG4uZGVjaXNpb25fX2lkZW50aXR5LXZhbHVlIHtcblxuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG59XG5cbi8qIFRoZSBpZGVudGl0eSBsaW5lIGNsb3NlcyB0aGUgaGVybyBjYXJkLCBydW5uaW5nIGl0cyB3aG9sZSB3aWR0aC4gQnJhbmQsIFNLVSxcbiAgIG1hbnVmYWN0dXJlciBwYXJ0IGFuZCBiYXJjb2RlIHRoZW4gc2l0IG9uIE9ORSBsaW5lIOKAlCBpbiBhIGhhbGYtd2lkdGggY29sdW1uXG4gICB0aGV5IHdyYXBwZWQgdG8gdHdvLCB3aGljaCBpcyB3aGF0IG1hZGUgdGhlIGdhbGxlcnkgc2lkZSB0aGUgdGFsbGVyIGhhbGYuICovXG4uYnV5LXJlZ2lvbiAuZGVzY3JpcHRpb24tcGFuZWwgPiAuZGVjaXNpb25fX2lkZW50aXR5IHtcblxuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTYpO1xufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGRlbGl2ZXJ5LW9wdGlvbnNcbi8vXG4vLyBQb3J0ZWQgZnJvbSBjYXRhbG9ndWUgYmxvY2sgYGRlbGl2ZXJ5LW9wdGlvbnNgIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxMCwgb3BlcmF0b3ItYWNjZXB0ZWRcbi8vIDIwMjYtMDktMjQpIGZvciB0aGUgYmFza2V0IHdhbGssIE1QRzEwLiBUaGUgY2F0YWxvZ3VlIHJvdyBpcyB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIGRlbGl2ZXJ5LW9wdGlvbnMgIChORVcpXG4gICBUaGUgZGVsaXZlcnkgc3BlZWRzLCBjaG9zZW4gaW4gdGhlIGJhc2tldCByYXRoZXIgdGhhbiBmaXJzdCBtZXQgYXQgY2hlY2tvdXRcbiAgIOKAlCB0aGUgb25lIHRoaW5nIHRoZSBvbGQgc3RvcmUncyBiYXNrZXQgZGlkIHRoYXQgbW9zdCBzdG9yZXMgbGVhdmUgdG8gdGhlXG4gICBuZXh0IHBhZ2UuIEVhY2ggbWV0aG9kIGlzIGEgYGNob2ljZWAgcmFkaW8gd2l0aCBpdHMgcHJpY2Ugc2V0IHJpZ2h0LCBpbiB0aGVcbiAgIGNvbW1lcmNlIGZhY2UgYmVjYXVzZSBpdCBpcyBhIHByaWNlLiBUaGUgc2VsZWN0ZWQgbWV0aG9kIHRha2VzIHRoZSBicmFuZCdzXG4gICBjdXJyZW50LWl0ZW0gd2FzaCwgdGhlIHNhbWUgb25lIHRoZSBzdG9yZSBuYXZpZ2F0aW9uIHVzZXMuIFRoZSByb3dzIGFyZSBhXG4gICBib3JkZXJlZCBncm91cCBvZiBsaXN0IHJvd3MsIHNvIHRoZSBvdXRsaW5lIHRha2VzIHRoZSBzdXJmYWNlIHJhZGl1cy5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLmRlbGl2ZXJ5LW9wdGlvbnMge1xuXG5cdG1pbi1pbmxpbmUtc2l6ZTogMDtcblx0bWFyZ2luOiAwO1xuXHRwYWRkaW5nOiAwO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmRlbGl2ZXJ5LW9wdGlvbnNfX2xlZ2VuZCB7XG5cblx0cG9zaXRpb246IGFic29sdXRlO1xuXHR3aWR0aDogMXB4O1xuXHRoZWlnaHQ6IDFweDtcblx0bWFyZ2luOiAtMXB4O1xuXHRwYWRkaW5nOiAwO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHRjbGlwOiByZWN0KCAwIDAgMCAwICk7XG5cdHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cdGJvcmRlcjogMDtcbn1cblxuLmRlbGl2ZXJ5LW9wdGlvbnNfX2l0ZW0ge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cdGdhcDogdmFyKC0tc3BhY2UtNCk7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTMpIHZhcigtLXNwYWNlLTQpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbCk7XG59XG5cbi5kZWxpdmVyeS1vcHRpb25zX19pdGVtICsgLmRlbGl2ZXJ5LW9wdGlvbnNfX2l0ZW0ge1xuXG5cdGJvcmRlci1ibG9jay1zdGFydDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcbn1cblxuLmRlbGl2ZXJ5LW9wdGlvbnNfX2l0ZW0tLXNlbGVjdGVkIHtcblxuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jYXJkLWhvdmVyKTtcblx0Ym94LXNoYWRvdzogaW5zZXQgM3B4IDAgMCB2YXIoLS1ib3JkZXItYnJhbmQpO1xufVxuXG4uZGVsaXZlcnktb3B0aW9uc19faXRlbSAuY2hvaWNlIHtcblxuXHRmbGV4OiAxIDEgYXV0bztcbn1cblxuLmRlbGl2ZXJ5LW9wdGlvbnNfX2RldGFpbCB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG59XG5cbi5kZWxpdmVyeS1vcHRpb25zX19wcmljZSB7XG5cblx0ZmxleDogMCAwIGF1dG87XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1jaHJvbWUpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHktbGcpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctYm9sZCk7XG5cdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcbn1cblxuLmRlbGl2ZXJ5LW9wdGlvbnNfX3Njb3BlIHtcblxuXHRtYXJnaW46IDAgMCB2YXIoLS1zcGFjZS00KTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbn1cblxuLmRlbGl2ZXJ5LW9wdGlvbnNfX25vdGUge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdG1hcmdpbjogdmFyKC0tc3BhY2UtNCkgMCAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG4uZGVsaXZlcnktb3B0aW9uc19fbm90ZS1pY29uIHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0d2lkdGg6IDI0cHg7XG5cdGhlaWdodDogMjRweDtcblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGRlc2NyaXB0aW9uLXBhbmVsXG4vL1xuLy8gVGhlIHBhbmVsLXdoaXRlIHN1cmZhY2UgdGhhdCBjYXJyaWVzIGEgcHJvZHVjdCBkZXNjcmlwdGlvbiBhcyBvbmVcbi8vIGNvbnRpbnVvdXMgZG9jdW1lbnQsIGFuZCB0aGUgdmVydGljYWwgcmh5dGhtIGJldHdlZW4gdGhlIHNoYXBlcyBpbnNpZGUgaXQuXG4vLyBGbGF0LCBzcXVhcmUtc2hvdWxkZXJlZCBhdCB0aGUgYnJhbmQncyBvbmUgc3VyZmFjZSByYWRpdXMsIGdlbmVyb3VzbHlcbi8vIHBhZGRlZC5cbi8vXG4vLyBTb3VyY2U6IGNhdGFsb2d1ZSBibG9jayBgZGVzY3JpcHRpb24tcGFuZWxgLiBQb3J0ZWQgZm9yIHRoZSBNUEc5IHByb2R1Y3QtcGFnZSB3YWxrLCAyMDI2LTA5LTE2LlxuXG4uZGVzY3JpcHRpb24tcGFuZWwge1xuXG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLWNhcmQtcGFkZGluZyk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctcGFuZWwpO1xufVxuXG4uZGVzY3JpcHRpb24tcGFuZWxfX2RvYyA+ICoge1xuXG5cdG1hcmdpbi1ibG9jazogMDtcbn1cblxuLmRlc2NyaXB0aW9uLXBhbmVsX19kb2MgPiAqICsgKiB7XG5cblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS04KTtcbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBkb2Mtc2VjdGlvblxuLy9cbi8vIE9uZSB0aXRsZWQgc2VjdGlvbiBvZiBhIGxvbmcgZG9jdW1lbnQ6IGEgYHNlY3Rpb24taGVhZGAgYW5kIHdoYXRldmVyIHRoZVxuLy8gc2VjdGlvbiBob2xkcy4gSXQgY2FycmllcyBhbiBpZCwgd2hpY2ggaXMgd2hhdCB0aGUgY29udGVudHMgcmFpbCBsaW5rcyB0by5cbi8vXG4vLyBTb3VyY2U6IGNhdGFsb2d1ZSBibG9jayBgZG9jLXNlY3Rpb25gLCByZWNvbmNpbGVkIGFnYWluc3QgTVBHOCAoZGVzaWduXG4vLyAxNzk1NSkuIFBvcnRlZCBmb3IgdGhlIE1QRzggY2F0ZWdvcnktZnVubmVsIHdhbGssIDIwMjYtMDktMTYuXG5cbi8qIC0tLS0gZG9jLXNlY3Rpb24gKHJldXNlZCBmcm9tIHRoZSBicmFuZCBjYXRhbG9ndWUsIHZlcmJhdGltKSAtLS0tICovXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBkb2Mtc2VjdGlvbiAgKE5FVylcbiAgIEEgcmVmZXJlbmNlIHBhZ2UgaXMgY29uc3VsdGVkLCBub3QgcmVhZDogYSByZWFkZXIgYXJyaXZlcyBmcm9tIGEgc3VwcG9ydFxuICAgZW1haWwgYXQgb25lIHNlY3Rpb24gYW5kIG5ldmVyIHNlZXMgdGhlIHJlc3QuIFNvIGEgc2VjdGlvbiBpcyBhIHJlYWwgb2JqZWN0XG4gICByYXRoZXIgdGhhbiBhIGhlYWRpbmcgZm9sbG93ZWQgYnkgc29tZSBwYXJhZ3JhcGhzIOKAlCBpdCBjYXJyaWVzIHRoZSBpZCB0aGVcbiAgIGNvbnRlbnRzIGxpc3QgYW5kIHRoZSBzdXBwb3J0IGVtYWlsIHBvaW50IGF0LCBhbmQgdGhlIHNjcm9sbCBvZmZzZXQgdGhhdFxuICAgc3RvcHMgdGhlIGhlYWRpbmcgbGFuZGluZyBmbHVzaCBhZ2FpbnN0IHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0LlxuXG4gICBUd28gZ2FwcywgYW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbSBpcyB3aGF0IG1ha2VzIHRoZSBwYWdlIHNjYW5uYWJsZTpcbiAgIGEgc2VjdGlvbiBhbmQgaXRzIG5laWdoYm91ciBhcmUgYSBzZWN0aW9uIGdhcCBhcGFydCwgdGhlIHNoYXBlcyBpbnNpZGUgb25lXG4gICBzZWN0aW9uIGEgZG9jdW1lbnQgZ2FwIGFwYXJ0LiBUaGUgZG9jdW1lbnQgZ2FwIGlzIHRoZSBzYW1lIG9uZSB0aGUgYnJhbmQnc1xuICAgb3RoZXIgZG9jdW1lbnRzIGFscmVhZHkgdXNlLCBzbyBhIGJsb2NrIHdyaXR0ZW4gZm9yIGFuIGFydGljbGUgb3IgYSBwcm9kdWN0XG4gICBkZXNjcmlwdGlvbiBzdGF0ZXMgdGhlIHJpZ2h0IHZhbHVlIGFuZCBsYW5kcyBjb3JyZWN0bHkgaW4gaGVyZSB0b28uXG5cbiAgIFRoZSByaHl0aG0gdmFsdWUgaXMgc3RhdGVkIG91dHJpZ2h0IHJhdGhlciB0aGFuIHJlc2V0IHRvIHplcm8uIFRoZSBkb2N1bWVudFxuICAgY29udGFpbmVyJ3MgYD4gKiArICpgIHJ1bGUgaXMgYSBzaW5nbGUtY2xhc3Mgc2VsZWN0b3IsIHNvIGEgYmFyZSBgbWFyZ2luOiAwYFxuICAgaGVyZSB3b3VsZCB0aWUgaXQgYW5kIHdpbiBvbiBzb3VyY2Ugb3JkZXIsIGxhbmRpbmcgZXZlcnkgc2VjdGlvbiBmbHVzaFxuICAgYWdhaW5zdCB0aGUgbGFzdCDigJQgdGhlIHRyYXAgZmlndXJlLXJvdyBhbmQgcHVsbC1xdW90ZSBhbHJlYWR5IGRvY3VtZW50LlxuXG4gICBUaGUgaGVhZGluZyBydWxlIGhhbmRzIHRoZSBzcGFjZSBiZW5lYXRoIGEgc2VjdGlvbiB0aXRsZSBiYWNrIHRvIHRoZSB0aXRsZSdzXG4gICBvd24gbWFyZ2luLCBzbyB0aGUgaGVhZGluZyBiaW5kcyB0byB3aGF0IGl0IGludHJvZHVjZXMgaW5zdGVhZCBvZiBmbG9hdGluZ1xuICAgbWlkd2F5IGJldHdlZW4gdHdvIHNoYXBlcy4gSXQgY2FycmllcyB0d28gY2xhc3NlcyBhbmQgd2lucyBvdXRyaWdodC5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4uZG9jLXNlY3Rpb24ge1xuXG5cdG1hcmdpbjogdmFyKC0tc3BhY2UtMTIpIDAgMDtcblx0c2Nyb2xsLW1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtMTIpO1xufVxuXG4uZG9jLXNlY3Rpb24gPiAqICsgKiB7XG5cblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS04KTtcbn1cblxuLmRvYy1zZWN0aW9uID4gLnNlY3Rpb24taGVhZCArICoge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogMDtcbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuZG9jLXNlY3Rpb24ge1xuXG5cdFx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS04KTtcblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGVtcHR5LXN0YXRlXG4vL1xuLy8gV2hhdCBhIGxvb3Agc2hvd3Mgd2hlbiB0aGUgcXVlcnkgcmV0dXJucyBub3RoaW5nIOKAlCBhIHBhbmVsIGNhcnJ5aW5nIGEgaGVhZGluZyxcbi8vIG9uZSBsaW5lLCBhbmQgYSB3YXkgYmFjay4gVGl0bGVkIGF0IHRoZSBzYW1lIHNpemUgYXMgdGhlIGFyY2hpdmUgdGl0bGUgaXQgc2l0c1xuLy8gYmVuZWF0aCwgYmVjYXVzZSBpdCBzdGFuZHMgaW4gZm9yIHRoZSB3aG9sZSByZXN1bHQgc2V0IHJhdGhlciB0aGFuIGZvciBvbmUgY2FyZC5cbi8vXG4vLyBTb3VyY2U6IGNhdGFsb2d1ZSBibG9jayBgZW1wdHktc3RhdGVgLiBQb3J0ZWQgZm9yIHRoZSBNUEc3IGNhdGVnb3J5LWFyY2hpdmUgd2FsaywgMjAyNi0wOS0xNi5cbi8vIFJlY29uY2lsZWQgYWdhaW5zdCB0aGUgTVBHNyBtb2NrdXAncyBvd24gc3R5bGVzaGVldDogYnl0ZS1pZGVudGljYWwsIG5vIGRlcGFydHVyZXMuXG5cbi5lbXB0eS1zdGF0ZSB7XG5cblx0cGFkZGluZzogdmFyKC0tc3BhY2UtMTYpIHZhcigtLXNwYWNlLWNhcmQtcGFkZGluZyk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctcGFuZWwpO1xuXHR0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi5lbXB0eS1zdGF0ZV9fdGl0bGUge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWgyKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LWxpZ2h0KTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1oZWFkaW5nKTtcbn1cblxuLmVtcHR5LXN0YXRlX190ZXh0IHtcblxuXHRtYXgtd2lkdGg6IHZhcigtLWNvbnRhaW5lci1yZWFkaW5nKTtcblx0bWFyZ2luOiB2YXIoLS1zcGFjZS00KSBhdXRvIDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA5MDBweCApIHtcblxuXHQuZW1wdHktc3RhdGUge1xuXG5cdFx0cGFkZGluZzogdmFyKC0tc3BhY2UtMTIpIHZhcigtLXNwYWNlLTYpO1xuXHR9XG5cblx0LmVtcHR5LXN0YXRlX190aXRsZSB7XG5cblx0XHRmb250LXNpemU6IHZhcigtLWZzLWgzKTtcblx0fVxufVxuXG4vKiAtLWNvbXBhY3Q6IGFuIGVtcHR5IHN0YXRlIHN0YW5kaW5nIGluIGZvciBPTkUgcGFuZWwgaW5zaWRlIGEgY29sdW1uLCBub3QgYSB3aG9sZVxuICAgcmVzdWx0IHNldCDigJQgdGl0bGVkIGF0IGNhcmQgc2l6ZSBzbyBpdCBuZXZlciBvdXQtcmFua3MgdGhlIHBhZ2UgdGl0bGUgKG9wZXJhdG9yXG4gICByZXZpZXcgb2YgTVBHMTMpLiBQb3J0ZWQgZm9yIHRoZSBhY2NvdW50IHdhbGssIE1QRzEzLiAqL1xuLmVtcHR5LXN0YXRlLS1jb21wYWN0IC5lbXB0eS1zdGF0ZV9fdGl0bGUge1xuXG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDMpO1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDkwMHB4ICkge1xuXG5cdC5lbXB0eS1zdGF0ZS0tY29tcGFjdCAuZW1wdHktc3RhdGVfX3RpdGxlIHtcblxuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDQpO1xuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgZXJyb3ItbGlzdFxuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBjaGVja291dCBtb2NrdXAgKGRlc2lnbiBvZiByZWNvcmQ6IE1QRzExLCBvcGVyYXRvci1hY2NlcHRlZFxuLy8gMjAyNi0wOS0yMykgZm9yIHRoZSBjaGVja291dCB3YWxrLCBNUEcxMS4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIFRoZSBicmFuZCBmb3JtIHNwZWNpbWVuJ3MgZXJyb3Igc3VtbWFyeSBsaXN0IChjYXRhbG9ndWUgYmxvY2sgYGVycm9yLWxpc3RgKSxcbiAgIHBhc3RlZCB2ZXJiYXRpbSBpbnRvIE1QRzExIGZvciB0aGUgY2hlY2tvdXQncyBlcnJvciBzdGF0ZS4gKi9cbi5lcnJvci1saXN0IHtcblxuXHRtYXJnaW46IDA7XG5cdHBhZGRpbmc6IDA7XG5cdGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi5lcnJvci1saXN0X19pdGVtIHtcblxuXHRwYWRkaW5nLWJsb2NrOiB2YXIoLS1zcGFjZS0yKTtcbn1cblxuLmVycm9yLWxpc3RfX2l0ZW0gKyAuZXJyb3ItbGlzdF9faXRlbSB7XG5cblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xufVxuXG4uZXJyb3ItbGlzdF9fbGluayB7XG5cblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rKTtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG4uZXJyb3ItbGlzdF9fbGluazpob3ZlciB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtbGluay1ob3Zlcik7XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgZXhwcmVzcy1jaGVja291dFxuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBjaGVja291dCBtb2NrdXAgKGRlc2lnbiBvZiByZWNvcmQ6IE1QRzExLCBvcGVyYXRvci1hY2NlcHRlZFxuLy8gMjAyNi0wOS0yMykgZm9yIHRoZSBjaGVja291dCB3YWxrLCBNUEcxMS4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIGV4cHJlc3MtY2hlY2tvdXQgIChORVcpXG4gICBUaGUgZmFzdGVzdCB3YXkgdGhyb3VnaDogQXBwbGUgUGF5IGFuZCBHb29nbGUgUGF5LCBhYm92ZSB0aGUgZm9ybSwgb24gaXRzXG4gICBvd24gc2xpbSBwYW5lbC13aGl0ZSBjYXJkLiBBbiBleHByZXNzIHBheW1lbnQgc3VwcGxpZXMgdGhlIHNob3BwZXIncyBuYW1lLFxuICAgZW1haWwgYW5kIGFkZHJlc3MsIHNvIHRha2luZyBpdCBza2lwcyB0aGUgZm9ybSBlbnRpcmVseSDigJQgd2hpY2ggaXMgd2h5IGl0XG4gICBzaXRzIGZpcnN0LCBhbmQgd2h5IHRoZSBkaXZpZGVyIGJlbmVhdGggaXQgc2F5cyB3aGF0IHRoZSBmb3JtIGJlbG93IGlzIGZvci5cblxuICAgVGhlIHR3byBidXR0b25zIGFyZSB0aGUgb25lIHBsYWNlIG9uIHRoZSBwYWdlIHRoYXQgZG9lcyBub3Qgd2VhciB0aGUgYnJhbmQ6XG4gICB0aGUgcGxhdGZvcm1zIHJlcXVpcmUgdGhlaXIgb3duIGJsYWNrIGJ1dHRvbiB3aXRoIGEgd2hpdGUgbWFyaywgZHJhd24gaGVyZVxuICAgd2l0aCB0aGUgYnJhbmQncyBvd24gaW5rIGFuZCBwYW5lbCB3aGl0ZSAodGhlIHBhbGV0dGUgaGFzIGJvdGgsIHNvIG5vIHZhbHVlXG4gICBvdXRzaWRlIHRoZSBzZXZlbnRlZW4gaXMgbmVlZGVkKS4gRXZlcnl0aGluZyBhcm91bmQgdGhlbSDigJQgdGhlIGNhcmQsIHRoZVxuICAgZXllYnJvdywgdGhlIGhhaXJsaW5lIGRpdmlkZXIg4oCUIGlzIHRoZSBicmFuZCdzLiBUaGUgYnV0dG9ucyB0YWtlIHRoZSBzcXVhcmVcbiAgIGNvbnRyb2wgY29ybmVyOyBTdHJpcGUncyBFeHByZXNzIENoZWNrb3V0IEVsZW1lbnQgc2V0cyBpdHMgYnV0dG9ucycgY29ybmVyXG4gICBmcm9tIHRoZSBBcHBlYXJhbmNlIEFQSSdzIGJvcmRlciByYWRpdXMsIHNvIHNxdWFyZSBpcyBidWlsZGFibGUuXG5cbiAgIFRoZSBidXR0b25zIHNoYXJlIHRoZSByb3cgZXF1YWxseSBpbiBhIGZsZXggcm93LCBzbyBhIGRldmljZSBvZmZlcmluZyBvbmx5XG4gICBvbmUgb2YgdGhlbSBzaG93cyBvbmUgZnVsbC13aWR0aCBidXR0b24gd2l0aCBubyBnYXA7IGEgZGV2aWNlIG9mZmVyaW5nXG4gICBuZWl0aGVyIGRyb3BzIHRoZSB3aG9sZSBjYXJkLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4uZXhwcmVzcy1jaGVja291dCB7XG5cblx0cGFkZGluZzogdmFyKC0tc3BhY2UtNikgdmFyKC0tc3BhY2UtY2FyZC1wYWRkaW5nKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtY2FyZCk7XG5cdGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1wYW5lbCk7XG59XG5cbi5leHByZXNzLWNoZWNrb3V0X190aXRsZSB7XG5cblx0bWFyZ2luOiAwIDAgdmFyKC0tc3BhY2UtNCk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1leWVicm93KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0bGV0dGVyLXNwYWNpbmc6IDAuMTJlbTtcblx0dGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuXG4uZXhwcmVzcy1jaGVja291dF9fYnV0dG9ucyB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0Z2FwOiB2YXIoLS1zcGFjZS00KTtcbn1cblxuLmV4cHJlc3MtY2hlY2tvdXRfX2J1dHRvbiB7XG5cblx0ZmxleDogMSAxIDA7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXHRtaW4td2lkdGg6IDA7XG5cdGhlaWdodDogNDhweDtcblx0cGFkZGluZzogMCB2YXIoLS1zcGFjZS00KTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtYnRuKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbmV1dHJhbC05MDApO1xuXHRjb2xvcjogdmFyKC0tbmV1dHJhbC01MCk7XG5cdGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmV4cHJlc3MtY2hlY2tvdXRfX2J1dHRvbiBzdmcge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHR3aWR0aDogYXV0bztcblx0aGVpZ2h0OiAyMnB4O1xufVxuXG4uZXhwcmVzcy1jaGVja291dF9fYnV0dG9uOmZvY3VzLXZpc2libGUge1xuXG5cdG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItZm9jdXMpO1xuXHRvdXRsaW5lLW9mZnNldDogMnB4O1xufVxuXG4uZXhwcmVzcy1jaGVja291dF9fZGl2aWRlciB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiB2YXIoLS1zcGFjZS00KTtcblx0bWFyZ2luOiB2YXIoLS1zcGFjZS02KSAwIDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG5cdHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLmV4cHJlc3MtY2hlY2tvdXRfX2RpdmlkZXI6OmJlZm9yZSxcbi5leHByZXNzLWNoZWNrb3V0X19kaXZpZGVyOjphZnRlciB7XG5cblx0Y29udGVudDogXCJcIjtcblx0ZmxleDogMSAxIDA7XG5cdG1pbi13aWR0aDogdmFyKC0tc3BhY2UtNCk7XG5cdGJvcmRlci1ibG9jay1zdGFydDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuZXhwcmVzcy1jaGVja291dCB7XG5cblx0XHRwYWRkaW5nOiB2YXIoLS1zcGFjZS00KTtcblx0fVxuXG5cdC5leHByZXNzLWNoZWNrb3V0X19idXR0b25zIHtcblxuXHRcdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdH1cblxuXHQuZXhwcmVzcy1jaGVja291dF9fZGl2aWRlciB7XG5cblx0XHRnYXA6IHZhcigtLXNwYWNlLTMpO1xuXHR9XG59XG5cbi8qIFdpcmluZyAoTVBHMTEpOiBTdHJpcGUgcHJpbnRzIGl0cyBvd24gXCLigJQgT1Ig4oCUXCIgaW5zaWRlIGl0cyBidXR0b24gb3V0cHV0IGFuZCBzaG93cyBpdFxuICAgd2l0aCBhbiBpbmxpbmUgYGRpc3BsYXlgIGZyb20gaXRzIHNjcmlwdDsgdGhlcmUgaXMgbm8gaG9vayB0byByZW1vdmUgaXQsIHNvIHRoZSBvbmVcbiAgIGAhaW1wb3J0YW50YCBvbiB0aGlzIHBhZ2UgdGFrZXMgaXQgZG93bi4gVGhlIGNhcmQncyBvd24gZGl2aWRlciBzYXlzIHdoYXQgdGhlIGZvcm1cbiAgIGJlbG93IGlzIGZvci4gKi9cbi5leHByZXNzLWNoZWNrb3V0X19idXR0b25zICN3Yy1zdHJpcGUtZXhwcmVzcy1jaGVja291dC1idXR0b24tc2VwYXJhdG9yIHtcblxuXHRkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgZmFxLWFjY29yZGlvblxuLy9cbi8vIFF1ZXN0aW9ucyB0aGF0IG9wZW4sIGJ1aWx0IG9uIDxkZXRhaWxzPi88c3VtbWFyeT4gc28gaXQgd29ya3MgYmVmb3JlIGFueVxuLy8gc2NyaXB0IGRvZXMuIFRoZSBtYXJrZXIgcm90YXRlcyBvbiBvcGVuOyB0aGUgYW5zd2VyIGhvbGRzIGBwcm9zZWAuXG4vL1xuLy8gVGhlIHF1ZXN0aW9uIGlzIGFuIDxoMz4gSU5TSURFIHRoZSBzdW1tYXJ5IHJhdGhlciB0aGFuIHRoZSBzdW1tYXJ5IGl0c2VsZiDigJRcbi8vIGEgc3VtbWFyeSBjYXJyaWVzIGl0cyBvd24gc2VtYW50aWNzIGFuZCBhIGhlYWRpbmcgaW5zaWRlIGl0IGtlZXBzIHRoZSBwYWdlJ3Ncbi8vIG91dGxpbmUgcmVhZGFibGUgd2l0aG91dCBmaWdodGluZyB0aGVtLlxuLy9cbi8vIFNvdXJjZTogY2F0YWxvZ3VlIGJsb2NrIGBmYXEtYWNjb3JkaW9uYCwgcmVjb25jaWxlZCBhZ2FpbnN0IE1QRzggKGRlc2lnblxuLy8gMTc5NTUpLiBQb3J0ZWQgZm9yIHRoZSBNUEc4IGNhdGVnb3J5LWZ1bm5lbCB3YWxrLCAyMDI2LTA5LTE2LlxuXG4vKiAtLS0tIGZhcS1hY2NvcmRpb24gKHJldXNlZCBmcm9tIHRoZSBicmFuZCBjYXRhbG9ndWUsIHZlcmJhdGltKSAtLS0tICovXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBmYXEtYWNjb3JkaW9uICAoTkVXKVxuICAgQSByZWFsIGRpc2Nsb3N1cmUg4oCUIGBkZXRhaWxzYCBhbmQgYHN1bW1hcnlgIOKAlCBhbmQgbm90IGEgc3R5bGVkIGxpc3Qgd2l0aCBhXG4gICBzY3JpcHQgb24gaXQuIFRocmVlIHRoaW5ncyBmb2xsb3cgZnJvbSB0aGF0IGFuZCBhbGwgdGhyZWUgYXJlIHJlcXVpcmVtZW50c1xuICAgcmF0aGVyIHRoYW4gcHJlZmVyZW5jZXM6IGl0IG9wZW5zIHdpdGggbm8gSmF2YVNjcmlwdCwgYSBzZWFyY2ggZW5naW5lIGFuZCBhXG4gICBzY3JlZW4gcmVhZGVyIHNlZSBldmVyeSBhbnN3ZXIgd2hldGhlciBvciBub3QgaXRzIHJvdyBpcyBvcGVuLCBhbmQgdGhlXG4gICBwbGF0Zm9ybSdzIG93biBmcmFnbWVudC1yZXZlYWwgb3BlbnMgYSBjbG9zZWQgcm93IHdoZW4gYSBsaW5rIHBvaW50cyBpbnNpZGVcbiAgIGl0LlxuXG4gICBUSEUgSUQgU0lUUyBPTiBUSEUgQU5TV0VSLCBub3Qgb24gdGhlIHJvdyBhbmQgbm90IG9uIHRoZSBxdWVzdGlvbi4gVGhlXG4gICByZXZlYWwgb25seSBmaXJlcyBmb3IgYSB0YXJnZXQgaW5zaWRlIHRoZSBkaXNjbG9zdXJlLCBhbmQgYSBzdW1tYXJ5IGlzXG4gICBhbHJlYWR5IHZpc2libGUgc28gaXQgZG9lcyBub3QgY291bnQg4oCUIGFuIGlkIG9uIHRoZSBxdWVzdGlvbiBzY3JvbGxzIHRvIGFcbiAgIHJvdyB0aGF0IGlzIHN0aWxsIHNodXQuIE9uIHRoZSBhbnN3ZXIgaXQgb3BlbnMsIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludDogYVxuICAgc3VwcG9ydCBlbWFpbCBwb2ludGluZyBhdCBvbmUgcXVlc3Rpb24gbXVzdCBub3QgbGFuZCBvbiBhIGNsb3NlZCBwYWdlLiBUaGVcbiAgIGFuc3dlciB0aGVuIGNhcnJpZXMgYSBzY3JvbGwgb2Zmc2V0IGEgbGl0dGxlIGRlZXBlciB0aGFuIHRoZSBoZWlnaHQgb2YgdGhlXG4gICByb3cgYWJvdmUgaXQsIHNvIHRoZSBxdWVzdGlvbiBpdCBiZWxvbmdzIHRvIGxhbmRzIG9uIHNjcmVlbiB3aXRoIGl0LlxuXG4gICBUSEUgQ0xPU0VEIFJPVyDigJQgdGhlIHF1ZXN0aW9uIGF0IHRoZSBicmFuZCdzIGluLWRvY3VtZW50IHN1Yi1oZWFkaW5nXG4gICBzZXR0aW5nLCBhIGNoZXZyb24gYXQgdGhlIGZhciBlbmQsIGEgaGFpcmxpbmUgdG8gdGhlIG5leHQgcm93IGFuZCBub3RoaW5nXG4gICBlbHNlLiBObyBncm91bmQsIG5vIGJvcmRlciwgbm8gYm94OiBzaXggcXVlc3Rpb25zIGluIGEgcm93IG9mIGJveGVzIHJlYWRzIGFzXG4gICBzaXggY2FyZHMsIGFuZCB0aGVzZSBhcmUgb25lIGxpc3QuXG5cbiAgIFRIRSBNQVJLRVIg4oCUIHRoZSBicmFuZCdzIG93biBjaGV2cm9uLCB0aGUgb25lIHNlY3Rpb24tbGluayBhbmQgY291bnQtbGlzdFxuICAgY2FycnksIHR1cm5lZCB0byBwb2ludCBkb3duLiBEb3duIGlzIGFscmVhZHkgaG93IHRoaXMgYnJhbmQgc2F5cyBhIHRoaW5nXG4gICBvcGVuczogaXQgaXMgdGhlIG1hcmsgb24gZXZlcnkgaXRlbSBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uIGFuZCBvbiBldmVyeSBiYXJcbiAgIGluIHRoZSBzdG9yZSBzaWRlYmFyLiBJdCBzaXRzIGF0IHRoZSBmYXIgZW5kIG9mIHRoZSByb3cgcmF0aGVyIHRoYW4gaW4gZnJvbnRcbiAgIG9mIHRoZSBxdWVzdGlvbiwgc28gdGhlIHF1ZXN0aW9ucyBzdGF5IGZsdXNoIGxlZnQgYW5kIHNjYW5uYWJsZSBhcyBhIGNvbHVtblxuICAgb2Ygc2VudGVuY2VzOyBhIGxlYWRpbmcgbWFya2VyIHdvdWxkIGFsc28gY29sbGlkZSB3aXRoIHRoZSBkb3RzIHRoZSBuZXN0ZWRcbiAgIGxpc3QgcHV0cyBpbiB0aGF0IHNhbWUgcG9zaXRpb24gZWxzZXdoZXJlIG9uIHRoZSBwYWdlLiBPcGVuLCBpdCBwb2ludHMgdXAuXG5cbiAgIFRIRSBPUEVOIFJPVyDigJQgdGhlIHJvdyBkaWZmZXJzIGJ5IG1vcmUgdGhhbiBoZWlnaHQsIGJlY2F1c2UgYSByZWFkZXIgd2hvIGhhc1xuICAgc2Nyb2xsZWQgcGFzdCB0aGUgc3VtbWFyeSBuZWVkcyB0byBrbm93IHdoaWNoIHF1ZXN0aW9uIHRoZSBhbnN3ZXIgYmVsb25nc1xuICAgdG8uIEl0IHRha2VzIHRoZSBicmFuZCdzIGN1cnJlbnQtaXRlbSBtYXJraW5nIGV4YWN0bHkgYXMgdGhlIHN0b3JlIHNpZGViYXJcbiAgIGFuZCBjb3VudC1saXN0IGFscmVhZHkgZGVmaW5lIGl0OiB0aGUgYmx1ZS10aW50IHdhc2ggYWNyb3NzIHRoZSB3aG9sZSByb3csXG4gICB0aGUgdGhyZWUtcGl4ZWwgUGFyYWdvbi1ibHVlIHJ1bGUgb24gdGhlIGxlYWRpbmcgZWRnZSwgYW5kIHRoZSBxdWVzdGlvbiBpblxuICAgUGFyYWdvbiBibHVlLiBUaGUgcnVsZSBpcyBwYWlkIGZvciBvdXQgb2YgdGhlIHJvdydzIG93biBwYWRkaW5nLCBzbyBhbiBvcGVuXG4gICByb3cgaXMgdGhlIHNhbWUgd2lkdGggYXMgYSBjbG9zZWQgb25lIGFuZCBub3RoaW5nIHNoaWZ0cyBhcyBpdCBvcGVucy5cblxuICAgSG92ZXIgaXMgdGhlIHNhbWUgd2FzaCB3aXRob3V0IHRoZSBydWxlIOKAlCBhIHJvdyBhYm91dCB0byBiZSBvcGVuZWQsXG4gICBwcmV2aWV3aW5nIHRoZSBzdGF0ZSBpdCBpcyBoZWFkaW5nIGZvci5cblxuICAgVGhlIG1lYXN1cmUgaXMgdGhlIHJlYWRpbmcgbWVhc3VyZSBwbHVzIHRoZSByb3cncyBwYWRkaW5nOiBhIHF1ZXN0aW9uIGlzIGFcbiAgIHNlbnRlbmNlIGFuZCBhbiBhbnN3ZXIgaXMgYSBwYXJhZ3JhcGgsIHNvIGJvdGggYXJlIHJlYWQgYWxvbmcsIG5vdCBhY3Jvc3MuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLmZhcS1hY2NvcmRpb24ge1xuXG5cdG1heC13aWR0aDogY2FsYyggdmFyKC0tY29udGFpbmVyLXJlYWRpbmcpICsgKCB2YXIoLS1zcGFjZS00KSAqIDIgKSApO1xuXHQvKiBUaGUgcmh5dGhtIHZhbHVlIHN0YXRlZCBvdXRyaWdodCDigJQgc2VlIGRvYy1zZWN0aW9uLiAqL1xuXHRtYXJnaW46IHZhcigtLXNwYWNlLTgpIDAgMDtcblx0Ym9yZGVyLWJsb2NrOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xufVxuXG4uZmFxLWFjY29yZGlvbl9faXRlbSArIC5mYXEtYWNjb3JkaW9uX19pdGVtIHtcblxuXHRib3JkZXItYmxvY2stc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG59XG5cbi5mYXEtYWNjb3JkaW9uX19zdW1tYXJ5IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblx0anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuXHRnYXA6IHZhcigtLXNwYWNlLTYpO1xuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS00KTtcblx0bGlzdC1zdHlsZTogbm9uZTtcblx0Y3Vyc29yOiBwb2ludGVyO1xufVxuXG4vKiBUaGUgYnJvd3NlcidzIG93biBkaXNjbG9zdXJlIHRyaWFuZ2xlLCByZW1vdmVkIGluIGJvdGggZGlhbGVjdHMuICovXG4uZmFxLWFjY29yZGlvbl9fc3VtbWFyeTo6LXdlYmtpdC1kZXRhaWxzLW1hcmtlciB7XG5cblx0ZGlzcGxheTogbm9uZTtcbn1cblxuLmZhcS1hY2NvcmRpb25fX3N1bW1hcnk6Om1hcmtlciB7XG5cblx0Y29udGVudDogXCJcIjtcbn1cblxuLmZhcS1hY2NvcmRpb25fX3N1bW1hcnk6aG92ZXIge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWNhcmQtaG92ZXIpO1xufVxuXG4uZmFxLWFjY29yZGlvbl9fc3VtbWFyeTpmb2N1cy12aXNpYmxlIHtcblxuXHRvdXRsaW5lOiAycHggc29saWQgdmFyKC0tYm9yZGVyLWZvY3VzKTtcblx0b3V0bGluZS1vZmZzZXQ6IC0ycHg7XG59XG5cbi5mYXEtYWNjb3JkaW9uX19xdWVzdGlvbiB7XG5cblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDQpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1oZWFkaW5nKTtcbn1cblxuLmZhcS1hY2NvcmRpb25fX21hcmtlciB7XG5cblx0ZmxleDogMCAwIGF1dG87XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHR3aWR0aDogMTZweDtcblx0aGVpZ2h0OiAxNnB4O1xuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IDAuM2VtO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG59XG5cbi5mYXEtYWNjb3JkaW9uX19tYXJrZXIgc3ZnIHtcblxuXHR3aWR0aDogMTAwJTtcblx0aGVpZ2h0OiAxMDAlO1xuXHR0cmFuc2Zvcm06IHJvdGF0ZSggOTBkZWcgKTtcbn1cblxuLmZhcS1hY2NvcmRpb25fX2Fuc3dlciB7XG5cblx0cGFkZGluZzogMCB2YXIoLS1zcGFjZS00KSB2YXIoLS1zcGFjZS02KTtcblx0c2Nyb2xsLW1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtMTYpO1xufVxuXG4uZmFxLWFjY29yZGlvbl9faXRlbVtvcGVuXSB7XG5cblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2FyZC1ob3Zlcik7XG5cdGJvcmRlci1pbmxpbmUtc3RhcnQ6IDNweCBzb2xpZCB2YXIoLS1jb2xvci1icmFuZCk7XG59XG5cbi8qIFRoZSBsZWFkaW5nIHJ1bGUgaXMgcGFpZCBmb3Igb3V0IG9mIHRoZSByb3cncyBvd24gc3RhcnQgcGFkZGluZywgc28gYW4gb3BlblxuICAgcm93IGlzIGV4YWN0bHkgdGhlIHdpZHRoIG9mIGEgY2xvc2VkIG9uZSDigJQgdGhlIHRyaWNrIGNvdW50LWxpc3QgYWxyZWFkeSB1c2VzXG4gICB0byBtYXJrIGl0cyBjdXJyZW50IGl0ZW0uICovXG4uZmFxLWFjY29yZGlvbl9faXRlbVtvcGVuXSAuZmFxLWFjY29yZGlvbl9fc3VtbWFyeSxcbi5mYXEtYWNjb3JkaW9uX19pdGVtW29wZW5dIC5mYXEtYWNjb3JkaW9uX19hbnN3ZXIge1xuXG5cdHBhZGRpbmctaW5saW5lLXN0YXJ0OiBjYWxjKCB2YXIoLS1zcGFjZS00KSAtIDNweCApO1xufVxuXG4uZmFxLWFjY29yZGlvbl9faXRlbVtvcGVuXSAuZmFxLWFjY29yZGlvbl9fcXVlc3Rpb24ge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xufVxuXG4uZmFxLWFjY29yZGlvbl9faXRlbVtvcGVuXSAuZmFxLWFjY29yZGlvbl9fbWFya2VyIHN2ZyB7XG5cblx0dHJhbnNmb3JtOiByb3RhdGUoIC05MGRlZyApO1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5mYXEtYWNjb3JkaW9uX19zdW1tYXJ5IHtcblxuXHRcdGdhcDogdmFyKC0tc3BhY2UtNCk7XG5cdFx0cGFkZGluZy1pbmxpbmU6IHZhcigtLXNwYWNlLTMpO1xuXHR9XG5cblx0LmZhcS1hY2NvcmRpb25fX2l0ZW1bb3Blbl0gLmZhcS1hY2NvcmRpb25fX3N1bW1hcnksXG5cdC5mYXEtYWNjb3JkaW9uX19pdGVtW29wZW5dIC5mYXEtYWNjb3JkaW9uX19hbnN3ZXIge1xuXG5cdFx0cGFkZGluZy1pbmxpbmUtc3RhcnQ6IGNhbGMoIHZhcigtLXNwYWNlLTMpIC0gM3B4ICk7XG5cdH1cblxuXHQuZmFxLWFjY29yZGlvbl9fcXVlc3Rpb24ge1xuXG5cdFx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0fVxuXG5cdC5mYXEtYWNjb3JkaW9uX19hbnN3ZXIge1xuXG5cdFx0cGFkZGluZy1pbmxpbmU6IHZhcigtLXNwYWNlLTMpO1xuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgZmVhdHVyZS1wYW5lbFxuLy9cbi8vIEEgZmVhdHVyZSByZW5kZXIgYmVzaWRlIGEgdGhpcmQtbGV2ZWwgaGVhZGluZyBhbmQgb25lIHBhcmFncmFwaCDigJQgdGhlXG4vLyBsb25nZXN0LXJ1bm5pbmcgc2hhcGUgaW4gdGhlIGNhdGFsb2d1ZSdzIGRlc2NyaXB0aW9ucy4gLS1yZXZlcnNlIHB1dHMgdGhlXG4vLyByZW5kZXIgb24gdGhlIHJpZ2h0IHNvIGEgc3RhY2sgb2YgdGhlbSBhbHRlcm5hdGVzOyBib3RoIGZvcm1zIHN0YWNrXG4vLyBpbWFnZS1vdmVyLXRleHQgYmVsb3cgNzY4cHggd2l0aCB0aGUgcmVuZGVyIGtlZXBpbmcgaXRzIG93biBhc3BlY3QgcmF0aW8uXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYGZlYXR1cmUtcGFuZWxgLiBQb3J0ZWQgZm9yIHRoZSBNUEc5IHByb2R1Y3QtcGFnZSB3YWxrLCAyMDI2LTA5LTE2LlxuXG4uZmVhdHVyZS1wYW5lbCB7XG5cblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoIDAsIDJmciApIG1pbm1heCggMCwgM2ZyICk7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtOCk7XG59XG5cbi5mZWF0dXJlLXBhbmVsLS1yZXZlcnNlIHtcblxuXHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCggMCwgM2ZyICkgbWlubWF4KCAwLCAyZnIgKTtcbn1cblxuLmZlYXR1cmUtcGFuZWxfX21lZGlhIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdGFzcGVjdC1yYXRpbzogMyAvIDI7XG5cdG9iamVjdC1maXQ6IGNvbnRhaW47XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsKTtcblx0Ym9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtY2FyZCk7XG59XG5cbi5mZWF0dXJlLXBhbmVsLS1yZXZlcnNlIC5mZWF0dXJlLXBhbmVsX19tZWRpYSB7XG5cblx0b3JkZXI6IDI7XG59XG5cbi8qIFRoZSB0ZXh0IGhhbGYuIFBsYWNlZCBieSB0aGUgdHJhY2ssIHNvIG5vIGxheW91dCBoZXJlIGVpdGhlciDigJQgb25seSB0aGUgZmxvb3JcbiAgIHRoYXQgc3RvcHMgYSBsb25nIHdvcmQgaW4gbWlncmF0ZWQgY2F0ZWdvcnkgY29weSBmcm9tIHdpZGVuaW5nIHRoZSBjb2x1bW4gcGFzdFxuICAgaXRzIHNoYXJlIG9mIHRoZSBwYW5lbCBhbmQgc3F1ZWV6aW5nIHRoZSByZW5kZXIgYmVzaWRlIGl0LiAqL1xuLmZlYXR1cmUtcGFuZWxfX2JvZHkge1xuXG5cdG1pbi13aWR0aDogMDtcbn1cblxuLmZlYXR1cmUtcGFuZWxfX3RpdGxlIHtcblxuXHRtYXJnaW46IDAgMCB2YXIoLS1zcGFjZS0zKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWg0KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtaGVhZGluZyk7XG59XG5cbi5mZWF0dXJlLXBhbmVsX190ZXh0IHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDc2OHB4ICkge1xuXG5cdC5mZWF0dXJlLXBhbmVsLFxuXHQuZmVhdHVyZS1wYW5lbC0tcmV2ZXJzZSB7XG5cblx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCggMCwgMWZyICk7XG5cdFx0Z2FwOiB2YXIoLS1zcGFjZS02KTtcblx0fVxuXG5cdC5mZWF0dXJlLXBhbmVsLS1yZXZlcnNlIC5mZWF0dXJlLXBhbmVsX19tZWRpYSB7XG5cblx0XHRvcmRlcjogMDtcblx0fVxuXG5cdC5mZWF0dXJlLXBhbmVsX19tZWRpYSB7XG5cblx0XHRhc3BlY3QtcmF0aW86IDE2IC8gOTtcblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGZlYXR1cmVkLXByb2R1Y3Rcbi8vXG4vLyBPbmUgcHJvZHVjdCBnaXZlbiBhIHdob2xlIGJhbmQ6IHRoZSBwaWN0dXJlIGJlc2lkZSBhbiBleWVicm93LCB0aGUgdGl0bGUsIHRoZVxuLy8gcHJpY2UsIGEgc2VudGVuY2Ugc2F5aW5nIHdoeSB0aGlzIG9uZSwgaXRzIHN0b2NrIGxpbmUgYW5kIHRoZSB0d28gYWN0aW9ucy5cbi8vXG4vLyBUV08gQ09OVEVOVCBTVEFURVMsIE9ORSBDT01QT05FTlQuIE1QRzggZHJhd3MgaXQgdHdpY2Ug4oCUIFwiT3VyIEJlc3QgU2VsbGVyXCJcbi8vIHdpdGggYSBzYWxlcyBjb3VudCwgYW5kIFwiV29ydGggQSBMb29rXCIgb24gYSByYW5nZSB3aXRoIG5vIHJ1bmF3YXkgc2VsbGVyIOKAlFxuLy8gYW5kIHRoZSBtb2NrdXAncyBvd24gbm90ZSBzYXlzIG9uZSByZW5kZXJzLCBub3QgYm90aC4gU2FtZSBnZW9tZXRyeSwgc2FtZVxuLy8gbWFya3VwLCBkaWZmZXJlbnQgY29weTsgdGhlIGNob2ljZSBpcyBQYXNzIDIncywgbm90IGEgc2Vjb25kIGNvbXBvbmVudCdzLlxuLy9cbi8vIFNvdXJjZTogY2F0YWxvZ3VlIGJsb2NrIGBmZWF0dXJlZC1wcm9kdWN0YCwgcmVjb25jaWxlZCBhZ2FpbnN0IE1QRzggKGRlc2lnblxuLy8gMTc5NTUpLiBQb3J0ZWQgZm9yIHRoZSBNUEc4IGNhdGVnb3J5LWZ1bm5lbCB3YWxrLCAyMDI2LTA5LTE2LlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBmZWF0dXJlZC1wcm9kdWN0ICAoTkVXKVxuICAgVGhlIHJhbmdlJ3Mgb25lIHJvdGF0aW5nIHNsb3Q6IGEgc2luZ2xlIHByb2R1Y3QgZ2l2ZW4gdGhlIHJvb20gYSBiYW5kIHdvdWxkXG4gICBub3JtYWxseSBnaXZlIGEgZ3JpZCDigJQgbWFudWZhY3R1cmVyIHNob3Qgb24gcGFuZWwgd2hpdGUgYmVzaWRlIGEgbGFiZWwsIHRoZVxuICAgbmFtZSwgdGhlIHByaWNlLCBvbmUgbGluZSBvZiBjb3B5LCB0aGUgc3RvY2sgZmFjdCBhbmQgb25lIGFjdGlvbi5cblxuICAgQXV0aG9yZWQgcmF0aGVyIHRoYW4gcmV1c2VkLCBhbmQgdGhlIHR3byBuZWFyIG1pc3NlcyBhcmUgd29ydGggcmVjb3JkaW5nLlxuICAgcHJvbW8tdGlsZSBoYXMgdGhlIHByb3BvcnRpb25zIHRoZSBidWlsZCBicmllZiBwb2ludHMgYXQsIGJ1dCBpdCBsYXlzIGl0c1xuICAgY29weSBvdmVyIGEgcGhvdG9ncmFwaCBhbmQgY2FycmllcyBuZWl0aGVyIGEgcHJpY2Ugbm9yIGEgYnV0dG9uIOKAlCBhbmQgdGhpc1xuICAgYnJhbmQncyBwcm9kdWN0IGltYWdlcnkgaXMgYSBtYW51ZmFjdHVyZXIgc2hvdCBvbiB3aGl0ZSB0aGF0IGlzIG5ldmVyIGNyb3BwZWRcbiAgIGludG8gYSBzY2VuZS4gcHJvZHVjdC1jYXJkIGNhcnJpZXMgZXZlcnkgZmllbGQgZXhjZXB0IHRoZSBsaW5lIG9mIGNvcHksIGJ1dCBhXG4gICBwcm9kdWN0LWNhcmQgYXQgdGhlIGZ1bGwgd2lkdGggb2YgdGhlIGNvbHVtbiByZWFkcyBhcyBhIHByb2R1Y3QgZ3JpZCBob2xkaW5nXG4gICBvbmUgaXRlbSwgd2hpY2ggaXMgdGhlIG9uZSB0aGluZyB0aGlzIHBhZ2UgbXVzdCBub3QgYmVjb21lLlxuXG4gICBUaGUgbGFiZWwgaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoZSBzbG90LiBPbmUgZGF5IGl0IHJlYWRzICdPdXIgQmVzdCBTZWxsZXInXG4gICBhbmQgdGhlIGNvcHkgaXMgYWJvdXQgaG93IG1hbnkgaGF2ZSBzb2xkOyB0aGUgbmV4dCBpdCByZWFkcyAnV29ydGggQSBMb29rJ1xuICAgYW5kIHRoZSBjb3B5IGlzIGFib3V0IGEgcHJvZHVjdCBub2JvZHkgaGFzIGJvdWdodCB5ZXQuIFNhbWUgYmxvY2ssIHNhbWVcbiAgIGdlb21ldHJ5LCBkaWZmZXJlbnQgcHJvbWlzZSDigJQgdGhlIHdvcmRzIGNhcnJ5IHRoZSBkaWZmZXJlbmNlLCBzbyB0aGUgb3BlcmF0b3JcbiAgIGNhbiByb3RhdGUgdGhlIHNsb3Qgd2l0aG91dCB0aGUgcGFnZSBjaGFuZ2luZyBzaGFwZSB1bmRlcm5lYXRoIHRoZW0uXG5cbiAgIExhcmdlIHByb21vdGlvbmFsIGNvcHkgc2V0cyB0aGUgYm9keSBmb250IGF0IDE4cHggbGlnaHQsIHBlciB0aGUgc3R5bGVndWlkZS5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4uZmVhdHVyZWQtcHJvZHVjdCB7XG5cblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoIDAsIDJmciApIG1pbm1heCggMCwgM2ZyICk7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMTIpO1xuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS1jYXJkLXBhZGRpbmcpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0Ym94LXNoYWRvdzogdmFyKC0tc2hhZG93LXBhbmVsKTtcbn1cblxuLmZlYXR1cmVkLXByb2R1Y3RfX21lZGlhIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xufVxuXG4uZmVhdHVyZWQtcHJvZHVjdF9fbWVkaWEgaW1nIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdGFzcGVjdC1yYXRpbzogNCAvIDM7XG5cdG9iamVjdC1maXQ6IGNvbnRhaW47XG59XG5cbi8qIFRoZSBjb3B5IGhhbGYuIFRoZSB0cmFjayBwbGFjZXMgaXQ7IHRoaXMgaXMgdGhlIGZsb29yIHRoYXQga2VlcHMgYSBwcm9kdWN0IG5hbWVcbiAgIGluc2lkZSB0aGUgY29sdW1uIHJhdGhlciB0aGFuIGxldHRpbmcgaXQgd2lkZW4gcGFzdCBpdHMgM2ZyIHNoYXJlIGFuZCB0YWtlIHRoZVxuICAgbWFudWZhY3R1cmVyIHNob3QncyB3aWR0aCB3aXRoIGl0LiAqL1xuLmZlYXR1cmVkLXByb2R1Y3RfX2JvZHkge1xuXG5cdG1pbi13aWR0aDogMDtcbn1cblxuLmZlYXR1cmVkLXByb2R1Y3RfX2V5ZWJyb3cge1xuXG5cdG1hcmdpbjogMCAwIHZhcigtLXNwYWNlLTMpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtZXllYnJvdyk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogMTtcblx0bGV0dGVyLXNwYWNpbmc6IDAuMTJlbTtcblx0dGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xufVxuXG4uZmVhdHVyZWQtcHJvZHVjdF9fdGl0bGUge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWNocm9tZSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDMpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctYm9sZCk7XG5cdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRsZXR0ZXItc3BhY2luZzogMC4wMWVtO1xufVxuXG4uZmVhdHVyZWQtcHJvZHVjdF9fdGl0bGUgYSB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtaGVhZGluZyk7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLmZlYXR1cmVkLXByb2R1Y3RfX3RpdGxlIGE6aG92ZXIge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xufVxuXG4uZmVhdHVyZWQtcHJvZHVjdF9fcHJpY2Uge1xuXG5cdG1hcmdpbjogdmFyKC0tc3BhY2UtMykgMCAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtY2hyb21lKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1oMik7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1ib2xkKTtcblx0Zm9udC1zdHlsZTogaXRhbGljO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG4uZmVhdHVyZWQtcHJvZHVjdF9fdGV4dCB7XG5cblx0bWFyZ2luOiB2YXIoLS1zcGFjZS00KSAwIDA7XG5cdG1heC13aWR0aDogdmFyKC0tY29udGFpbmVyLXJlYWRpbmcpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keS1sZyk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1saWdodCk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1ib2R5KTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG59XG5cbi5mZWF0dXJlZC1wcm9kdWN0X19tZXRhIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xuXHRtYXJnaW46IHZhcigtLXNwYWNlLTQpIDAgMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuXG4uZmVhdHVyZWQtcHJvZHVjdF9fc3RvY2stZG90IHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0d2lkdGg6IDhweDtcblx0aGVpZ2h0OiA4cHg7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1waWxsKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItcG9zaXRpdmUpO1xufVxuXG4uZmVhdHVyZWQtcHJvZHVjdF9fYWN0aW9ucyB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC13cmFwOiB3cmFwO1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTQpO1xuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTYpO1xufVxuXG4vKiBzZWN0aW9uLWxpbmsgaXMgYnVpbHQgdG8gY2xvc2UgYSBiYW5kLCBzbyBpdCBjYXJyaWVzIGEgdG9wIG1hcmdpbiBhbmQgc2V0c1xuICAgbWVkaXVtLiBCZXNpZGUgYSBidXR0b24gaXQgaXMgbmVpdGhlciDigJQgdGhlIG1hcmdpbiBrbm9ja3MgaXQgb3V0IG9mIGxpbmUgd2l0aFxuICAgdGhlIGJ1dHRvbiwgYW5kIG1lZGl1bSBjb21wZXRlcyB3aXRoIHRoZSBidXR0b24gaXQgc2l0cyBuZXh0IHRvLiAqL1xuLmZlYXR1cmVkLXByb2R1Y3RfX2FjdGlvbnMgLnNlY3Rpb24tbGluayB7XG5cblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiAwO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogOTAwcHggKSB7XG5cblx0LmZlYXR1cmVkLXByb2R1Y3Qge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoIDAsIDFmciApO1xuXHRcdGdhcDogdmFyKC0tc3BhY2UtOCk7XG5cdH1cblxuXHQuZmVhdHVyZWQtcHJvZHVjdF9fbWVkaWEgaW1nIHtcblxuXHRcdGFzcGVjdC1yYXRpbzogMTYgLyA5O1xuXHR9XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LmZlYXR1cmVkLXByb2R1Y3Qge1xuXG5cdFx0cGFkZGluZzogdmFyKC0tc3BhY2UtNik7XG5cdH1cblxuXHQuZmVhdHVyZWQtcHJvZHVjdF9fdGl0bGUge1xuXG5cdFx0Zm9udC1zaXplOiB2YXIoLS1mcy1oNCk7XG5cdH1cblxuXHQuZmVhdHVyZWQtcHJvZHVjdF9fcHJpY2Uge1xuXG5cdFx0Zm9udC1zaXplOiB2YXIoLS1mcy1oMyk7XG5cdH1cblxuXHQuZmVhdHVyZWQtcHJvZHVjdF9fdGV4dCB7XG5cblx0XHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgZmllbGRcbi8vXG4vLyBUaGUgYnJhbmQncyBzdGFuZGFyZCBmb3JtIGNvbnRyb2w6IGxhYmVsLCBvcHRpb25hbCBoZWxwLCB0aGUgY29udHJvbCBpdHNlbGYsXG4vLyBhbmQgaXRzIGZvY3VzLCBlcnJvciBhbmQgZGlzYWJsZWQgc3RhdGVzLiBGb2N1cyBpcyBhdXRob3JlZCByYXRoZXIgdGhhbiB0aGVcbi8vIGJyb3dzZXIncyBvd24gb3V0bGluZSwgYW5kIGNhcnJpZXMgdGhyZWUgc2lnbmFscyDigJQgYnJhbmQgYm9yZGVyLCBicmFuZCBzb2Z0XG4vLyB3YXNoLCBhbmQgYSAycHggcmluZyBjbGVhciBvZiB0aGUgYm94IOKAlCBzbyBpdCBzdXJ2aXZlcyBvbiBwYW5lbCB3aGl0ZSBhbmQgb25cbi8vIGNhbnZhcyBncmV5IGFsaWtlLiBOb3RoaW5nIGNoYW5nZXMgd2lkdGgsIHNvIG5vdGhpbmcgc2hpZnRzLlxuLy9cbi8vIFJlYWNoZWQgdGhlIHRoZW1lIHZpYSB0aGUgYXJjaGl2ZSdzIHByaWNlIGZpbHRlciBhbmQgaXRzIHNvcnQgY29udHJvbC4gVGhlXG4vLyBtb2NrdXAncyBvd24gY29tbWVudCBtYXJrcyBpdCBSRVVTRUQsIFZFUkJBVElNIGZyb20gdGhlIGZvcm0gc3BlY2ltZW4g4oCUIGl0IGlzXG4vLyBhIGNhdGFsb2d1ZSByb3cgdGhhdCBubyB3YWxrZWQgdGVtcGxhdGUgaGFkIG5lZWRlZCB1bnRpbCBub3cuXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYGZpZWxkYC4gUG9ydGVkIGZvciB0aGUgTVBHNyBjYXRlZ29yeS1hcmNoaXZlIHdhbGssIDIwMjYtMDktMTYuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIGZpZWxkICAoUkVVU0VELCB2ZXJiYXRpbSlcbiAgIFRoZSBwcmljZSByYW5nZSdzIHR3byBpbnB1dHMgYW5kIHRoZSB0b29sYmFyJ3Mgc29ydCBjb250cm9sIGFyZSBib3RoIHRoZVxuICAgYnJhbmQncyBzdGFuZGFyZCBjb250cm9sLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi5maWVsZCB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdG1pbi13aWR0aDogMDtcbn1cblxuLyogLS13aWRlOiBzcGFucyBib3RoIHRyYWNrcyBvZiBhIHR3by1jb2x1bW4gZmllbGQgZ3JpZCAoZmllbGQtZ3JvdXBfX2ZpZWxkcykuIE5vLW9wXG4gICBvdXRzaWRlIG9uZS4gUG9ydGVkIGZyb20gTVBHMTEgZm9yIHRoZSBjaGVja291dCB3YWxrLiAqL1xuLmZpZWxkLS13aWRlIHtcblxuXHRncmlkLWNvbHVtbjogMSAvIC0xO1xufVxuLmZpZWxkX19sYWJlbCxcbi5pZHBjLWZpbmRlciA+IGxhYmVsIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0bWFyZ2luLWJsb2NrLWVuZDogdmFyKC0tc3BhY2UtMik7XG5cdHBhZGRpbmc6IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWhlYWRpbmcpO1xufVxuLyogUmVxdWlyZWQgY2FycmllcyBubyBtYXJrOyBvcHRpb25hbCBpcyBtYXJrZWQsIGFuZCB0aGUgZm9ybSBzYXlzIHNvIG9uY2UgYXRcbiAgIHRoZSB0b3AuIFRoZSBtYXJrZXIgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBkaXN0aW5ndWlzaGVzIHRoZSB0d28uICovXG4uZmllbGRfX21hcmtlciB7XG5cblx0bWFyZ2luLWlubGluZS1zdGFydDogdmFyKC0tc3BhY2UtMik7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1leWVicm93KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsZXR0ZXItc3BhY2luZzogMC4wOGVtO1xuXHR0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG59XG4uZmllbGRfX2hlbHAsXG4uZmllbGQgLmRlc2NyaXB0aW9uIHtcblxuXHRtYXJnaW46IDAgMCB2YXIoLS1zcGFjZS0yKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbn1cbi5maWVsZF9fY29udHJvbCxcbi5pZHBjLWZpbmRlciBpbnB1dCB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdHdpZHRoOiAxMDAlO1xuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS0zKTtcblx0Ym9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWlucHV0KTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWlucHV0KTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctaW5wdXQpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcbn1cbi5maWVsZF9fY29udHJvbDo6cGxhY2Vob2xkZXIge1xuXG5cdGNvbG9yOiB2YXIoLS1uZXV0cmFsLTUwMCk7XG5cdG9wYWNpdHk6IDE7XG59XG4vKiBGT0NVUyDigJQgYXV0aG9yZWQsIG5ldmVyIHRoZSBicm93c2VyJ3Mgb3duIG91dGxpbmUsIGFuZCB0aHJlZSBzaWduYWxzIHNvIGl0XG4gICBzdXJ2aXZlcyBvbiBwYW5lbCB3aGl0ZSBhbmQgb24gY2FudmFzIGdyZXkgYWxpa2U6IHRoZSBib3JkZXIgdGFrZXMgdGhlIGJyYW5kXG4gICBjb2xvdXIsIHRoZSBncm91bmQgdGFrZXMgdGhlIGJyYW5kJ3Mgc29mdCB3YXNoLCBhbmQgYSAycHggYnJhbmQgcmluZyBzaXRzXG4gICBjbGVhciBvZiB0aGUgYm94LiBOb3RoaW5nIGNoYW5nZXMgd2lkdGgsIHNvIG5vdGhpbmcgc2hpZnRzLiAqL1xuLmZpZWxkX19jb250cm9sOmZvY3VzLFxuLmZpZWxkX19jb250cm9sOmZvY3VzLXZpc2libGUsXG4uZmllbGRfX2NvbnRyb2wtLWZvY3VzLFxuLmlkcGMtZmluZGVyIGlucHV0OmZvY3VzIHtcblxuXHRib3JkZXItY29sb3I6IHZhcigtLWJvcmRlci1mb2N1cyk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWJyYW5kLXNvZnQpO1xuXHRvdXRsaW5lOiAycHggc29saWQgdmFyKC0tYm9yZGVyLWZvY3VzKTtcblx0b3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cbi8qIEVSUk9SIOKAlCB0aGUgYm9yZGVyIGRvdWJsZXMgdG8gdGhlIGJyYW5kJ3MgZW1waGF0aWMgd2VpZ2h0IGluIGFsZXJ0IHJlZCBhbmRcbiAgIHRoZSBwYWRkaW5nIGdpdmVzIGJhY2sgdGhlIHBpeGVsLCBzbyBhbiBlcnJvcmVkIGZpZWxkIGlzIGV4YWN0bHkgdGhlIHNpemUgb2ZcbiAgIGEgZ29vZCBvbmUuIFJlZCBhcHBlYXJzIGhlcmUgYW5kIG5vd2hlcmUgZWxzZS4gKi9cbi5maWVsZC0tZXJyb3IgLmZpZWxkX19jb250cm9sLFxuLmZpZWxkLndvb2NvbW1lcmNlLWludmFsaWQgLmZpZWxkX19jb250cm9sIHtcblxuXHRib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1jb2xvci1uZWdhdGl2ZSk7XG5cdHBhZGRpbmc6IGNhbGMoIHZhcigtLXNwYWNlLTMpIC0gMXB4ICk7XG59XG4uZmllbGQtLWVycm9yIC5maWVsZF9fY29udHJvbDpmb2N1cyxcbi5maWVsZC0tZXJyb3IgLmZpZWxkX19jb250cm9sOmZvY3VzLXZpc2libGUsXG4uZmllbGQtLWVycm9yIC5maWVsZF9fY29udHJvbC0tZm9jdXMsXG4uZmllbGQud29vY29tbWVyY2UtaW52YWxpZCAuZmllbGRfX2NvbnRyb2w6Zm9jdXMge1xuXG5cdGJvcmRlci1jb2xvcjogdmFyKC0tY29sb3ItbmVnYXRpdmUpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1pbnB1dCk7XG5cdG91dGxpbmUtY29sb3I6IHZhcigtLWNvbG9yLW5lZ2F0aXZlKTtcbn1cbi5maWVsZF9fZXJyb3IsXG4uZmllbGQgLmNoZWNrb3V0LWlubGluZS1lcnJvci1tZXNzYWdlIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKTtcblx0bWFyZ2luOiB2YXIoLS1zcGFjZS0yKSAwIDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS1jb2xvci1uZWdhdGl2ZSk7XG59XG4uZmllbGRfX2Vycm9yLWljb24ge1xuXG5cdGZsZXg6IDAgMCBhdXRvO1xuXHR3aWR0aDogMTZweDtcblx0aGVpZ2h0OiAxNnB4O1xuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IDAuM2VtO1xufVxuLyogRElTQUJMRUQg4oCUIHVuYXZhaWxhYmxlLCBub3QgbWVyZWx5IHBhbGUuIFRoZSBjb250cm9sIGRyb3BzIG9mZiB0aGUgcGFuZWwgb25cbiAgIHRvIHRoZSBwYWdlIGdyb3VuZCwgaXRzIHRleHQgYW5kIGl0cyBsYWJlbCB0byB0aGUgZGlzYWJsZWQgZ3JleS4gKi9cbi5maWVsZF9fY29udHJvbDpkaXNhYmxlZCxcbi5maWVsZF9fY29udHJvbC0tZGlzYWJsZWQge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhZ2UpO1xuXHRib3JkZXItY29sb3I6IHZhcigtLWJvcmRlci1kZWZhdWx0KTtcblx0Y29sb3I6IHZhcigtLW5ldXRyYWwtNTAwKTtcblx0Y3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cbi5maWVsZC0tZGlzYWJsZWQgLmZpZWxkX19sYWJlbCxcbi5maWVsZC0tZGlzYWJsZWQgLmZpZWxkX19oZWxwIHtcblxuXHRjb2xvcjogdmFyKC0tbmV1dHJhbC01MDApO1xufVxuLmZpZWxkX19jb250cm9sW3R5cGU9XCJkYXRlXCJdOjotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3Ige1xuXG5cdGN1cnNvcjogcG9pbnRlcjtcbn1cbi5maWVsZF9fY2hvaWNlcyB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC13cmFwOiB3cmFwO1xuXHRnYXA6IHZhcigtLXNwYWNlLTQpIHZhcigtLXNwYWNlLTgpO1xufVxuXG4vKiBTRUxFQ1Qg4oCUIHNxdWFyZSwgb3duIGNoZXZyb24gaW4gUGFyYWdvbiBibHVlLCBncmV5ZWQgd2hpbGUgaXQgc3RpbGwgc2hvd3MgaXRzXG4gICBwbGFjZWhvbGRlci4gVGhlIGNoZXZyb24gaXMgdGhlIHRva2VuIHZhbHVlIGlubGluZWQ7IGEgZGF0YSBVUkkgY2Fubm90IHJlYWQgYSBjdXN0b21cbiAgIHByb3BlcnR5LiBBZGRlZCBieSB3YWxrLWJhY2sgb24gdGhlIGNoZWNrb3V0IHdhbGsgKE1QRzExKTogdGhlIGZvcm0gc3BlY2ltZW4ncyBwb3J0XG4gICBsZWZ0IHRoZSBzZWxlY3QgYW5kIHRleHRhcmVhIHJ1bGVzIG91dCwgYW5kIHRoZSBjaGVja291dCdzIGFkZHJlc3Mgc2VsZWN0IHJlbmRlcmVkXG4gICB0aGUgYnJvd3NlcidzIG93biBjb250cm9sLiAqL1xuc2VsZWN0LmZpZWxkX19jb250cm9sIHtcblxuXHRhcHBlYXJhbmNlOiBub25lO1xuXHQtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG5cdHBhZGRpbmctaW5saW5lLWVuZDogdmFyKC0tc3BhY2UtMTIpO1xuXHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDIwIDEyJyUzRSUzQ3BhdGggZD0nTTEuNSAyIEwxMCA5LjUgTDE4LjUgMicgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxRDdEQkInIHN0cm9rZS13aWR0aD0nMi41JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9zdmclM0VcIik7XG5cdGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG5cdGJhY2tncm91bmQtcG9zaXRpb246IHJpZ2h0IHZhcigtLXNwYWNlLTQpIGNlbnRlcjtcblx0YmFja2dyb3VuZC1zaXplOiAxNHB4IGF1dG87XG5cdGN1cnNvcjogcG9pbnRlcjtcbn1cblxuc2VsZWN0LmZpZWxkX19jb250cm9sOnJlcXVpcmVkOmludmFsaWQge1xuXG5cdGNvbG9yOiB2YXIoLS1uZXV0cmFsLTUwMCk7XG59XG5cbnNlbGVjdC5maWVsZF9fY29udHJvbCBvcHRpb24ge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG50ZXh0YXJlYS5maWVsZF9fY29udHJvbCB7XG5cblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRyZXNpemU6IHZlcnRpY2FsO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIFdPT0NPTU1FUkNFJ1MgT1dOIEZJRUxEIE1BUktVUCAoY2hlY2tvdXQgd2lyaW5nLCBNUEcxMSkuIHdvb2NvbW1lcmNlX2Zvcm1fZmllbGQoKVxuICAgZHJhd3MgYSBmaWVsZCBhcyBwLmZvcm0tcm93ID4gbGFiZWwgKyBzcGFuLndvb2NvbW1lcmNlLWlucHV0LXdyYXBwZXIgPiBjb250cm9sICtcbiAgIHNwYW4uZGVzY3JpcHRpb24sIGFuZCB0aGUgY2hlY2tvdXQgc2NyaXB0IHZhbGlkYXRlcyB0aHJvdWdoIHRoYXQgbWFya3VwLCBzbyBpdCBpc1xuICAga2VwdCBhbmQgZHJlc3NlZCByYXRoZXIgdGhhbiByZXBsYWNlZC4gaW5jbHVkZXMvb3JkZXItZnVubmVsLnBocCBhZGRzIGBmaWVsZGAsXG4gICBgZmllbGRfX2xhYmVsYCBhbmQgYGZpZWxkX19jb250cm9sYDsgdGhlIHJ1bGVzIGJlbG93IGNvdmVyIHRoZSBwYXJ0cyBXb29Db21tZXJjZVxuICAgbmFtZXMgaXRzZWxmIOKAlCB0aGUgaGVscCBsaW5lIChkcmF3biBhYm92ZSB0aGUgY29udHJvbCwgYXMgdGhlIGJyYW5kJ3MgZmllbGQgZG9lcyksXG4gICB0aGUgcmVxdWlyZWQgbWFyayAobm9uZTogdGhlIGZvcm0gc2F5cyBzbyBvbmNlKSwgdGhlIG9wdGlvbmFsIG1hcmssIHRoZSBpbnZhbGlkXG4gICBzdGF0ZSBhbmQgdGhlIGlubGluZSBlcnJvciwgd2hpY2ggam9pbiB0aGUgYnJhbmQgcnVsZXMgYWJvdmUuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi5maWVsZC5mb3JtLXJvdyB7XG5cblx0bWFyZ2luOiAwO1xuXHRwYWRkaW5nOiAwO1xufVxuXG4uZmllbGQgLndvb2NvbW1lcmNlLWlucHV0LXdyYXBwZXIge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XG5cbi5maWVsZCAuZGVzY3JpcHRpb24ge1xuXG5cdG9yZGVyOiAtMTtcbn1cblxuLmZpZWxkIC5yZXF1aXJlZCB7XG5cblx0ZGlzcGxheTogbm9uZTtcbn1cblxuLyogV29vQ29tbWVyY2Ugd3JpdGVzIFwiKG9wdGlvbmFsKVwiIHdpdGggaXRzIGJyYWNrZXRzIGhhcmQtY29kZWQsIGluIFBIUCBhbmQgYWdhaW4gaW5cbiAgIHRoZSBhZGRyZXNzIHNjcmlwdCB3aGVuZXZlciB0aGUgY291bnRyeSBsb2Fkcywgc28gdGhlIHRleHQgY2Fubm90IGJlIGNoYW5nZWQgYXRcbiAgIHNvdXJjZS4gVGhlIGJyYW5kJ3MgbWFya2VyIGlzIGRyYXduIGluIGl0cyBwbGFjZS4gRW5nbGlzaC1vbmx5IHN0b3JlLiAqL1xuLmZpZWxkIC5vcHRpb25hbCB7XG5cblx0bWFyZ2luLWlubGluZS1zdGFydDogdmFyKC0tc3BhY2UtMik7XG5cdGZvbnQtc2l6ZTogMDtcbn1cblxuLmZpZWxkIC5vcHRpb25hbDo6YWZ0ZXIge1xuXG5cdGNvbnRlbnQ6IFwiT3B0aW9uYWxcIjtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWV5ZWJyb3cpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxldHRlci1zcGFjaW5nOiAwLjA4ZW07XG5cdHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbn1cblxuLyogV29vQ29tbWVyY2UgZW5oYW5jZXMgdGhlIGNvdW50cnkgYW5kIGNvdW50eSBzZWxlY3RzIHdpdGggc2VsZWN0V29vIChzZWxlY3QyKSwgd2hpY2hcbiAgIGhpZGVzIHRoZSByZWFsIDxzZWxlY3Q+IOKAlCB0aGUgb25lIGNhcnJ5aW5nIGZpZWxkX19jb250cm9sIOKAlCBhbmQgZHJhd3MgaXRzIG93biBib3guXG4gICBPbmx5IHRoZSBjbG9zZWQgYm94IGlzIGRyZXNzZWQsIHRvIHRoZSBicmFuZCBjb250cm9sOyB0aGUgb3BlbiBsaXN0IGlzIHNlbGVjdDIncyBvd25cbiAgIGZ1cm5pdHVyZSAodGhlIEFSVFNBQkVSUyBwcmVjZWRlbnQpLiAqL1xuLmZpZWxkIC5zZWxlY3QyLWNvbnRhaW5lciAuc2VsZWN0Mi1zZWxlY3Rpb24tLXNpbmdsZSB7XG5cblx0aGVpZ2h0OiBhdXRvO1xuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS0zKTtcblx0Ym9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWlucHV0KTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWlucHV0KTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctaW5wdXQpO1xufVxuXG4uZmllbGQgLnNlbGVjdDItY29udGFpbmVyIC5zZWxlY3QyLXNlbGVjdGlvbl9fcmVuZGVyZWQge1xuXG5cdHBhZGRpbmc6IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcbn1cblxuLmZpZWxkIC5zZWxlY3QyLWNvbnRhaW5lciAuc2VsZWN0Mi1zZWxlY3Rpb25fX2Fycm93IHtcblxuXHR0b3A6IDUwJTtcblx0cmlnaHQ6IHZhcigtLXNwYWNlLTMpO1xuXHR0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoIC01MCUgKTtcbn1cblxuLmZpZWxkIC5zZWxlY3QyLWNvbnRhaW5lci0tZm9jdXMgLnNlbGVjdDItc2VsZWN0aW9uLS1zaW5nbGUsXG4uZmllbGQgLnNlbGVjdDItY29udGFpbmVyLS1vcGVuIC5zZWxlY3QyLXNlbGVjdGlvbi0tc2luZ2xlIHtcblxuXHRib3JkZXItY29sb3I6IHZhcigtLWJvcmRlci1mb2N1cyk7XG5cdG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItZm9jdXMpO1xuXHRvdXRsaW5lLW9mZnNldDogMnB4O1xufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGZpZWxkLWdyb3VwXG4vL1xuLy8gUG9ydGVkIGZyb20gY2F0YWxvZ3VlIGJsb2NrIGBmaWVsZC1ncm91cGAgKGRlc2lnbiBvZiByZWNvcmQ6IE1QRzQsIHRoZSBmb3JtXG4vLyBzcGVjaW1lbikgZm9yIHRoZSBiYXNrZXQgd2FsaywgTVBHMTAsIHdoZXJlIGVhY2ggcGFja2FnZSdzIGRlbGl2ZXJ5IGNob2ljZSBzaXRzIGluXG4vLyBvbmUuIE1pc3NlZCBhdCBlbnVtZXJhdGlvbiBhbmQgYWRkZWQgYnkgd2Fsay1iYWNrICgyMDI2LTA5LTI0KTsgY2hlY2tvdXQgcmV1c2VzIGl0LlxuXG4uZmllbGQtZ3JvdXAge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xufVxuXG4uZmllbGQtZ3JvdXBfX3RpdGxlIHtcblxuXHRtYXJnaW46IDAgMCB2YXIoLS1zcGFjZS02KTtcblx0cGFkZGluZy1ibG9jay1lbmQ6IHZhcigtLXNwYWNlLTMpO1xuXHRib3JkZXItYmxvY2stZW5kOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDQpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1oZWFkaW5nKTtcbn1cblxuLyogVHdvIHRyYWNrcyBhdCBhIG1lYXN1cmUgYSBjb250cm9sIGlzIGFjdHVhbGx5IHJlYWQgYXQg4oCUIGEgcGFuZWwgc3Bhbm5pbmcgdGhlXG4gICBmdWxsIGNvbHVtbiBtdXN0IG5vdCBzdHJldGNoIGFuIG9yZGVyIG51bWJlciB0byBoYWxmIG9mIGl0LiBBIGZpZWxkIHRoYXRcbiAgIG5lZWRzIHRoZSByb29tIHRha2VzIC0td2lkZSBhbmQgc3BhbnMgYm90aCB0cmFja3MuICovXG4uZmllbGQtZ3JvdXBfX2ZpZWxkcyB7XG5cblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoIDIsIG1pbm1heCggMCwgMjRyZW0gKSApO1xuXHRnYXA6IHZhcigtLXNwYWNlLTYpIHZhcigtLXNwYWNlLWNvbnRlbnQtZ2FwKTtcblx0YWxpZ24taXRlbXM6IHN0YXJ0O1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDkwMHB4ICkge1xuXG5cdC5maWVsZC1ncm91cF9fZmllbGRzIHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KCAyLCBtaW5tYXgoIDAsIDFmciApICk7XG5cdH1cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuZmllbGQtZ3JvdXBfX2ZpZWxkcyB7XG5cblx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCggMCwgMWZyICk7XG5cdH1cbn1cblxuLyogT24gdGhlIGNoZWNrb3V0LCBXb29Db21tZXJjZSdzIGJpbGxpbmcgYW5kIHNoaXBwaW5nIHRlbXBsYXRlcyB3cmFwIHRoZWlyIGdyb3VwcyBpblxuICAgdGhlaXIgb3duIGRpdnMsIHNvIHRoZSBjYXJkJ3MgYD4gKiArICpgIHJoeXRobSAoZGVzY3JpcHRpb24tcGFuZWxfX2RvYykgc3RvcHMgYXQgdGhlXG4gICB3cmFwcGVyIGFuZCBDb250YWN0IC8gQWRkcmVzcyAvIHRoZSBkZWxpdmVyLWVsc2V3aGVyZSBjaG9pY2UgLyBEZWxpdmVyeSBBZGRyZXNzIHNhdFxuICAgYWdhaW5zdCBlYWNoIG90aGVyLiBUaGUgc2FtZSBzdGVwIGlzIGdpdmVuIGluc2lkZSB0aGUgd3JhcHBlcnMuIChDaGVja291dCB3aXJpbmcsXG4gICBNUEcxMS4pICovXG4ud29vY29tbWVyY2UtYmlsbGluZy1maWVsZHMgPiAuZmllbGQtZ3JvdXAgKyAuZmllbGQtZ3JvdXAsXG4ud29vY29tbWVyY2Utc2hpcHBpbmctZmllbGRzID4gLmZpZWxkLWdyb3VwICsgLmZpZWxkLWdyb3VwIHtcblxuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTgpO1xufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGZpZ3VyZS1yb3dcbi8vXG4vLyBBIHJvdyBvZiBoZWFkbGluZSBmaWd1cmVzIHB1bGxlZCBvdXQgb2YgYSBzcGVjaWZpY2F0aW9uIOKAlCBhIGxhcmdlIGZpZ3VyZVxuLy8gb3ZlciBhIHF1aWV0IGxhYmVsLCBlYWNoIGNlbGwgb24gdGhlIGJyYW5kJ3MgYm9yZGVyZWQtZ3JvdXAgdHJlYXRtZW50LiBOb1xuLy8gaWNvbnM7IHRoZSBmaWd1cmUgY2FycmllcyB0aGUgd2VpZ2h0LlxuLy9cbi8vIFNvdXJjZTogY2F0YWxvZ3VlIGJsb2NrIGBmaWd1cmUtcm93YC4gUG9ydGVkIGZvciB0aGUgTVBHOSBwcm9kdWN0LXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLmZpZ3VyZS1yb3cge1xuXG5cdGRpc3BsYXk6IGdyaWQ7XG5cdGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KCA0LCBtaW5tYXgoIDAsIDFmciApICk7XG5cdGdhcDogdmFyKC0tc3BhY2UtNCk7XG5cdC8qIFRoZSBsaXN0IHJlc2V0IGhhcyB0byBjYXJyeSBpdHMgb3duIHRvcCBtYXJnaW4uIEEgYmFyZSBgbWFyZ2luOiAwYCB0aWVzXG5cdCAgIHdpdGggdGhlIGRvY3VtZW50J3MgYD4gKiArICpgIHJoeXRobSBydWxlIG9uIHNwZWNpZmljaXR5IGFuZCB3aW5zIG9uXG5cdCAgIHNvdXJjZSBvcmRlciwgc28gdGhlIHJvdyBsYW5kcyBmbHVzaCBhZ2FpbnN0IHRoZSBidWxsZXRzIGFib3ZlIGl0LiAqL1xuXHRtYXJnaW46IHZhcigtLXNwYWNlLTgpIDAgMDtcblx0cGFkZGluZzogMDtcblx0bGlzdC1zdHlsZTogbm9uZTtcbn1cblxuLmZpZ3VyZS1yb3dfX2NlbGwge1xuXG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTYpO1xuXHRib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItYnJhbmQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtY2FyZCk7XG59XG5cbi5maWd1cmUtcm93X192YWx1ZSB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1oMik7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1saWdodCk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtaGVhZGluZyk7XG59XG5cbi5maWd1cmUtcm93X19sYWJlbCB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtMik7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogOTAwcHggKSB7XG5cblx0LmZpZ3VyZS1yb3cge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoIDIsIG1pbm1heCggMCwgMWZyICkgKTtcblx0fVxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5maWd1cmUtcm93X192YWx1ZSB7XG5cblx0XHRmb250LXNpemU6IHZhcigtLWZzLWgzKTtcblx0fVxuXG5cdC5maWd1cmUtcm93X19jZWxsIHtcblxuXHRcdHBhZGRpbmc6IHZhcigtLXNwYWNlLTQpO1xuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgZmlsdGVyLWNoaXBzXG4vL1xuLy8gV2hhdCBhIGxpc3RpbmcgaXMgZmlsdGVyZWQgYnksIGFib3ZlIHRoZSBncmlkOiBvbmUgcmVtb3ZhYmxlIHNxdWFyZSBjaGlwIHBlclxuLy8gYWN0aXZlIGZhY2V0LCBlYWNoIGNhcnJ5aW5nIGl0cyBmYWNldCBuYW1lIGFib3ZlIGl0cyB2YWx1ZSwgd2l0aCAnQ2xlYXIgYWxsJ1xuLy8gYXQgdGhlIGZhciBlbmQuIE9uIGEgcGFuZWwsIGJlY2F1c2UgdGhpcyBicmFuZCBuZXZlciBwdXRzIGNvbnRlbnQgb24gdGhlIGJhcmVcbi8vIGNhbnZhcy4gQSBmaWx0ZXJlZCBsaXN0aW5nIHRoYXQgZG9lcyBub3Qgc2F5IHdoYXQgaXQgaXMgZmlsdGVyZWQgYnkgaXMgdGhlXG4vLyBjb21tb25lc3Qgd2F5IGEgc2hvcHBlciBjb25jbHVkZXMgdGhlIHNob3AgaGFzIG5vdGhpbmcuXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYGZpbHRlci1jaGlwc2AuIFBvcnRlZCBmb3IgdGhlIE1QRzcgY2F0ZWdvcnktYXJjaGl2ZSB3YWxrLCAyMDI2LTA5LTE2LlxuLy8gUmVjb25jaWxlZCBhZ2FpbnN0IHRoZSBNUEc3IG1vY2t1cCdzIG93biBzdHlsZXNoZWV0OiBieXRlLWlkZW50aWNhbCwgbm8gZGVwYXJ0dXJlcy5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgZmlsdGVyLWNoaXBzICAoTkVXKVxuICAgV2hhdCB0aGUgbGlzdGluZyBpcyBmaWx0ZXJlZCBieSwgYWJvdmUgdGhlIGdyaWQsIGVhY2ggb25lIHJlbW92YWJsZSwgd2l0aFxuICAgJ0NsZWFyIGFsbCcgYmVzaWRlIHRoZW0uIEEgZmlsdGVyZWQgbGlzdGluZyB0aGF0IGRvZXMgbm90IHNheSB3aGF0IGl0IGlzXG4gICBmaWx0ZXJlZCBieSBpcyB0aGUgY29tbW9uZXN0IHdheSBhIHNob3BwZXIgY29uY2x1ZGVzIHRoZSBzaG9wIGhhcyBubyBzdG9jay5cblxuICAgSXQgc2l0cyBvbiBhIHBhbmVsIGxpa2UgZXZlcnl0aGluZyBlbHNlIG9uIHRoaXMgYnJhbmQg4oCUIGNvbnRlbnQgbmV2ZXIgc2l0c1xuICAgZGlyZWN0bHkgb24gdGhlIGNhbnZhcy4gRWFjaCBjaGlwIGlzIGEgY29udHJvbCwgc28gaXQgaXMgc3F1YXJlLCBhbmQgaXRcbiAgIGNhcnJpZXMgdGhlIGZhY2V0IG5hbWUgYWJvdmUgaXRzIHZhbHVlIHNvICdYYm94JyBjYW5ub3QgYmUgcmVhZCBhcyBhIGJyYW5kXG4gICB3aGVuIGl0IHdhcyBjaG9zZW4gYXMgYSBwbGF0Zm9ybS5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4uZmlsdGVyLWNoaXBzIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LXdyYXA6IHdyYXA7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMykgdmFyKC0tc3BhY2UtNCk7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTQpIHZhcigtLXNwYWNlLTYpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0Ym94LXNoYWRvdzogdmFyKC0tc2hhZG93LXBhbmVsKTtcbn1cblxuLmZpbHRlci1jaGlwc19fbGFiZWwge1xuXG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWhlYWRpbmcpO1xufVxuXG4uZmlsdGVyLWNoaXBzX19saXN0IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LXdyYXA6IHdyYXA7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMik7XG5cdG1hcmdpbjogMDtcblx0cGFkZGluZzogMDtcblx0bGlzdC1zdHlsZTogbm9uZTtcbn1cblxuLmZpbHRlci1jaGlwc19fY2hpcCB7XG5cblx0ZGlzcGxheTogaW5saW5lLWZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMik7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTEpIHZhcigtLXNwYWNlLTMpO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItYnJhbmQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtYnRuKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2FyZC1ob3Zlcik7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG4uZmlsdGVyLWNoaXBzX19jaGlwOmhvdmVyIHtcblxuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbCk7XG59XG5cbi5maWx0ZXItY2hpcHNfX2dyb3VwIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG59XG5cbi5maWx0ZXItY2hpcHNfX3ZhbHVlIHtcblxuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcbn1cblxuLmZpbHRlci1jaGlwc19fcmVtb3ZlIHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0d2lkdGg6IDEycHg7XG5cdGhlaWdodDogMTJweDtcblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xufVxuXG4uZmlsdGVyLWNoaXBzX19jbGVhciB7XG5cblx0bWFyZ2luLWlubGluZS1zdGFydDogYXV0bztcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbGluayk7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLmZpbHRlci1jaGlwc19fY2xlYXI6aG92ZXIge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmstaG92ZXIpO1xuXHR0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuZmlsdGVyLWNoaXBzX19jbGVhciB7XG5cblx0XHRtYXJnaW4taW5saW5lLXN0YXJ0OiAwO1xuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgZmlsdGVyLWdyb3VwXG4vL1xuLy8gQSBjb2xsYXBzaWJsZSBmaWx0ZXIgcGFuZWwgaW4gdGhlIHN0b3JlIHNpZGViYXIuIEl0IGNvbXBvc2VzIHRoZSBicmFuZCdzXG4vLyBgd2lkZ2V0YCB1bmNoYW5nZWQgYW5kIGFkZHMgb25seSB0aGUgZGlzY2xvc3VyZSDigJQgbmF0aXZlIG1hcmtlciByZW1vdmVkLCB0aGVcbi8vIGJyYW5kJ3MgY2hldnJvbiBhdCB0aGUgZmFyIGVuZCBvZiB0aGUgdGl0bGUgYmFyLCBkb3duIGNsb3NlZCBhbmQgdXAgb3BlbiDigJQgc29cbi8vIHRoZSBicmFuZCBjYXJyaWVzIG9uZSBsYWJlbGxlZC1wYW5lbCB0cmVhdG1lbnQgYW5kIG9uZSBvcGVuaW5nIGdlc3R1cmUuXG4vL1xuLy8gQ29tcG9zZXMgd2l0aDogLndpZGdldCAoc2hpcHBlZCwgTVBHOCkuIFRoaXMgZmlsZSBhZGRzIHRoZSBkaXNjbG9zdXJlIG9ubHkuXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYGZpbHRlci1ncm91cGAuIFBvcnRlZCBmb3IgdGhlIE1QRzcgY2F0ZWdvcnktYXJjaGl2ZSB3YWxrLCAyMDI2LTA5LTE2LlxuLy8gUmVjb25jaWxlZCBhZ2FpbnN0IHRoZSBNUEc3IG1vY2t1cCdzIG93biBzdHlsZXNoZWV0OiBieXRlLWlkZW50aWNhbCwgbm8gZGVwYXJ0dXJlcy5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgZmlsdGVyLWdyb3VwICAoTkVXKVxuICAgQSBjb2xsYXBzaWJsZSBmaWx0ZXIgcGFuZWwgaW4gdGhlIHN0b3JlIHNpZGViYXIuXG5cbiAgIEl0IGlzIHRoZSBicmFuZCdzIHdpZGdldCBhbmQgbm90IGEgdGhpcmQgbGFiZWxsZWQtcGFuZWwgdHJlYXRtZW50OiB0aGVcbiAgIG1hcmt1cCBjb21wb3NlcyBgd2lkZ2V0YCB1bmNoYW5nZWQgYW5kIHRoaXMgYmxvY2sgYWRkcyBvbmx5IHdoYXQgdHVybnMgYVxuICAgcGFuZWwgaW50byBhIGRpc2Nsb3N1cmUg4oCUIHRoZSBuYXRpdmUgbWFya2VyIHJlbW92ZWQsIHRoZSBicmFuZCdzIGNoZXZyb24gYXRcbiAgIHRoZSBmYXIgZW5kIG9mIHRoZSB0aXRsZSBiYXIsIHBvaW50aW5nIGRvd24gY2xvc2VkIGFuZCB1cCBvcGVuLiBFeGFjdGx5IHRoZVxuICAgZ2VzdHVyZSB0aGUgc3RvcmUgbmF2aWdhdGlvbiBhYm92ZSBpdCB1c2VzLCBhdCB0aGUgc2NhbGUgb2YgYSBwYW5lbC5cblxuICAgVGhlIGJvZHkgaG9sZHMgd2hhdGV2ZXIgdGhlIGZhY2V0IG5lZWRzOiBhIGZsdXNoIGBjb3VudC1saXN0YCB3aGVyZSB0aGVcbiAgIHZhbHVlcyBjYXJyeSBjb3VudHMsIHRoZSBzdGFuZGFyZCBgZmllbGRgIGNvbnRyb2xzIHdoZXJlIGl0IGlzIGEgcmFuZ2UsIGFcbiAgIGBjaG9pY2VgIHdoZXJlIGl0IGlzIGEgc2luZ2xlIHN3aXRjaC5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4uZmlsdGVyLWdyb3VwX19zdW1tYXJ5IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdGxpc3Qtc3R5bGU6IG5vbmU7XG5cdGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmZpbHRlci1ncm91cF9fc3VtbWFyeTo6LXdlYmtpdC1kZXRhaWxzLW1hcmtlciB7XG5cblx0ZGlzcGxheTogbm9uZTtcbn1cblxuLmZpbHRlci1ncm91cF9fc3VtbWFyeTo6bWFya2VyIHtcblxuXHRjb250ZW50OiBcIlwiO1xufVxuXG4uZmlsdGVyLWdyb3VwX19zdW1tYXJ5OmZvY3VzLXZpc2libGUge1xuXG5cdG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1uZXV0cmFsLTUwKTtcblx0b3V0bGluZS1vZmZzZXQ6IC0zcHg7XG59XG5cbi5maWx0ZXItZ3JvdXBfX21hcmtlciB7XG5cblx0ZmxleDogMCAwIGF1dG87XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRjb2xvcjogdmFyKC0tdGV4dC1vbi1icmFuZCk7XG59XG5cbi5maWx0ZXItZ3JvdXBfX21hcmtlciBzdmcge1xuXG5cdHdpZHRoOiAxMDAlO1xuXHRoZWlnaHQ6IDEwMCU7XG5cdHRyYW5zZm9ybTogcm90YXRlKCA5MGRlZyApO1xufVxuXG4uZmlsdGVyLWdyb3VwW29wZW5dIC5maWx0ZXItZ3JvdXBfX21hcmtlciBzdmcge1xuXG5cdHRyYW5zZm9ybTogcm90YXRlKCAtOTBkZWcgKTtcbn1cblxuLmZpbHRlci1ncm91cF9fcmFuZ2Uge1xuXG5cdGRpc3BsYXk6IGdyaWQ7XG5cdGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KCAyLCBtaW5tYXgoIDAsIDFmciApICk7XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdG1hcmdpbi1ibG9jay1lbmQ6IHZhcigtLXNwYWNlLTQpO1xufVxuXG4uZmlsdGVyLWdyb3VwX19ub3RlIHtcblxuXHRtYXJnaW46IHZhcigtLXNwYWNlLTMpIDAgMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBmb3JtLWFjdGlvbnNcbi8vXG4vLyBQb3J0ZWQgZnJvbSB0aGUgY2hlY2tvdXQgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxMSwgb3BlcmF0b3ItYWNjZXB0ZWRcbi8vIDIwMjYtMDktMjMpIGZvciB0aGUgY2hlY2tvdXQgd2FsaywgTVBHMTEuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiBUaGUgYnJhbmQgZm9ybSBzcGVjaW1lbidzIGNsb3Npbmcgcm93IChjYXRhbG9ndWUgYmxvY2sgYGZvcm0tYWN0aW9uc2ApLCBwYXN0ZWRcbiAgIHZlcmJhdGltIGludG8gTVBHMTEgZm9yIHRoZSBjaGVja291dCdzIHBob25lIGZvb3QuICovXG4uZm9ybS1hY3Rpb25zIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LXdyYXA6IHdyYXA7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtNik7XG5cdHBhZGRpbmctYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTYpO1xuXHRib3JkZXItYmxvY2stc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG59XG5cbi5mb3JtLWFjdGlvbnNfX2NhbmNlbCB7XG5cblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5mb3JtLWFjdGlvbnNfX2NhbmNlbDpob3ZlciB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtbGluayk7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LmZvcm0tYWN0aW9ucyB7XG5cblx0XHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRcdGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuXHRcdGdhcDogdmFyKC0tc3BhY2UtNCk7XG5cdH1cblxuXHQuZm9ybS1hY3Rpb25zIC5idG4ge1xuXG5cdFx0d2lkdGg6IDEwMCU7XG5cdH1cblxuXHQuZm9ybS1hY3Rpb25zX19jYW5jZWwge1xuXG5cdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgZm9ybS1ub3RlXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIGNoZWNrb3V0IG1vY2t1cCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTEsIG9wZXJhdG9yLWFjY2VwdGVkXG4vLyAyMDI2LTA5LTIzKSBmb3IgdGhlIGNoZWNrb3V0IHdhbGssIE1QRzExLiBUaGUgbW9ja3VwJ3MgcnVsZXMgYXJlIHRoZSBkZXNpZ247IHRoaXMgaXNcbi8vIHdoYXQgc2hpcHBlZC4gRGVwYXJ0dXJlcyBmcm9tIGl0IGFyZSBjb21tZW50ZWQgd2hlcmUgdGhleSBvY2N1ci5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgZm9ybS1ub3RlICAoTkVXKVxuICAgT25lIHF1aWV0IGxpbmUgdGhhdCBiZWxvbmdzIHRvIGEgZm9ybSBidXQgdG8gbm9uZSBvZiBpdHMgZmllbGRzOiB0aGF0XG4gICBvcHRpb25hbCBmaWVsZHMgYXJlIHRoZSBtYXJrZWQgb25lcywgYSB3YXkgaW4gZm9yIGEgcmV0dXJuaW5nIGN1c3RvbWVyLCB0aGVcbiAgIGNvbnNlbnQgbGluZSB1bmRlciB0aGUgb3JkZXIgYnV0dG9uLiBCb2R5IGZvbnQgYXQgdGhlIHNtYWxsIHNpemUgaW4gc2xhdGU7XG4gICBhIGxpbmsgaW5zaWRlIGl0IGlzIFBhcmFnb24gYmx1ZSwgbm8gdW5kZXJsaW5lLCBhcyBsaW5rcyBhcmUgaW4gdGhpcyBicmFuZC5cblxuICAgVGhlIGJhc2Ugc2V0cyBubyB0b3AgbWFyZ2luIG9uIHB1cnBvc2U6IGEgbm90ZSB0aGF0IG9wZW5zIGEgZm9ybSwgb3IgZm9sbG93c1xuICAgYSBncm91cCBpbnNpZGUgYSBkb2N1bWVudCwgdGFrZXMgaXRzIGNvbnRhaW5lcidzIG93biByaHl0aG0uIFRoZSB0d29cbiAgIHRyYWlsaW5nIG1vZGlmaWVycyBhbHdheXMgZm9sbG93IHNvbWV0aGluZyDigJQgdGhlIGZpZWxkcyBhYm92ZSwgdGhlIHBheW1lbnRcbiAgIG1hcmtzIGFib3ZlIOKAlCBzbyB0aGV5IGNhcnJ5IHRoZSBnYXAgdGhlbXNlbHZlcywgYW5kIHNheSB3aGljaCB3YXkgdGhleVxuICAgYWxpZ24uXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi5mb3JtLW5vdGUge1xuXG5cdG1hcmdpbi1ibG9jay1lbmQ6IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG59XG5cbi5mb3JtLW5vdGUgYSB7XG5cblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xuXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5mb3JtLW5vdGUgYTpob3ZlciB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtbGluay1ob3Zlcik7XG59XG5cbi8qIC0tc3RhcnQ6IGEgbm90ZSBjbG9zaW5nIGEgZmllbGQgZ3JvdXAsIG9uIHRoZSBsZWZ0IGxpa2UgdGhlIGZpZWxkcyBhYm92ZSBpdC4gSXQgd2FzXG4gICBgLS1lbmRgLCByaWdodC1hbGlnbmVkLCB1bnRpbCB0aGUgb3BlcmF0b3IgYXNrZWQgZm9yIHRoZSBjaGVja291dCdzIFwiQWxyZWFkeSBoYXZlIGFuXG4gICBhY2NvdW50P1wiIGxpbmUgdG8gc2l0IGxlZnQgKDIwMjYtMDktMjYpIOKAlCBgLS1lbmRgIGhhZCBubyBvdGhlciB1c2UsIHNvIGl0IGlzIHJlcGxhY2VkXG4gICByYXRoZXIgdGhhbiBrZXB0IGJlc2lkZSBpdC4gKi9cbi5mb3JtLW5vdGUtLXN0YXJ0IHtcblxuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTQpO1xufVxuXG4uZm9ybS1ub3RlLS1jZW50ZXIge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtNCk7XG5cdHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBoZXJvLXNsaWRlclxuLy9cbi8vIFRoZSBsYW5kaW5nIHBhZ2UncyBvcGVuaW5nIGJhbmQ6IGEgbWFudWFsLWFkdmFuY2Ugc2xpZGVyIG9mIHBob3RvZ3JhcGhpY1xuLy8gc2xpZGVzLCBlYWNoIGNhcnJ5aW5nIGxlZnQtYWxpZ25lZCBjb3B5IG92ZXIgYSBzY3JpbSB0aGF0IGRhcmtlbnMgdGhlIHN0YXJ0XG4vLyBlZGdlIG9ubHkuIEFycm93cyBzaXQgaW5zaWRlIHRoZSBmcmFtZSBvbiBib3RoIGVkZ2VzLCBkb3RzIGFsb25nIHRoZSBib3R0b20uXG4vL1xuLy8gTkVWRVIgQVVUTy1BRFZBTkNFUy4gVGhlIGRlc2lnbiBicmllZiBpcyBleHBsaWNpdCBhYm91dCBpdCBhbmQgdGhlIENTUyBjYXJyaWVzXG4vLyBubyBhbmltYXRpb24gdG8gdGhhdCBlbmQg4oCUIGEgc3RvcmUncyBoZXJvIG1vdmluZyB1bmRlciBhIHJlYWRlciB3aG8gaXMgcGFydFxuLy8gd2F5IHRocm91Z2ggYSBsaW5lIGNvc3RzIG1vcmUgdGhhbiB0aGUgc2Vjb25kIHNsaWRlIGdhaW5zLlxuLy9cbi8vIERpc3RpbmN0IGZyb20gYHByb21vLXRpbGVgLCB3aGljaCBpcyBhIHNpbmdsZSBmaXhlZCBhZHZlcnQgaW4gYSByYWlsIG9yIGFcbi8vIGdyaWQgY2VsbC4gVGhpcyBpcyB0aGUgcGFnZSdzIG9uZSBmdWxsLXdpZHRoIHJvdGF0aW5nIGJhbmQuXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYGhlcm8tc2xpZGVyYC4gUG9ydGVkIGZvciB0aGUgTVBHMSBob21lcGFnZSB3YWxrLCAyMDI2LTA5LTE2LlxuXG4uaGVyby1zbGlkZXIge1xuXG5cdC8qIFRoZSBhcnJvdydzIGdlb21ldHJ5LCBkZWNsYXJlZCBvbmNlLiBUaGUgYXJyb3cgcnVsZXMgYmVsb3cgY29uc3VtZSBpdCwgYW5kXG5cdCAgIHNvIGRvZXMgdGhlIGNvcHkncyBpbmxpbmUgcGFkZGluZyDigJQgdGhlIGNvcHkgaGFzIHRvIGNsZWFyIHRoZSBhcnJvdywgYW5kXG5cdCAgIGJlZm9yZSB0aGlzIHdhcyBhIHRva2VuIHRoYXQgY2xlYXJhbmNlIHdhcyBhIGhhbmQtYWRkZWQgNjRweCB0aGF0IGxlZnRcblx0ICAgZXhhY3RseSA0cHggb2YgZGF5bGlnaHQuIFN0YXRlZCBmcm9tIHRoZSBwYXJ0cywgdGhlIGNvcHkgZm9sbG93cyB0aGUgYXJyb3dcblx0ICAgaWYgdGhlIGFycm93IGV2ZXIgbW92ZXMuICovXG5cdC0taGVyby1hcnJvdy1zaXplOiAgNDRweDsgLy8gc2Nzcy1ydWxlLWxpbnQ6IGFsbG93LWRlY2xcblx0LS1oZXJvLWFycm93LWluc2V0OiB2YXIoLS1zcGFjZS00KTsgLy8gc2Nzcy1ydWxlLWxpbnQ6IGFsbG93LWRlY2xcblxuXHQvKiBBTEwgU0xJREVTIE9DQ1VQWSBPTkUgQ0VMTCwgc28gdGhleSBjYW4gY3Jvc3MtZmFkZS4gVGhleSB1c2VkIHRvIGJlXG5cdCAgIGBkaXNwbGF5OiBub25lYCAvIGBibG9ja2AsIHdoaWNoIGNhbm5vdCB0cmFuc2l0aW9uIOKAlCBhIHByb3BlcnR5IHRoYXQganVtcHNcblx0ICAgYmV0d2VlbiB0d28ga2V5d29yZHMgaGFzIG5vdGhpbmcgdG8gaW50ZXJwb2xhdGUuIFN0YWNraW5nIHRoZW0gaW4gYSBzaW5nbGVcblx0ICAgZ3JpZCBjZWxsIGtlZXBzIHRoZSB0YWxsZXN0IHNsaWRlIHNpemluZyB0aGUgYmFuZCwgd2hpY2ggYWJzb2x1dGVcblx0ICAgcG9zaXRpb25pbmcgd291bGQgaGF2ZSBnaXZlbiBhd2F5LCBhbmQgdGhlIGJhbmQga2VlcHMgaXRzIGhlaWdodCB3aXRoIG5vXG5cdCAgIHNsaWRlIHZpc2libGUgYXQgYWxsLiAqL1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdGRpc3BsYXk6IGdyaWQ7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbmV1dHJhbC04MDApO1xuXHRib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctY2FyZCk7XG59XG5cbi8qIFRIRSBTTElERSBPV05TIFRIRSBCT1gsIE5PVCBJVFMgSU1BR0UuXG5cbiAgIFVudGlsIDIwMjYtMDktMTcgdGhlIHJhdGlvIGFuZCB0aGUgZmxvb3Igc2F0IG9uIGAuaGVyby1zbGlkZXJfX21lZGlhYCwgc28gdGhlXG4gICBzbGlkZSdzIGhlaWdodCBjYW1lIGZyb20gaXRzIHBpY3R1cmUuIFRoYXQgd29ya3MgaW4gYSBtb2NrdXAsIHdoZXJlIGV2ZXJ5XG4gICBzbGlkZSBoYXMgb25lLiBJdCBkb2VzIG5vdCB3b3JrIGluIGEgdGhlbWU6IHRoZSBzY3JpbSBhbmQgdGhlIGNvcHkgYXJlIGJvdGhcbiAgIGFic29sdXRlbHkgcG9zaXRpb25lZCwgc28gYSBzbGlkZSB3aXRoIG5vIGltYWdlIGhhcyBOTyBpbi1mbG93IGNoaWxkIGF0IGFsbFxuICAgYW5kIGNvbGxhcHNlcyB0byB6ZXJvIOKAlCBhbmQgdGhlIHdob2xlIGhlcm8gd2l0aCBpdC4gVGhlIGJhbmQgZGlkIG5vdCBsb29rXG4gICBicm9rZW4sIGl0IGxvb2tlZCBhYnNlbnQsIHdoaWNoIGlzIHdoeSBpdCByZWFkIGFzIGEgbWlzc2luZyBibG9jayByYXRoZXIgdGhhblxuICAgYSBzaXppbmcgcnVsZSBpbiB0aGUgd3JvbmcgcGxhY2UuXG5cbiAgIFRoZSBicmFuZCBoYXMgbm8gaGVybyBwaG90b2dyYXBoeSB5ZXQsIHNvIHRoaXMgaXMgdGhlIG5vcm1hbCBjYXNlIHJhdGhlciB0aGFuXG4gICBhbiBlZGdlIG9uZS4gVGhlIHNsaWRlIG5vdyBjYXJyaWVzIHRoZSBkZXNpZ24ncyBvd24gMTQwMHg1MjAgcHJvcG9ydGlvbiB3aXRoIGFcbiAgIGZsb29yIGZvciBuYXJyb3cgdmlld3BvcnRzLCBhbmQgdGhlIGltYWdlIOKAlCB3aGVuIG9uZSBsYW5kcyDigJQgZmlsbHMgdGhhdCBib3hcbiAgIGluc3RlYWQgb2YgZGVmaW5pbmcgaXQuIGAuaGVyby1zbGlkZXJgIGFscmVhZHkgcGFpbnRzIGEgZ3JvdW5kLCBzbyBhblxuICAgaW1hZ2UtbGVzcyBzbGlkZSBzaG93cyBicmFuZCBjb2xvdXIgdW5kZXIgdGhlIHNjcmltIHJhdGhlciB0aGFuIG5vdGhpbmcuICovXG4uaGVyby1zbGlkZXJfX3NsaWRlIHtcblxuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdGdyaWQtYXJlYTogMSAvIDE7XG5cdGFzcGVjdC1yYXRpbzogMTQwMCAvIDUyMDtcblx0bWluLWhlaWdodDogMzgwcHg7XG5cblx0LyogSGlkZGVuLCBidXQgc3RpbGwgbGFpZCBvdXQg4oCUIHRoYXQgaXMgdGhlIHBvaW50IG9mIHN0YWNraW5nIHRoZW0uIGBvcGFjaXR5YFxuXHQgICBjYXJyaWVzIHRoZSBmYWRlOyBgdmlzaWJpbGl0eWAgaXMgd2hhdCB0YWtlcyBhbiBpbmFjdGl2ZSBzbGlkZSBvdXQgb2YgdGhlXG5cdCAgIGFjY2Vzc2liaWxpdHkgdHJlZSBhbmQgb2ZmIHRoZSB0YWIgb3JkZXIsIHdoaWNoIGBvcGFjaXR5OiAwYCBhbG9uZSBkb2VzIG5vdFxuXHQgICBkby4gSXRzIHRyYW5zaXRpb24gaXMgYSB6ZXJvLWxlbmd0aCBzdGVwIERFTEFZRUQgdW50aWwgdGhlIGZhZGUgZmluaXNoZXMsIHNvXG5cdCAgIHRoZSBvdXRnb2luZyBzbGlkZSBzdGF5cyB2aXNpYmxlIHdoaWxlIGl0IGZhZGVzIGFuZCBvbmx5IHRoZW4gc3RvcHNcblx0ICAgZXhpc3RpbmcuIFRyYW5zaXRpb25pbmcgdmlzaWJpbGl0eSBhcyBhIGR1cmF0aW9uIGluc3RlYWQgbWFrZXMgaXQgZmxpY2tlclxuXHQgICBoYWxmIHdheS4gKi9cblx0b3BhY2l0eTogMDtcblx0dmlzaWJpbGl0eTogaGlkZGVuO1xuXHR0cmFuc2l0aW9uOlxuXHRcdG9wYWNpdHkgdmFyKC0tbW90aW9uLXN0YW5kYXJkKSB2YXIoLS1tb3Rpb24tZWFzZSksXG5cdFx0dmlzaWJpbGl0eSAwcyBsaW5lYXIgdmFyKC0tbW90aW9uLXN0YW5kYXJkKTtcbn1cblxuLmhlcm8tc2xpZGVyX19zbGlkZS5pcy1hY3RpdmUge1xuXG5cdC8qIEFib3ZlIGl0cyBzaWJsaW5ncyBzbyB0aGF0IGR1cmluZyB0aGUgZmFkZSB0aGUgT1VUR09JTkcgc2xpZGUncyBzY3JpbSBpcyBub3Rcblx0ICAgdGhlIHRoaW5nIGEgcG9pbnRlciBsYW5kcyBvbi4gVGhlIGNvbnRyb2xzIHNpdCBhYm92ZSBib3RoIOKAlCBzZWUgdGhlIHotaW5kZXhcblx0ICAgb24gdGhlIGFycm93cyBhbmQgZG90cywgd2hpY2ggaXMgbG9hZC1iZWFyaW5nIHJhdGhlciB0aGFuIHRpZHk6IHdpdGhvdXQgaXRcblx0ICAgdGhpcyBsaW5lIGFsb25lIHB1dHMgdGhlIHdob2xlIHNsaWRlIG92ZXIgdGhlbSBhbmQgZXZlcnkgY2xpY2sgaGl0cyB0aGVcblx0ICAgc2NyaW0gaW5zdGVhZCBvZiB0aGUgYnV0dG9uLiBUaGUgc2xpZGVyIGlzIHRoZW4gc2lsZW50bHkgZGVhZCwgYW5kIGl0IHN0aWxsXG5cdCAgIGxvb2tzIHBlcmZlY3QuICovXG5cdHotaW5kZXg6IDE7XG5cdG9wYWNpdHk6IDE7XG5cdHZpc2liaWxpdHk6IHZpc2libGU7XG5cdHRyYW5zaXRpb246XG5cdFx0b3BhY2l0eSB2YXIoLS1tb3Rpb24tc3RhbmRhcmQpIHZhcigtLW1vdGlvbi1lYXNlKSxcblx0XHR2aXNpYmlsaXR5IDBzIGxpbmVhciAwcztcbn1cblxuLyogQSBzbGlkZXIgaXMgZGVjb3JhdGlvbiBhIHJlYWRlciBkaWQgbm90IGFzayB0byBtb3ZlLiBIb25vdXIgdGhlIHN5c3RlbVxuICAgc2V0dGluZzogdGhlIHNsaWRlIHN0aWxsIGNoYW5nZXMsIGl0IGp1c3QgYXJyaXZlcyByYXRoZXIgdGhhbiBmYWRlcy4gKi9cbkBtZWRpYSAoIHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSApIHtcblxuXHQuaGVyby1zbGlkZXJfX3NsaWRlLFxuXHQuaGVyby1zbGlkZXJfX3NsaWRlLmlzLWFjdGl2ZSB7XG5cblx0XHR0cmFuc2l0aW9uOiBub25lO1xuXHR9XG59XG5cbi5oZXJvLXNsaWRlcl9fbWVkaWEge1xuXG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0aW5zZXQ6IDA7XG5cdGRpc3BsYXk6IGJsb2NrO1xuXHR3aWR0aDogMTAwJTtcblx0aGVpZ2h0OiAxMDAlO1xuXHRvYmplY3QtZml0OiBjb3Zlcjtcbn1cblxuLmhlcm8tc2xpZGVyX19zY3JpbSB7XG5cblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRpbnNldDogMDtcblx0YmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCA5MGRlZywgdmFyKC0tYmctb3ZlcmxheSkgMCUsIHZhcigtLWJnLW92ZXJsYXkpIDQwJSwgdHJhbnNwYXJlbnQgNzglICk7XG59XG5cbi5oZXJvLXNsaWRlcl9fY29udGVudCB7XG5cblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRpbnNldC1ibG9jazogMDtcblx0aW5zZXQtaW5saW5lLXN0YXJ0OiAwO1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtNik7XG5cdG1heC13aWR0aDogNjgwcHg7XG5cblx0LyogQ0xFQVJTIFRIRSBBUlJPVyBXSVRIIFJPT00gVE8gU1BBUkUsIHJhdGhlciB0aGFuIGJ5IGZvdXIgcGl4ZWxzLiBUaGUgb2xkXG5cdCAgIHZhbHVlIHdhcyBhIGZsYXQgNjRweCBhZ2FpbnN0IGFuIGFycm93IHRoYXQgZW5kcyBhdCA2MCDigJQgdGVjaG5pY2FsbHkgY2xlYXIsXG5cdCAgIGFuZCBpdCByZWFkIGFzIHRoZSBjb3B5IGJlaW5nIGphbW1lZCBhZ2FpbnN0IHRoZSBjb250cm9sLiBCdWlsdCBmcm9tIHRoZVxuXHQgICBhcnJvdydzIG93biBnZW9tZXRyeSBwbHVzIGEgZ2FwLCBzbyBpdCBpcyAyNHB4IG9mIGRheWxpZ2h0IGJ5IGNvbnN0cnVjdGlvblxuXHQgICBhbmQgc3RheXMgcmlnaHQgaWYgdGhlIGFycm93IG1vdmVzLiBNZWFzdXJlZCBiZWZvcmU6IHRleHQgYXQgeD04NCwgYXJyb3dcblx0ICAgZW5kaW5nIGF0IHg9ODAuICovXG5cdHBhZGRpbmctaW5saW5lLXN0YXJ0OiBjYWxjKCB2YXIoLS1oZXJvLWFycm93LWluc2V0KSArIHZhcigtLWhlcm8tYXJyb3ctc2l6ZSkgKyB2YXIoLS1zcGFjZS02KSApO1xuXHRwYWRkaW5nLWlubGluZS1lbmQ6IHZhcigtLXNwYWNlLTgpO1xuXHRwYWRkaW5nLWJsb2NrOiB2YXIoLS1zcGFjZS04KTtcblx0dGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLy8gVGhlIGV5ZWJyb3cgdGFrZXMgdGhlIGJyYW5kJ3MgZXllYnJvdyB0cmVhdG1lbnQgKGZlYXR1cmVkLXByb2R1Y3QsIGFydGljbGUtY2FyZFxuLy8ga2lja2VyKSBpbiB0aGUgc2xpZGUncyBvbi1icmFuZCB0ZXh0IGNvbG91ciwgYmVjYXVzZSBpdCBzaXRzIG9uIHRoZSBzY3JpbSB3aXRoXG4vLyB0aGUgdGl0bGUgYW5kIGxlYWQgcmF0aGVyIHRoYW4gb24gYSBjYXJkLlxuLmhlcm8tc2xpZGVyX19leWVicm93IHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1leWVicm93KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiAxO1xuXHRsZXR0ZXItc3BhY2luZzogMC4xMmVtO1xuXHR0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1vbi1icmFuZCk7XG59XG5cbi5oZXJvLXNsaWRlcl9fdGl0bGUge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWgxKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtb24tYnJhbmQpO1xufVxuXG4uaGVyby1zbGlkZXJfX2xlYWQge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHktbGcpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbGlnaHQpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW9uLWJyYW5kKTtcbn1cblxuLmhlcm8tc2xpZGVyX19hcnJvdyB7XG5cblx0cG9zaXRpb246IGFic29sdXRlO1xuXHQvKiBBYm92ZSB0aGUgc2xpZGUgc3RhY2sg4oCUIHNlZSB0aGUgbm90ZSBvbiBgLmlzLWFjdGl2ZWAuICovXG5cdHotaW5kZXg6IDI7XG5cdGluc2V0LWJsb2NrLXN0YXJ0OiA1MCU7XG5cdHRyYW5zZm9ybTogdHJhbnNsYXRlWSggLTUwJSApO1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdHdpZHRoOiB2YXIoLS1oZXJvLWFycm93LXNpemUpO1xuXHRoZWlnaHQ6IHZhcigtLWhlcm8tYXJyb3ctc2l6ZSk7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWJ0bik7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJ0bi1wcmltYXJ5LWJnKTtcblx0Y29sb3I6IHZhcigtLWJ0bi1wcmltYXJ5LXRleHQpO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5oZXJvLXNsaWRlcl9fYXJyb3c6aG92ZXIge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJ0bi1wcmltYXJ5LWJnLWhvdmVyKTtcbn1cblxuLmhlcm8tc2xpZGVyX19hcnJvdy0tcHJldiB7XG5cblx0aW5zZXQtaW5saW5lLXN0YXJ0OiB2YXIoLS1oZXJvLWFycm93LWluc2V0KTtcbn1cblxuLmhlcm8tc2xpZGVyX19hcnJvdy0tbmV4dCB7XG5cblx0aW5zZXQtaW5saW5lLWVuZDogdmFyKC0taGVyby1hcnJvdy1pbnNldCk7XG59XG5cbi5oZXJvLXNsaWRlcl9fYXJyb3cgc3ZnIHtcblxuXHR3aWR0aDogMjJweDtcblx0aGVpZ2h0OiAyMnB4O1xufVxuXG4uaGVyby1zbGlkZXJfX2RvdHMge1xuXG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0LyogQWJvdmUgdGhlIHNsaWRlIHN0YWNrIOKAlCBzZWUgdGhlIG5vdGUgb24gYC5pcy1hY3RpdmVgLiAqL1xuXHR6LWluZGV4OiAyO1xuXHRpbnNldC1ibG9jay1lbmQ6IHZhcigtLXNwYWNlLTYpO1xuXHRpbnNldC1pbmxpbmUtc3RhcnQ6IDUwJTtcblx0dHJhbnNmb3JtOiB0cmFuc2xhdGVYKCAtNTAlICk7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG59XG5cbi5oZXJvLXNsaWRlcl9fZG90IHtcblxuXHR3aWR0aDogMTJweDtcblx0aGVpZ2h0OiAxMnB4O1xuXHRib3JkZXI6IDA7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1waWxsKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3Itc3VyZmFjZSk7XG5cdG9wYWNpdHk6IDAuNTU7XG5cdGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmhlcm8tc2xpZGVyX19kb3QuaXMtY3VycmVudCB7XG5cblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItYnJhbmQpO1xuXHRvcGFjaXR5OiAxO1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDExMDBweCApIHtcblxuXHQuaGVyby1zbGlkZXJfX2NvbnRlbnQge1xuXG5cdFx0LyogTk9UIGEgZmxhdCB2YWx1ZSBoZXJlIGVpdGhlci4gVGhlIGFycm93IGlzIHRoZSBzYW1lIHNpemUgYXQgdGhpcyB3aWR0aCxcblx0XHQgICBzbyB0aGUgY2xlYXJhbmNlIGlzIHRoZSBzYW1lIGNhbGN1bGF0aW9uIOKAlCByZXN0YXRpbmcgNjRweCB3b3VsZCBwdXQgdGhlXG5cdFx0ICAgY29weSBiYWNrIGFnYWluc3QgdGhlIGNvbnRyb2wgYmVsb3cgMTEwMCBvbmx5LCB3aGljaCBpcyB0aGUga2luZCBvZlxuXHRcdCAgIGZhdWx0IHRoYXQgc3Vydml2ZXMgYSBkZXNrdG9wIGNoZWNrLiAqL1xuXHRcdHBhZGRpbmctaW5saW5lLXN0YXJ0OiBjYWxjKCB2YXIoLS1oZXJvLWFycm93LWluc2V0KSArIHZhcigtLWhlcm8tYXJyb3ctc2l6ZSkgKyB2YXIoLS1zcGFjZS02KSApO1xuXHRcdHBhZGRpbmctaW5saW5lLWVuZDogdmFyKC0tc3BhY2UtNik7XG5cdFx0bWF4LXdpZHRoOiA1NjBweDtcblx0fVxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDkwMHB4ICkge1xuXG5cdC5oZXJvLXNsaWRlcl9fdGl0bGUge1xuXG5cdFx0Zm9udC1zaXplOiB2YXIoLS1mcy1oMik7XG5cdH1cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQvKiBUSEUgUkFUSU8gRk9MTE9XRUQgVEhFIEJPWC4gV2hlbiB0aGUgc2xpZGUgdG9vayBvd25lcnNoaXAgb2YgaXRzIG93biBoZWlnaHRcblx0ICAgb24gMjAyNi0wOS0xNyB0aGlzIG92ZXJyaWRlIHdhcyBsZWZ0IHBvaW50aW5nIGF0IHRoZSBtZWRpYSwgd2hpY2ggbm8gbG9uZ2VyXG5cdCAgIHNpemVzIGFueXRoaW5nIOKAlCBzbyB0aGUgcGhvbmUgaGVybyBmZWxsIGJhY2sgdG8gdGhlIDM4MHB4IGZsb29yIGluc3RlYWQgb2Zcblx0ICAgdGhlIGRlc2lnbidzIHBvcnRyYWl0IGNyb3AsIGFuZCBub3RoaW5nIGxvb2tlZCBicm9rZW4gZW5vdWdoIHRvIG5vdGljZS4gKi9cblx0Lmhlcm8tc2xpZGVyX19zbGlkZSB7XG5cblx0XHRhc3BlY3QtcmF0aW86IDQgLyA1O1xuXHRcdG1pbi1oZWlnaHQ6IDQyMHB4O1xuXHR9XG5cblx0Lmhlcm8tc2xpZGVyX19zY3JpbSB7XG5cblx0XHRiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoIDBkZWcsIHZhcigtLWJnLW92ZXJsYXkpIDAlLCB2YXIoLS1iZy1vdmVybGF5KSA1NSUsIHRyYW5zcGFyZW50IDk1JSApO1xuXHR9XG5cblx0Lmhlcm8tc2xpZGVyX19jb250ZW50IHtcblxuXHRcdGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG5cdFx0cGFkZGluZy1pbmxpbmUtc3RhcnQ6IHZhcigtLXNwYWNlLTYpO1xuXHRcdHBhZGRpbmctaW5saW5lLWVuZDogdmFyKC0tc3BhY2UtNik7XG5cdFx0cGFkZGluZy1ibG9jay1lbmQ6IHZhcigtLXNwYWNlLTE2KTtcblx0XHRtYXgtd2lkdGg6IG5vbmU7XG5cdFx0Z2FwOiB2YXIoLS1zcGFjZS00KTtcblx0fVxuXG5cdC8qIFRIRSBBUlJPV1MgTU9WRSBPRkYgVEhFIENPUFkuIEJlbG93IDY0MCB0aGUgc2xpZGUgZ29lcyBwb3J0cmFpdCBhbmQgdGhlIGNvcHlcblx0ICAgbW92ZXMgdG8gdGhlIEJPVFRPTSBvZiBpdCwgd2hpbGUgdGhlIGFycm93cyBzdGF5IHZlcnRpY2FsbHkgY2VudHJlZCDigJQgd2hpY2hcblx0ICAgcHV0cyB0aGUgcHJldiBhcnJvdyBzdHJhaWdodCB0aHJvdWdoIHRoZSBsZWFkIHBhcmFncmFwaC4gTWVhc3VyZWQgYXQgMzkwOlxuXHQgICBhcnJvdyAzOTItNDM2LCBsZWFkIDQwMS01MDksIGEgZ2VudWluZSBvdmVybGFwIHRoYXQgdGhlIHRpdGxlIGNsZWFyZWQgYW5kXG5cdCAgIHRoZSBwYXJhZ3JhcGggZGlkIG5vdC5cblxuXHQgICBQaW5uZWQgdG8gdGhlIHRvcCBvZiB0aGUgc2xpZGUgcmF0aGVyIHRoYW4gbnVkZ2VkIHVwIGEgcGVyY2VudGFnZSwgc28gdGhlXG5cdCAgIGNsZWFyYW5jZSBkb2VzIG5vdCBkcmlmdCB3aGVuIGEgc2xpZGUncyBjb3B5IHJ1bnMgdG8gYW5vdGhlciBsaW5lLiBUaGVcblx0ICAgdHJhbnNmb3JtIGdvZXMgd2l0aCB0aGUgY2VudHJpbmcgaXQgZXhpc3RlZCB0byBjb3JyZWN0LiAqL1xuXHQuaGVyby1zbGlkZXJfX2Fycm93IHtcblxuXHRcdGluc2V0LWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS04KTtcblx0XHR0cmFuc2Zvcm06IG5vbmU7XG5cdH1cblxuXHQuaGVyby1zbGlkZXJfX3RpdGxlIHtcblxuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDMpO1xuXHR9XG5cblx0Lmhlcm8tc2xpZGVyX19sZWFkIHtcblxuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdH1cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBob3VzZS1hZFxuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBNYWdhemluZSBBcnRpY2xlIG1vY2t1cCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTYsIG9wZXJhdG9yLWFwcHJvdmVkXG4vLyAyMDI2LTA5LTI4KSBmb3IgdGhlIGFydGljbGUgd2FsaywgTVBHMTYuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBob3VzZS1hZCAgKE5FVylcbiAgIFwiRnJvbSB0aGUgc3RvcmVcIjogdGhlIG1hZ2F6aW5lIGNhcnJpZXMgdGhlIHNob3AncyBvd24gYWR2ZXJ0cywgbm90IHRoaXJkLVxuICAgcGFydHkgb25lcy4gUHJvZHVjdC1sZWQsIGxhYmVsbGVkIHBsYWlubHksIGFuZCBuZXZlciBsb3VkZXIgdGhhbiB0aGUgdGV4dFxuICAgYXJvdW5kIGl0IOKAlCBhIGhhaXJsaW5lIG91dGxpbmUgb24gd2hpdGUgcmF0aGVyIHRoYW4gYSBmaWxsZWQgYmFuZCwgb25lXG4gICBwcm9kdWN0LCBvbmUgY29tbWVyY2UgYnV0dG9uLCBvbmUgcXVpZXQgVmlldyBsaW5rLlxuXG4gICAtLWlubGluZSBzaXRzIG9uY2UgaW4gdGhlIGJvZHkgd2hlcmUgdGhlIG9sZCBpbi1hcnRpY2xlIGFkIG1hcmtlciB3YXM6IGFcbiAgIHNpbmdsZSBjb21wYWN0IHJvdyBhdCB0aGUgcmVhZGluZy1jb2x1bW4gd2lkdGguIC0tcmFpbCBpcyB0aGUgcG9ydHJhaXRcbiAgIGZvcm0gZm9yIHRoZSByYWlsLiBXaGVuIHRoZSBhcnRpY2xlIGhhcyBubyBnYW1lIGh1YiB0aGUgcmFpbCBmb3JtIGhvbGRzIGFcbiAgIHByb21vLXRpbGUgZnJvbSB0aGUgc3RvcmUncyBwcm9tbyBwb29sIGluc3RlYWQgb2YgYSBwcm9kdWN0LlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi5ob3VzZS1hZCB7XG5cblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2FyZCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblxufVxuXG4uaG91c2UtYWRfX2xhYmVsIHtcblxuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKTtcblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtZXllYnJvdyk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogMTtcblx0bGV0dGVyLXNwYWNpbmc6IDAuMTJlbTtcblx0dGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuXG59XG5cbi8qIFRoZSBsYWJlbCdzIHN0b3JlIGljb24g4oCUIHRoZSBsaXN0aW5nIGFkdmVydCBjYXJyaWVzIG9uZSAoTVBHMTUpLiAqL1xuLmhvdXNlLWFkX19sYWJlbCBzdmcge1xuXG5cdGZsZXg6IDAgMCBhdXRvO1xuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG5cbn1cblxuLmhvdXNlLWFkX19tZWRpYSB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cbn1cblxuLmhvdXNlLWFkX19tZWRpYSBpbWcge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHR3aWR0aDogMTAwJTtcblx0YXNwZWN0LXJhdGlvOiAxO1xuXHRvYmplY3QtZml0OiBjb250YWluO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jYXJkKTtcblxufVxuXG4uaG91c2UtYWRfX2JvZHkge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogdmFyKC0tc3BhY2UtMik7XG5cdG1pbi13aWR0aDogMDtcblxufVxuXG4uaG91c2UtYWRfX3RpdGxlIHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1jaHJvbWUpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctYm9sZCk7XG5cdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXG59XG5cbi5ob3VzZS1hZF9fdGl0bGUgYSB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtaGVhZGluZyk7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblxufVxuXG4uaG91c2UtYWRfX3RpdGxlIGE6aG92ZXIge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xuXG59XG5cbi5ob3VzZS1hZF9fcHJpY2Uge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWNocm9tZSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDQpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctYm9sZCk7XG5cdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblxufVxuXG4uaG91c2UtYWRfX21ldGEge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG5cbn1cblxuLmhvdXNlLWFkX19hY3Rpb25zIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTQpO1xuXG59XG5cbi5ob3VzZS1hZF9fdmlldyB7XG5cblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbGluayk7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblxufVxuXG4uaG91c2UtYWRfX3ZpZXc6aG92ZXIge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmstaG92ZXIpO1xuXG59XG5cbi5ob3VzZS1hZC0taW5saW5lIHtcblxuXHRtYXJnaW46IHZhcigtLXNwYWNlLTgpIDAgMDtcblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxMTJweCBtaW5tYXgoIDAsIDFmciApIGF1dG87XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtNCkgdmFyKC0tc3BhY2UtNik7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTQpIHZhcigtLXNwYWNlLTYpO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cbn1cblxuLmhvdXNlLWFkLS1yYWlsIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLTMpO1xuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS02KTtcblxufVxuXG4uaG91c2UtYWQtLXJhaWwgLmhvdXNlLWFkX19tZWRpYSBpbWcge1xuXG5cdGFzcGVjdC1yYXRpbzogNCAvIDM7XG5cbn1cblxuLmhvdXNlLWFkLS1yYWlsIC5ob3VzZS1hZF9fYWN0aW9ucyB7XG5cblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0YWxpZ24taXRlbXM6IHN0cmV0Y2g7XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdHRleHQtYWxpZ246IGNlbnRlcjtcblxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5ob3VzZS1hZC0taW5saW5lIHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogODhweCBtaW5tYXgoIDAsIDFmciApO1xuXHRcdHBhZGRpbmc6IHZhcigtLXNwYWNlLTQpO1xuXG5cdH1cblxuXHQuaG91c2UtYWQtLWlubGluZSAuaG91c2UtYWRfX2FjdGlvbnMge1xuXG5cdFx0Z3JpZC1jb2x1bW46IDEgLyAtMTtcblxuXHR9XG59XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBNT0RJRklFUiDigJQgaG91c2UtYWQtLWxpc3RpbmcgIChNUEcxNSwgc2VjdGlvbiBsYW5kaW5nKVxuICAgVGhlIGFkdmVydCBvbmNlIGluIGEgbGlzdCBvZiBhcnRpY2xlcywgYWZ0ZXIgdGhlIHNpeHRoOiBhIHdpZGUgcm93IOKAlCBpbWFnZSxcbiAgIHRleHQsIGJ1dHRvbiDigJQgdGhlIHNhbWUgaGVpZ2h0IGNsYXNzIGFzIHRoZSByZXZpZXcgY2FyZHMgYXJvdW5kIGl0LCBhbmQgd2l0aFxuICAgdGhlaXIgY2FyZCBzaGFkb3cgc28gaXQgc2l0cyBpbiB0aGUgbGlzdCByYXRoZXIgdGhhbiBvbiBpdC4gVGhlIG1vY2t1cCBuYW1lZFxuICAgdGhlIHBhcnRzIF9fbmFtZSBhbmQgX19hY3Rpb247IHRoZXkgYXJlIHRoZSBiYXNlIF9fdGl0bGUgYW5kIF9fYWN0aW9ucyBoZXJlLFxuICAgc28gb25lIGFkdmVydCBwYXJ0aWFsIHNlcnZlcyB0aGUgYXJ0aWNsZSBhbmQgdGhlIGxpc3RpbmcuIEl0cyBwaG9uZSBydWxlcyBhcmVcbiAgIHNjb3BlZCB0byB0aGUgdmFyaWFudCDigJQgdW5zY29wZWQsIHRoZXkgd291bGQgaGF2ZSByZXNpemVkIHRoZSBhcnRpY2xlJ3MgYWR2ZXJ0cy5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4uaG91c2UtYWQtLWxpc3Rpbmcge1xuXG5cdGRpc3BsYXk6IGdyaWQ7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5cdGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1jYXJkKTtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxNjBweCBtaW5tYXgoIDAsIDFmciApIGF1dG87XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtOCk7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTYpIHZhcigtLXNwYWNlLWNhcmQtcGFkZGluZyk7XG5cbn1cblxuLmhvdXNlLWFkLS1saXN0aW5nIC5ob3VzZS1hZF9fYm9keSB7XG5cblx0bWluLXdpZHRoOiAwO1xuXHRtYXgtd2lkdGg6IHZhcigtLWNvbnRhaW5lci1yZWFkaW5nKTtcblxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5ob3VzZS1hZC0tbGlzdGluZyB7XG5cblx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDk2cHggbWlubWF4KCAwLCAxZnIgKTtcblx0XHRnYXA6IHZhcigtLXNwYWNlLTQpIHZhcigtLXNwYWNlLTYpO1xuXHRcdHBhZGRpbmc6IHZhcigtLXNwYWNlLTYpO1xuXG5cdH1cblxuXHQuaG91c2UtYWQtLWxpc3RpbmcgLmhvdXNlLWFkX19hY3Rpb25zIHtcblxuXHRcdGdyaWQtY29sdW1uOiAxIC8gLTE7XG5cblx0fVxuXG5cdC5ob3VzZS1hZC0tbGlzdGluZyAuaG91c2UtYWRfX2FjdGlvbnMgLmJ0biB7XG5cblx0XHR3aWR0aDogMTAwJTtcblxuXHR9XG5cblx0LmhvdXNlLWFkLS1saXN0aW5nIC5ob3VzZS1hZF9fdGl0bGUge1xuXG5cdFx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblxuXHR9XG5cblx0LmhvdXNlLWFkLS1saXN0aW5nIC5ob3VzZS1hZF9fcHJpY2Uge1xuXG5cdFx0Zm9udC1zaXplOiB2YXIoLS1mcy1oNCk7XG5cblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGluZm8tYmFuZFxuLy9cbi8vIFRoZSBmb3VyIHNob3J0IHBvbGljeSBibG9ja3MgYXQgdGhlIGZvb3Qgb2YgYSBzdG9yZSBwYWdlIOKAlCBkZWxpdmVyeSxcbi8vIHJldHVybnMsIHdheXMgdG8gcGF5IGFuZCBoZWxwIOKAlCB0d28gYnkgdHdvIG9uIGl0cyBvd24gcGFuZWwsIGVhY2ggbmFtaW5nXG4vLyB0aGUgcHJvZHVjdCBvciB0aGUgY2F0ZWdvcnkgaXQgc2l0cyBvbiBhbmQgZWFjaCBsaW5raW5nIHRvIHRoZSBwYWdlIHRoYXRcbi8vIG93bnMgdGhlIHN1YmplY3QuIEl0IGV4aXN0cyBmb3IgY28tb2NjdXJyZW5jZSByYXRoZXIgdGhhbiBjb250ZW50OiBhXG4vLyBkZWRpY2F0ZWQgcG9saWN5IHBhZ2UgaGFzIG5vIHByb2R1Y3QgY29udGV4dCBhbmQgY2Fubm90IG1hdGNoIGEgY29tcG91bmRcbi8vIHF1ZXJ5IGxpa2UgJ3hib3ggY2xlYXJwYXknLCB3aGlsZSBhIHBhZ2UgY2FycnlpbmcgYm90aCB0ZXJtcyBjYW4uXG4vLyBEZWxpYmVyYXRlbHkgc2hvcnQg4oCUIGl0IHJlcGVhdHMgYWNyb3NzIGV2ZXJ5IHByb2R1Y3QgYW5kIGFyY2hpdmUgcGFnZSwgc29cbi8vIGxlbmd0aCB3b3VsZCBjb3N0IHVuaXF1ZS1jb250ZW50IHJhdGlvIHdpdGhvdXQgYWRkaW5nIHJlbGV2YW5jZS4gVHdvIGFjcm9zc1xuLy8gYXQgNDU5cHggcmF0aGVyIHRoYW4gZm91ciBhdCAyMjIsIHdoaWNoIHdhcyBhIGZvb3RlciBjb2x1bW4gYW5kIGdhdmUgYVxuLy8gdGhpcnR5LWNoYXJhY3RlciBsaW5lLlxuLy9cbi8vIFNvdXJjZTogY2F0YWxvZ3VlIGJsb2NrIGBpbmZvLWJhbmRgLiBQb3J0ZWQgZm9yIHRoZSBNUEc5IHByb2R1Y3QtcGFnZSB3YWxrLCAyMDI2LTA5LTE2LlxuXG4vKiAtLS0tIHRoZSBwb2xpY3kgYmFuZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgRm91ciBzaG9ydCBibG9ja3MgYXQgdGhlIGZvb3Q6IGRlbGl2ZXJ5LCByZXR1cm5zLCB3YXlzIHRvIHBheSwgaGVscC4gRWFjaFxuICAgbmFtZXMgdGhlIHByb2R1Y3Qgb3IgaXRzIGNhdGVnb3J5IGFuZCBsaW5rcyB0byB0aGUgcGFnZSB0aGF0IG93bnMgdGhlXG4gICBzdWJqZWN0LlxuXG4gICBGb3VyIGFjcm9zcyB0aGUgY29udGVudCBjb2x1bW4gZ2l2ZXMgZWFjaCBibG9jayBhYm91dCAyMjNweCwgd2hpY2ggaXMgYVxuICAgZm9vdGVyIGNvbHVtbidzIHdpZHRoIGFuZCBpcyB3aHkgdGhlIGNvcHkgaXMgZGVsaWJlcmF0ZWx5IHNob3J0LiBJdCBpcyBhbHNvXG4gICB0aGUgcG9pbnQ6IHRoaXMgYmFuZCBleGlzdHMgc28gdGhlIHByb2R1Y3QgdGVybSBhbmQgdGhlIHBheW1lbnQgb3IgZGVsaXZlcnlcbiAgIHRlcm0gYXBwZWFyIGluIE9ORSBkb2N1bWVudCwgd2hpY2ggaXMgd2hhdCBhIGRlZGljYXRlZCBwb2xpY3kgcGFnZSBjYW4gbmV2ZXJcbiAgIGRvIGZvciBhIGNvbXBvdW5kIHF1ZXJ5LiBWb2x1bWUgb2YgdGV4dCB3b3VsZCB3b3JrIGFnYWluc3QgaXQuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyogVGhlIGJhbmQgY2FycmllcyBpdHMgb3duIHN1cmZhY2UgcmF0aGVyIHRoYW4gYmVpbmcgd3JhcHBlZCBpbiBhIHBhbmVsLCBiZWNhdXNlXG4gICBpdCBub3cgaGFzIHR3byBjb25zdW1lcnMg4oCUIHRoZSBwcm9kdWN0IHBhZ2UgYW5kIHRoZSBjYXRlZ29yeSBhcmNoaXZlIOKAlCBhbmQgYVxuICAgYmxvY2sgdGhhdCBuZWVkcyBhIHdyYXBwZXIgdG8gbG9vayByaWdodCBpcyBhIGJsb2NrIHRoYXQgZ2V0cyBjb21wb3NlZCB3cm9uZ1xuICAgb24gdGhlIHRoaXJkIHBhZ2UuICovXG4uaW5mby1iYW5kIHtcblxuXHRkaXNwbGF5OiBncmlkO1xuXHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCggMiwgbWlubWF4KCAwLCAxZnIgKSApO1xuXHRnYXA6IHZhcigtLXNwYWNlLTEyKSB2YXIoLS1zcGFjZS0xNik7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLWNhcmQtcGFkZGluZyk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctcGFuZWwpO1xufVxuXG4vKiBUaGUgZ3JpZCBpdGVtLiBUaGUgdHJhY2sgcGxhY2VzIGl0LCBzbyBpdCBkZWNsYXJlcyBubyBsYXlvdXQgb2YgaXRzIG93biDigJQgdGhpc1xuICAgaXMgdGhlIGZsb29yIHRoYXQga2VlcHMgaXQgaW5zaWRlIHRoYXQgdHJhY2suIEEgZ3JpZCBpdGVtJ3MgZGVmYXVsdCBtaW5pbXVtIGlzXG4gICBpdHMgb3duIGxvbmdlc3Qgd29yZCwgYW5kIHRoaXMgY29weSBuYW1lcyB0aGUgcHJvZHVjdCBpdCBzaXRzIG9uLCB3aGljaCBhcnJpdmVzXG4gICBmcm9tIHRoZSBjYXRhbG9ndWUgYW5kIGNhbiBiZSBhIHNpbmdsZSB1bmJyb2tlbiBzdHJpbmcuIFdpdGhvdXQgdGhlIGZsb29yIG9uZVxuICAgc3VjaCBuYW1lIHdpZGVucyB0aGUgaXRlbSBwYXN0IGl0cyA0NTlweCBjb2x1bW4gYW5kIHRoZSB0d28tdXAgcm93IGdvZXMgd2l0aCBpdC4gKi9cbi5pbmZvLWJhbmRfX2Jsb2NrIHtcblxuXHRtaW4td2lkdGg6IDA7XG59XG5cbi5pbmZvLWJhbmRfX3RpdGxlIHtcblxuXHRtYXJnaW46IDAgMCB2YXIoLS1zcGFjZS0zKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWg0KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtaGVhZGluZyk7XG59XG5cbi5pbmZvLWJhbmRfX3RleHQge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG4uaW5mby1iYW5kIC5zZWN0aW9uLWxpbmsge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtMyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDU2MHB4ICkge1xuXG4uaW5mby1iYW5kIHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KCAwLCAxZnIgKTtcblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGlubGluZS1mb3JtXG4vL1xuLy8gUG9ydGVkIGZyb20gY2F0YWxvZ3VlIGJsb2NrIGBpbmxpbmUtZm9ybWAgKGRlc2lnbiBvZiByZWNvcmQ6IE1QRzQgKGZvcm0gc3BlY2ltZW4pLCBvcGVyYXRvci1hY2NlcHRlZFxuLy8gMjAyNi0wOS0yNCkgZm9yIHRoZSBiYXNrZXQgd2FsaywgTVBHMTAuIFRoZSBjYXRhbG9ndWUgcm93IGlzIHRoZSBkZXNpZ247IHRoaXMgaXNcbi8vIHdoYXQgc2hpcHBlZC4gRGVwYXJ0dXJlcyBmcm9tIGl0IGFyZSBjb21tZW50ZWQgd2hlcmUgdGhleSBvY2N1ci5cblxuLmlubGluZS1mb3JtIHtcblxuXHRtYXJnaW46IHZhcigtLXNwYWNlLTYpIDAgMDtcbn1cblxuLmlubGluZS1mb3JtX19yb3cge1xuXG5cdGRpc3BsYXk6IGdyaWQ7XG5cdGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KCAwLCAxOHJlbSApIG1pbm1heCggMCwgMjJyZW0gKSBhdXRvO1xuXHRnYXA6IHZhcigtLXNwYWNlLTQpO1xuXHRhbGlnbi1pdGVtczogZW5kO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xufVxuXG4vKiAtLXNpbmdsZTogb25lIGZpZWxkIGFuZCBpdHMgYnV0dG9uLCB0aGUgZmllbGQgdGFraW5nIHRoZSB3aWR0aCDigJQgYSBzZWFyY2ggYm94IGluXG4gICBhIDMyOHB4IHNpZGViYXIgKE1QRzE1IHdhbGstYmFjaykgY2Fubm90IGhvbGQgdGhlIHRocmVlLWNvbHVtbiByb3cuIEl0IHN0YW5kc1xuICAgYWxvbmUgaW4gaXRzIHBhbmVsLCBzbyBpdCB0YWtlcyBubyB0b3AgbWFyZ2luLiAqL1xuLmlubGluZS1mb3JtLS1zaW5nbGUge1xuXG5cdG1hcmdpbjogMDtcbn1cblxuLmlubGluZS1mb3JtLS1zaW5nbGUgLmlubGluZS1mb3JtX19yb3cge1xuXG5cdGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KCAwLCAxZnIgKSBhdXRvO1xuXHRnYXA6IHZhcigtLXNwYWNlLTMpO1xufVxuXG4vKiBUaGUgYnV0dG9uJ3Mgb3duIHBhZGRpbmcgZ2l2ZXMgYmFjayB0aGUgdHdvIHBpeGVscyB0aGUgaW5wdXRzIHNwZW5kIG9uIHRoZWlyXG4gICBib3JkZXJzLCBzbyB0aGUgcm93IHJlYWRzIGFzIG9uZSBoZWlnaHQuICovXG4uaW5saW5lLWZvcm1fX2FjdGlvbiAuYnRuIHtcblxuXHRwYWRkaW5nLWJsb2NrOiBjYWxjKCB2YXIoLS1zcGFjZS0zKSArIDFweCApO1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDkwMHB4ICkge1xuXG5cdC5pbmxpbmUtZm9ybV9fcm93IHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KCAwLCAxZnIgKSBtaW5tYXgoIDAsIDFmciApIGF1dG87XG5cdH1cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuaW5saW5lLWZvcm1fX3JvdyB7XG5cblx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCggMCwgMWZyICk7XG5cdFx0YWxpZ24taXRlbXM6IHN0cmV0Y2g7XG5cdFx0Z2FwOiB2YXIoLS1zcGFjZS02KTtcblx0fVxuXG5cdC5pbmxpbmUtZm9ybV9fYWN0aW9uIC5idG4ge1xuXG5cdFx0d2lkdGg6IDEwMCU7XG5cdH1cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBsZWFkLXN0b3J5XG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE1hZ2F6aW5lIFNlY3Rpb24gTGFuZGluZyBtb2NrdXAgKGRlc2lnbiBvZiByZWNvcmQ6IE1QRzE1LCBvcGVyYXRvci1cbi8vIGFwcHJvdmVkIDIwMjYtMDktMjgpIGZvciB0aGUgc2VjdGlvbiBsYW5kaW5nIHdhbGssIE1QRzE1LiBUaGUgbW9ja3VwJ3MgcnVsZXMgYXJlIHRoZVxuLy8gZGVzaWduOyB0aGlzIGlzIHdoYXQgc2hpcHBlZC4gRGVwYXJ0dXJlcyBmcm9tIGl0IGFyZSBjb21tZW50ZWQgd2hlcmUgdGhleSBvY2N1ci5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgbGVhZC1zdG9yeSAgKFJFVVNFRCwgdmVyYmF0aW0g4oCUIHBsdXMgb25lIE5FVyBtb2RpZmllciwgLS1zcGxpdClcbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4ubGVhZC1zdG9yeSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0aGVpZ2h0OiAxMDAlO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jYXJkKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHRib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctY2FyZCk7XG5cbn1cblxuLmxlYWQtc3RvcnlfX21lZGlhIHtcblxuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdGRpc3BsYXk6IGJsb2NrO1xuXHRmbGV4OiAxIDAgYXV0bztcblx0YXNwZWN0LXJhdGlvOiAxNiAvIDk7XG5cbn1cblxuLmxlYWQtc3RvcnlfX21lZGlhIGltZyB7XG5cblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRpbnNldDogMDtcblx0ZGlzcGxheTogYmxvY2s7XG5cdHdpZHRoOiAxMDAlO1xuXHRoZWlnaHQ6IDEwMCU7XG5cdG9iamVjdC1maXQ6IGNvdmVyO1xuXG59XG5cbi5sZWFkLXN0b3J5X19ib2R5IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS1jYXJkLXBhZGRpbmcpO1xuXG59XG5cbi5sZWFkLXN0b3J5X19raWNrZXIge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWV5ZWJyb3cpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IDE7XG5cdGxldHRlci1zcGFjaW5nOiAwLjEyZW07XG5cdHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJyYW5kKTtcblxufVxuXG4ubGVhZC1zdG9yeV9fdGl0bGUge1xuXG5cdG1hcmdpbjogdmFyKC0tc3BhY2UtMykgMCAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDIpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbGlnaHQpO1xuXHRmb250LXN0eWxlOiBpdGFsaWM7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblxufVxuXG4ubGVhZC1zdG9yeV9fdGl0bGUgYSB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xuXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cbn1cblxuLmxlYWQtc3RvcnlfX3RpdGxlIGE6aG92ZXIge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmstaG92ZXIpO1xuXG59XG5cbi5sZWFkLXN0b3J5X19zdGFuZGZpcnN0IHtcblxuXHRtYXgtd2lkdGg6IHZhcigtLWNvbnRhaW5lci1yZWFkaW5nKTtcblx0bWFyZ2luOiB2YXIoLS1zcGFjZS00KSAwIDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5LWxnKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LWxpZ2h0KTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblxufVxuXG4ubGVhZC1zdG9yeV9fbWV0YSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiB2YXIoLS1zcGFjZS00KTtcblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS02KTtcblx0cGFkZGluZy1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtNik7XG5cdGJvcmRlci1ibG9jay1zdGFydDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcblxufVxuXG4ubGVhZC1zdG9yeV9fYnlsaW5lIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLTEpO1xuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblxufVxuXG4ubGVhZC1zdG9yeV9fYXV0aG9yIHtcblxuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblxufVxuXG4ubGVhZC1zdG9yeV9fZGF0ZSB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuXG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LmxlYWQtc3RvcnlfX3RpdGxlIHtcblxuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDMpO1xuXG5cdH1cblxuXHQubGVhZC1zdG9yeV9fc3RhbmRmaXJzdCB7XG5cblx0XHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXG5cdH1cbn1cblxuLmxlYWQtc3RvcnktLXNwbGl0IHtcblxuXHRmbGV4LWRpcmVjdGlvbjogcm93O1xuXG59XG5cbi5sZWFkLXN0b3J5LS1zcGxpdCAubGVhZC1zdG9yeV9fbWVkaWEge1xuXG5cdGZsZXg6IDAgMCA1MCU7XG5cdGFzcGVjdC1yYXRpbzogYXV0bztcblx0bWluLWhlaWdodDogMzAwcHg7XG5cbn1cblxuLmxlYWQtc3RvcnktLXNwbGl0IC5sZWFkLXN0b3J5X19ib2R5IHtcblxuXHRmbGV4OiAxIDEgYXV0bztcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA5MDBweCApIHtcblxuXHQubGVhZC1zdG9yeS0tc3BsaXQge1xuXG5cdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblxuXHR9XG5cblx0LmxlYWQtc3RvcnktLXNwbGl0IC5sZWFkLXN0b3J5X19tZWRpYSB7XG5cblx0XHRmbGV4OiAxIDAgYXV0bztcblx0XHRhc3BlY3QtcmF0aW86IDE2IC8gOTtcblx0XHRtaW4taGVpZ2h0OiAwO1xuXG5cdH1cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBsaXN0aW5nLXRvb2xiYXJcbi8vXG4vLyBUaGUgcm93IGFib3ZlIGEgcHJvZHVjdCBncmlkOiB0aGUgcmVzdWx0IGNvdW50IG9uIHRoZSBsZWZ0LCB0aGUgc29ydCBzZWxlY3Rcbi8vIGFuZCB0aGUgdHdvLWNvbnRyb2wgdmlldyB0b2dnbGUgb24gdGhlIHJpZ2h0LCBhbmQgYmVuZWF0aCB0aGVtIHRoZSBzdG9yZSdzXG4vLyBsaXZlIGRpc3BhdGNoIGxpbmUg4oCUIGNvdW50aW5nIGRvd24gdG8gdGhlIDJwbSBjdXQtb2ZmLCBhbmQgYWZ0ZXIgaXQgcmVhZGluZ1xuLy8gJ09yZGVyZWQgdG9kYXksIGRpc3BhdGNoZWQgdG9tb3Jyb3cnLiBUaGUgc2FtZSBzbG90LCBuZXZlciBlbXB0eSwgbmV2ZXIgYVxuLy8gY291bnRkb3duIHRvIG5vdGhpbmcuXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYGxpc3RpbmctdG9vbGJhcmAuIFBvcnRlZCBmb3IgdGhlIE1QRzcgY2F0ZWdvcnktYXJjaGl2ZSB3YWxrLCAyMDI2LTA5LTE2LlxuLy8gUmVjb25jaWxlZCBhZ2FpbnN0IHRoZSBNUEc3IG1vY2t1cCdzIG93biBzdHlsZXNoZWV0OiBieXRlLWlkZW50aWNhbCwgbm8gZGVwYXJ0dXJlcy5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgbGlzdGluZy10b29sYmFyICAoTkVXKVxuICAgVGhlIHJvdyBhYm92ZSB0aGUgZ3JpZDogd2hhdCB5b3UgYXJlIGxvb2tpbmcgYXQgb24gdGhlIGxlZnQsIGhvdyBpdCBpc1xuICAgb3JkZXJlZCBhbmQgaG93IGl0IGlzIGxhaWQgb3V0IG9uIHRoZSByaWdodC5cblxuICAgQmVuZWF0aCBpdCwgcXVpZXQgYW5kIGxlZnQtYWxpZ25lZCwgdGhlIGRpc3BhdGNoIGxpbmUuIFRoZSBzdG9yZSdzIHJlYWwgdGVybVxuICAgaXMgMnBtIE1vbmRheSB0byBGcmlkYXksIHNvIGJlZm9yZSB0aGUgY3V0LW9mZiBpdCBjb3VudHMgdGhlIHRpbWUgbGVmdCBhbmRcbiAgIGFmdGVyIGl0IHJlYWRzICdPcmRlcmVkIHRvZGF5LCBkaXNwYXRjaGVkIHRvbW9ycm93JyDigJQgdGhlIHNhbWUgc2xvdCwgbmV2ZXJcbiAgIGVtcHR5LCBuZXZlciBhIGNvdW50ZG93biB0byBub3RoaW5nLlxuXG4gICBUaGUgc29ydCBjb250cm9sIGlzIHRoZSBicmFuZCdzIHN0YW5kYXJkIHNlbGVjdCwgZ2l2ZW4gYW4gYXV0byB3aWR0aDsgdGhlXG4gICB2aWV3IHRvZ2dsZSBpcyB0d28gc3F1YXJlIGNvbnRyb2xzIHdpdGggdGhlIGN1cnJlbnQgb25lIGZpbGxlZCwgYmVjYXVzZVxuICAgdGhpcyBicmFuZCBvZmZlcnMgYm90aCBsYXlvdXRzIGFuZCB0aGUgc2hvcHBlciBjaG9vc2VzLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi5saXN0aW5nLXRvb2xiYXIge1xuXG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTQpIHZhcigtLXNwYWNlLTYpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0Ym94LXNoYWRvdzogdmFyKC0tc2hhZG93LXBhbmVsKTtcbn1cblxuLmxpc3RpbmctdG9vbGJhcl9fcm93IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LXdyYXA6IHdyYXA7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjtcblx0Z2FwOiB2YXIoLS1zcGFjZS00KTtcbn1cblxuLmxpc3RpbmctdG9vbGJhcl9fY291bnQge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG59XG5cbi5saXN0aW5nLXRvb2xiYXJfX2NvbnRyb2xzIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LXdyYXA6IHdyYXA7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG59XG5cbi5saXN0aW5nLXRvb2xiYXJfX2xhYmVsIHtcblxuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1oZWFkaW5nKTtcbn1cblxuLyogVGhlIHNvcnQgY29udHJvbCBhcnJpdmVzIGluc2lkZSBXb29Db21tZXJjZSdzIG93biBmb3JtLCB3aGljaCBpcyB3aGF0IGNhcnJpZXNcbiAgIHRoZSBhY3RpdmUgZmlsdGVycyB0aHJvdWdoIGEgc29ydCBhcyBoaWRkZW4gaW5wdXRzLiBUaGUgZm9ybSBpcyB0aGUgZmxleCBpdGVtXG4gICBhbmQgaGFzIG5vIGFwcGVhcmFuY2Ugb2YgaXRzIG93biDigJQgdGhpcyBvbmx5IHN0b3BzIGEgbWFyZ2luIGFycml2aW5nIGZyb20gdGhlXG4gICBwbGF0Zm9ybSdzIHN0eWxlc2hlZXQgYW5kIHB1c2hpbmcgdGhlIHNlbGVjdCBvdXQgb2YgdGhlIHJvdy4gKi9cbi5saXN0aW5nLXRvb2xiYXJfX29yZGVyaW5nIHtcblxuXHRtYXJnaW46IDA7XG59XG5cbi5saXN0aW5nLXRvb2xiYXJfX3NlbGVjdCB7XG5cblx0d2lkdGg6IGF1dG87XG5cdG1pbi13aWR0aDogMjEwcHg7XG5cdHBhZGRpbmctYmxvY2s6IHZhcigtLXNwYWNlLTIpO1xufVxuXG4ubGlzdGluZy10b29sYmFyX192aWV3cyB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKTtcblx0bWFyZ2luLWlubGluZS1zdGFydDogdmFyKC0tc3BhY2UtMik7XG59XG5cbi5saXN0aW5nLXRvb2xiYXJfX3ZpZXcge1xuXG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0d2lkdGg6IDQwcHg7XG5cdGhlaWdodDogNDBweDtcblx0cGFkZGluZzogMDtcblx0Ym9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtYnRuKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG5cdGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmxpc3RpbmctdG9vbGJhcl9fdmlldyBzdmcge1xuXG5cdHdpZHRoOiAxOHB4O1xuXHRoZWlnaHQ6IDE4cHg7XG59XG5cbi5saXN0aW5nLXRvb2xiYXJfX3ZpZXc6aG92ZXIge1xuXG5cdGJvcmRlci1jb2xvcjogdmFyKC0tYm9yZGVyLWJyYW5kKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2FyZC1ob3Zlcik7XG59XG5cbi5saXN0aW5nLXRvb2xiYXJfX3ZpZXctLWN1cnJlbnQge1xuXG5cdGJvcmRlci1jb2xvcjogdmFyKC0tYnRuLXByaW1hcnktYmcpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1idG4tcHJpbWFyeS1iZyk7XG5cdGNvbG9yOiB2YXIoLS1idG4tcHJpbWFyeS10ZXh0KTtcbn1cblxuLmxpc3RpbmctdG9vbGJhcl9fdmlldy0tY3VycmVudDpob3ZlciB7XG5cblx0Ym9yZGVyLWNvbG9yOiB2YXIoLS1idG4tcHJpbWFyeS1iZy1ob3Zlcik7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJ0bi1wcmltYXJ5LWJnLWhvdmVyKTtcblx0Y29sb3I6IHZhcigtLWJ0bi1wcmltYXJ5LXRleHQpO1xufVxuXG4ubGlzdGluZy10b29sYmFyX19kaXNwYXRjaCB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKTtcblx0bWFyZ2luOiB2YXIoLS1zcGFjZS00KSAwIDA7XG5cdHBhZGRpbmctYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTQpO1xuXHRib3JkZXItYmxvY2stc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG59XG5cbi5saXN0aW5nLXRvb2xiYXJfX2Rpc3BhdGNoIHN2ZyB7XG5cblx0ZmxleDogMCAwIGF1dG87XG5cdHdpZHRoOiAxNnB4O1xuXHRoZWlnaHQ6IDE2cHg7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJyYW5kKTtcbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQubGlzdGluZy10b29sYmFyX19jb250cm9scyB7XG5cblx0XHR3aWR0aDogMTAwJTtcblx0fVxuXG5cdC5saXN0aW5nLXRvb2xiYXJfX3NlbGVjdCB7XG5cblx0XHRmbGV4OiAxIDEgYXV0bztcblx0XHRtaW4td2lkdGg6IDA7XG5cdH1cblxuXHQubGlzdGluZy10b29sYmFyX192aWV3cyB7XG5cblx0XHRtYXJnaW4taW5saW5lLXN0YXJ0OiAwO1xuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgbG95YWx0eS1jYXJkXG4vL1xuLy8gVGhlIHBvaW50cyBhIHB1cmNoYXNlIGVhcm5zLCBhcyBpdHMgb3duIGNhcmQgb24gdGhlIG9wZW4gZ3JvdW5kIGJlc2lkZSB0aGVcbi8vIHBheS1sYXRlciBjYXJkLiBJdCBrZWVwcyB0aGUgYnJhbmQncyBvbmUgbGFiZWxsZWQtcGFuZWwgdHJlYXRtZW50IOKAlCBhXG4vLyBzb2xpZC1jb2xvdXIgY2FyZCB3b3VsZCBiZSBhIHNlY29uZCBvbmUg4oCUIHNvIHRoZSB3ZWlnaHQgY29tZXMgZnJvbSB0aGUgc2l6ZVxuLy8gb2YgdGhlIGZpZ3VyZSwgc2V0IGluIHRoZSBjb21tZXJjZSBmYWNlIGF0IGgyIGFuZCBpbiBibGFjaywgYmVjYXVzZSBibHVlIGF0XG4vLyB0aGF0IHNpemUgcmVhZHMgYXMgYSBsaW5rIGFuZCB0aGUgdGl0bGUgYmFyIGlzIGFscmVhZHkgYmx1ZS5cbi8vXG4vLyBTb3VyY2U6IGNhdGFsb2d1ZSBibG9jayBgbG95YWx0eS1jYXJkYC4gUG9ydGVkIGZvciB0aGUgTVBHOSBwcm9kdWN0LXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLyogVGhlIGxveWFsdHkgY2xhaW0sIGdpdmVuIHRoZSB3ZWlnaHQgdGhlIG9wZXJhdG9yIGFza2VkIGZvci4gSXQga2VlcHMgdGhlXG4gICBicmFuZCdzIG9uZSBsYWJlbGxlZC1wYW5lbCB0cmVhdG1lbnQgcmF0aGVyIHRoYW4gaW52ZW50aW5nIGEgc2Vjb25kIHN1cmZhY2Ug4oCUXG4gICB0aGUgaW1wYWN0IGlzIGluIHRoZSBzaXplIG9mIHRoZSBmaWd1cmUsIHdoaWNoIGlzIHNldCBpbiB0aGUgY29tbWVyY2UgZmFjZSBhdFxuICAgaDIsIG1hdGNoaW5nIHRoZSBwYXktbGF0ZXIgY2FyZCBvcHBvc2l0ZSBzbyB0aGUgdHdvIGFyZSB0aGUgc2FtZSBoZWlnaHQuICovXG4ubG95YWx0eS1jYXJkX19ib2R5IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTQpO1xufVxuXG4ubG95YWx0eS1jYXJkX19pY29uIHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0d2lkdGg6IDQ0cHg7XG5cdGhlaWdodDogNDRweDtcblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xufVxuXG4ubG95YWx0eS1jYXJkX19pY29uIHN2ZyB7XG5cblx0d2lkdGg6IDEwMCU7XG5cdGhlaWdodDogMTAwJTtcbn1cblxuLyogVGhlIGZpZ3VyZXMgYmVzaWRlIHRoZSBpY29uLiBBIGZsZXggaXRlbSdzIGRlZmF1bHQgbWluaW11bSBpcyBpdHMgbG9uZ2VzdCB3b3JkLFxuICAgYW5kIHRoZSBjYXJkIHNpdHMgaW4gYSA0NzZweCBoYWxmIG9mIHRoZSBoZXJvIOKAlCB0aGUgZmxvb3IgbGV0cyB0aGUgd29yZGluZyB1bmRlclxuICAgdGhlIGZpZ3VyZSB3cmFwIGluc3RlYWQgb2YgcHVzaGluZyB0aGUgaWNvbiBvdXQgb2YgdGhlIHJvdy4gKi9cbi5sb3lhbHR5LWNhcmRfX2ZpZ3VyZXMge1xuXG5cdG1pbi13aWR0aDogMDtcbn1cblxuLmxveWFsdHktY2FyZF9fcG9pbnRzIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWNocm9tZSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDIpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctYm9sZCk7XG5cdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHQvKiBCbGFjaywgbm90IGJyYW5kIGJsdWUg4oCUIG9wZXJhdG9yLCAyMDI2LTA5LTE1LiBUaGUgYmx1ZSByZWFkIGFzIGEgbGluayBhdFxuXHQgICB0aGF0IHNpemUgYW5kIHRoZSBjYXJkIGFscmVhZHkgaGFzIGJsdWUgb24gaXRzIHRpdGxlIGJhci4gKi9cblx0Y29sb3I6IHZhcigtLXRleHQtaGVhZGluZyk7XG59XG5cbi5sb3lhbHR5LWNhcmRfX3dvcnRoIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS0xKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG4vKiBCb3RoIGNhcmRzIGNhcnJ5IGEgdHJhaWxpbmcgbGluaywgd2hpY2ggaXMgd2hhdCBtYWtlcyB0aGVtIHRoZSBzYW1lIGhlaWdodCDigJRcbiAgIGFuZCB0aGF0IGlzIHRoZSBvbmx5IHdheSB0d28gY2FyZHMgYm90dG9tLWFsaWduZWQgY2FuIGFsc28gbGluZSB1cCBhbG9uZyB0aGVcbiAgIHRvcC4gQm90dG9tLWFsaWduaW5nIGFsb25lIHB1dCB0aGVpciB0aXRsZSBiYXJzIDM2cHggYXBhcnQsIHdoaWNoIHJlYWRzIHdvcnNlXG4gICB0aGFuIHRoZSAxNHB4IGl0IHdhcyBtZWFudCB0byBmaXgsIGJlY2F1c2UgdGhlIGV5ZSBmb2xsb3dzIHRoZSBibHVlIGJhciBhbmRcbiAgIG5vdCB0aGUgZm9vdCBvZiB0aGUgY2FyZC4gKi9cbi5wYXlsYXRlci1jYXJkIC5zZWN0aW9uLWxpbmssXG4ubG95YWx0eS1jYXJkIC5zZWN0aW9uLWxpbmsge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtNCk7XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgbWVkaWEtZmlndXJlXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE1hZ2F6aW5lIEFydGljbGUgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxNiwgb3BlcmF0b3ItYXBwcm92ZWRcbi8vIDIwMjYtMDktMjgpIGZvciB0aGUgYXJ0aWNsZSB3YWxrLCBNUEcxNi4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIEJMT0NLIOKAlCBtZWRpYS1maWd1cmUgKE5FVykgKi9cblxuLm1lZGlhLWZpZ3VyZSB7XG5cblx0bWFyZ2luOiB2YXIoLS1zcGFjZS04KSAwIDA7XG5cbn1cblxuLm1lZGlhLWZpZ3VyZS0tYmxlZWQge1xuXG5cdG1hcmdpbi1pbmxpbmU6IGNhbGMoIC0xICogdmFyKC0tc3BhY2UtY2FyZC1wYWRkaW5nKSApO1xuXG59XG5cbi5tZWRpYS1maWd1cmVfX21lZGlhIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdGhlaWdodDogYXV0bztcblx0Ym9yZGVyLWJsb2NrOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xuXG59XG5cbi8vIERFUEFSVFVSRTogdGhlIG1vY2t1cCBmaXhlZCB0aGUgZnJhbWUgYXQgMTIwMCAvIDQyMCBhbmQgbGV0dGVyYm94ZWQgaW50byBpdCxcbi8vIHdoaWNoIHN1aXRlZCBpdHMgcGxhY2Vob2xkZXIgYXJ0LiBSZWFsIGluLWJvZHkgaW1hZ2VzIGFyZSBtb3N0bHkgMTY6OVxuLy8gc2NyZWVuc2hvdHMgYW5kIHNhdCBzaHJ1bmsgaW4gYSBncmV5IHN0cmlwOyB0aGV5IG5vdyB0YWtlIHRoZWlyIG5hdHVyYWwgaGVpZ2h0LFxuLy8gdGhlIG9wZXJhdG9yJ3MgcnVsZSBmb3IgaW1hZ2VzIGluIHJ1bm5pbmcgY29weSAoMjAyNi0wOS0yOCkuIFdpcmluZyB3YWxrLWJhY2ssXG4vLyBNUEcxNiBQYXNzIDIuXG5cbi5tZWRpYS1maWd1cmVfX2NhcHRpb24ge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtMyk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG5cbn1cblxuLm1lZGlhLWZpZ3VyZS0tYmxlZWQgLm1lZGlhLWZpZ3VyZV9fY2FwdGlvbiB7XG5cblx0cGFkZGluZy1pbmxpbmU6IHZhcigtLXNwYWNlLWNhcmQtcGFkZGluZyk7XG5cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBvcmRlci1jbG9zZVxuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBvcmRlciBjb25maXJtYXRpb24gbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxMiwgb3BlcmF0b3ItYWNjZXB0ZWRcbi8vIDIwMjYtMDktMjQpIGZvciB0aGUgY29uZmlybWF0aW9uIHdhbGssIE1QRzEyLiBUaGUgbW9ja3VwJ3MgcnVsZXMgYXJlIHRoZSBkZXNpZ247IHRoaXMgaXNcbi8vIHdoYXQgc2hpcHBlZC4gRGVwYXJ0dXJlcyBmcm9tIGl0IGFyZSBjb21tZW50ZWQgd2hlcmUgdGhleSBvY2N1ci5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgb3JkZXItY2xvc2UgIChFWFRFTkRFRCBvbiB0aGUgc2Vjb25kIHJldmlldywgbWFya3VwIG9ubHkpXG4gICBPbmUgcXVpZXQgbGluZSBvZiBoZWxwIGxpbmtzIOKAlCBwbGFpbiBzZWN0aW9uLWxpbmtzLCB0aGUgYnJhbmQncyB0cmFpbGluZ1xuICAgbGluay4gVGhlIHRyYWlsaW5nIGJ1dHRvbiBzbG90IGlzIG5vdyBvcHRpb25hbDogb24gdGhlIGNvbmZpcm1hdGlvbixcbiAgIENvbnRpbnVlIFNob3BwaW5nIG1vdmVkIHRvIHRoZSBmb290IG9mIENvbXBsZXRlIFlvdXIgU2V0dXAsIHNvIHRoZSByb3cgaGVyZVxuICAgY2FycmllcyB0aGUgbGlua3MgYWxvbmUuIFRoZSBDU1MgaXMgdW5jaGFuZ2VkOyB3aXRoIG5vIGJ1dHRvbiB0aGUgcm93J3NcbiAgIHNwYWNlLWJldHdlZW4gc2ltcGx5IGxlYXZlcyB0aGUgbGlua3Mgb24gdGhlIGxlZnQuIE5vdCBhIGJhbmQgYW5kIG5vdCBhIHBhbmVsOiB0aGUgZGVzaWduIGJyaWVmIGxldHNcbiAgIHRoZSBjYW52YXMgY2FycnkgdGhlIHNtYWxsIHRyYWlsaW5nIGxpbmtzIHRoYXQgZm9sbG93IGEgYmFuZCwgYW5kIHRoaXMgaXNcbiAgIGV4YWN0bHkgdGhhdC4gVGhlIHNlY3Rpb24tbGluaydzIG93biB0b3AgbWFyZ2luIGlzIGhhbmRlZCBiYWNrIHRvIHRoZSByb3cuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi5vcmRlci1jbG9zZSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC13cmFwOiB3cmFwO1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cdGdhcDogdmFyKC0tc3BhY2UtNCkgdmFyKC0tc3BhY2UtOCk7XG59XG5cbi5vcmRlci1jbG9zZV9fbGlua3Mge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtd3JhcDogd3JhcDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKSB2YXIoLS1zcGFjZS04KTtcblx0bWFyZ2luOiAwO1xuXHRwYWRkaW5nOiAwO1xuXHRsaXN0LXN0eWxlOiBub25lO1xufVxuXG4ub3JkZXItY2xvc2VfX2xpbmtzIC5zZWN0aW9uLWxpbmsge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogMDtcbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQub3JkZXItY2xvc2Uge1xuXG5cdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0XHRhbGlnbi1pdGVtczogc3RyZXRjaDtcblx0XHRnYXA6IHZhcigtLXNwYWNlLTYpO1xuXHR9XG5cblx0Lm9yZGVyLWNsb3NlX19saW5rcyB7XG5cblx0XHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRcdGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuXHRcdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdH1cblxuXHQub3JkZXItY2xvc2UgLmJ0biB7XG5cblx0XHR3aWR0aDogMTAwJTtcblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIG9yZGVyLWxheW91dFxuLy9cbi8vIFRoZSBvcmRlciBmdW5uZWwncyB0d28tY29sdW1uIGxheW91dDogdGhlIG9yZGVyIG9uIHRoZSBsZWZ0LCBhIHN0aWNreSBzdW1tYXJ5IG9uXG4vLyB0aGUgcmlnaHQuIFNoYXJlZCBieSB0aGUgYmFza2V0LCBjaGVja291dCBhbmQgb3JkZXIgY29uZmlybWF0aW9uLiBQb3J0ZWQgZnJvbSB0aGVcbi8vIGJhc2tldCBtb2NrdXAncyBwYWdlLWxldmVsIGBiYXNrZXQtcmVnaW9uYCAoTVBHMTAsIGFjY2VwdGVkIDIwMjYtMDktMjQpLCByZW5hbWVkXG4vLyBiZWNhdXNlIHRocmVlIHBhZ2VzIHVzZSBpdC5cbi8vXG4vLyBUaGUgcHJvZHVjdCBwYWdlJ3Mgc2V2ZW4tY29sdW1uIGdyaWQsIHJldXNlZCBzbyB0aGUgZnVubmVsJ3MgcmlnaHQtaGFuZCBlZGdlIGxpbmVzXG4vLyB1cCB3aXRoIHRoZSBzdG9yZSdzOiBmaXZlIGNvbHVtbnMgb2Ygb3JkZXIgKDk5NHB4IGF0IHRoZSAxNDAwIGNvbHVtbiksIHR3byBvZlxuLy8gc3VtbWFyeSAoMzg2cHgpIOKAlCB0aGUgd2lkdGggdGhlIHByb2R1Y3QgcGFnZSBnaXZlcyBpdHMgYnV5IGJveC4gYGFsaWduLWl0ZW1zOlxuLy8gc3RhcnRgIGlzIHdoYXQgbGV0cyB0aGUgYXNpZGUgc3RpY2suXG4vL1xuLy8gQk9USCBDT0xVTU5TIFNUQVJUIE9OIE9ORSBMSU5FLiBFYWNoIGNvbHVtbiBvd25zIHRoZSBzcGFjaW5nIGJldHdlZW4gaXRzIHBhbmVscywgc29cbi8vIGV2ZXJ5IGNoaWxkJ3Mgb3duIGJsb2NrIG1hcmdpbnMgYXJlIHplcm9lZCBmaXJzdCDigJQgYSBwYW5lbCB3aG9zZSBtYXJrdXAgaXMgYSA8cD5cbi8vIG90aGVyd2lzZSBrZWVwcyB0aGUgYnJvd3NlcidzIDE2cHggdG9wIG1hcmdpbiBhbmQgc2l0cyBiZWxvdyBpdHMgbmVpZ2hib3VyLlxuXG4ub3JkZXItbGF5b3V0IHtcblxuXHRkaXNwbGF5OiBncmlkO1xuXHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCggNywgbWlubWF4KCAwLCAxZnIgKSApO1xuXHRhbGlnbi1pdGVtczogc3RhcnQ7XG5cdGdhcDogdmFyKC0tZ3V0dGVyLXNtYWxsKTtcbn1cblxuLm9yZGVyLWxheW91dF9fbWFpbiB7XG5cblx0Z3JpZC1jb2x1bW46IHNwYW4gNTtcbn1cblxuLm9yZGVyLWxheW91dF9fYXNpZGUge1xuXG5cdHBvc2l0aW9uOiBzdGlja3k7XG5cdHRvcDogdmFyKC0tc3BhY2UtNik7XG5cdGdyaWQtY29sdW1uOiBzcGFuIDI7XG59XG5cbi8qIEVhY2ggY29sdW1uIHN0YWNrcyBpdHMgcGFuZWxzIHdpdGggYSBmbGV4IEdBUCwgbm90IGEgYD4gKiArICpgIG1hcmdpbiAoY2hhbmdlZCBmb3JcbiAgIHRoZSBjaGVja291dCB3YWxrLCBNUEcxMSk6IHRoZSBjaGVja291dCdzIG1haW4gY29sdW1uIG9wZW5zIHdpdGggdGhlIHBob25lLW9ubHlcbiAgIHN1bW1hcnkgdG9nZ2xlLCBhbmQgaGlkZGVuIGFib3ZlIHBob25lIHdpZHRoIGl0IHN0aWxsIGNvdW50ZWQgYXMgXCJhIHByZXZpb3VzXG4gICBzaWJsaW5nXCIsIHNvIHRoZSBmaXJzdCB2aXNpYmxlIHBhbmVsIHRvb2sgdGhlIGdhcCBhbmQgc2F0IDMwcHggYmVsb3cgdGhlIHN1bW1hcnknc1xuICAgdG9wIGVkZ2UuIEEgZ2FwIGlzIG9ubHkgbGFpZCBiZXR3ZWVuIGJveGVzIHRoYXQgcmVuZGVyLiAqL1xuLm9yZGVyLWxheW91dF9fbWFpbixcbi5vcmRlci1sYXlvdXRfX2FzaWRlIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLWNvbnRlbnQtZ2FwKTtcbn1cblxuLm9yZGVyLWxheW91dF9fbWFpbiA+ICosXG4ub3JkZXItbGF5b3V0X19hc2lkZSA+ICoge1xuXG5cdG1hcmdpbi1ibG9jazogMDtcbn1cblxuLyogX19zdGFjazogYSBjb250YWluZXIgSU5TSURFIGEgY29sdW1uIHRoYXQgc3RhY2tzIHRoZSBjb2x1bW4ncyBwYW5lbHMg4oCUIHRoZSBiYXNrZXQnc1xuICAgY2FydCBmb3JtLiBXb29Db21tZXJjZSdzIGNhcnQgZm9ybSB3cmFwcyBldmVyeSBwYWNrYWdlIHBhbmVsLCBzbyB0aGUgY29sdW1uJ3Mgb3duXG4gICBzcGFjaW5nIHJlYWNoZXMgb25seSB0aGUgZm9ybSwgYW5kIHRoZSBwYW5lbHMgd291bGQgdG91Y2guIEFkZGVkIGJ5IHdhbGstYmFja1xuICAgZHVyaW5nIHRoZSBNUEcxMCBwYWNrYWdlcyBjb21wb3NpdGlvbiAoMjAyNi0wOS0yNCkuICovXG4ub3JkZXItbGF5b3V0X19zdGFjayB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0Z2FwOiB2YXIoLS1zcGFjZS1jb250ZW50LWdhcCk7XG59XG5cbi5vcmRlci1sYXlvdXRfX3N0YWNrID4gKiB7XG5cblx0bWFyZ2luLWJsb2NrOiAwO1xufVxuXG4vKiBUaGUgU21hcnQgQ291cG9ucyBwbHVnaW4gcmVzZXJ2ZXMgYSBzbG90IGF0IHRoZSB0b3Agb2YgdGhlIGNhcnQgZm9ybSBmb3IgaXRzIGNvdXBvblxuICAgbWVzc2FnZXMg4oCUIGEgd3JhcHBlciBob2xkaW5nIGFuIGVtcHR5IHBsYWNlaG9sZGVyIHdoZW5ldmVyIHRoZXJlIGlzIG5vIG1lc3NhZ2UuIEFzIGFcbiAgIGZsZXggaXRlbSBpdCBzdGlsbCB0b29rIGEgbGluZSBhbmQgYSBnYXAsIGRyb3BwaW5nIHRoZSBmaXJzdCBwYW5lbCA1MHB4IGJlbG93IHRoZVxuICAgc3VtbWFyeS4gSGlkZGVuIG9ubHkgd2hpbGUgaXQgaG9sZHMgbm90aGluZyBidXQgdGhlIHBsYWNlaG9sZGVyLCBzbyBhIHJlYWwgY291cG9uXG4gICBtZXNzYWdlIHN0aWxsIHNob3dzLiBPbmNlIGEgY291cG9uIGlzIGFwcGxpZWQgaXQgcmUtcmVuZGVycyB3aXRoIG5vIHBsYWNlaG9sZGVyIGF0XG4gICBhbGwg4oCUIG9ubHkgd2hpdGVzcGFjZSwgd2hpY2ggOmVtcHR5IGRvZXMgbm90IG1hdGNoIOKAlCBoZW5jZSB0aGUgc2Vjb25kIHNlbGVjdG9yLiAqL1xuLm9yZGVyLWxheW91dF9fc3RhY2sgPiAud2NfY291cG9uX21lc3NhZ2Vfd3JhcDpoYXMoID4gLm5vX3djX2NvdXBvbl9tZXNzYWdlOm9ubHktY2hpbGQgKSxcbi5vcmRlci1sYXlvdXRfX3N0YWNrID4gLndjX2NvdXBvbl9tZXNzYWdlX3dyYXA6bm90KCA6aGFzKCAqICkgKSB7XG5cblx0ZGlzcGxheTogbm9uZTtcbn1cblxuLyogV29vQ29tbWVyY2UncyBjaGVja291dCBzY3JpcHQgcHV0cyBpdHMgZXJyb3Igc3VtbWFyeSAoYW5kIGFueSB1cGRhdGUgbm90aWNlcykgYXQgdGhlXG4gICB0b3Agb2YgdGhlIGNoZWNrb3V0IGZvcm0g4oCUIHdoaWNoIGlzIHRoaXMgZ3JpZCDigJQgc28gd2l0aG91dCB0aGlzIGl0IGxhbmRzIGluIG9uZVxuICAgc2V2ZW50aC13aWRlIGNlbGwgYW5kIHB1c2hlcyBib3RoIGNvbHVtbnMgb3V0IG9mIHBsYWNlLiBJdCBzcGFucyB0aGUgZ3JpZCwgYWJvdmUgYm90aFxuICAgY29sdW1ucy4gKENoZWNrb3V0IHdpcmluZywgTVBHMTEuKSAqL1xuLm9yZGVyLWxheW91dCA+IC53b29jb21tZXJjZS1Ob3RpY2VHcm91cCB7XG5cblx0Z3JpZC1jb2x1bW46IDEgLyAtMTtcbn1cblxuLyogLS1zZXR0bGVkOiB0aGUgb3JkZXIgY29uZmlybWF0aW9uIChNUEcxMikuIFRoZSBvcmRlciBpcyBwbGFjZWQgYW5kIHRoZXJlIGlzIG5vIGJ1dHRvblxuICAgdG8ga2VlcCBpbiByZWFjaCwgc28gbm90aGluZyBzdGlja3M7IGFuZCBiZWxvdyAxMTAwIHRoZSBhc2lkZSDigJQgRGVsaXZlcmluZyBUbyDigJQgdGFrZXNcbiAgIHRoZSBmdWxsIHdpZHRoIHJhdGhlciB0aGFuIHRoZSBiYXNrZXQncyA0ODBweCByaWdodC1oYW5kIGNvbHVtbi4gKi9cbi5vcmRlci1sYXlvdXQtLXNldHRsZWQgLm9yZGVyLWxheW91dF9fYXNpZGUge1xuXG5cdHBvc2l0aW9uOiBzdGF0aWM7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogMTEwMHB4ICkge1xuXG5cdC5vcmRlci1sYXlvdXQtLXNldHRsZWQgLm9yZGVyLWxheW91dF9fYXNpZGUge1xuXG5cdFx0bWF4LXdpZHRoOiBub25lO1xuXHR9XG59XG5cbi8qIFRoZSBjaGVja291dCdzIHN1bW1hcnkgcGFuZWwgaXMgYSBib3JkZXJlZC1ncm91cCwgd2hvc2UgYG92ZXJmbG93OiBoaWRkZW5gIGNyb3BzIGl0c1xuICAgdGl0bGUgdG8gdGhlIGNhcmQgcmFkaXVzIOKAlCBhbmQgYWxzbyBtYWtlcyBpdCBhIHNjcm9sbCBjb250YWluZXIsIHdoaWNoIHNpbGVudGx5XG4gICBjYW5jZWxzIGFueSBgcG9zaXRpb246IHN0aWNreWAgaW5zaWRlIGl0OiB0aGUgcGF5bWVudCBtYXJrcyBwaW5uZWQgdG8gdGhlIHZpZXdwb3J0XG4gICBmb290IChvcmRlci10b3RhbHNfX2FjdGlvbi0tc3RpY2t5KSBzYXQgYXQgdGhlIHBhbmVsJ3MgZW5kIGluc3RlYWQuIGBjbGlwYCBjcm9wcyB0aGVcbiAgIHNhbWUgd2l0aG91dCBjcmVhdGluZyBhIHNjcm9sbCBjb250YWluZXIuICovXG4ub3JkZXItbGF5b3V0X19zdW1tYXJ5IHtcblxuXHRvdmVyZmxvdzogY2xpcDtcbn1cblxuLyogVGhlIGNoZWNrb3V0J3MgcGhvbmUgcGllY2UgKE1QRzExKTogX190b2dnbGUgaXMgdGhlIG9yZGVyIHN1bW1hcnkgZm9sZGVkIGludG8gYSBiYXJcbiAgIGFib3ZlIHRoZSBmb3JtLiBJdCBzdGFuZHMgZG93biB3aGlsZSB0aGUgc2lkZWJhciBkb2VzIGl0cyBqb2IsIGFuZCBhdCBwaG9uZSB3aWR0aFxuICAgX19zdW1tYXJ5IOKAlCB0aGUgc2lkZWJhcidzIHN1bW1hcnkgcGFuZWwg4oCUIHN0YW5kcyBkb3duIGZvciBpdC4gKi9cbi5vcmRlci1sYXlvdXRfX3RvZ2dsZSB7XG5cblx0ZGlzcGxheTogbm9uZTtcbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiAxMTAwcHggKSB7XG5cblx0Lm9yZGVyLWxheW91dCB7XG5cblx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCggMCwgMWZyICk7XG5cdH1cblxuXHQub3JkZXItbGF5b3V0X19tYWluLFxuXHQub3JkZXItbGF5b3V0X19hc2lkZSB7XG5cblx0XHRncmlkLWNvbHVtbjogMSAvIC0xO1xuXHR9XG5cblx0Lm9yZGVyLWxheW91dF9fYXNpZGUge1xuXG5cdFx0cG9zaXRpb246IHN0YXRpYztcblx0XHRtYXgtd2lkdGg6IDQ4MHB4O1xuXHRcdGp1c3RpZnktc2VsZjogZW5kO1xuXHRcdHdpZHRoOiAxMDAlO1xuXHR9XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0Lm9yZGVyLWxheW91dF9fYXNpZGUge1xuXG5cdFx0bWF4LXdpZHRoOiBub25lO1xuXHR9XG5cblx0Lm9yZGVyLWxheW91dF9fdG9nZ2xlIHtcblxuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXHR9XG5cblx0Lm9yZGVyLWxheW91dF9fc3VtbWFyeSB7XG5cblx0XHRkaXNwbGF5OiBub25lO1xuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgb3JkZXItbGluZXNcbi8vXG4vLyBQb3J0ZWQgZnJvbSB0aGUgY2hlY2tvdXQgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxMSwgb3BlcmF0b3ItYWNjZXB0ZWRcbi8vIDIwMjYtMDktMjMpIGZvciB0aGUgY2hlY2tvdXQgd2FsaywgTVBHMTEuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBvcmRlci1saW5lcyAgKE5FVylcbiAgIFdoYXQgaXMgaW4gdGhlIG9yZGVyLCBjb21wYWN0bHksIGdyb3VwZWQgYnkgcGFja2FnZSDigJQgdGhlIGNoZWNrb3V0XG4gICBzdW1tYXJ5J3MgY29udGVudHMgYWJvdmUgaXRzIHRvdGFscy4gRWFjaCBwYWNrYWdlIG9wZW5zIHdpdGggdGhlIGJhc2tldCdzXG4gICBvd24gcGFja2FnZS1oZWFkIGFuZCBjbG9zZXMgd2l0aCBpdHMgZGVsaXZlcnkgYXMgYW4gb3JkZXItdG90YWxzIHJvdywgc28gdGhlXG4gICB0aHJlZSBwYXJ0cyBhcmUgdGhlIGJhc2tldCdzIHZvY2FidWxhcnkgYXQgYSBzaWRlYmFyJ3Mgd2lkdGg7IHRoaXMgYmxvY2sgaXNcbiAgIG9ubHkgdGhlIGdyb3VwaW5nIGFuZCB0aGUgY29tcGFjdCBsaW5lLlxuXG4gICBBIGxpbmUgaXMgYSBzbWFsbCBtYW51ZmFjdHVyZXIgc2hvdCBvbiBhIGhhaXJsaW5lIHRpbGUgYXQgdGhlIHN1cmZhY2VcbiAgIHJhZGl1cywgdGhlIHRpdGxlIGluIHRoZSBjb21tZXJjZSBmYWNlIGF0IHRoZSBzbWFsbCBzaXplIGFuZCBuZXZlciBtb3JlXG4gICB0aGFuIHR3byBsaW5lcywgdGhlIHF1YW50aXR5LCBhbmQgdGhlIGxpbmUgdG90YWwgaW4gdGhlIGNvbW1lcmNlIGZhY2UuIEFcbiAgIHByZS1vcmRlciBsaW5lIGtlZXBzIGl0cyBtYXJrZXIsIHdpdGggdGhlIGJyYW5kLWJsdWUgZG90IHRoZSBiYXNrZXQgZ2l2ZXNcbiAgIGl0LiBUaGUgYmxvY2sgY2xvc2VzIG9uIGEgaGFpcmxpbmUsIHNvIHRoZSBncmFuZCB0b3RhbHMgYmVsb3cgaXQgc3RhcnRcbiAgIGNsZWFuLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4ub3JkZXItbGluZXMge1xuXG5cdG1hcmdpbjogMCAwIHZhcigtLXNwYWNlLTQpO1xuXHRwYWRkaW5nOiAwIDAgdmFyKC0tc3BhY2UtNik7XG5cdGxpc3Qtc3R5bGU6IG5vbmU7XG5cdGJvcmRlci1ibG9jay1lbmQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG59XG5cbi8qIFRoZSBjbG9zaW5nIGhhaXJsaW5lIHNlcGFyYXRlcyB0aGUgbGluZXMgZnJvbSB0aGUgdG90YWxzIEJFTE9XIHRoZW0uIFdoZXJlIG5vdGhpbmdcbiAgIGZvbGxvd3Mg4oCUIFRyYWNrIE9yZGVyIGxpc3RzIHRoZSBwYWNrYWdlcyBhbmQgc3RvcHMg4oCUIGl0IGNsb3NlZCB0aGUgcGFuZWwgb24gYSBzdHJheVxuICAgbGluZSwgc28gaXQgb25seSBkcmF3cyB3aGVuIHNvbWV0aGluZyBjb21lcyBhZnRlciAocmVmaW5lbWVudCBsaXN0LCAyMDI2LTA5LTI3KS4gKi9cbi5vcmRlci1saW5lczpsYXN0LWNoaWxkIHtcblxuXHRtYXJnaW4tYmxvY2stZW5kOiAwO1xuXHRwYWRkaW5nLWJsb2NrLWVuZDogMDtcblx0Ym9yZGVyLWJsb2NrLWVuZDogMDtcbn1cblxuLm9yZGVyLWxpbmVzX19wYWNrYWdlICsgLm9yZGVyLWxpbmVzX19wYWNrYWdlIHtcblxuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTYpO1xuXHRwYWRkaW5nLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS02KTtcblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xufVxuXG4ub3JkZXItbGluZXNfX2xpc3Qge1xuXG5cdG1hcmdpbjogdmFyKC0tc3BhY2UtNCkgMCB2YXIoLS1zcGFjZS0yKTtcblx0cGFkZGluZzogMDtcblx0bGlzdC1zdHlsZTogbm9uZTtcbn1cblxuLm9yZGVyLWxpbmVzX19pdGVtIHtcblxuXHRkaXNwbGF5OiBncmlkO1xuXHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDU2cHggbWlubWF4KCAwLCAxZnIgKSBhdXRvO1xuXHRhbGlnbi1pdGVtczogc3RhcnQ7XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG59XG5cbi5vcmRlci1saW5lc19faXRlbSArIC5vcmRlci1saW5lc19faXRlbSB7XG5cblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS0zKTtcbn1cblxuLm9yZGVyLWxpbmVzX19tZWRpYSB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTEpO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2FyZCk7XG59XG5cbi5vcmRlci1saW5lc19fbWVkaWEgaW1nIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdGFzcGVjdC1yYXRpbzogMSAvIDE7XG5cdG9iamVjdC1maXQ6IGNvbnRhaW47XG59XG5cbi5vcmRlci1saW5lc19faW5mbyB7XG5cblx0bWluLXdpZHRoOiAwO1xufVxuXG4ub3JkZXItbGluZXNfX3RpdGxlIHtcblxuXHRkaXNwbGF5OiAtd2Via2l0LWJveDtcblx0bWFyZ2luOiAwO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHQtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuXHQtd2Via2l0LWxpbmUtY2xhbXA6IDI7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1jaHJvbWUpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LWJvbGQpO1xuXHRmb250LXN0eWxlOiBpdGFsaWM7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtaGVhZGluZyk7XG59XG5cbi5vcmRlci1saW5lc19fbWV0YSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC13cmFwOiB3cmFwO1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTEpIHZhcigtLXNwYWNlLTMpO1xuXHRtYXJnaW46IHZhcigtLXNwYWNlLTEpIDAgMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbn1cblxuLm9yZGVyLWxpbmVzX19tYXJrZXIge1xuXG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG59XG5cbi5vcmRlci1saW5lc19fbWFya2VyOjpiZWZvcmUge1xuXG5cdGNvbnRlbnQ6IFwiXCI7XG5cdHdpZHRoOiA4cHg7XG5cdGhlaWdodDogOHB4O1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtcGlsbCk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWJyYW5kKTtcbn1cblxuLm9yZGVyLWxpbmVzX190b3RhbCB7XG5cblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtY2hyb21lKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LWJvbGQpO1xuXHRmb250LXN0eWxlOiBpdGFsaWM7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG5cdHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgb3JkZXItc3RhdHVzXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE15IEFjY291bnQgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxMykgZm9yIHRoZSBhY2NvdW50IHdhbGssXG4vLyBNUEcxMy4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzIHdoYXQgc2hpcHBlZC4gRGVwYXJ0dXJlcyBmcm9tIGl0IGFyZVxuLy8gY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIG9yZGVyLXN0YXR1cyAgKE5FVylcbiAgIEFuIG9yZGVyJ3Mgc3RhdHVzIGFzIGEgc21hbGwgaW5kaWNhdG9yOiBhIHJvdW5kIGRvdCDigJQgcm91bmQgaW5kaWNhdG9ycyB0YWtlXG4gICB0aGUgcGlsbCByYWRpdXMsIHBlciB0aGUgc2hhcGUgbGF3IOKAlCBhbmQgdGhlIHN0YXR1cyBuYW1lIGluIGJvZHkgdGV4dCBhdFxuICAgbWVkaXVtIHdlaWdodCwgaW5rLiBUaGUgY29sb3VyIGlzIG9ubHkgZXZlciB0aGUgZG90OyB0aGUgd29yZHMgc3RheSBpbmssIHNvXG4gICBubyBzdGF0dXMgcmVhZHMgYXMgY29sb3VyZWQgdGV4dC5cblxuICAgVGhlIG1vZGlmaWVyIGlzIFdvb0NvbW1lcmNlJ3Mgb3duIHN0YXR1cyBzbHVnLCBzbyB0aGUgdGVtcGxhdGUgd3JpdGVzXG4gICBgb3JkZXItc3RhdHVzLS17c2x1Z31gIGZyb20gdGhlIG9yZGVyIGFuZCBuZXZlciBwaWNrcyBhIGNvbG91ciBwZXIgcm93LlxuICAgQ3VzdG9tIHN0YXR1c2VzIHJlZ2lzdGVyZWQgaW4gY2FtY29tLWdsb2JhbCBmYWxsIGJhY2sgdG8gdGhlIGJhc2UgZ3JleSBkb3RcbiAgIHVudGlsIHRoZXkgYXJlIGdpdmVuIG9uZS5cbiAgICAgcHJvY2Vzc2luZywgb24taG9sZCAgUGFyYWdvbiBibHVlIOKAlCB3aXRoIHVzLCBpbiBoYW5kXG4gICAgIGNvbXBsZXRlZCAgICAgICAgICAgIGdvIGdyZWVuIOKAlCB0aGUgYnJhbmQncyBwb3NpdGl2ZSBjb25maXJtYXRpb25cbiAgICAgcGVuZGluZyAgICAgICAgICAgICAgc2xhdGUsIGhvbGxvdyDigJQgd2FpdGluZyBvbiBwYXltZW50XG4gICAgIGZhaWxlZCwgY2FuY2VsbGVkICAgIGFsZXJ0IHJlZCDigJQgYW4gZXJyb3Igc3RhdGUsIHdoaWNoIGlzIHJlZCdzIGpvYlxuICAgICByZWZ1bmRlZCAgICAgICAgICAgICBtaXN0IOKAlCBjbG9zZWQsIG5vdGhpbmcgbW9yZSB0byBoYXBwZW5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLm9yZGVyLXN0YXR1cyB7XG5cblx0ZGlzcGxheTogaW5saW5lLWZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMik7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xuXHR3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4ub3JkZXItc3RhdHVzOjpiZWZvcmUge1xuXG5cdGNvbnRlbnQ6IFwiXCI7XG5cdGZsZXg6IDAgMCBhdXRvO1xuXHR3aWR0aDogMTBweDtcblx0aGVpZ2h0OiAxMHB4O1xuXHRib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItc3Ryb25nKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXBpbGwpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ib3JkZXItc3Ryb25nKTtcbn1cblxuLm9yZGVyLXN0YXR1cy0tcHJvY2Vzc2luZzo6YmVmb3JlLFxuLm9yZGVyLXN0YXR1cy0tb24taG9sZDo6YmVmb3JlIHtcblxuXHRib3JkZXItY29sb3I6IHZhcigtLWNvbG9yLWJyYW5kKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItYnJhbmQpO1xufVxuXG4ub3JkZXItc3RhdHVzLS1jb21wbGV0ZWQ6OmJlZm9yZSB7XG5cblx0Ym9yZGVyLWNvbG9yOiB2YXIoLS1jb2xvci1wb3NpdGl2ZSk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLXBvc2l0aXZlKTtcbn1cblxuLm9yZGVyLXN0YXR1cy0tcGVuZGluZzo6YmVmb3JlIHtcblxuXHRib3JkZXItY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLm9yZGVyLXN0YXR1cy0tZmFpbGVkOjpiZWZvcmUsXG4ub3JkZXItc3RhdHVzLS1jYW5jZWxsZWQ6OmJlZm9yZSB7XG5cblx0Ym9yZGVyLWNvbG9yOiB2YXIoLS1jb2xvci1uZWdhdGl2ZSk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLW5lZ2F0aXZlKTtcbn1cblxuLm9yZGVyLXN0YXR1cy0tcmVmdW5kZWQ6OmJlZm9yZSB7XG5cblx0Ym9yZGVyLWNvbG9yOiB2YXIoLS1ib3JkZXItc3Ryb25nKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYm9yZGVyLXN0cm9uZyk7XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgb3JkZXItdG90YWxzXG4vL1xuLy8gUG9ydGVkIGZyb20gY2F0YWxvZ3VlIGJsb2NrIGBvcmRlci10b3RhbHNgIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxMCwgb3BlcmF0b3ItYWNjZXB0ZWRcbi8vIDIwMjYtMDktMjQpIGZvciB0aGUgYmFza2V0IHdhbGssIE1QRzEwLiBUaGUgY2F0YWxvZ3VlIHJvdyBpcyB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIG9yZGVyLXRvdGFscyAgKE5FVylcbiAgIFRoZSBjb250ZW50cyBvZiB0aGUgT3JkZXIgU3VtbWFyeTogdGhlIHN1bSwgdGhlIGRlbGl2ZXJ5LCBhbnkgZGlzY291bnQsIHRoZW5cbiAgIHRoZSB0b3RhbCBpbiB0aGUgY29tbWVyY2UgZmFjZSBhdCB0aGUgc2l6ZSB0aGUgcHJvZHVjdCBwYWdlIGdpdmVzIGEgcHJpY2UsXG4gICB0aGUgVkFUIGl0IGluY2x1ZGVzLCB0aGUgQ2xlYXJwYXkgbGluZSB3aGVuIHRoZSB0b3RhbCBhbGxvd3MgaXQsIGFuZCB0aGVcbiAgIHBvaW50cyBsaW5lLiBDb250ZW50cyBvbmx5IOKAlCB0aGUgc3VyZmFjZSBpcyBib3JkZXJlZC1ncm91cCwgdGhlIGJyYW5kJ3Mgb25lXG4gICBsYWJlbGxlZC1wYW5lbCB0cmVhdG1lbnQsIGV4YWN0bHkgYXMgYnV5LWJveCBzaXRzIGluc2lkZSBpdCBvbiB0aGUgcHJvZHVjdFxuICAgcGFnZS5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLm9yZGVyLXRvdGFscyB7XG5cblx0bWFyZ2luOiAwO1xufVxuXG4ub3JkZXItdG90YWxzX19yb3cge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcblx0anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuXHRnYXA6IHZhcigtLXNwYWNlLTQpO1xuXHRwYWRkaW5nLWJsb2NrOiB2YXIoLS1zcGFjZS0yKTtcbn1cblxuLm9yZGVyLXRvdGFsc19fbGFiZWwge1xuXG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG4ub3JkZXItdG90YWxzX19kZXRhaWwge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTEpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuXG4ub3JkZXItdG90YWxzX192YWx1ZSB7XG5cblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xuXHR3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4ub3JkZXItdG90YWxzX190b3RhbCB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGJhc2VsaW5lO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cdGdhcDogdmFyKC0tc3BhY2UtNCk7XG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtMyk7XG5cdHBhZGRpbmctYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTQpO1xuXHRib3JkZXItYmxvY2stc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG59XG5cbi5vcmRlci10b3RhbHNfX3RvdGFsLWxhYmVsIHtcblxuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDQpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1oZWFkaW5nKTtcbn1cblxuLm9yZGVyLXRvdGFsc19fdG90YWwtdmFsdWUge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWNocm9tZSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDIpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctYm9sZCk7XG5cdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRsZXR0ZXItc3BhY2luZzogMC4wMWVtO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLm9yZGVyLXRvdGFsc19fdmF0IHtcblxuXHRtYXJnaW46IHZhcigtLXNwYWNlLTEpIDAgMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcblx0dGV4dC1hbGlnbjogZW5kO1xufVxuXG4ub3JkZXItdG90YWxzX19saW5lIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTMpO1xuXHRtYXJnaW46IHZhcigtLXNwYWNlLTQpIDAgMDtcblx0cGFkZGluZy1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtNCk7XG5cdGJvcmRlci1ibG9jay1zdGFydDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG4ub3JkZXItdG90YWxzX19saW5lICsgLm9yZGVyLXRvdGFsc19fbGluZSB7XG5cblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS0zKTtcblx0cGFkZGluZy1ibG9jay1zdGFydDogMDtcblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAwO1xufVxuXG4ub3JkZXItdG90YWxzX19saW5lIHN0cm9uZyB7XG5cblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG59XG5cbi5vcmRlci10b3RhbHNfX2ljb24ge1xuXG5cdGZsZXg6IDAgMCBhdXRvO1xuXHR3aWR0aDogMjhweDtcblx0aGVpZ2h0OiAyOHB4O1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG59XG5cbi5vcmRlci10b3RhbHNfX2ljb24gc3ZnIHtcblxuXHR3aWR0aDogMTAwJTtcblx0aGVpZ2h0OiAxMDAlO1xufVxuXG4vKiBUaGUgY2hlY2tvdXQgYWN0aW9uJ3Mgd3JhcHBlci4gV29vQ29tbWVyY2UgcHJpbnRzIGB3Yy1wcm9jZWVkLXRvLWNoZWNrb3V0YDtcbiAgIHRoaXMgZWxlbWVudCBuYW1lcyBpdCBmb3IgdGhlIGJyYW5kIHNvIHRoZSBwaG9uZSBjaGVja291dCBiYXIgY2FuIHN0YW5kIGluXG4gICBmb3IgaXQgKHNlZSBfY2hlY2tvdXQtYmFyLnNjc3MpLiBJbiB0aGUgbW9ja3VwIHRoaXMgd2FzIGEgcGFnZS1sZXZlbFxuICAgYG9yZGVyLXN1bW1hcnlfX2FjdGlvbmAgb3duZWQgYnkgbm8gYmxvY2suICovXG4ub3JkZXItdG90YWxzX19hY3Rpb24ge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtNik7XG59XG5cbi8qIC0tc3RpY2t5OiBUSEUgUEFZTUVOVCBNQVJLUyBTVEFZIElOIFZJRVcgKGNoZWNrb3V0LCBNUEcxMSkuIFRoZSBjaGVja291dCBzdW1tYXJ5IGxpc3RzXG4gICBldmVyeSBwYWNrYWdlIGJlZm9yZSBpdHMgdG90YWxzLCBzbyBpdCBpcyB0YWxsZXIgdGhhbiBhIGxhcHRvcCBzY3JlZW4gYW5kIGEgc3RpY2t5XG4gICBjb2x1bW4gYWxvbmUgd291bGQgY2FycnkgaXRzIGZvb3Qgb2ZmIHRoZSBib3R0b20uIFRoZSBhY2NlcHRlZC1wYXltZW50IG1hcmtzIHBpbiB0b1xuICAgdGhlIGZvb3Qgb2YgdGhlIHZpZXdwb3J0IGluc2lkZSB0aGUgcGlubmVkIGNvbHVtbiDigJQgYSB0cnVzdCBzaWduYWwga2VwdCBhYm92ZSB0aGVcbiAgIGZvbGQgKG9wZXJhdG9yLCAyMDI2LTA5LTI2KSDigJQgYW5kIHNldHRsZSBiYWNrIGFzIHRoZSBjb2x1bW4ncyBlbmQgY29tZXMgaW50byB2aWV3LFxuICAgcGFpbnRlZCBwYW5lbCB3aGl0ZSB3aXRoIGEgaGFpcmxpbmUgYWJvdmUgc28gd2hhdGV2ZXIgc2Nyb2xscyBiZW5lYXRoIGlzIGNvdmVyZWRcbiAgIGNsZWFubHkuIFN0YXRpYyBvbmNlIHRoZSBzdW1tYXJ5IGRyb3BzIGJlbG93IHRoZSBmb3JtLiBQb3J0ZWQgZnJvbSB0aGUgbW9ja3VwJ3NcbiAgIGBvcmRlci1zdW1tYXJ5X19hY3Rpb25gOyBQbGFjZSBPcmRlciBpdHNlbGYgbW92ZWQgaW50byB0aGUgUGF5bWVudCBjYXJkLiAqL1xuLm9yZGVyLXRvdGFsc19fYWN0aW9uLS1zdGlja3kge1xuXG5cdHBvc2l0aW9uOiBzdGlja3k7XG5cdGJvdHRvbTogMDtcblx0ei1pbmRleDogMTtcblx0cGFkZGluZy1ibG9jazogdmFyKC0tc3BhY2UtNCk7XG5cdGJvcmRlci1ibG9jay1zdGFydDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xufVxuXG4ub3JkZXItdG90YWxzX19hY3Rpb24tLXN0aWNreSA+IC5wYXltZW50LW1hcmtzIHtcblxuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IDA7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogMTEwMHB4ICkge1xuXG5cdC5vcmRlci10b3RhbHNfX2FjdGlvbi0tc3RpY2t5IHtcblxuXHRcdHBvc2l0aW9uOiBzdGF0aWM7XG5cdH1cbn1cblxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHBhY2thZ2UtZGVsaXZlcnlcbi8vXG4vLyBQb3J0ZWQgZnJvbSB0aGUgY2hlY2tvdXQgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxMSwgb3BlcmF0b3ItYWNjZXB0ZWRcbi8vIDIwMjYtMDktMjMpIGZvciB0aGUgY2hlY2tvdXQgd2FsaywgTVBHMTEuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBwYWNrYWdlLWRlbGl2ZXJ5ICAoRVhURU5ERUQgb24gdGhlIGNoZWNrb3V0J3Mgc2Vjb25kIHJldmlldylcbiAgIFRoZSBjaGVja291dCdzIHBlci1wYWNrYWdlIGRlbGl2ZXJ5LCBjb25maXJtZWQgcmF0aGVyIHRoYW4gY2hvc2VuIGFnYWluLlxuICAgVGhlIHNob3BwZXIgcGlja2VkIGVhY2ggcGFja2FnZSdzIHNwZWVkIGluIHRoZSBiYXNrZXQsIHNvIGhlcmUgZWFjaCBwYWNrYWdlXG4gICBpcyBPTkUgcmVhZC1vbmx5IGxpbmUg4oCUIHdoaWNoIHBhY2thZ2UsIHdoZW4gaXQgYXJyaXZlcywgdGhlIHNwZWVkIGFuZCBpdHNcbiAgIHByaWNlLiBERVBBUlRVUkU6IG5vIENoYW5nZS4gVGhlIG1vY2t1cCBvZmZlcmVkIG9uZSBhdCB0aGUgZmFyIGVuZCBvZiBlYWNoXG4gICBsaW5lOyBpdCBpcyBnb25lIChvcGVyYXRvciwgMjAyNi0wOS0yNCkgYmVjYXVzZSB0aGUgc3RvcmUgcnVucyBvbmUgc3BlZWQsXG4gICBhbmQgYmVjYXVzZSB0aGUgY2hlY2tvdXQgbWVyZ2VzIHRoZSBwYWNrYWdlcyBpbnRvIG9uZSBzZXR0bGVkIGNoYXJnZSBzbyB0aGVcbiAgIHdhbGxldHMgY2FuIHJlbmRlciAoY2FtY29tLWdsb2JhbCBjYW1jb20tZHJvcHNoaXAtY2hlY2tvdXQtbWVyZ2UucGhwKSDigJRcbiAgIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2hhbmdlIGFuZCBub3doZXJlIHRvIGNoYW5nZSBpdC4gVGhlIHJ1bGVzIGZvciBDaGFuZ2VcbiAgIGFuZCBpdHMgb3BlbmVkIHJvdyB3ZXJlIG5vdCBwb3J0ZWQuXG5cbiAgIFdoYXQgY2hhbmdlZDogdGhlIHJvdyB1c2VkIHRvIGJlIHRoZSBiYXNrZXQncyBwYWNrYWdlLWhlYWQgYmVzaWRlIGEgc2VsZWN0XG4gICBob2xkaW5nIHRoZSBzcGVlZC4gVGhlIHNlbGVjdCBpcyBnb25lIOKAlCBpdCBhc2tlZCB0aGUgYmFza2V0J3MgcXVlc3Rpb24gYVxuICAgc2Vjb25kIHRpbWUsIGFuZCBhdCAzOTBweCBpdCBjbGlwcGVkIGl0cyBvd24gcHJpY2UuIFRoZSByb3cgaXMgbm93IGEgc2luZ2xlXG4gICBsaW5lIHRoYXQgd3JhcHMgcmF0aGVyIHRoYW4gdHJ1bmNhdGVzOiBhIFBhcmFnb24tYmx1ZSBvdXRsaW5lIGljb24gKGEgdmFuLFxuICAgb3IgYSBjYWxlbmRhciBmb3IgYSBwcmUtb3JkZXIpLCB0aGUgcGFja2FnZSBuYW1lIGFuZCBhcnJpdmFsIGF0IGluayBhbmRcbiAgIG1lZGl1bSB3ZWlnaHQsIHRoZSBzcGVlZCBpbiBzbGF0ZSwgdGhlIHByaWNlIGluIHRoZSBjb21tZXJjZSBmYWNlIGJlY2F1c2VcbiAgIGl0IGlzIGEgcHJpY2UsIGFuZCBDaGFuZ2UgYXMgYSBsaW5rLWJsdWUgdGV4dCBidXR0b24uIENoYW5nZSBvcGVucyB0aGF0XG4gICBwYWNrYWdlJ3MgdHdvIHNwZWVkcyBpbiBwbGFjZSBhcyB0aGUgYmFza2V0J3Mgb3duIGRlbGl2ZXJ5LW9wdGlvbnMsIHJldXNlZFxuICAgdmVyYmF0aW07IHRoZSBvcGVuZWQgcm93IHRha2VzIHRoZSBicmFuZCdzIGxlYWRpbmcgUGFyYWdvbi1ibHVlIHJ1bGUgc28gaXRcbiAgIGlzIGNsZWFyIHdoaWNoIHBhY2thZ2UgaXMgYmVpbmcgY2hhbmdlZC4gQmVuZWF0aCB0aGUgcm93cyB0aGUgZGlzcGF0Y2hcbiAgIHJ1bGUsIGFzIGJlZm9yZSwgYW5kIGEgbmV3IHF1aWV0ZXIgbGluZSBmb3IgdGhlIEhpZ2hsYW5kcyAmIElzbGFuZHNcbiAgIHN1cmNoYXJnZSwgd2hpY2ggdGhlIHNob3BwZXIgbmV2ZXIgcGlja3MuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi5wYWNrYWdlLWRlbGl2ZXJ5X19yb3dzIHtcblxuXHRtYXJnaW46IDA7XG5cdHBhZGRpbmc6IDA7XG5cdGxpc3Qtc3R5bGU6IG5vbmU7XG5cdGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ucGFja2FnZS1kZWxpdmVyeV9fcm93IHtcblxuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS00KSB2YXIoLS1zcGFjZS02KTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xufVxuXG4ucGFja2FnZS1kZWxpdmVyeV9fcm93ICsgLnBhY2thZ2UtZGVsaXZlcnlfX3JvdyB7XG5cblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xufVxuXG4ucGFja2FnZS1kZWxpdmVyeV9fbGluZSB7XG5cblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAyNHB4IG1pbm1heCggMCwgMWZyICk7XG5cdGFsaWduLWl0ZW1zOiBzdGFydDtcblx0Y29sdW1uLWdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdHJvdy1nYXA6IHZhcigtLXNwYWNlLTIpO1xufVxuXG4ucGFja2FnZS1kZWxpdmVyeV9faWNvbiB7XG5cblx0d2lkdGg6IDI0cHg7XG5cdGhlaWdodDogMjRweDtcblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiAwLjE1ZW07XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJyYW5kKTtcbn1cblxuLnBhY2thZ2UtZGVsaXZlcnlfX2ljb24gc3ZnIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdGhlaWdodDogMTAwJTtcbn1cblxuLnBhY2thZ2UtZGVsaXZlcnlfX3N1bW1hcnkge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1ib2R5KTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuXG4ucGFja2FnZS1kZWxpdmVyeV9fcGFja2FnZSxcbi5wYWNrYWdlLWRlbGl2ZXJ5X19hcnJpdmFsIHtcblxuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG59XG5cbi5wYWNrYWdlLWRlbGl2ZXJ5X19wcmljZSB7XG5cblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWNocm9tZSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1ib2xkKTtcblx0Zm9udC1zdHlsZTogaXRhbGljO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLnBhY2thZ2UtZGVsaXZlcnlfX25vdGUge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdG1hcmdpbjogdmFyKC0tc3BhY2UtOCkgMCAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG4ucGFja2FnZS1kZWxpdmVyeV9fbm90ZS1pY29uIHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0d2lkdGg6IDI0cHg7XG5cdGhlaWdodDogMjRweDtcblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xufVxuXG4ucGFja2FnZS1kZWxpdmVyeV9fbm90ZS1pY29uIHN2ZyB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdHdpZHRoOiAxMDAlO1xuXHRoZWlnaHQ6IDEwMCU7XG59XG5cbi5wYWNrYWdlLWRlbGl2ZXJ5X19zdXJjaGFyZ2Uge1xuXG5cdG1hcmdpbjogdmFyKC0tc3BhY2UtMikgMCAwO1xuXHRwYWRkaW5nLWlubGluZS1zdGFydDogY2FsYyggMjRweCArIHZhcigtLXNwYWNlLTMpICk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG59XG5cbi8qIFBob25lOiB0aGUgbGluZSBrZWVwcyBldmVyeSB3b3JkIGFuZCB3cmFwcywgYSBzdGVwIHNtYWxsZXIuICovXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5wYWNrYWdlLWRlbGl2ZXJ5X19yb3cge1xuXG5cdFx0cGFkZGluZzogdmFyKC0tc3BhY2UtNCk7XG5cdH1cblxuXHQucGFja2FnZS1kZWxpdmVyeV9fc3VtbWFyeSB7XG5cblx0XHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0fVxuXG5cdC5wYWNrYWdlLWRlbGl2ZXJ5X19ub3RlIHtcblxuXHRcdGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRcdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1ib2R5KTtcblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHBhY2thZ2UtaGVhZFxuLy9cbi8vIFBvcnRlZCBmcm9tIGNhdGFsb2d1ZSBibG9jayBgcGFja2FnZS1oZWFkYCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTAsIG9wZXJhdG9yLWFjY2VwdGVkXG4vLyAyMDI2LTA5LTI0KSBmb3IgdGhlIGJhc2tldCB3YWxrLCBNUEcxMC4gVGhlIGNhdGFsb2d1ZSByb3cgaXMgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBwYWNrYWdlLWhlYWQgIChORVcpXG4gICBUaGUgdG9wIG9mIGEgcGFja2FnZSBwYW5lbDogYFBhY2thZ2UgMSBvZiAzYCBpbiB0aGUgaGVhZGluZyBmb250IGF0IHRoZVxuICAgc21hbGwtdGl0bGUgc2l6ZSwgdGhlbiB0aGUgcGFja2FnZSdzIHN0YXR1cyBsaW5lLiBUaGUgYnVpbGQgYnJpZWYgY2FsbHMgdGhlXG4gICBhcnJpdmFsIGRhdGUgdGhlIG1vc3QgaW1wb3J0YW50IGxpbmUgaW4gdGhlIHBhbmVsLCBzbyBpdCBpcyB0aGUgb25lIHBocmFzZVxuICAgc2V0IGF0IGluayBhbmQgbWVkaXVtIHdlaWdodCDigJQgdGhlIHN0b2NrIHN0YXRlIGJlc2lkZSBpdCBtYXRjaGVzIGl0LCB0aGVcbiAgIGRpc3BhdGNoIGRldGFpbCBiZXR3ZWVuIHRoZW0gc3RheXMgc2xhdGUuIEEgUGFyYWdvbi1ibHVlIG91dGxpbmUgaWNvbiBsZWFkc1xuICAgdGhlIGxpbmU6IGEgdmFuIGZvciBhIHN0b2NrZWQgcGFja2FnZSwgYSBjYWxlbmRhciBmb3IgYSBwcmUtb3JkZXIuXG5cbiAgIFRoZSB0aXRsZSBpcyBvcHRpb25hbC4gQSBiYXNrZXQgdGhhdCBkb2VzIG5vdCBzcGxpdCBkcmF3cyB0aGUgaGVhZCB3aXRoIHRoZVxuICAgc3RhdHVzIGxpbmUgYWxvbmUg4oCUIFwiUGFja2FnZSAxIG9mIDFcIiB3b3VsZCBiZSBhIGxhYmVsIGZvciBhIGZhY3Qgbm9ib2R5XG4gICBuZWVkcyB0b2xkLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4ucGFja2FnZS1oZWFkIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xufVxuXG4ucGFja2FnZS1oZWFkX190aXRsZSB7XG5cblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDQpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1oZWFkaW5nKTtcbn1cblxuLnBhY2thZ2UtaGVhZF9fc3RhdHVzIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblx0Z2FwOiB2YXIoLS1zcGFjZS0zKTtcblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG59XG5cbi5wYWNrYWdlLWhlYWRfX2ljb24ge1xuXG5cdGZsZXg6IDAgMCBhdXRvO1xuXHR3aWR0aDogMjRweDtcblx0aGVpZ2h0OiAyNHB4O1xuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IDAuMTVlbTtcblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xufVxuXG4ucGFja2FnZS1oZWFkX19pY29uIHN2ZyB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdHdpZHRoOiAxMDAlO1xuXHRoZWlnaHQ6IDEwMCU7XG59XG5cbi5wYWNrYWdlLWhlYWRfX3N0YXRlLFxuLnBhY2thZ2UtaGVhZF9fYXJyaXZhbCB7XG5cblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5wYWNrYWdlLWhlYWRfX3N0YXR1cyB7XG5cblx0XHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHBhZ2Vcbi8vXG4vLyBUaGUgY29udGVudCBjb2x1bW4gYW5kIHRoZSB2ZXJ0aWNhbCByaHl0aG0gYmV0d2VlbiBpdHMgYmFuZHMuXG4vL1xuLy8gU291cmNlOiBNUEc5IG1vY2t1cCAoZGVzaWduIDE3OTY3KSwgbm8gY2F0YWxvZ3VlIHJvdy4gUG9ydGVkIGZvciB0aGUgTVBHOSBwcm9kdWN0LXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBQQUdFIExBWU9VVCDigJQgdGhlIHNoZWxsLCB0aGUgcmFpbCBhbmQgdGhlIHJlZ2lvbiBncmlkcy5cblxuICAgQlVJTFQgMjAyNi0wOS0xNSBmcm9tIHNpeCBwaWVjZXMgb2Ygb3BlcmF0b3IgZmVlZGJhY2ssIGFmdGVyIHRocmVlIGRlc2lnbnNcbiAgIHdlcmUgcmVqZWN0ZWQuIEVhY2ggb2YgdGhlIHNpeCBpcyBhbnN3ZXJlZCBpbiBvbmUgcGxhY2UgYW5kIHRoZSBwbGFjZSBpc1xuICAgbmFtZWQsIHNvIGEgbGF0ZXIgc2Vzc2lvbiBjYW4gc2VlIHdoaWNoIGNob2ljZXMgYXJlIGxvYWQtYmVhcmluZzpcblxuICAgMS4gVGhlIHNob3J0IGRlc2NyaXB0aW9uIGdvZXMgQkVGT1JFIHRoZSBidXkgYm94ICAgIOKGkiAuYnV5LXJlZ2lvbl9fc3VtbWFyeVxuICAgMi4gTG95YWx0eSBwb2ludHMgc2l0IEFGVEVSIHRoZSBidXkgYm94ICAgICAgICAgICAgIOKGkiAuYnV5LXJlZ2lvbl9fc3VtbWFyeVxuICAgMy4gU3RhdCBwaWxscyBsaXZlIGluc2lkZSB0aGUgcHJvZHVjdCBkZXNjcmlwdGlvbiAgIOKGkiAuZG9jLWZpZ3VyZXNcbiAgIDQuIFRoZSBkZXNjcmlwdGlvbiB0YWtlcyB0aGUgbGl2ZSBzaXRlJ3MgY29sdW1uICAgICDihpIgLnN0b3JlLWxheW91dFxuICAgNS4gQWRkIHRvIEJhc2tldCBuZXZlciB3cmFwcyB0byB0d28gbGluZXMgICAgICAgICAgIOKGkiAuYnRuLS1jb21tZXJjZSwgLnJvdXRlLXJvd1xuICAgNi4gVGhlIG5hdmlnYXRpb24gcmFpbCBjb21lcyBiYWNrLCBkZXNrdG9wIG9ubHkgICAgIOKGkiAuc3RvcmUtbGF5b3V0X19zaWRlYmFyXG5cbiAgIFRIRSBDT0xVTU4gSVMgMTA0MnB4IEFORCBUSEFUIElTIFRIRSBQT0lOVCBPRiAoNCkuIEl0IGlzIHdoYXQgdGhlIGxpdmUgc3RvcmVcbiAgIGdpdmVzIGl0cyBjb250ZW50OiBhIDE0MDAgcGFnZSwgYSAzMjggcmFpbCwgYSAzMCBnYXAuIFRocmVlIGRyYWZ0cyBwdXQgdGhlXG4gICBkZXNjcmlwdGlvbiBhdCA2ODAgb3IgNzQwIGJlY2F1c2UgdGhhdCBpcyB0aGUgc3R5bGVndWlkZSdzIFJFQURJTkcgbWVhc3VyZSxcbiAgIGFuZCBhbGwgdGhyZWUgcmVhZCBhcyBjcmFtcGVkIOKAlCBiZWNhdXNlIHRoZSBtZWFzdXJlIHdhcyBzZXQgZm9yIGVkaXRvcmlhbFxuICAgcGFnZXMsIHdoZXJlIHByb3NlIGlzIGFsb25lIG9uIHRoZSBwYWdlLiBBIHByb2R1Y3QgZGVzY3JpcHRpb24gaXMgbm90IGFsb25lOlxuICAgaXQgY2FycmllcyBzdGF0IGJsb2Nrcywgc3BlYyB0YWJsZXMgYW5kIGZlYXR1cmUgcm93cywgYW5kIGl0IHdhbnRzIHRoZSByb29tXG4gICB0aGUgc3RvcmUgYWxyZWFkeSBnaXZlcyBpdC4gVGhlIDY4MCBtZWFzdXJlIHN0aWxsIGdvdmVybnMgYXJ0aWNsZSBwYWdlcy5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4ucGFnZV9faW5uZXIge1xuXG5cdG1heC13aWR0aDogY2FsYyggdmFyKC0tc2l0ZS1tYXgtd2lkdGgpICsgKCB2YXIoLS1ndXR0ZXItc21hbGwpICogMiApICk7XG5cdG1hcmdpbi1pbmxpbmU6IGF1dG87XG5cdHBhZGRpbmctaW5saW5lOiB2YXIoLS1ndXR0ZXItc21hbGwpO1xufVxuXG4ucGFnZV9fYm9keSB7XG5cblx0cGFkZGluZy1ibG9jazogdmFyKC0tc3BhY2UtNikgdmFyKC0tc3BhY2UtMTYpO1xufVxuXG4ucGFnZV9fZmxvdyA+ICogKyAqIHtcblxuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTEyKTtcbn1cblxuLyogVGhlIHRpZ2h0IGZsb3cg4oCUIElOU0lERSBhIGJhbmQgcmF0aGVyIHRoYW4gYmV0d2VlbiBiYW5kcy5cblxuICAgQSBiYW5kIGlzIGEgaGVhZCBhbmQgdGhlIHRoaW5nIGl0IGludHJvZHVjZXMsIGFuZCBvbiBhIGNvbXBvc2VkIHBhZ2UgdGhvc2VcbiAgIGFycml2ZSBhcyBzZXBhcmF0ZSB0b3AtbGV2ZWwgYmxvY2tzLiBMZWZ0IGFzIHNpYmxpbmdzIG9mIHRoZSBwYWdlIGZsb3cgdGhleVxuICAgdG9vayB0aGUgNDhweCB0aGF0IHNlcGFyYXRlcyBvbmUgYmFuZCBmcm9tIHRoZSBORVhULCBzbyBhIHRpdGxlIHNhdCBhcyBmYXJcbiAgIGZyb20gaXRzIG93biBncmlkIGFzIGZyb20gdGhlIGJhbmQgYWJvdmUgaXQgYW5kIG5vdGhpbmcgcmVhZCBhcyBhIHVuaXRcbiAgIChtZWFzdXJlZCAyMDI2LTA5LTE3OiBldmVyeSBoZWFkIDQ4cHggZnJvbSBpdHMgb3duIGNvbnRlbnQpLlxuXG4gICBTbyBlYWNoIGJhbmQgaXMgd3JhcHBlZCBpbiBhIGdyb3VwIGNhcnJ5aW5nIHRoaXMsIGFuZCB0aGUgcGFnZSBmbG93J3MgNDhweFxuICAgZmFsbHMgYmV0d2VlbiB0aG9zZSBncm91cHMuIEEgbW9kaWZpZXIgcmF0aGVyIHRoYW4gYSBzZWNvbmQgY29tcG9uZW50OiB0aGVcbiAgIG1lY2hhbmlzbSBpcyBpZGVudGljYWwgYW5kIG9ubHkgdGhlIHN0ZXAgY2hhbmdlcywgd2hpY2ggaXMgd2hhdCBgLS13aWRlYFxuICAgYWxyZWFkeSBlc3RhYmxpc2hlZCBmb3IgdGhlIGF4aXMuIDI0cHggaXMgdGhlIHZhbHVlIGAuc2VjdGlvbi1oZWFkYCBjYXJyaWVzXG4gICBmb3IgdGhlIHNhbWUgZ2FwIGluIHRoZSBQSFAgdGVtcGxhdGVzLCBzbyBib3RoIHJvdXRlcyBzcGFjZSBhIGJhbmQgaGVhZCB0aGVcbiAgIHNhbWUgd2F5LlxuXG4gICBUV08gU0VMRUNUT1JTIEJFQ0FVU0UgVEhFUkUgQVJFIFRXTyBET00gU0hBUEVTLiBBIFBIUCB0ZW1wbGF0ZSBwdXRzIHRoZVxuICAgY2hpbGRyZW4gZGlyZWN0bHkgaW5zaWRlOyBhIGBjb3JlL2dyb3VwYCB3cmFwcyB0aGVtIGluXG4gICBgLndwLWJsb2NrLWdyb3VwX19pbm5lci1jb250YWluZXJgLCB3aGljaCBXb3JkUHJlc3MgcmVzdG9yZXMgb24gYW55IHNpdGVcbiAgIHdpdGhvdXQgYSBgdGhlbWUuanNvbmAg4oCUIGV2ZXJ5IHRoZW1lIGluIHRoaXMgbGluZSwgYnkgcG9saWN5LiBBIGA+YCBydWxlIGFsb25lXG4gICB0aGVyZWZvcmUgbGFuZHMgb24gdGhlIHdyYXBwZXIgYW5kIHNwYWNlcyBub3RoaW5nLiBOYW1pbmcgdGhlIGNvbnRhaW5lciBpc1xuICAgbm9ybWFsbHkgdGhlIHRoaW5nIG5vdCB0byBkbywgYnV0IHRoZSBhbHRlcm5hdGl2ZSBoZXJlIGlzIGEgZGVzY2VuZGFudCBydWxlXG4gICB0aGF0IHdvdWxkIHJlYWNoIGV2ZXJ5IG5lc3RpbmcgbGV2ZWwgb2YgYSBiYW5kLiAqL1xuLnBhZ2VfX2Zsb3ctLXRpZ2h0ID4gKiArICosXG4ucGFnZV9fZmxvdy0tdGlnaHQgPiAud3AtYmxvY2stZ3JvdXBfX2lubmVyLWNvbnRhaW5lciA+ICogKyAqIHtcblxuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTYpO1xufVxuXG5cbi8qIFRoZSB3aWRlIGZsb3cg4oCUIHRoZSBiYW5kcyBiZWxvdyB0aGUgcHJvZHVjdCB6b25lLiBUaGV5IGFyZSBub3QgYWJvdXQgVEhJU1xuICAgcHJvZHVjdCdzIHB1cmNoYXNlIGRlY2lzaW9uLCB0aGV5IGFyZSB0aGUgcm91dGVzIG91dCBvZiBpdCwgc28gdGhleSBydW4gdGhlXG4gICBmdWxsIHBhZ2Ugd2lkdGggcmF0aGVyIHRoYW4gdGhlIGNvbnRlbnQgY29sdW1uJ3MgYW5kIHBhc3MgdW5kZXIgdGhlIHJhaWwgd2hlcmVcbiAgIGl0IGVuZHMuIEEgbW9kaWZpZXIgcmF0aGVyIHRoYW4gYSBzZWNvbmQgY29udGFpbmVyOiBzYW1lIHZlcnRpY2FsIHJoeXRobSxcbiAgIGRpZmZlcmVudCB3aWR0aC4gT3BlcmF0b3IsIDIwMjYtMDktMTYuICovXG4ucGFnZV9fZmxvdy0td2lkZSB7XG5cblx0d2lkdGg6IDEwMCU7XG5cblx0LyogVGhlIGdhcCBiZXR3ZWVuIHRoZSB0d28gem9uZXMuIFdpdGhvdXQgaXQgdGhlIHNwZWNpZmljYXRpb24gYmFuZCBvcGVuc1xuXHQgICBpbW1lZGlhdGVseSB1bmRlciB0aGUgZGVzY3JpcHRpb24ncyBsYXN0IGxpbmUgYW5kIHJlYWRzIGFzIHBhcnQgb2YgaXQg4oCUXG5cdCAgIHdoaWNoIGlzIHRoZSBvcHBvc2l0ZSBvZiB3aGF0IG1vdmluZyBpdCBvdXQgaGVyZSB3YXMgZm9yLiAqL1xuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTE2KTtcbn1cblxuLyogX19iYW5kOiBhIGZ1bGwtd2lkdGggYmFuZCB0aGF0IGZvbGxvd3MgdGhlIHBhZ2UncyBtYWluIGNvbnRlbnQg4oCUIHRoZSBiYXNrZXQnc1xuICAgdHJ1c3Qgcm93LiBJdCBzdGFuZHMgZnVydGhlciBvZmYgdGhhbiB0aGUgZmxvdydzIHBhbmVsIGdhcCBzbyBpdCByZWFkcyBhcyB0aGVcbiAgIHBhZ2UncyBjbG9zZSByYXRoZXIgdGhhbiBvbmUgbW9yZSBwYW5lbCAoTVBHMTApLiAqL1xuLnBhZ2VfX2Zsb3cgPiAucGFnZV9fYmFuZCB7XG5cblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS0xMik7XG59XG5cbi8qIEEgV29vQ29tbWVyY2UgcGFnZSAoYmFza2V0LCBjaGVja291dCwgYWNjb3VudCkgcHJpbnRzIGl0cyB3aG9sZSB0ZW1wbGF0ZSBpbnNpZGUgb25lXG4gICBgLndvb2NvbW1lcmNlYCB3cmFwcGVyLCBzbyB0aGUgcGFnZSBmbG93J3Mgb3duIHNwYWNpbmcgbmV2ZXIgcmVhY2hlcyB0aGUgcGFydHMg4oCUXG4gICB0aGUgb3BlbmluZywgdGhlIHN0ZXBzIGJhbmQsIHRoZSBvcmRlciBsYXlvdXQsIHRoZSBjbG9zaW5nIGJhbmQuIFRoZSB3cmFwcGVyIHN0YWNrc1xuICAgdGhlbSBpbnN0ZWFkLCBhdCB0aGUgb3JkZXIgZnVubmVsJ3Mgcmh5dGhtICgtLXNwYWNlLTgsIGFzIHRoZSBhY2NlcHRlZCBiYXNrZXRcbiAgIGRyYXdzIGl0KS4gQSBmbGV4IGdhcCwgbm90IHNpYmxpbmcgbWFyZ2lucywgYmVjYXVzZSBXb29Db21tZXJjZSBhbHdheXMgcHJpbnRzIGFcbiAgIG5vdGljZXMgd3JhcHBlciB0aGF0IGlzIHVzdWFsbHkgZW1wdHk6IGhpZGRlbiwgaXQgdGFrZXMgbm8gZ2FwIGF0IGFsbC5cbiAgIFRoZSBjbG9zaW5nIGJhbmQga2VlcHMgaXRzIGZ1cnRoZXIgb2Zmc2V0ICgtLXNwYWNlLTEyIGluIGFsbCkuIFdhbGstYmFjaywgTVBHMTAuICovXG4ucGFnZV9fZmxvdyA+IC53b29jb21tZXJjZSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0Z2FwOiB2YXIoLS1zcGFjZS04KTtcbn1cblxuLnBhZ2VfX2Zsb3cgPiAud29vY29tbWVyY2UgPiAqIHtcblxuXHRtYXJnaW4tYmxvY2s6IDA7XG59XG5cbi5wYWdlX19mbG93ID4gLndvb2NvbW1lcmNlID4gLndvb2NvbW1lcmNlLW5vdGljZXMtd3JhcHBlcjplbXB0eSB7XG5cblx0ZGlzcGxheTogbm9uZTtcbn1cblxuLnBhZ2VfX2Zsb3cgPiAud29vY29tbWVyY2UgPiAucGFnZV9fYmFuZCB7XG5cblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS00KTtcbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBwYWdlLWNvbnRlbnRzXG4vL1xuLy8gVGhlIFwiT24gVGhpcyBQYWdlXCIgbGlzdC4gSXQgcnVucyBhcyBhIHdyYXBwZWQgcm93IGJ5IGRlZmF1bHQ7IGluc2lkZSB0aGVcbi8vIGZ1bm5lbCdzIHJhaWwgaXQgc3RhY2tzLCBhbmQgdGhhdCBzdGFja2luZyBydWxlIGxpdmVzIHdpdGggYHNlby1kb2NgIGJlY2F1c2Vcbi8vIGl0IGlzIHRoZSByYWlsJ3MgZG9pbmcgcmF0aGVyIHRoYW4gdGhpcyBjb21wb25lbnQncy5cbi8vXG4vLyBTb3VyY2U6IGNhdGFsb2d1ZSBibG9jayBgcGFnZS1jb250ZW50c2AsIHJlY29uY2lsZWQgYWdhaW5zdCBNUEc4IChkZXNpZ25cbi8vIDE3OTU1KS4gUG9ydGVkIGZvciB0aGUgTVBHOCBjYXRlZ29yeS1mdW5uZWwgd2FsaywgMjAyNi0wOS0xNi5cblxuLyogSW4gdGhlIHJhaWwgdGhlIGNvbnRlbnRzIGxpc3Qgc3RhY2tzIGluc3RlYWQgb2YgcnVubmluZyBhcyBhIHdyYXBwZWQgcm93LiAqL1xuLnNlby1kb2NfX3JhaWwgLnBhZ2UtY29udGVudHMge1xuXG5cdG1hcmdpbjogMDtcblx0cGFkZGluZzogMDtcblx0Ym9yZGVyOiAwO1xufVxuXG4uc2VvLWRvY19fcmFpbCAucGFnZS1jb250ZW50c19fbGlzdCB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0zKTtcbn1cblxuLnNlby1kb2NfX3JhaWwgLnBhZ2UtY29udGVudHNfX2l0ZW06OmFmdGVyIHtcblxuXHRjb250ZW50OiBub25lO1xufVxuXG4vKiAtLS0tIHBhZ2UtY29udGVudHMgKHJldXNlZCBmcm9tIHRoZSBicmFuZCBjYXRhbG9ndWUsIHZlcmJhdGltKSAtLS0tICovXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBwYWdlLWNvbnRlbnRzICAoTkVXKVxuICAgSW5saW5lIGF0IHRoZSB0b3Agb2YgdGhlIGRvY3VtZW50LCBub3Qgc3RpY2t5LiBUaGVzZSBwYWdlcyBhcmUgY29uc3VsdGVkXG4gICBvbmNlIGZyb20gYSBzdXBwb3J0IGVtYWlsIGFuZCB0aGVuIGxlZnQ7IGEgcmFpbCB0aGF0IGZvbGxvd3MgdGhlIHJlYWRlciBkb3duXG4gICBhIHBhZ2UgdGhleSBhcmUgbm90IHJlYWRpbmcgaXMgZnVybml0dXJlIGZvciBpdHMgb3duIHNha2UsIGFuZCBpdCB3b3VsZCBoYXZlXG4gICB0byBzdXJ2aXZlIGJlc2lkZSB0aGUgc3BsaWNlZCBzaXRlIGhlYWRlci5cblxuICAgQnVpbHQgdGhlIHdheSBicmVhZGNydW1icyBpcyBidWlsdCDigJQgYSB3cmFwcGluZyBmbGV4IHJvdyB3aXRoIHRoZSBzZXBhcmF0b3JcbiAgIG9uIHRoZSBpdGVtJ3Mgb3duIDo6YWZ0ZXIg4oCUIHNvIHRoZSBicmFuZCdzIHR3byAnd2hlcmUgYW0gSScgc3RyaXBzIHJlYWQgYXNcbiAgIG9uZSBjb25zdHJ1Y3Rpb24uIFRoZSBzZXBhcmF0b3IgaXMgdGhlIG1pZGRvdCB0aGUgYXJ0aWNsZSBraWNrZXIgYWxyZWFkeVxuICAgdXNlcywgaW4gdGhlIHNhbWUgcXVpZXQgZ3JleS5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4ucGFnZS1jb250ZW50cyB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC13cmFwOiB3cmFwO1xuXHRhbGlnbi1pdGVtczogYmFzZWxpbmU7XG5cdGdhcDogdmFyKC0tc3BhY2UtMykgdmFyKC0tc3BhY2UtNik7XG5cdHBhZGRpbmctYmxvY2stZW5kOiB2YXIoLS1zcGFjZS02KTtcblx0Ym9yZGVyLWJsb2NrLWVuZDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcbn1cblxuLyogQVMgQSBDT1JFIENPTFVNTiwgdGhlIHJhaWwgc3RhdGVzIGl0cyBvd24gc2hhcmUgaGVyZSByYXRoZXIgdGhhbiBjYXJyeWluZyB0aGVcbiAgIGVkaXRvcidzIGBzdHlsZT1cImZsZXgtYmFzaXM6MjglXCJgIGludG8gYSBwYXR0ZXJuIGZpbGUuIFRoZSBkb2MgYmVzaWRlIGl0IHRha2VzXG4gICB0aGUgcmVzdC4gKi9cbi53cC1ibG9jay1jb2x1bW4ucGFnZS1jb250ZW50cyB7XG5cblx0ZmxleDogMCAwIDI4JTtcbn1cblxuLnBhZ2UtY29udGVudHNfX2xhYmVsIHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1leWVicm93KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0bGV0dGVyLXNwYWNpbmc6IDAuMDhlbTtcblx0dGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuXG4ucGFnZS1jb250ZW50c19fbGlzdCB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC13cmFwOiB3cmFwO1xuXHRhbGlnbi1pdGVtczogYmFzZWxpbmU7XG5cdGdhcDogdmFyKC0tc3BhY2UtMikgdmFyKC0tc3BhY2UtNCk7XG5cdG1hcmdpbjogMDtcblx0cGFkZGluZzogMDtcblx0bGlzdC1zdHlsZTogbm9uZTtcbn1cblxuLnBhZ2UtY29udGVudHNfX2l0ZW0ge1xuXG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogYmFzZWxpbmU7XG5cdGdhcDogdmFyKC0tc3BhY2UtNCk7XG59XG5cbi5wYWdlLWNvbnRlbnRzX19pdGVtOjphZnRlciB7XG5cblx0Y29udGVudDogXCLCt1wiO1xuXHRjb2xvcjogdmFyKC0tbmV1dHJhbC01MDApO1xufVxuXG4ucGFnZS1jb250ZW50c19faXRlbTpsYXN0LWNoaWxkOjphZnRlciB7XG5cblx0Y29udGVudDogbm9uZTtcbn1cblxuLnBhZ2UtY29udGVudHNfX2xpbmsge1xuXG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbGluayk7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLnBhZ2UtY29udGVudHNfX2xpbms6aG92ZXIge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmstaG92ZXIpO1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5wYWdlLWNvbnRlbnRzX19sYWJlbCB7XG5cblx0XHRmbGV4OiAwIDAgMTAwJTtcblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHBhZ2luYXRpb25cbi8vXG4vLyBSZWFsIHF1ZXJ5IHBhZ2luYXRpb24gb24gYSBwYW5lbDogcHJldmlvdXMgYW5kIG5leHQgZWl0aGVyIHNpZGUgb2YgYSBudW1iZXJlZFxuLy8gcnVuIHdpdGggdGhlIGN1cnJlbnQgcGFnZSBtYXJrZWQgYW5kIGEgcXVpZXQgZ2FwIHN0YW5kaW5nIGluIGZvciB0aGUgcGFnZXNcbi8vIGJldHdlZW4uIFNxdWFyZSBjb250cm9scyBwZXIgdGhlIG9uZS1yYWRpdXMgbGF3OyBhdCBwaG9uZSB3aWR0aCB0aGUgbnVtYmVyIHJ1blxuLy8gdGFrZXMgYSByb3cgb2YgaXRzIG93biwgdGhlIGFycm93cyBtb3ZlIGJlbmVhdGggaXQgb25lIGF0IGVhY2ggZW5kLCBhbmQgdGhlXG4vLyB0b2tlbnMgc2hyaW5rLiBUaGUgYXJyb3cgbGFiZWxzIFNUQVkg4oCUIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiB0aGlzIG5vdGUgc2FpZFxuLy8gdGhleSBkcm9wLCBhbmQgbmVpdGhlciB0aGUgbW9ja3VwIG5vciB0aGlzIGZpbGUgZXZlciBkaWQgdGhhdC4gTWVhc3VyZWQgYXQgMzkwOlxuLy8gdGhlIHR3byBhcnJvd3MgYW5kIHRoZWlyIHdvcmRzIHRha2UgMTg1cHggb2YgYSAzNTBweCByb3csIHNvIHRoZXJlIGlzIG5vIHJlYXNvbiB0by5cbi8vXG4vLyBTb3VyY2U6IGNhdGFsb2d1ZSBibG9jayBgcGFnaW5hdGlvbmAuIFBvcnRlZCBmb3IgdGhlIE1QRzcgY2F0ZWdvcnktYXJjaGl2ZSB3YWxrLCAyMDI2LTA5LTE2LlxuLy8gUmVjb25jaWxlZCBhZ2FpbnN0IHRoZSBNUEc3IG1vY2t1cCdzIG93biBzdHlsZXNoZWV0OiBieXRlLWlkZW50aWNhbCwgbm8gZGVwYXJ0dXJlcy5cblxuLnBhZ2luYXRpb24ge1xuXG5cdGRpc3BsYXk6IGdyaWQ7XG5cdGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KCAwLCAxZnIgKSBhdXRvIG1pbm1heCggMCwgMWZyICk7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtNCk7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTQpIHZhcigtLXNwYWNlLTYpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0Ym94LXNoYWRvdzogdmFyKC0tc2hhZG93LXBhbmVsKTtcbn1cblxuLy8gREVQQVJUVVJFOiB0aGUgbW9ja3VwJ3MgZmxleCByb3cgc3ByZWFkIGl0cyB0aHJlZSBwYXJ0cyB3aXRoIHNwYWNlLWJldHdlZW4sIHNvXG4vLyBvbiBwYWdlIDEg4oCUIG5vIFByZXZpb3VzIOKAlCB0aGUgbnVtYmVycyBzbGlkIGludG8gdGhlIGVtcHR5IHNsb3QgYW5kIHNhdCBvZmZcbi8vIGNlbnRyZSAob3BlcmF0b3IsIDIwMjYtMDktMjgpLiBBIHRocmVlLWNvbHVtbiBncmlkIHBpbnMgdGhlIHJ1biBpbiB0aGUgbWlkZGxlXG4vLyBjb2x1bW4gYW5kIGVhY2ggYXJyb3cgdG8gaXRzIG93biBzaWRlLCB3aGljaGV2ZXIgYXJyb3dzIGFyZSBwcmVzZW50LlxuLnBhZ2luYXRpb25fX2xpc3Qge1xuXG5cdGdyaWQtY29sdW1uOiAyO1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xuXHRtYXJnaW46IDA7XG5cdHBhZGRpbmc6IDA7XG5cdGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi5wYWdpbmF0aW9uX19wYWdlIHtcblxuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdG1pbi13aWR0aDogNDRweDtcblx0aGVpZ2h0OiA0NHB4O1xuXHRwYWRkaW5nLWlubGluZTogdmFyKC0tc3BhY2UtMyk7XG5cdGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWJ0bik7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiAxO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG4ucGFnaW5hdGlvbl9fcGFnZTpob3ZlciB7XG5cblx0Ym9yZGVyLWNvbG9yOiB2YXIoLS1ib3JkZXItYnJhbmQpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jYXJkLWhvdmVyKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbGluayk7XG59XG5cbi5wYWdpbmF0aW9uX19wYWdlLS1jdXJyZW50IHtcblxuXHRib3JkZXItY29sb3I6IHZhcigtLWJ0bi1wcmltYXJ5LWJnKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYnRuLXByaW1hcnktYmcpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0Y29sb3I6IHZhcigtLWJ0bi1wcmltYXJ5LXRleHQpO1xufVxuXG4ucGFnaW5hdGlvbl9fZ2FwIHtcblxuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdG1pbi13aWR0aDogMjRweDtcblx0aGVpZ2h0OiA0NHB4O1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGxpbmUtaGVpZ2h0OiAxO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG59XG5cbi5wYWdpbmF0aW9uX19hcnJvdyB7XG5cblx0ZGlzcGxheTogaW5saW5lLWZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMik7XG5cdGhlaWdodDogNDRweDtcblx0cGFkZGluZy1pbmxpbmU6IHZhcigtLXNwYWNlLTQpO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItYnJhbmQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtYnRuKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xuXHRsaW5lLWhlaWdodDogMTtcblx0Y29sb3I6IHZhcigtLXRleHQtbGluayk7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLnBhZ2luYXRpb25fX2Fycm93W3JlbD1cInByZXZcIl0ge1xuXG5cdGdyaWQtcm93OiAxO1xuXHRncmlkLWNvbHVtbjogMTtcblx0anVzdGlmeS1zZWxmOiBzdGFydDtcbn1cblxuLnBhZ2luYXRpb25fX2Fycm93W3JlbD1cIm5leHRcIl0ge1xuXG5cdGdyaWQtcm93OiAxO1xuXHRncmlkLWNvbHVtbjogMztcblx0anVzdGlmeS1zZWxmOiBlbmQ7XG59XG5cbi5wYWdpbmF0aW9uX19hcnJvdzpob3ZlciB7XG5cblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2FyZC1ob3Zlcik7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmstaG92ZXIpO1xufVxuXG4ucGFnaW5hdGlvbl9fYXJyb3cgc3ZnIHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0d2lkdGg6IDE0cHg7XG5cdGhlaWdodDogMTRweDtcbn1cblxuLyogVGhlIGNvbnRyb2wgaG9sZHMgYW4gaWNvbiBhbmQgYSB3b3JkLCBhbmQgb25seSB0aGUgd29yZCBoYXMgYSB0eXBlZmFjZS4gVHlwZVxuICAgdGhlcmVmb3JlIHNpdHMgaGVyZSByYXRoZXIgdGhhbiBvbiB0aGUgY29udHJvbCwgd2hpY2ggb3ducyB0aGUgYm94OiB0aGUgaWNvblxuICAgaXMgc2l6ZWQgaW4gcGl4ZWxzIGFuZCBpbmhlcml0cyBub3RoaW5nLCBzbyB0aGlzIGlzIHRoZSBvbmx5IGVsZW1lbnQgdGhlXG4gICBoZWFkaW5nIGZhY2UsIHRoZSBzbWFsbCBzdGVwIGFuZCB0aGUgbWVkaXVtIHdlaWdodCBhY3R1YWxseSBkZXNjcmliZS4gKi9cbi5wYWdpbmF0aW9uX19hcnJvdy1sYWJlbCB7XG5cblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG59XG5cbi8qIFRvbyBuYXJyb3cgZm9yIG9uZSByb3c6IHRoZSBudW1iZXIgcnVuIHRha2VzIGEgcm93IG9mIGl0cyBvd24gYW5kIHRoZSB0d29cbiAgIGFycm93cyBzaXQgYmVuZWF0aCBpdCwgb25lIGF0IGVhY2ggZW5kLCB3aGVyZSBhIHRodW1iIHJlYWNoZXMgdGhlbS4gKi9cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LnBhZ2luYXRpb24ge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoIDAsIDFmciApIG1pbm1heCggMCwgMWZyICk7XG5cdFx0Z2FwOiB2YXIoLS1zcGFjZS00KTtcblx0XHRwYWRkaW5nOiB2YXIoLS1zcGFjZS00KTtcblx0fVxuXG5cdC5wYWdpbmF0aW9uX19saXN0IHtcblxuXHRcdGdyaWQtcm93OiAxO1xuXHRcdGdyaWQtY29sdW1uOiAxIC8gLTE7XG5cdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdH1cblxuXHQucGFnaW5hdGlvbl9fYXJyb3dbcmVsPVwicHJldlwiXSB7XG5cblx0XHRncmlkLXJvdzogMjtcblx0XHRncmlkLWNvbHVtbjogMTtcblx0fVxuXG5cdC5wYWdpbmF0aW9uX19hcnJvd1tyZWw9XCJuZXh0XCJdIHtcblxuXHRcdGdyaWQtcm93OiAyO1xuXHRcdGdyaWQtY29sdW1uOiAyO1xuXHR9XG5cblx0LnBhZ2luYXRpb25fX3BhZ2UsXG5cdC5wYWdpbmF0aW9uX19nYXAge1xuXG5cdFx0bWluLXdpZHRoOiAzOHB4O1xuXHRcdGhlaWdodDogMzhweDtcblx0XHRwYWRkaW5nLWlubGluZTogdmFyKC0tc3BhY2UtMik7XG5cdH1cblxuXHQucGFnaW5hdGlvbl9fYXJyb3cge1xuXG5cdFx0aGVpZ2h0OiAzOHB4O1xuXHRcdHBhZGRpbmctaW5saW5lOiB2YXIoLS1zcGFjZS0zKTtcblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHBheWxhdGVyLWNhcmRcbi8vXG4vLyBUaGUgaW5zdGFsbWVudCBvZmZlciwgYnVpbHQgZXhhY3RseSBhcyB0aGUgbG95YWx0eSBjYXJkIHNvIHRoZSB0d28gcmVhZCBhc1xuLy8gYSBwYWlyIGVpdGhlciBzaWRlIG9mIGEgaGVyby4gVGhlIGNsYWltIGlzIG1hZGUgT05DRSBvbiB0aGUgcGFnZTogdGhlIGJ1eVxuLy8gYm94IGdhdmUgdXAgaXRzIG93biBzbWFsbCBwYXktbGF0ZXIgbGluZSB3aGVuIHRoaXMgY2FyZCBhcnJpdmVkLCBiZWNhdXNlXG4vLyBzYXlpbmcgaXQgdHdpY2Ugd2Vha2VucyBpdC4gVGhlIGZpZ3VyZSBpcyBzaG9ydCBvbiBwdXJwb3NlIOKAlCBhIGxvbmdlclxuLy8gc3RyaW5nIHdyYXBwZWQgd2hlcmUgdGhlIGxveWFsdHkgZmlndXJlIGRpZCBub3QsIGFuZCB0aGUgdHdvIGNhcmRzIHRoZW5cbi8vIHN0b3BwZWQgbWF0Y2hpbmcgaW4gaGVpZ2h0LlxuLy9cbi8vIFNvdXJjZTogY2F0YWxvZ3VlIGJsb2NrIGBwYXlsYXRlci1jYXJkYC4gUG9ydGVkIGZvciB0aGUgTVBHOSBwcm9kdWN0LXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLyogVGhlIHBheS1sYXRlciBjYXJkLCB1bmRlciB0aGUgZ2FsbGVyeS4gU2FtZSBjb25zdHJ1Y3Rpb24gYXMgdGhlIGxveWFsdHkgY2FyZFxuICAgc28gdGhlIHR3byByZWFkIGFzIGEgcGFpciBlaXRoZXIgc2lkZSBvZiB0aGUgaGVybywgYW5kIHRoZSBmaWd1cmUgaXMgc2V0IHRoZVxuICAgc2FtZSB3YXkg4oCUIGNvbW1lcmNlIGZhY2UsIGJsYWNrLCB3aXRoIHRoZSBleHBsYW5hdGlvbiBiZW5lYXRoIGl0LiAqL1xuLnBheWxhdGVyLWNhcmRfX2JvZHkge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtNCk7XG59XG5cbi5wYXlsYXRlci1jYXJkX19pY29uIHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0d2lkdGg6IDQ0cHg7XG5cdGhlaWdodDogNDRweDtcblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xufVxuXG4ucGF5bGF0ZXItY2FyZF9faWNvbiBzdmcge1xuXG5cdHdpZHRoOiAxMDAlO1xuXHRoZWlnaHQ6IDEwMCU7XG59XG5cbi8qIFNhbWUgZmxvb3IgYXMgdGhlIGxveWFsdHkgY2FyZCdzIGZpZ3VyZXMsIGZvciB0aGUgc2FtZSByZWFzb246IGEgZmxleCBpdGVtJ3NcbiAgIGRlZmF1bHQgbWluaW11bSBpcyBpdHMgbG9uZ2VzdCB3b3JkLCBzbyB3aXRob3V0IGl0IHRoZSBpbnN0YWxtZW50IHdvcmRpbmcgcHVzaGVzXG4gICB0aGUgaWNvbiBvdXQgb2YgdGhlIHJvdyByYXRoZXIgdGhhbiB3cmFwcGluZyB1bmRlciB0aGUgZmlndXJlLiAqL1xuLnBheWxhdGVyLWNhcmRfX2ZpZ3VyZXMge1xuXG5cdG1pbi13aWR0aDogMDtcbn1cblxuLyogTWF0Y2hlZCB0byB0aGUgbG95YWx0eSBmaWd1cmUgc28gdGhlIHR3byBjYXJkcyBhcmUgdGhlIHNhbWUgaGVpZ2h0LCB3aGljaCBpc1xuICAgdGhlIG9ubHkgd2F5IHRoZXkgbGluZSB1cCBhbG9uZyB0aGUgdG9wIGFzIHdlbGwgYXMgdGhlIGZvb3QuICovXG4ucGF5bGF0ZXItY2FyZF9fYW1vdW50IHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWNocm9tZSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDIpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctYm9sZCk7XG5cdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1oZWFkaW5nKTtcbn1cblxuLnBheWxhdGVyLWNhcmRfX25vdGUge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTEpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG59XG5cbi8qIEJvdGggY2FyZHMgY2FycnkgYSB0cmFpbGluZyBsaW5rLCB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZW0gdGhlIHNhbWUgaGVpZ2h0IOKAlFxuICAgYW5kIHRoYXQgaXMgdGhlIG9ubHkgd2F5IHR3byBjYXJkcyBib3R0b20tYWxpZ25lZCBjYW4gYWxzbyBsaW5lIHVwIGFsb25nIHRoZVxuICAgdG9wLiBCb3R0b20tYWxpZ25pbmcgYWxvbmUgcHV0IHRoZWlyIHRpdGxlIGJhcnMgMzZweCBhcGFydCwgd2hpY2ggcmVhZHMgd29yc2VcbiAgIHRoYW4gdGhlIDE0cHggaXQgd2FzIG1lYW50IHRvIGZpeCwgYmVjYXVzZSB0aGUgZXllIGZvbGxvd3MgdGhlIGJsdWUgYmFyIGFuZFxuICAgbm90IHRoZSBmb290IG9mIHRoZSBjYXJkLiAqL1xuLnBheWxhdGVyLWNhcmQgLnNlY3Rpb24tbGluayxcbi5sb3lhbHR5LWNhcmQgLnNlY3Rpb24tbGluayB7XG5cblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS00KTtcbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBwYXltZW50LW1hcmtzXG4vL1xuLy8gUG9ydGVkIGZyb20gY2F0YWxvZ3VlIGJsb2NrIGBwYXltZW50LW1hcmtzYCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTAsIG9wZXJhdG9yLWFjY2VwdGVkXG4vLyAyMDI2LTA5LTI0KSBmb3IgdGhlIGJhc2tldCB3YWxrLCBNUEcxMC4gVGhlIGNhdGFsb2d1ZSByb3cgaXMgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBwYXltZW50LW1hcmtzICAoRVhURU5ERUQg4oCUIHJlYWwgbWFya3MgcmVwbGFjZSB0aGUgdGV4dCBsYWJlbHM7XG4gICBFWFRFTkRFRCBhZ2FpbiBvbiB0aGUgYmFza2V0J3Mgc2Vjb25kIHJldmlldyDigJQgYSBHb29nbGUgUGF5IG1hcmsgam9pbnMgdGhlXG4gICByb3csIGRyYXduIHRoZSBzYW1lIHdheTogYSBtb25vY2hyb21lIEcgYW5kIFwiUGF5XCIgaW4gY3VycmVudENvbG9yLCBpbiB0aGVcbiAgIHNhbWUgaGFpcmxpbmUgY2hpcC4gQ1NTIHVuY2hhbmdlZDsgdGhlIHJvdyBpcyBub3cgVmlzYSwgTWFzdGVyY2FyZCxcbiAgIEFwcGxlIFBheSwgR29vZ2xlIFBheSwgQ2xlYXJwYXkg4oCUIHRoZSB3YXlzIFN0cmlwZSB0YWtlcyBwYXltZW50IGhlcmUuKVxuICAgVGhlIGFjY2VwdGVkIHdheXMgdG8gcGF5LCBiZW5lYXRoIHRoZSBjaGVja291dCBidXR0b24gYW5kIGRlbGliZXJhdGVseSBxdWlldFxuICAg4oCUIGEgcmVhc3N1cmFuY2UsIG5vdCBhIGZlYXR1cmUuXG5cbiAgIFdoYXQgY2hhbmdlZDogZWFjaCBtYXJrIGlzIG5vdyB0aGUgcGF5bWVudCBzY2hlbWUncyBvd24gZHJhd24gbWFyayAoVmlzYSxcbiAgIE1hc3RlcmNhcmQsIEFwcGxlIFBheSwgQ2xlYXJwYXkpIGFzIGlubGluZSBTVkcgcmF0aGVyIHRoYW4gYSB0ZXh0IGxhYmVsLCBzb1xuICAgdGhlIHNob3BwZXIgcmVjb2duaXNlcyBpdCBhdCBhIGdsYW5jZSBpbnN0ZWFkIG9mIHJlYWRpbmcgaXQuIFRoZSBtYXJrcyBhcmVcbiAgIGRyYXduIGluIGBjdXJyZW50Q29sb3JgIGFuZCB0aGUgY2hpcCBzZXRzIHRoYXQgdG8gdGhlIG11dGVkIHRleHQgcm9sZTogdGhlXG4gICBzY2hlbWVzJyBvd24gY29sb3VycyBhcmUgbm90IGluIHRoaXMgYnJhbmQncyBzZXZlbnRlZW4sIGFuZCBhIHJvdyBvZiBmb3VyXG4gICBjb21wZXRpbmcgbG9nb3MgYmVzaWRlIHRoZSBvbmUgYmx1ZSBidXR0b24gd291bGQgYmUgZXhhY3RseSB0aGUgZ2FyaXNobmVzc1xuICAgdGhlIGJyaWVmIHJ1bGVzIG91dC4gVGhlIGNoaXAga2VlcHMgaXRzIHNxdWFyZSBjb250cm9sIGNvcm5lciBhbmQgaGFpcmxpbmUuXG4gICBFYWNoIFNWRyBjYXJyaWVzIHJvbGU9XCJpbWdcIiBhbmQgYW4gYXJpYS1sYWJlbCwgc28gdGhlIGxpc3Qgc3RpbGwgcmVhZHMgYXNcbiAgIHdvcmRzIHRvIGEgc2NyZWVuIHJlYWRlci5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLnBheW1lbnQtbWFya3Mge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtd3JhcDogd3JhcDtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMik7XG5cdG1hcmdpbjogdmFyKC0tc3BhY2UtNCkgMCAwO1xuXHRwYWRkaW5nOiAwO1xuXHRsaXN0LXN0eWxlOiBub25lO1xufVxuXG4ucGF5bWVudC1tYXJrc19fbWFyayB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdG1pbi13aWR0aDogNTZweDtcblx0aGVpZ2h0OiAzNHB4O1xuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS0xKSB2YXIoLS1zcGFjZS0yKTtcblx0Ym9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtYnRuKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG59XG5cbi5wYXltZW50LW1hcmtzX19tYXJrIHN2ZyB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdHdpZHRoOiBhdXRvO1xuXHRoZWlnaHQ6IDE4cHg7XG59XG5cbi8qIFRoZSB0d28gcHJlc2VudGF0aW9uIGRldGFpbHMgdGhlIG1hcmtzJyBTVkdzIGNhcnJpZWQgaW5saW5lIGluIHRoZSBtb2NrdXAsIG1vdmVkXG4gICBoZXJlIGJlY2F1c2UgYSB0aGVtZSB0ZW1wbGF0ZSBjYXJyaWVzIG5vIGlubGluZSBzdHlsZXM6IHRoZSBWaXNhIHdvcmRtYXJrJ3Mgc2xhbnQsXG4gICBhbmQgdGhlIENsZWFycGF5IG1hcmsncyBrbm9ja2VkLW91dCBhcnJvdyBkcmF3biBpbiB0aGUgcGFuZWwgY29sb3VyLiAqL1xuLnBheW1lbnQtbWFya3NfX2l0YWxpYyB7XG5cblx0Zm9udC1zdHlsZTogaXRhbGljO1xufVxuXG4ucGF5bWVudC1tYXJrc19fa25vY2tvdXQge1xuXG5cdHN0cm9rZTogdmFyKC0tYmctcGFuZWwpO1xufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHBheW1lbnQtbWV0aG9kc1xuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBjaGVja291dCBtb2NrdXAgKGRlc2lnbiBvZiByZWNvcmQ6IE1QRzExLCBvcGVyYXRvci1hY2NlcHRlZFxuLy8gMjAyNi0wOS0yMykgZm9yIHRoZSBjaGVja291dCB3YWxrLCBNUEcxMS4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIHBheW1lbnQtbWV0aG9kcyAgKEVYVEVOREVEIG9uIHRoZSBjaGVja291dCdzIHNlY29uZCByZXZpZXcpXG4gICBUaGUgd2F5cyB0byBwYXkgYXMgcmFkaW8gdGlsZXM6IENhcmQgYW5kIENsZWFycGF5LCBhbmQgbm90aGluZyBlbHNlLiBFYWNoXG4gICB0aWxlJ3MgaGVhZCBpcyBhIGBjaG9pY2VgIHJhZGlvIHdpdGggdGhlIG1ldGhvZCdzIG5hbWUsIGFuIG9wdGlvbmFsIHNsYXRlXG4gICBkZXRhaWwgbGluZSwgYW5kIHRoZSBzY2hlbWUncyBvd24gbWFya3MgYXQgdGhlIGZhciBlbmQg4oCUIHRoZSBiYXNrZXQnc1xuICAgYHBheW1lbnQtbWFya3NgLCByZXVzZWQsIHNvIHRoZSBtYXJrcyBoZXJlIGFuZCB1bmRlciB0aGUgb3JkZXIgYnV0dG9uIGFyZVxuICAgb25lIGRyYXdpbmcuXG5cbiAgIFdoYXQgY2hhbmdlZDogbWFya3VwIGFuZCBjb3B5IG9ubHksIENTUyB1bnRvdWNoZWQuIFBheW1lbnRzIGFyZSBTdHJpcGUnc1xuICAgbm93OyBBcHBsZSBQYXkgYW5kIEdvb2dsZSBQYXkgaGF2ZSBtb3ZlZCB1cCBpbnRvIGV4cHJlc3MtY2hlY2tvdXQsIHNvIHRoZVxuICAgQXBwbGUgUGF5IHRpbGUgaXMgZ29uZS4gVGhlIENhcmQgdGlsZSBvcGVucyB0byBTdHJpcGUncyBjYXJkIGZpZWxkcyAoQ2FyZFxuICAgbnVtYmVyLCBFeHBpcnksIFNlY3VyaXR5IGNvZGUg4oCUIFN0cmlwZSdzIFBheW1lbnQgRWxlbWVudCBjb2xsZWN0cyBubyBuYW1lXG4gICBvbiBjYXJkKSBhbmQgdGhlIG5vdGUgdW5kZXIgdGhlbSBuYW1lcyBTdHJpcGUuIFRoZSBibG9jayBub3cgc2l0cyBpbnNpZGUgYVxuICAgYm9yZGVyZWQtZ3JvdXAgdGl0bGVkIFBheW1lbnQuXG5cbiAgIFRoZSB0aWxlcyBhcmUgbGlzdCByb3dzIGluc2lkZSBhIGhhaXJsaW5lIG91dGxpbmUgYXQgdGhlIHN1cmZhY2UgcmFkaXVzLFxuICAgdGhlIGNvbnN0cnVjdGlvbiBkZWxpdmVyeS1vcHRpb25zIHVzZXMsIGFuZCB0aGUgc2VsZWN0ZWQgdGlsZSB0YWtlcyB0aGVcbiAgIHNhbWUgY3VycmVudC1pdGVtIG1hcmtpbmc6IHRoZSBibHVlLXRpbnQgd2FzaCBhbmQgYSBQYXJhZ29uLWJsdWUgcnVsZSBvblxuICAgaXRzIGxlYWRpbmcgZWRnZS4gT25seSB0aGUgc2VsZWN0ZWQgdGlsZSBvcGVucy4gSXRzIGJvZHkga2VlcHMgdGhlIGxlYWRpbmdcbiAgIHJ1bGUsIHNvIHRoZSBjYXJkIGZpZWxkcyByZWFkIGFzIGJlbG9uZ2luZyB0byB0aGUgdGlsZSB0aGF0IG9wZW5lZCB0aGVtLlxuXG4gICBBIG1ldGhvZCB0aGF0IGlzIG5vdCBvZmZlcmVkIOKAlCBDbGVhcnBheSBvdmVyIGl0cyDCozEsMjAwIGxpbWl0IOKAlCBpcyBzaW1wbHlcbiAgIGFic2VudC4gVGhlIHRpbGVzIGFyZSBhIHN0YWNrLCBzbyBhIG1pc3Npbmcgb25lIGxlYXZlcyBubyBnYXAuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi5wYXltZW50LW1ldGhvZHMge1xuXG5cdG1pbi1pbmxpbmUtc2l6ZTogMDtcblx0bWFyZ2luOiAwO1xuXHRwYWRkaW5nOiAwO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnBheW1lbnQtbWV0aG9kc19fbGVnZW5kIHtcblxuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdHdpZHRoOiAxcHg7XG5cdGhlaWdodDogMXB4O1xuXHRtYXJnaW46IC0xcHg7XG5cdHBhZGRpbmc6IDA7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5cdGNsaXA6IHJlY3QoIDAgMCAwIDAgKTtcblx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcblx0Ym9yZGVyOiAwO1xufVxuXG4ucGF5bWVudC1tZXRob2RzX19pdGVtICsgLnBheW1lbnQtbWV0aG9kc19faXRlbSB7XG5cblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xufVxuXG4ucGF5bWVudC1tZXRob2RzX19oZWFkIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LXdyYXA6IHdyYXA7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0zKSB2YXIoLS1zcGFjZS00KTtcblx0cGFkZGluZzogdmFyKC0tc3BhY2UtNCkgdmFyKC0tc3BhY2UtNik7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsKTtcbn1cblxuLnBheW1lbnQtbWV0aG9kc19faXRlbTpoYXMoID4gLnBheW1lbnQtbWV0aG9kc19faGVhZCAuaW5wdXQtcmFkaW86Y2hlY2tlZCApIC5wYXltZW50LW1ldGhvZHNfX2hlYWQge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWNhcmQtaG92ZXIpO1xuXHRib3gtc2hhZG93OiBpbnNldCAzcHggMCAwIHZhcigtLWJvcmRlci1icmFuZCk7XG59XG5cbi5wYXltZW50LW1ldGhvZHNfX2hlYWQgLmNob2ljZSB7XG5cblx0ZmxleDogMSAxIGF1dG87XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5wYXltZW50LW1ldGhvZHNfX2hlYWQgLmNob2ljZV9fY29udHJvbCB7XG5cblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiAwO1xufVxuXG4ucGF5bWVudC1tZXRob2RzX19uYW1lIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1oZWFkaW5nKTtcbn1cblxuLnBheW1lbnQtbWV0aG9kc19fZGV0YWlsIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS0xKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbn1cblxuLnBheW1lbnQtbWV0aG9kc19fbWFya3Mge1xuXG5cdGZsZXg6IDAgMCBhdXRvO1xufVxuXG4vKiBwYXltZW50LW1hcmtzIHNpdHMgdW5kZXIgYSBidXR0b24gZXZlcnl3aGVyZSBlbHNlLCBjZW50cmVkIHdpdGggYSBnYXBcbiAgIGFib3ZlIGl0LiBJbiBhIHRpbGUgaGVhZCBpdCBzaXRzIGJlc2lkZSB0aGUgbWV0aG9kJ3MgbmFtZSwgc28gdGhlIGhlYWRcbiAgIHRha2VzIGJvdGggYmFjay4gTm90aGluZyBlbHNlIGFib3V0IHRoZSBtYXJrcyBjaGFuZ2VzLiAqL1xuLnBheW1lbnQtbWV0aG9kc19fbWFya3MgLnBheW1lbnQtbWFya3Mge1xuXG5cdG1hcmdpbjogMDtcblx0anVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbn1cblxuLnBheW1lbnQtbWV0aG9kc19fYm9keSB7XG5cblx0cGFkZGluZzogdmFyKC0tc3BhY2UtNik7XG5cdGJvcmRlci1ibG9jay1zdGFydDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xuXHRib3gtc2hhZG93OiBpbnNldCAzcHggMCAwIHZhcigtLWJvcmRlci1icmFuZCk7XG59XG5cbi5wYXltZW50LW1ldGhvZHNfX25vdGUge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMik7XG5cdG1hcmdpbjogdmFyKC0tc3BhY2UtNikgMCAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1ib2R5KTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuXG4ucGF5bWVudC1tZXRob2RzX19ub3RlLWljb24ge1xuXG5cdGZsZXg6IDAgMCBhdXRvO1xuXHR3aWR0aDogMThweDtcblx0aGVpZ2h0OiAxOHB4O1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG59XG5cbi5wYXltZW50LW1ldGhvZHNfX25vdGUtaWNvbiBzdmcge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHR3aWR0aDogMTAwJTtcblx0aGVpZ2h0OiAxMDAlO1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5wYXltZW50LW1ldGhvZHNfX2hlYWQge1xuXG5cdFx0cGFkZGluZzogdmFyKC0tc3BhY2UtNCk7XG5cdH1cblxuXHQucGF5bWVudC1tZXRob2RzX19tYXJrcyB7XG5cblx0XHRmbGV4LWJhc2lzOiAxMDAlO1xuXHRcdHBhZGRpbmctaW5saW5lLXN0YXJ0OiBjYWxjKCAyMHB4ICsgdmFyKC0tc3BhY2UtMykgKTtcblx0fVxuXG5cdC5wYXltZW50LW1ldGhvZHNfX21hcmtzIC5wYXltZW50LW1hcmtzIHtcblxuXHRcdGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcblx0fVxuXG5cdC5wYXltZW50LW1ldGhvZHNfX2JvZHkge1xuXG5cdFx0cGFkZGluZzogdmFyKC0tc3BhY2UtNCk7XG5cdH1cblxuXHQucGF5bWVudC1tZXRob2RzX19ub3RlIHtcblxuXHRcdGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuXHR9XG59XG5cbi8qIFRoZSBoaWdobGlnaHQgZm9sbG93cyB0aGUgQ0hFQ0tFRCBSQURJTyB0aHJvdWdoIGA6aGFzKClgIGFib3ZlLCBhbmQgbm90aGluZyBlbHNlLlxuICAgV29vQ29tbWVyY2UncyBjaGVja291dCBzY3JpcHQgb25seSBzd2FwcyB0aGUgb3BlbiBwYXltZW50IGJveCB3aGVuIHRoZSBzaG9wcGVyIHBpY2tzXG4gICBhbm90aGVyIG1ldGhvZCwgc28gYSBjbGFzcyB0aGUgc2VydmVyIHNldHMgb24gdGhlIGNob3NlbiBnYXRld2F5IG5ldmVyIG1vdmVzOiBhXG4gICBgLS1zZWxlY3RlZGAgbW9kaWZpZXIgZHJhd24gaGVyZSBhcyB3ZWxsIGxlZnQgQ2FyZCBsaXQgYmVzaWRlIEtsYXJuYSBvciBDbGVhcnBheVxuICAgKG9wZXJhdG9yLCAyMDI2LTA5LTI2KS4gVGhlIHNlcnZlciBhbHJlYWR5IHJlbmRlcnMgdGhlIGNob3NlbiByYWRpbyBgY2hlY2tlZGAsIHNvIHRoZVxuICAgcmFkaW8gYWxvbmUgY292ZXJzIGZpcnN0IHBhaW50IHRvby4gVGhlIHJhZGlvIGl0c2VsZiBpcyB0aGUgYnJhbmQgY2hvaWNlIGNvbnRyb2xcbiAgIChXb29Db21tZXJjZSdzIGBpbnB1dC1yYWRpb2AgY2xhc3Mga2VwdCBmb3IgaXRzIHNjcmlwdCkuICovXG5cbi8qIFBMQUNFIE9SREVSIGNsb3NlcyB0aGUgUGF5bWVudCBjYXJkIChvcGVyYXRvciwgMjAyNi0wOS0yNikuIEl0IGlzIFdvb0NvbW1lcmNlJ3NcbiAgIGAjcGxhY2Vfb3JkZXJgLCB3aG9zZSB0ZXh0IGNoZWNrb3V0LmpzIHJld3JpdGVzIG9uIGV2ZXJ5IHBheW1lbnQtbWV0aG9kIGNoYW5nZSDigJQgYW5cbiAgIGljb24gaW5zaWRlIGl0IHdvdWxkIGJlIHdpcGVkIG9uIHBhZ2UgbG9hZCDigJQgc28gdGhlIHBhZGxvY2sgaXMgZHJhd24gaGVyZSwgZnJvbSB0aGVcbiAgIHNhbWUgZHJhd2luZyB0aGUgb3RoZXIgUGxhY2UgT3JkZXIgYnV0dG9ucyBjYXJyeSwgYXMgYSBtYXNrIGluIGN1cnJlbnRDb2xvciAoYSBkYXRhXG4gICBVUkkgY2Fubm90IHJlYWQgYSBjdXN0b20gcHJvcGVydHkpLiAqL1xuLnBsYWNlLW9yZGVyICNwbGFjZV9vcmRlcjo6YmVmb3JlIHtcblxuXHRjb250ZW50OiBcIlwiO1xuXHR3aWR0aDogMTZweDtcblx0aGVpZ2h0OiAxNnB4O1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG5cdG1hc2s6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nYmxhY2snIHN0cm9rZS13aWR0aD0nMi40JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcmVjdCB4PSc0JyB5PScxMC41JyB3aWR0aD0nMTYnIGhlaWdodD0nMTEnLyUzRSUzQ3BhdGggZD0nTTggMTAuNVY3YTQgNCAwIDAgMSA4IDB2My41Jy8lM0UlM0Mvc3ZnJTNFXCIpIGNlbnRlciAvIGNvbnRhaW4gbm8tcmVwZWF0O1xufVxuXG4ud29vY29tbWVyY2UtY2hlY2tvdXQtcGF5bWVudCAuZm9ybS1hY3Rpb25zIHtcblxuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTgpO1xufVxuXG4ud29vY29tbWVyY2UtY2hlY2tvdXQtcGF5bWVudCAuZm9ybS1hY3Rpb25zICsgLndvb2NvbW1lcmNlLXRlcm1zLWFuZC1jb25kaXRpb25zLXdyYXBwZXIge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtNCk7XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgcHJvZHVjdC1jYXJkXG4vL1xuLy8gVGhlIGhvbWVwYWdlIHByb2R1Y3QgdGlsZTogbWFudWZhY3R1cmVyIGltYWdlIG9uIHBhbmVsIHdoaXRlLCBzdGFyIHJhdGluZ1xuLy8gd2l0aCByZXZpZXcgY291bnQsIHRpdGxlIGFuZCBwcmljZSBpbiB0aGUgY29tbWVyY2UgZm9udCwgc3RvY2sgYW5kIGRpc3BhdGNoXG4vLyBsaW5lLCB0aGVuIGFkZCB0byBiYXNrZXQgd2l0aCBhbiBvdXRsaW5lIHdpc2hsaXN0IGhlYXJ0IGJlc2lkZSBpdC5cbi8vXG4vLyBTb3VyY2U6IGNhdGFsb2d1ZSBibG9jayBgcHJvZHVjdC1jYXJkYC4gUG9ydGVkIGZvciB0aGUgTVBHOSBwcm9kdWN0LXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgcHJvZHVjdC1jYXJkICAoVVBEQVRFRCDigJQgYW4gaW5zdGFsbWVudCBsaW5lIGFuZCB0aHJlZSBzdGF0ZXMpXG5cbiAgIEZvdXIgYWRkaXRpdmUgc2xvdHMsIGV2ZXJ5IG9uZSBvZiB0aGVtIG9wdGlvbmFsLiBUaGUgY2FyZCBzdGlsbCByZW5kZXJzXG4gICBjb3JyZWN0bHkgd2l0aCBhbGwgZm91ciBhYnNlbnQsIHdoaWNoIGlzIGhvdyB0aGUgaG9tZXBhZ2UgYW5kIHRoZSBlZGl0b3JpYWxcbiAgIGJ1eSBiYW5kIGFscmVhZHkgdXNlIGl0LCBhbmQgbm90aGluZyBhYm91dCB0aGUgYmFzZSBjYXJkIG1vdmVkLlxuXG4gICAgIF9fYmFkZ2UgICAgICAgICAgdGhlIHNhbGUgbWFyaywgYWxlcnQgcmVkLCBvbiB0aGUgaW1hZ2UuIFJlZCBpcyByZXNlcnZlZFxuICAgICAgICAgICAgICAgICAgICAgIGZvciBzYWxlLCBvdXQgb2Ygc3RvY2sgYW5kIGVycm9ycywgYW5kIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgdGltZSB0aGUgY2FyZCBoYXMgZHJhd24gaXQuXG4gICAgIF9fcHJpY2Utd2FzICAgICAgdGhlIHByZXZpb3VzIHByaWNlIHN0cnVjayB0aHJvdWdoIGJlc2lkZSB0aGUgY3VycmVudCBvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgVGhlIGN1cnJlbnQgcHJpY2Ugc3RheXMgaW5rOiB0aGUgYmFkZ2UgY2FycmllcyB0aGUgcmVkLFxuICAgICAgICAgICAgICAgICAgICAgIHNvIHJlZCBuZXZlciBiZWNvbWVzIGRlY29yYXRpb24uXG4gICAgIF9faW5zdGFsbWVudHMgICAgcGF5LWxhdGVyIG1lc3NhZ2luZyBiZWxvbmdzIGJlc2lkZSBhIHByaWNlIGFuZCBub3Qgb25seVxuICAgICAgICAgICAgICAgICAgICAgIGluIGEgdHJ1c3QgY2FyZC4gU2hvd24gYWJvdmUgYSB0aHJlc2hvbGQgb25seSwgc28gaXRcbiAgICAgICAgICAgICAgICAgICAgICBuZXZlciBhcHBlYXJzIHVuZGVyIGEgwqM1Ljk5IGNhYmxlLCBhbmQgbmV2ZXIgb24gYW4gaXRlbVxuICAgICAgICAgICAgICAgICAgICAgIHRoYXQgY2Fubm90IGJlIGJvdWdodC5cbiAgICAgX19zdG9jay1ub3RlICAgICAnT25seSAyIGxlZnQnLiBTZXQgaW4gaW5rIGF0IG1lZGl1bSB3ZWlnaHQgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgICByZWQsIGJlY2F1c2UgbG93IHN0b2NrIGlzIG5vdCBvbiB0aGUgYnJhbmQncyByZWQgbGlzdC5cbiAgICAgICAgICAgICAgICAgICAgICBSYXJlIGlzIHdoYXQgbWFrZXMgaXQgY3JlZGlibGUuXG5cbiAgIE91dCBvZiBzdG9jayBpcyBhIHN0YXRlIHJhdGhlciB0aGFuIGEgc2xvdDogdGhlIHN0b2NrIGRvdCB0dXJucyByZWQgYW5kIHRoZVxuICAgYmFza2V0IGJ1dHRvbiBnaXZlcyB3YXkgdG8gJ05vdGlmeSBtZScsIHdoaWNoIGlzIG5vdCBhIGNvbW1lcmNlIGFjdGlvbiBhbmRcbiAgIHNvIHNldHMgaXRzIGxhYmVsIGluIHRoZSBoZWFkaW5nIGZvbnQgbGlrZSBldmVyeSBvdGhlciBzZWNvbmRhcnkgYnV0dG9uLlxuICAgVGhlIGNhcmQga2VlcHMgaXRzIHNoYXBlLlxuXG4gICBPbmUgY29ycmVjdGlvbiBjYXJyaWVkIGluIHRoaXMgb3ZlcndyaXRlOiB0aGUgY2F0YWxvZ3VlJ3MgY29weSBvZiB0aGUgbWVkaWFcbiAgIHJ1bGUgaGFkIGFuIGVzY2FwZSBjaGFyYWN0ZXIgaW4gZnJvbnQgb2YgdGhlIHNsYXNoIGluIGl0cyBhc3BlY3QgcmF0aW8sIHdoaWNoXG4gICBubyBicm93c2VyIHBhcnNlcy4gSXQgcmVhZHMgcGxhaW5seSBoZXJlLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi5wcm9kdWN0LWNhcmQge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWNhcmQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtY2FyZCk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5cdGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1jYXJkKTtcbn1cblxuLnByb2R1Y3QtY2FyZF9fbWVkaWEge1xuXG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0ZGlzcGxheTogYmxvY2s7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTYpIHZhcigtLXNwYWNlLTQpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jYXJkKTtcbn1cblxuLnByb2R1Y3QtY2FyZF9fbWVkaWEgaW1nIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdGFzcGVjdC1yYXRpbzogNCAvIDM7XG5cdG9iamVjdC1maXQ6IGNvbnRhaW47XG59XG5cbi5wcm9kdWN0LWNhcmRfX2JhZGdlIHtcblxuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdGluc2V0LWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS00KTtcblx0aW5zZXQtaW5saW5lLXN0YXJ0OiB2YXIoLS1zcGFjZS00KTtcblx0cGFkZGluZzogdmFyKC0tc3BhY2UtMSkgdmFyKC0tc3BhY2UtMyk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLW5lZ2F0aXZlKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWNocm9tZSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctYm9sZCk7XG5cdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRsZXR0ZXItc3BhY2luZzogMC4wNGVtO1xuXHR0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1vbi1icmFuZCk7XG59XG5cbi5wcm9kdWN0LWNhcmRfX2JvZHkge1xuXG5cdGZsZXg6IDEgMSBhdXRvO1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLTMpO1xuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS02KTtcblx0cGFkZGluZy1ibG9jay1zdGFydDogMDtcbn1cblxuLnByb2R1Y3QtY2FyZF9fdGl0bGUge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWNocm9tZSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDQpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctYm9sZCk7XG5cdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRsZXR0ZXItc3BhY2luZzogMC4wMWVtO1xufVxuXG4ucHJvZHVjdC1jYXJkX190aXRsZSBhIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1oZWFkaW5nKTtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG4ucHJvZHVjdC1jYXJkX190aXRsZSBhOmhvdmVyIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rKTtcbn1cblxuLnByb2R1Y3QtY2FyZF9fcHJpY2Uge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWNocm9tZSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDMpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctYm9sZCk7XG5cdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcbn1cblxuLnByb2R1Y3QtY2FyZF9fcHJpY2Utd2FzIHtcblxuXHRtYXJnaW4taW5saW5lLXN0YXJ0OiB2YXIoLS1zcGFjZS0yKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1oNCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcbn1cblxuLyogVGhlIGluc3RhbG1lbnQgbGluZSBpcyBwdWxsZWQgYmFjayBhZ2FpbnN0IHRoZSBwcmljZSBpdCBiZWxvbmdzIHRvLCBvdXQgb2ZcbiAgIHRoZSBib2R5J3Mgb3duIGdhcCwgc28gaXQgcmVhZHMgYXMgcGFydCBvZiB0aGUgcHJpY2UgYW5kIG5vdCBhcyBhIHRoaXJkXG4gICBsaW5lIG9mIG1ldGEuICovXG4ucHJvZHVjdC1jYXJkX19pbnN0YWxtZW50cyB7XG5cblx0bWFyZ2luOiBjYWxjKCAtMSAqIHZhcigtLXNwYWNlLTIpICkgMCAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuXG4ucHJvZHVjdC1jYXJkX19tZXRhIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbn1cblxuLnByb2R1Y3QtY2FyZF9fc3RvY2stZG90IHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0d2lkdGg6IDhweDtcblx0aGVpZ2h0OiA4cHg7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1waWxsKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItcG9zaXRpdmUpO1xufVxuXG4ucHJvZHVjdC1jYXJkX19zdG9jay1kb3QtLW91dCB7XG5cblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItbmVnYXRpdmUpO1xufVxuXG4ucHJvZHVjdC1jYXJkX19zdG9jay1ub3RlIHtcblxuXHRtYXJnaW46IGNhbGMoIC0xICogdmFyKC0tc3BhY2UtMikgKSAwIDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG4vKiBUaGUgYWN0aW9ucyBzaXQgb24gdGhlIGNhcmQncyBmbG9vciwgc28gYSByb3cgb2YgY2FyZHMgbGluZXMgaXRzIGJ1dHRvbnMgdXBcbiAgIHdoYXRldmVyIHRoZSB0aXRsZXMgcnVuIHRvIChvcGVyYXRvciwgMjAyNi0wOS0yNCkuIFRoZSBib2R5IGZpbGxzIHRoZSBjYXJkJ3NcbiAgIGhlaWdodCAoYWJvdmUpIGFuZCBgYXV0b2AgdGFrZXMgdXAgdGhlIHNsYWNrOyB0aGUgNHB4IHRoZSByb3cgYWx3YXlzIGhhZCBhYm92ZVxuICAgaXQgaXMga2VwdCBhcyBwYWRkaW5nLCBzbyBhIGxvbmUgY2FyZCBsb29rcyBleGFjdGx5IGFzIGl0IGRpZC4gKi9cbi5wcm9kdWN0LWNhcmRfX2FjdGlvbnMge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IGF1dG87XG5cdHBhZGRpbmctYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTEpO1xufVxuXG4ucHJvZHVjdC1jYXJkX19hY3Rpb25zIC5idG4ge1xuXG5cdGZsZXg6IDEgMSBhdXRvO1xufVxuXG4ucHJvZHVjdC1jYXJkX193aXNobGlzdCB7XG5cblx0ZmxleDogMCAwIGF1dG87XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0d2lkdGg6IDQycHg7XG5cdHBhZGRpbmc6IDA7XG5cdGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWJ0bik7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWNhcmQpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG5cdGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLnByb2R1Y3QtY2FyZF9fd2lzaGxpc3Q6aG92ZXIge1xuXG5cdGJvcmRlci1jb2xvcjogdmFyKC0tYm9yZGVyLWJyYW5kKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2FyZC1ob3Zlcik7XG59XG5cbi5wcm9kdWN0LWNhcmRfX3dpc2hsaXN0IHN2ZyB7XG5cblx0d2lkdGg6IDI2cHg7XG5cdGhlaWdodDogMjZweDtcbn1cblxuXG4vKiBFVkVSWSBDQVJEIElOIFRIRSBTVFJJUCBJUyBUSEUgU0FNRSBIRUlHSFQsIEFDUk9TUyBST1dTIEFTIFdFTEwgQVMgQUxPTkcgVEhFTS5cblxuICAgQSBncmlkIHJvdyBpcyBhcyB0YWxsIGFzIGl0cyBvd24gdGFsbGVzdCBpdGVtLCBzbyBhIGZvdXItY2FyZCBzdHJpcCBsYWlkIG91dFxuICAgdHdvLWJ5LXR3byBnaXZlcyB0d28gcm93cyB0aGF0IGVhY2ggc2l6ZSBpbmRlcGVuZGVudGx5IOKAlCBhbmQgb25lIHByb2R1Y3QgdGl0bGVcbiAgIHdyYXBwaW5nIHRvIGEgc2Vjb25kIGxpbmUgbWFrZXMgdGhlIHdob2xlIGJvdHRvbSByb3cgdGFsbGVyIHRoYW4gdGhlIHRvcCBvbmUuXG4gICBXaXRoaW4gYSByb3cgdGhlIGNhcmRzIGFscmVhZHkgbWF0Y2gsIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlIGRpZmZlcmVuY2UgcmVhZFxuICAgYXMgYSBmYXVsdCByYXRoZXIgdGhhbiBhcyBjb250ZW50OiB0d28gY2FyZHMgb2Ygb25lIGhlaWdodCBiZXNpZGUgdHdvIG9mXG4gICBhbm90aGVyLCB3aXRoIG5vdGhpbmcgdmlzaWJsZSB0byBleHBsYWluIGl0LlxuXG4gICBgMWZyYCBzaXplcyBldmVyeSByb3cgdG8gdGhlIHRhbGxlc3QsIHNvIHRoZSBzdHJpcCBpcyBvbmUgYmxvY2sgb2YgZXF1YWwgY2FyZHNcbiAgIHdoYXRldmVyIGFueSBzaW5nbGUgdGl0bGUgZG9lcy4gU2FmZSBiZWNhdXNlIHRoZSBjYXJkIGlzIGEgZmxleCBjb2x1bW4gd2l0aCBpdHNcbiAgIHByaWNlIHBpbm5lZCB0byB0aGUgYm90dG9tIOKAlCBhIHN0cmV0Y2hlZCBjYXJkIGdyb3dzIGl0cyBtaWRkbGUsIGl0IGRvZXMgbm90XG4gICBsZWF2ZSBhIGdhcCB1bmRlciBpdHMgY29udGVudC5cblxuICAgQnJhbmQtc2lkZSByYXRoZXIgdGhhbiBvbiBgLmdyaWQtLWluLWNlbGxgLCB3aGljaCBpcyBhIGdsb2JhbCBtb2RpZmllciBmb3VyXG4gICBicmFuZHMgdXNlOiB0aGUgcnVsZSBhbiBpbm5lciBncmlkIG5lZWRzIGlzIFwib2NjdXB5IG9uZSBjZWxsXCIsIGFuZCBlcXVhbCByb3dzXG4gICBpcyB0aGlzIHN0cmlwJ3Mgb3duIGRlY2lzaW9uLiAqL1xuLndwLWJsb2NrLXRmZi1wcm9kdWN0LXN0cmlwIHtcblxuXHRncmlkLWF1dG8tcm93czogMWZyO1xuXG5cdC8qIEFORCBOT1QgT05DRSBJVCBJUyBBIFNJTkdMRSBDT0xVTU4uIGAuZ3JpZC0tMmAgY29sbGFwc2VzIGF0IDc2OCwgYW5kIGJlbG93XG5cdCAgIHRoYXQgZXZlcnkgY2FyZCBpcyBpdHMgb3duIHJvdyDigJQgc28gYDFmcmAgc3RvcHMgZXF1YWxpc2luZyBjYXJkcyBiZXNpZGUgZWFjaFxuXHQgICBvdGhlciBhbmQgc3RhcnRzIHBhZGRpbmcgZXZlcnkgc3RhY2tlZCBjYXJkIG91dCB0byB0aGUgdGFsbGVzdCBvbmUgaW4gdGhlXG5cdCAgIHN0cmlwLiBNZWFzdXJlZCBhdCAzOTA6IGZvdXIgY2FyZHMgYXQgNTg3cHggZWFjaCwgd2hlcmUgdGhlaXIgb3duIGNvbnRlbnRcblx0ICAgd2FudGVkIDU2MywgNTYzLCA1ODcgYW5kIDU2My4gRXF1YWwgaGVpZ2h0IGlzIGEgcnVsZSBhYm91dCBhIFJPVyBvZiBjYXJkcyxcblx0ICAgYW5kIHRoZXJlIGFyZSBubyByb3dzIGhlcmUuICovXG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNzY4cHggKSB7XG5cblx0LndwLWJsb2NrLXRmZi1wcm9kdWN0LXN0cmlwIHtcblxuXHRcdGdyaWQtYXV0by1yb3dzOiBhdXRvO1xuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgcHJvZHVjdC1nYWxsZXJ5XG4vL1xuLy8gVGhlIHByb2R1Y3QncyBwaG90b2dyYXBoczogYSBzdGFnZSB0aGF0IG9wZW5zIGEgZnVsbC1zaXplIHZpZXcsIHdpdGggdGhlXG4vLyB0aHVtYm5haWwgc3RyaXAgYmVuZWF0aCBpdC4gVGhlIHN0cmlwIHNpdHMgdW5kZXIgdGhlIHN0YWdlIHJhdGhlciB0aGFuXG4vLyBiZXNpZGUgaXQgd2hlcmV2ZXIgdGhlIGNvbHVtbiBpcyBuYXJyb3cg4oCUIGEgNzZweCByYWlsIGRvd24gdGhlIHNpZGUgb2YgYVxuLy8gNDQ2cHggcGFuZWwgdGFrZXMgdGhlIHBpY3R1cmUgdG8gMzU0LiBUaGUgc3RhZ2UgaXMgb2JqZWN0LWZpdDogY29udGFpbiBvblxuLy8gcGFuZWwgd2hpdGUsIGJlY2F1c2UgdGhlIGNhdGFsb2d1ZSdzIHBob3RvZ3JhcGhzIGFyZSBtYW51ZmFjdHVyZXIgY3V0LW91dHNcbi8vIGF0IG1peGVkIHJhdGlvcyBhbmQgdGhlIGRlc2lnbiBicmllZiBmb3JiaWRzIGNyb3BwaW5nIHRoZW0gaW50byBzY2VuZXMuXG4vL1xuLy8gV0lSRUQgMjAyNi0wOS0xNiB0byB0aGUgc2hhcmVkIGBjYW1jb21Qcm9kdWN0R2FsbGVyeWAgbW9kdWxlLCB3aGljaCBiaW5kcyB0b1xuLy8gYF9fbWFpbmAsIGBfX2ltZ2AgYW5kIGBfX3RodW1iYC4gVGhlIG1vY2t1cCdzIGBfX3N0YWdlYCBhbmQgYF9faW1hZ2VgIHdlcmVcbi8vIHJlbmFtZWQgdG8gdGhvc2UgcmF0aGVyIHRoYW4gdGVhY2hpbmcgdGhlIG1vZHVsZSBhIHNlY29uZCB2b2NhYnVsYXJ5IOKAlCB0aGVcbi8vIG1vZHVsZSBpcyB0aGUgYmVoYXZpb3VyIGNvbnRyYWN0LCBhbmQgYSBicmFuZCB0aGF0IGludmVudHMgbmFtZXMgZ2V0cyB0byB3cml0ZVxuLy8gdGhlIGJlaGF2aW91ciBhZ2Fpbi4gVGhlIHNlbGVjdGVkIHRodW1iIGlzIGAtLWFjdGl2ZWAgZm9yIHRoZSBzYW1lIHJlYXNvbjogdGhhdFxuLy8gaXMgdGhlIGNsYXNzIHRoZSBtb2R1bGUgdG9nZ2xlcywgYW5kIHRoZSBtb2NrdXAncyBgLS1jdXJyZW50YCBzdHlsZWQgYSBzdGF0ZVxuLy8gbm90aGluZyB3b3VsZCBldmVyIHNldCDigJQgdGhlIGZpcnN0IHRodW1iIHdvdWxkIGhhdmUgc3RheWVkIGhpZ2hsaWdodGVkIHdoaWxlIHRoZVxuLy8gcGxhdGUgc2hvd2VkIGEgZGlmZmVyZW50IGltYWdlLiBgX190aHVtYi1idXR0b25gIGlzIGdvbmUgd2l0aCB0aGVtOiB3aXJlZCwgdGhlIHRodW1iIGlzXG4vLyBpdHMgb3duIGNvbnRyb2wgYW5kIHRoZSBtb2R1bGUgaGFuZGxlcyBjbGljayBhbmQga2V5Ym9hcmQuXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYHByb2R1Y3QtZ2FsbGVyeWAuIFBvcnRlZCBmb3IgdGhlIE1QRzkgcHJvZHVjdC1wYWdlIHdhbGssIDIwMjYtMDktMTYuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgTkVXIEJMT0NLUyDigJQgYXV0aG9yZWQgaGVyZSBiZWNhdXNlIG5vIGNhdGFsb2d1ZSBibG9jayBjYXJyaWVzIHRoZVxuICAgc3RydWN0dXJhbCBwdXJwb3NlLlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgVEhJUyBQQUdFJ1MgT1dOIEJMT0NLU1xuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIHByb2R1Y3QtZ2FsbGVyeSAgKFVQREFURUQg4oCUIHRoZSB0aHVtYm5haWwgcmFpbCBpcyB2ZXJ0aWNhbClcbiAgIE1hbnVmYWN0dXJlciBzaG90cyBvbiB3aGl0ZSBhdCB0aGVpciBuYXR1cmFsIHByb3BvcnRpb25zOyB0aGUgZGVzaWduIGJyaWVmXG4gICBmb3JiaWRzIGNyb3BwaW5nIHRoZW0gaW50byBzY2VuZXMsIHNvIHRoZSBzdGFnZSBpcyBgb2JqZWN0LWZpdDogY29udGFpbmAgYW5kXG4gICBhIHNxdWFyZSBzaG90IGFuZCBhIHdpZGUgb25lIGJvdGggc2l0IGNvcnJlY3RseSBpbiBpdC5cblxuICAgVGhlIHJhaWwgbW92ZWQgZnJvbSB1bmRlciB0aGUgc3RhZ2UgdG8gYmVzaWRlIGl0LiBFaWdodCA3NnB4IHRodW1icyBhdCBhblxuICAgOHB4IGdhcCBzdGFjayB0byA2NjRweCBhZ2FpbnN0IGEgNjkwcHggc3RhZ2UsIHNvIHRoZSBnYWxsZXJ5IGlzIGV4YWN0bHkgYXNcbiAgIHRhbGwgYXMgaXRzIG93biBwaWN0dXJlIGFuZCBhZGRzIG5vdGhpbmcgdG8gdGhlIGNvbHVtbi4gYGF1dG8tZmlsbGAgb24gYVxuICAgc3RyaXAgdW5kZXJuZWF0aCBjb3VsZCBub3QgZG8gdGhhdCDigJQgaXQgYWRkZWQgYSByb3cncyBoZWlnaHQgdG8gd2hpY2hldmVyXG4gICBjb2x1bW4gd2FzIGFscmVhZHkgdGFsbGVyLCB3aGljaCBpcyBob3cgdHdvIGVhcmxpZXIgYXR0ZW1wdHMgZW5kZWQgdXAgd2l0aFxuICAgd2hpdGUgc3BhY2UgdG8gZmlsbC5cblxuICAgVGhlIGN1cnJlbnQgdGh1bWJuYWlsIGlzIG1hcmtlZCB3aXRoIHRoZSBicmFuZCdzIDJweCBQYXJhZ29uLWJsdWUgYm9yZGVyLFxuICAgdGhlIHNhbWUgd2VpZ2h0IGEgYm9yZGVyZWQgZ3JvdXAgdXNlcywgYmVjYXVzZSB0aGlzIGJyYW5kIGhhcyBubyBzZWNvbmRcbiAgIGFjY2VudCB0byBtYXJrIGEgc2VsZWN0aW9uIHdpdGguXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnByb2R1Y3QtZ2FsbGVyeSB7XG5cblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA3NnB4IG1pbm1heCggMCwgMWZyICk7XG5cdGFsaWduLWl0ZW1zOiBzdGFydDtcblx0Z2FwOiB2YXIoLS1zcGFjZS00KTtcbn1cblxuLnByb2R1Y3QtZ2FsbGVyeV9fdGh1bWJzIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xuXHRtYXJnaW46IDA7XG5cdHBhZGRpbmc6IDA7XG5cdGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi5wcm9kdWN0LWdhbGxlcnlfX3RodW1iIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTEpO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5wcm9kdWN0LWdhbGxlcnlfX3RodW1iOmhvdmVyIHtcblxuXHRib3JkZXItY29sb3I6IHZhcigtLWJvcmRlci1icmFuZCk7XG59XG5cbi5wcm9kdWN0LWdhbGxlcnlfX3RodW1iOmZvY3VzLXZpc2libGUge1xuXG5cdG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItZm9jdXMpO1xuXHRvdXRsaW5lLW9mZnNldDogMnB4O1xufVxuXG4ucHJvZHVjdC1nYWxsZXJ5X190aHVtYi0tYWN0aXZlIC5wcm9kdWN0LWdhbGxlcnlfX3RodW1iIHtcblxuXHRib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItYnJhbmQpO1xuXHRwYWRkaW5nOiBjYWxjKCB2YXIoLS1zcGFjZS0xKSAtIDFweCApO1xufVxuXG4ucHJvZHVjdC1nYWxsZXJ5X190aHVtYiAucHJvZHVjdC1nYWxsZXJ5X19pbWcge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHR3aWR0aDogMTAwJTtcblx0YXNwZWN0LXJhdGlvOiAxIC8gMTtcblx0b2JqZWN0LWZpdDogY29udGFpbjtcbn1cblxuLnByb2R1Y3QtZ2FsbGVyeV9fbWFpbiB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4vKiBgYXNwZWN0LXJhdGlvYCBob2xkcyBvbmx5IGJlY2F1c2UgdGhlIGdsb2JhbCByZXNldCBnaXZlcyBldmVyeSBpbWFnZVxuICAgYGhlaWdodDogYXV0b2A6IGB3cF9nZXRfYXR0YWNobWVudF9pbWFnZSgpYCBlbWl0cyB3aWR0aCBhbmQgaGVpZ2h0IEFUVFJJQlVURVMsIGFuZFxuICAgd2l0aG91dCBhbiBhdXRob3IgaGVpZ2h0IHJ1bGUgdGhlIGF0dHJpYnV0ZSBzZXRzIHRoZSB1c2VkIGhlaWdodCDigJQgZXZlcnkgdGh1bWJuYWlsXG4gICByZW5kZXJlZCBhdCAzMDBweCBpbnNpZGUgYSA2NnB4IGJveC4gVGhpcyBydWxlIGNhcnJpZWQgaXRzIG93biBgaGVpZ2h0OiBhdXRvYCB1bnRpbFxuICAgdGhlIHJlc2V0IHRvb2sgaXQgb24gZm9yIGV2ZXJ5IGltYWdlICgyMDI2LTA5LTI3KS4gKi9cbi5wcm9kdWN0LWdhbGxlcnlfX2ltZyB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdHdpZHRoOiAxMDAlO1xuXHRhc3BlY3QtcmF0aW86IDEgLyAxO1xuXHRvYmplY3QtZml0OiBjb250YWluO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbCk7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogMTE4MHB4ICkge1xuXG4ucHJvZHVjdC1nYWxsZXJ5IHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KCAwLCAxZnIgKTtcblx0fVxuXG4ucHJvZHVjdC1nYWxsZXJ5X190aHVtYnMge1xuXG5cdFx0ZmxleC1kaXJlY3Rpb246IHJvdztcblx0XHRmbGV4LXdyYXA6IHdyYXA7XG5cdFx0b3JkZXI6IDI7XG5cdH1cblxuLnByb2R1Y3QtZ2FsbGVyeV9fdGh1bWIge1xuXG5cdFx0ZmxleDogMCAwIDc2cHg7XG5cdH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBPVkVSUklERVMgVEhBVCBNVVNUIE9VVFJBTksgVEhFIEJMT0NLUyBBQk9WRVxuXG4gICBCb3RoIG9mIHRoZXNlIGFyZSBzaW5nbGUtY2xhc3MgcnVsZXMgdGhhdCB0aWUgd2l0aCBhIGJsb2NrJ3Mgb3duIHNpbmdsZS1jbGFzc1xuICAgcnVsZSwgc28gdGhleSB3aW4gb24gU09VUkNFIE9SREVSIGFuZCBub3RoaW5nIGVsc2Ug4oCUIHdoaWNoIGlzIHdoeSB0aGV5IGFyZVxuICAgd3JpdHRlbiBoZXJlLCBhZnRlciB0aGUgYmxvY2tzLCByYXRoZXIgdGhhbiB1cCB3aXRoIHRoZSBwYWdlIGxheW91dC4gUGxhY2VkXG4gICBiZWZvcmUgdGhlIGJsb2NrcyB0aGV5IGxvc2Ugc2lsZW50bHkgYW5kIHRoZSBwYWdlIHJlbmRlcnMgYXMgaWYgdGhleSB3ZXJlXG4gICBuZXZlciB3cml0dGVuOyB0aGF0IGlzIGV4YWN0bHkgd2hhdCBoYXBwZW5lZCB0byB0aGUgZ2FsbGVyeSBtb2RpZmllciBvbiB0aGVcbiAgIGZpcnN0IHJ1biBvZiB0aGlzIGJ1aWxkLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qIC0tLS0gcHJvZHVjdC1nYWxsZXJ5IC0tdW5kZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICBUaGUgdGh1bWJuYWlscyBnbyBVTkRFUiB0aGUgc3RhZ2UgcmF0aGVyIHRoYW4gYmVzaWRlIGl0LCBhbmQgYXQgdGhpcyB3aWR0aFxuICAgdGhhdCBpcyBhcml0aG1ldGljIHJhdGhlciB0aGFuIHRhc3RlOiB0aGUgZ2FsbGVyeSBwYW5lbCdzIHBhZGRpbmcgbGVhdmVzXG4gICA0NDZweCwgYW5kIGEgNzZweCByYWlsIGRvd24gdGhlIHNpZGUgd291bGQgdGFrZSB0aGUgcGljdHVyZSB0byAzNTQuIFVuZGVyXG4gICBpdCwgdGhlIHN0YWdlIGtlZXBzIHRoZSB3aG9sZSA0NDYuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnByb2R1Y3QtZ2FsbGVyeS0tdW5kZXIge1xuXG5cdGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KCAwLCAxZnIgKTtcbn1cblxuLyogT05FIFJPVywgU0NST0xMRUQg4oCUIG5vdCB3cmFwcGVkLlxuICAgRWlnaHQgdGh1bWJzIGF0IDc2cHggcGx1cyBnYXBzIG5lZWQgNzAwcHggYW5kIHRoZSByYWlsIGhhcyA0NDYsIHNvIHdyYXBwaW5nIHB1dFxuICAgdGhlbSBvbiB0d28gcm93cyBhbmQgdGhlIGdhbGxlcnkncyBoZWlnaHQgdGhlbiBjaGFuZ2VkIHdpdGggdGhlIGltYWdlIGNvdW50OlxuICAgYSBmb3VyLWltYWdlIHByb2R1Y3QgYW5kIGEgbmluZS1pbWFnZSBvbmUgbWFkZSBkaWZmZXJlbnQtc2l6ZWQgcGFuZWxzLCB3aGljaCBpc1xuICAgdGhlIGhlcm8ncyB0d28gaGFsdmVzIGFyZ3VlZCBhYm91dCBpbiBhIGRpZmZlcmVudCBmb3JtLlxuICAgU2Nyb2xsZWQsIHRoZSByYWlsIGlzIG9uZSByb3cgd2hhdGV2ZXIgdGhlIHByb2R1Y3QgY2Fycmllcy4gYHNjcm9sbC1zbmFwYCBtYWtlc1xuICAgYSBkcmFnIGxhbmQgb24gYSB0aHVtYiByYXRoZXIgdGhhbiBiZXR3ZWVuIHR3bywgYW5kIHRoZSB0aGluIHNjcm9sbGJhciBpcyBsZWZ0XG4gICBWSVNJQkxFIGRlbGliZXJhdGVseSDigJQgYSBzY3JvbGwgYXJlYSB3aXRoIG5vIHNjcm9sbGJhciBpcyBhIHNjcm9sbCBhcmVhIG5vYm9keVxuICAga25vd3MgYWJvdXQuICovXG4ucHJvZHVjdC1nYWxsZXJ5LS11bmRlciAucHJvZHVjdC1nYWxsZXJ5X190aHVtYnMge1xuXG5cdGZsZXgtZGlyZWN0aW9uOiByb3c7XG5cdGZsZXgtd3JhcDogbm93cmFwO1xuXHRvcmRlcjogMjtcblx0b3ZlcmZsb3cteDogYXV0bztcblx0b3ZlcnNjcm9sbC1iZWhhdmlvci14OiBjb250YWluO1xuXHRzY3JvbGwtc25hcC10eXBlOiB4IHByb3hpbWl0eTtcblx0cGFkZGluZy1ibG9jay1lbmQ6IHZhcigtLXNwYWNlLTIpO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogdmFyKC0tYm9yZGVyLXN0cm9uZykgdHJhbnNwYXJlbnQ7XG59XG5cbi5wcm9kdWN0LWdhbGxlcnktLXVuZGVyIC5wcm9kdWN0LWdhbGxlcnlfX3RodW1iczo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXG5cdGhlaWdodDogNnB4O1xufVxuXG4ucHJvZHVjdC1nYWxsZXJ5LS11bmRlciAucHJvZHVjdC1nYWxsZXJ5X190aHVtYnM6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblxuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtcGlsbCk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJvcmRlci1zdHJvbmcpO1xufVxuXG4ucHJvZHVjdC1nYWxsZXJ5LS11bmRlciAucHJvZHVjdC1nYWxsZXJ5X190aHVtYiB7XG5cblx0ZmxleDogMCAwIDc2cHg7XG5cdHNjcm9sbC1zbmFwLWFsaWduOiBzdGFydDtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgZ2FsbGVyeSBsaWdodGJveCAgKE5FVylcbiAgIFRoZSBzdGFnZSBvcGVucyBhIGZ1bGwtc2l6ZSB2aWV3LiBDb21wb25lbnQgYnV5ZXJzIGluc3BlY3QgcG9ydCBsYXlvdXRzIGFuZFxuICAgY29ubmVjdG9yIHBvc2l0aW9ucywgYW5kIGVpZ2h0IHBob3RvZ3JhcGhzIGF0IDQ0NnB4IGRvZXMgbm90IGxldCB0aGVtLlxuXG4gICBEcml2ZW4gYnkgYDp0YXJnZXRgLCBzbyB0aGUgbW9ja3VwIGRlbW9uc3RyYXRlcyB0aGUgcmVhbCBiZWhhdmlvdXIgd2l0aCBub1xuICAgc2NyaXB0OyB0aGUgdGhlbWUncyBvd24gbW9kYWwgbW9kdWxlIHRha2VzIG92ZXIgYXQgd2lyaW5nIHRpbWUuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnByb2R1Y3QtZ2FsbGVyeV9fem9vbSB7XG5cblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRjdXJzb3I6IHpvb20taW47XG59XG5cbi5wcm9kdWN0LWdhbGxlcnlfX3pvb20tY3VlIHtcblxuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdGluc2V0LWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS0zKTtcblx0aW5zZXQtaW5saW5lLWVuZDogdmFyKC0tc3BhY2UtMyk7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0d2lkdGg6IDM4cHg7XG5cdGhlaWdodDogMzhweDtcblx0Ym9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtYnRuKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG59XG5cbi5wcm9kdWN0LWdhbGxlcnlfX3pvb20tY3VlIHN2ZyB7XG5cblx0d2lkdGg6IDIwcHg7XG5cdGhlaWdodDogMjBweDtcbn1cblxuLnByb2R1Y3QtZ2FsbGVyeV9fem9vbTpob3ZlciAucHJvZHVjdC1nYWxsZXJ5X196b29tLWN1ZSB7XG5cblx0Ym9yZGVyLWNvbG9yOiB2YXIoLS1ib3JkZXItYnJhbmQpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jYXJkLWhvdmVyKTtcbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBwcm9kdWN0LWhlYWRpbmdcbi8vXG4vLyBUaGUgcHJvZHVjdCdzIGJyYW5kIGV5ZWJyb3csIHRpdGxlIGFuZCB0aGUgYnJhbmQncyBkaWFnb25hbC1jdXQgcnVsZVxuLy8gYmVuZWF0aCBpdC4gMjZweCBpbiB0aGUgY29tbWVyY2UgZmFjZSwgYm9sZCBhbmQgc2xhbnRlZCDigJQgaXQgd2FzIDQwcHgsXG4vLyB3aGljaCBtYWRlIGl0IHRoZSBsb3VkZXN0IHRoaW5nIG9uIGEgcGFnZSB3aG9zZSBqb2IgaXMgYSBwaG90b2dyYXBoIGFuZCBhXG4vLyBwcmljZS5cbi8vXG4vLyBTb3VyY2U6IGNhdGFsb2d1ZSBibG9jayBgcHJvZHVjdC1oZWFkaW5nYC4gUG9ydGVkIGZvciB0aGUgTVBHOSBwcm9kdWN0LXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgcHJvZHVjdC1oZWFkaW5nICAoVVBEQVRFRCDigJQgaXQgbGl2ZXMgaW4gdGhlIGRlY2lzaW9uIGNvbHVtbilcbiAgIDI2cHggaW4gdGhlIGNvbW1lcmNlIGZhY2UsIGJvbGQgYW5kIHNsYW50ZWQsIG92ZXIgdGhlIGJyYW5kJ3MgZGlhZ29uYWwtY3V0XG4gICBydWxlLiBJdCB1c2VkIHRvIHJ1biBhY3Jvc3MgdGhlIHdob2xlIHBhZ2UgYXQgNDBweDsgYXQgdGhhdCBzaXplIGl0IHdhcyB0aGVcbiAgIGxvdWRlc3QgdGhpbmcgb24gYSBwYWdlIHdob3NlIGpvYiBpcyBhIHBob3RvZ3JhcGggYW5kIGEgcHJpY2UuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnByb2R1Y3QtaGVhZGluZ19fZXllYnJvdyB7XG5cblx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRtYXJnaW46IDAgMCB2YXIoLS1zcGFjZS0yKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWV5ZWJyb3cpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRsZXR0ZXItc3BhY2luZzogMC4xZW07XG5cdHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xuXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5wcm9kdWN0LWhlYWRpbmdfX2V5ZWJyb3c6aG92ZXIge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmstaG92ZXIpO1xufVxuXG4ucHJvZHVjdC1oZWFkaW5nX190aXRsZSB7XG5cblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtY2hyb21lKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1oMyk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1ib2xkKTtcblx0Zm9udC1zdHlsZTogaXRhbGljO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGxldHRlci1zcGFjaW5nOiAwLjAxZW07XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWhlYWRpbmcpO1xufVxuXG4ucHJvZHVjdC1oZWFkaW5nX19ydWxlIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdGhlaWdodDogNnB4O1xuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTQpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1icmFuZCk7XG5cdGNsaXAtcGF0aDogcG9seWdvbiggMjBweCAwLCAxMDAlIDAsIDEwMCUgMTAwJSwgMCAxMDAlICk7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cbi5wcm9kdWN0LWhlYWRpbmdfX3RpdGxlIHtcblxuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDQpO1xuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgcHJvZHVjdC1saW5lXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE1hZ2F6aW5lIEFydGljbGUgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxNiwgb3BlcmF0b3ItYXBwcm92ZWRcbi8vIDIwMjYtMDktMjgpIGZvciB0aGUgYXJ0aWNsZSB3YWxrLCBNUEcxNi4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIHByb2R1Y3QtbGluZSAgKE5FVylcbiAgIFRoZSBjb21wYWN0IHByb2R1Y3Qgcm93IGZvciBhIHJhaWw6IGEgc21hbGwgbWFudWZhY3R1cmVyIHNob3Qgb24gd2hpdGUsXG4gICB0aGUgbmFtZSBhbmQgdGhlIHByaWNlIGluIHRoZSBjb21tZXJjZSBmb250LiBUaGUgd2hvbGUgcm93IGlzIHRoZSBsaW5rIOKAlFxuICAgbm8gYmFza2V0IGJ1dHRvbiBoZXJlOyB0aGUgYXJ0aWNsZSdzIEJ1eSBpdCBiYW5kIGNhcnJpZXMgdGhvc2UuIFJvd3MgcnVuXG4gICBlZGdlIHRvIGVkZ2UgaW4gYSBmbHVzaCB3aWRnZXQgYm9keSwgZWFjaCB3aXRoIGEgaGFpcmxpbmUgYWJvdmUgaXQuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnByb2R1Y3QtbGluZSB7XG5cblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA1NnB4IG1pbm1heCggMCwgMWZyICk7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTMpIHZhcigtLXNwYWNlLTYpO1xuXHRib3JkZXItYmxvY2stc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblxufVxuXG4ucHJvZHVjdC1saW5lOmhvdmVyIHtcblxuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jYXJkLWhvdmVyKTtcblxufVxuXG4ucHJvZHVjdC1saW5lX19tZWRpYSB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdHdpZHRoOiA1NnB4O1xuXHRhc3BlY3QtcmF0aW86IDE7XG5cdG9iamVjdC1maXQ6IGNvbnRhaW47XG5cdGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jYXJkKTtcblxufVxuXG4ucHJvZHVjdC1saW5lX19ib2R5IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLTEpO1xuXHRtaW4td2lkdGg6IDA7XG5cbn1cblxuLnByb2R1Y3QtbGluZV9fdGl0bGUge1xuXG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1jaHJvbWUpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LWJvbGQpO1xuXHRmb250LXN0eWxlOiBpdGFsaWM7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtaGVhZGluZyk7XG5cbn1cblxuLnByb2R1Y3QtbGluZTpob3ZlciAucHJvZHVjdC1saW5lX190aXRsZSB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtbGluayk7XG5cbn1cblxuLnByb2R1Y3QtbGluZV9fcHJpY2Uge1xuXG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1jaHJvbWUpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctYm9sZCk7XG5cdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHByb2R1Y3QtbGlzdC1yb3dcbi8vXG4vLyBUaGUgbGlzdGluZydzIG90aGVyIGxheW91dCwgYW5kIGEgZGlmZmVyZW50IGJsb2NrIGZyb20gdGhlIHByb2R1Y3QgY2FyZCBvblxuLy8gcHVycG9zZTogaW1hZ2UgbGVmdDsgdGl0bGUsIFBhcmFnb24tYmx1ZSBidWxsZXQgaGlnaGxpZ2h0cyBhbmQgdGhlIHRocmVlIGZhY3RzXG4vLyBhIHNob3BwZXIgYXNrcyBmb3Ig4oCUIHN0b2NrLCBkaXNwYXRjaCBkYXksIGxveWFsdHkgcG9pbnRzIOKAlCBpbiB0aGUgbWlkZGxlO1xuLy8gcHJpY2UsIGluc3RhbG1lbnQgbGluZSwgd2lzaGxpc3QgYW5kIGFkZCB0byBiYXNrZXQgaW4gYSBjb2x1bW4gb24gdGhlIHJpZ2h0IHNvXG4vLyBwcmljZXMgbGluZSB1cCBkb3duIHRoZSBwYWdlLlxuLy9cbi8vIFRoZSByb3dzIHN0YWNrIGluIGAucHJvZHVjdC1saXN0YCwgd2hpY2ggaXMgdGhlIGxpc3QgdmlldydzIGNvbnRhaW5lciBhbmQgdGhlXG4vLyBncmlkJ3MgY291bnRlcnBhcnQuIFRoZSB0d28gbGF5b3V0cyBuZXZlciByZW5kZXIgdG9nZXRoZXIuXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYHByb2R1Y3QtbGlzdC1yb3dgLiBQb3J0ZWQgZm9yIHRoZSBNUEc3IGNhdGVnb3J5LWFyY2hpdmUgd2FsaywgMjAyNi0wOS0xNi5cbi8vIFJlY29uY2lsZWQgYWdhaW5zdCB0aGUgTVBHNyBtb2NrdXAncyBvd24gc3R5bGVzaGVldDogYnl0ZS1pZGVudGljYWwsIG5vIGRlcGFydHVyZXMuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIHByb2R1Y3QtbGlzdC1yb3cgIChORVcpXG4gICBUaGUgbGlzdGluZydzIG90aGVyIGxheW91dCwgYW5kIGEgZGlmZmVyZW50IGJsb2NrIGZyb20gdGhlIHByb2R1Y3QgY2FyZCBvblxuICAgcHVycG9zZTogdGhlIGNhcmQgY29tcGFyZXMgcHJvZHVjdHMgYnkgc2hhcGUgYW5kIHByaWNlLCBhbmQgdGhlIHJvd1xuICAgY29tcGFyZXMgdGhlbSBieSBzcGVjaWZpY2F0aW9uLlxuXG4gICBJbWFnZSBsZWZ0OyB0aXRsZSwgdGhyZWUgYnVsbGV0IGhpZ2hsaWdodHMgYW5kIHRoZSB0aHJlZSBmYWN0cyBhIHNob3BwZXJcbiAgIGFza3MgZm9yIOKAlCBzdG9jaywgZGlzcGF0Y2ggZGF5LCBsb3lhbHR5IHBvaW50cyDigJQgaW4gdGhlIG1pZGRsZTsgcHJpY2UsXG4gICBpbnN0YWxtZW50IGxpbmUsIHdpc2hsaXN0IGFuZCBhZGQgdG8gYmFza2V0IGluIGEgY29sdW1uIG9uIHRoZSByaWdodCwgc28gdGhlXG4gICBwcmljZXMgbGluZSB1cCBkb3duIHRoZSBwYWdlIHdoYXRldmVyIHRoZSB0aXRsZXMgZG8uXG5cbiAgIFRoZSBidWxsZXQgaXMgdGhlIGJyYW5kJ3Mgc21hbGwgUGFyYWdvbi1ibHVlIGRvdC4gVGhlIGZhY3RzIGFyZSBvdXRsaW5lXG4gICBQYXJhZ29uLWJsdWUgaWNvbnMgd2l0aCBhIHNob3J0IGJvZHktZm9udCBsYWJlbCBlYWNoLiBMb3lhbHR5IHBvaW50cyBhcmVcbiAgIGRpc3BsYXktb25seSB1bnRpbCB0aGUgcG9pbnRzIHN5c3RlbSBleGlzdHMuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnByb2R1Y3QtbGlzdC1yb3cge1xuXG5cdGRpc3BsYXk6IGdyaWQ7XG5cdGdyaWQtdGVtcGxhdGUtY29sdW1uczogMjAwcHggbWlubWF4KCAwLCAxZnIgKSAyNTBweDtcblx0Z2FwOiB2YXIoLS1zcGFjZS02KTtcblx0cGFkZGluZzogdmFyKC0tc3BhY2UtNik7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWNhcmQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtY2FyZCk7XG5cdGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1jYXJkKTtcbn1cblxuLnByb2R1Y3QtbGlzdC1yb3dfX21lZGlhIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0YWxpZ24tc2VsZjogc3RhcnQ7XG59XG5cbi5wcm9kdWN0LWxpc3Qtcm93X19tZWRpYSBpbWcge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHR3aWR0aDogMTAwJTtcblx0YXNwZWN0LXJhdGlvOiA0IC8gMztcblx0b2JqZWN0LWZpdDogY29udGFpbjtcbn1cblxuLyogVGhlIG1pZGRsZSBjb2x1bW4uIFRoZSB0cmFjayBwbGFjZXMgaXQg4oCUIGBtaW5tYXgoIDAsIDFmciApYCBiZXR3ZWVuIGEgZml4ZWRcbiAgIHBpY3R1cmUgYW5kIGEgZml4ZWQgYnV5IGNvbHVtbiDigJQgc28gaXQgZGVjbGFyZXMgbm8gbGF5b3V0LCBvbmx5IHRoZSBmbG9vciB0aGF0XG4gICBrZWVwcyBhIGxvbmcgcHJvZHVjdCBuYW1lIGluc2lkZSB0aGUgY29sdW1uIGluc3RlYWQgb2Ygd2lkZW5pbmcgdGhlIHJvdyBwYXN0XG4gICBpdHMgb3duIGNhcmQuIFByb2R1Y3QgbmFtZXMgaGVyZSBydW4gdG8gJ0JhY2tib25lIE9uZTogUGxheVN0YXRpb24gR2FtaW5nXG4gICBDb250cm9sbGVyIEZvciBpT1MgTGlnaHRuaW5nIC0gV2hpdGUnLiAqL1xuLnByb2R1Y3QtbGlzdC1yb3dfX2JvZHkge1xuXG5cdG1pbi13aWR0aDogMDtcbn1cblxuLnByb2R1Y3QtbGlzdC1yb3dfX3RpdGxlIHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1jaHJvbWUpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWg0KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LWJvbGQpO1xuXHRmb250LXN0eWxlOiBpdGFsaWM7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0bGV0dGVyLXNwYWNpbmc6IDAuMDFlbTtcbn1cblxuLnByb2R1Y3QtbGlzdC1yb3dfX3RpdGxlIGEge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWhlYWRpbmcpO1xuXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5wcm9kdWN0LWxpc3Qtcm93X190aXRsZSBhOmhvdmVyIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rKTtcbn1cblxuLnByb2R1Y3QtbGlzdC1yb3dfX2hpZ2hsaWdodHMge1xuXG5cdG1hcmdpbjogdmFyKC0tc3BhY2UtMykgMCAwO1xuXHRwYWRkaW5nOiAwO1xuXHRsaXN0LXN0eWxlOiBub25lO1xufVxuXG4ucHJvZHVjdC1saXN0LXJvd19faGlnaGxpZ2h0IHtcblxuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdHBhZGRpbmctaW5saW5lLXN0YXJ0OiB2YXIoLS1zcGFjZS00KTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG4ucHJvZHVjdC1saXN0LXJvd19faGlnaGxpZ2h0OjpiZWZvcmUge1xuXG5cdGNvbnRlbnQ6IFwiXCI7XG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0aW5zZXQtaW5saW5lLXN0YXJ0OiAwO1xuXHRpbnNldC1ibG9jay1zdGFydDogMC42MmVtO1xuXHR3aWR0aDogNnB4O1xuXHRoZWlnaHQ6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXBpbGwpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1icmFuZCk7XG59XG5cbi5wcm9kdWN0LWxpc3Qtcm93X19mYWN0cyB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC13cmFwOiB3cmFwO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpIHZhcigtLXNwYWNlLTYpO1xuXHRtYXJnaW46IHZhcigtLXNwYWNlLTQpIDAgMDtcblx0cGFkZGluZzogMDtcblx0bGlzdC1zdHlsZTogbm9uZTtcbn1cblxuLnByb2R1Y3QtbGlzdC1yb3dfX2ZhY3Qge1xuXG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuXG4ucHJvZHVjdC1saXN0LXJvd19fZmFjdCBzdmcge1xuXG5cdGZsZXg6IDAgMCBhdXRvO1xuXHR3aWR0aDogMThweDtcblx0aGVpZ2h0OiAxOHB4O1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG59XG5cbi5wcm9kdWN0LWxpc3Qtcm93X19idXkge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKTtcbn1cblxuLnByb2R1Y3QtbGlzdC1yb3dfX3ByaWNlIHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1jaHJvbWUpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWgzKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LWJvbGQpO1xuXHRmb250LXN0eWxlOiBpdGFsaWM7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG59XG5cbi5wcm9kdWN0LWxpc3Qtcm93X19pbnN0YWxtZW50cyB7XG5cblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuXHR0ZXh0LWFsaWduOiByaWdodDtcbn1cblxuLnByb2R1Y3QtbGlzdC1yb3dfX2FjdGlvbnMge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xuXHR3aWR0aDogMTAwJTtcblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS0yKTtcbn1cblxuLnByb2R1Y3QtbGlzdC1yb3dfX2FjdGlvbnMgLmJ0biB7XG5cblx0ZmxleDogMSAxIGF1dG87XG59XG5cbi5wcm9kdWN0LWxpc3Qtcm93X193aXNobGlzdCB7XG5cblx0ZmxleDogMCAwIGF1dG87XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0d2lkdGg6IDQycHg7XG5cdHBhZGRpbmc6IDA7XG5cdGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWJ0bik7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWNhcmQpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG5cdGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLnByb2R1Y3QtbGlzdC1yb3dfX3dpc2hsaXN0OmhvdmVyIHtcblxuXHRib3JkZXItY29sb3I6IHZhcigtLWJvcmRlci1icmFuZCk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWNhcmQtaG92ZXIpO1xufVxuXG4ucHJvZHVjdC1saXN0LXJvd19fd2lzaGxpc3Qgc3ZnIHtcblxuXHR3aWR0aDogMjZweDtcblx0aGVpZ2h0OiAyNnB4O1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDkwMHB4ICkge1xuXG5cdC5wcm9kdWN0LWxpc3Qtcm93IHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogMTUwcHggbWlubWF4KCAwLCAxZnIgKTtcblx0fVxuXG5cdC5wcm9kdWN0LWxpc3Qtcm93X19idXkge1xuXG5cdFx0Z3JpZC1jb2x1bW46IDEgLyAtMTtcblx0XHRmbGV4LWRpcmVjdGlvbjogcm93O1xuXHRcdGZsZXgtd3JhcDogd3JhcDtcblx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRcdGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjtcblx0fVxuXG5cdC5wcm9kdWN0LWxpc3Qtcm93X19hY3Rpb25zIHtcblxuXHRcdHdpZHRoOiBhdXRvO1xuXHRcdG1hcmdpbi1ibG9jay1zdGFydDogMDtcblx0fVxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5wcm9kdWN0LWxpc3Qtcm93IHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KCAwLCAxZnIgKTtcblx0XHRnYXA6IHZhcigtLXNwYWNlLTQpO1xuXHR9XG5cblx0LnByb2R1Y3QtbGlzdC1yb3dfX21lZGlhIGltZyB7XG5cblx0XHRtYXgtd2lkdGg6IDIwMHB4O1xuXHR9XG5cblx0LnByb2R1Y3QtbGlzdC1yb3dfX2FjdGlvbnMge1xuXG5cdFx0d2lkdGg6IDEwMCU7XG5cdH1cbn1cblxuLyogLS0tLSB0aGUgbGlzdCB2aWV3J3MgY29udGFpbmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgIFRoZSByb3dzIHN0YWNrOyBub3RoaW5nIGVsc2UuIEl0IGlzIHRoZSBncmlkJ3MgY291bnRlcnBhcnQgYW5kIHRoZSB0d28gbmV2ZXJcbiAgIHJlbmRlciB0b2dldGhlciDigJQgdGhlIHNob3BwZXIncyB2aWV3IHRvZ2dsZSBwaWNrcyBvbmUuXG5cbiAgIE5vdCBpbiB0aGUgY2F0YWxvZ3VlIHJvdywgd2hpY2ggc3RvcmVzIHRoZSBST1cuIFRha2VuIGZyb20gdGhlIE1QRzcgbW9ja3VwJ3NcbiAgIG93biBzdHlsZXNoZWV0LCB3aGVyZSBpdCBpcyBkZWNsYXJlZCBiZXNpZGUgaXQuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi5wcm9kdWN0LWxpc3Qge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogdmFyKC0tc3BhY2UtY29udGVudC1nYXApO1xufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHByb2R1Y3QtbWluaVxuLy9cbi8vIFRoZSBjb21wYWN0IHByb2R1Y3QgdGlsZSBmb3IgZGVuc2Ugcm93cyDigJQgcmVjZW50bHkgdmlld2VkLCBjcm9zcy1zZWxscy5cbi8vIEltYWdlLCB0aXRsZSBhbmQgcHJpY2UgaW4gdGhlIGNvbW1lcmNlIGZvbnQgb25seTsgbm8gcmF0aW5nLCBubyBhZGQgdG9cbi8vIGJhc2tldC5cbi8vXG4vLyBTb3VyY2U6IGNhdGFsb2d1ZSBibG9jayBgcHJvZHVjdC1taW5pYC4gUG9ydGVkIGZvciB0aGUgTVBHOSBwcm9kdWN0LXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLnByb2R1Y3QtbWluaSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2FyZCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0Ym94LXNoYWRvdzogdmFyKC0tc2hhZG93LWNhcmQpO1xufVxuXG4ucHJvZHVjdC1taW5pX19tZWRpYSB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTMpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jYXJkKTtcbn1cblxuLnByb2R1Y3QtbWluaV9fbWVkaWEgaW1nIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdGFzcGVjdC1yYXRpbzogMSAvIDE7XG5cdG9iamVjdC1maXQ6IGNvbnRhaW47XG59XG5cbi5wcm9kdWN0LW1pbmlfX2JvZHkge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogdmFyKC0tc3BhY2UtMik7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTQpO1xuXHRwYWRkaW5nLWJsb2NrLXN0YXJ0OiAwO1xufVxuXG4ucHJvZHVjdC1taW5pX190aXRsZSB7XG5cblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtY2hyb21lKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1ib2xkKTtcblx0Zm9udC1zdHlsZTogaXRhbGljO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG59XG5cbi5wcm9kdWN0LW1pbmlfX3RpdGxlIGEge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWhlYWRpbmcpO1xuXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5wcm9kdWN0LW1pbmlfX3RpdGxlIGE6aG92ZXIge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xufVxuXG4ucHJvZHVjdC1taW5pX19wcmljZSB7XG5cblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtY2hyb21lKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LWJvbGQpO1xuXHRmb250LXN0eWxlOiBpdGFsaWM7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgcHJvbW8tdGlsZVxuLy9cbi8vIEEgcHJvbW90aW9uYWwgdGlsZSDigJQgYSBwaG90b2dyYXBoIGNhcnJ5aW5nIG9uZSBzaG9ydCBvdmVybGFpZCBsaW5lIGFuZCBhIGN1ZS5cbi8vXG4vLyBTUVVBUkUsIGRlbGliZXJhdGVseS4gVGhlIHRpbGUgYXBwZWFycyBpbiB0d28gcGxhY2VzIHdpdGggZGlmZmVyZW50IGhlaWdodHNcbi8vIGF2YWlsYWJsZSB0byB0aGVtOiBiZXNpZGUgYSBwcm9kdWN0IGJhbmQsIGFuZCBzdGFja2VkIGluIHRoZSBzdG9yZSByYWlsLiBUYWtpbmdcbi8vIGl0cyBoZWlnaHQgZnJvbSB0aGUgaW1hZ2UncyBvd24gYXNwZWN0IHJhdGlvIG1hZGUgaXQgNDI2cHggaW4gdGhlIHJhaWwsIHNvIGFcbi8vIHBpbm5lZCBwYWlyIHdhcyA4ODMgYW5kIGRpZCBub3QgZml0IGEgbGFwdG9wIHdpbmRvdyDigJQgd2hpY2ggdGhlbiB3YW50ZWQgYVxuLy8gaGVpZ2h0IGJyZWFrcG9pbnQgdG8gY29wZSB3aXRoLiBPbmUgcmF0aW8gcmVtb3ZlcyB0aGUgcHJvYmxlbSBpbnN0ZWFkIG9mXG4vLyBoYW5kbGluZyBpdCwgYW5kIGdpdmVzIHdob2V2ZXIgbWFrZXMgdGhlIGFydHdvcmsgYSBzaW5nbGUgc3BlYyB0byBkZXNpZ24gdG86XG4vLyBzcXVhcmUsIDY1Nng2NTYgZm9yIGEgMnggcmFpbCB0aWxlLlxuLy9cbi8vIFNvdXJjZTogY2F0YWxvZ3VlIGJsb2NrIGBwcm9tby10aWxlYC4gUG9ydGVkIGZvciB0aGUgTVBHOSBwcm9kdWN0LXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLnByb21vLXRpbGUge1xuXG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0ZGlzcGxheTogYmxvY2s7XG5cdGFzcGVjdC1yYXRpbzogMTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1uZXV0cmFsLTgwMCk7XG5cdGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1jYXJkKTtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG4vKiBUSEUgVElMRSBUSEFUIFRBS0VTIElUUyBIRUlHSFQgRlJPTSBBIE5FSUdIQk9VUiAoTVBHMSB3YWxrLCAyMDI2LTA5LTE2KS5cblxuICAgVGhlIHNxdWFyZSBhYm92ZSBpcyByaWdodCBmb3IgdGhlIHJhaWwsIHdoZXJlIHRoZSB0aWxlIGhhcyBubyBuZWlnaGJvdXIgdG9cbiAgIG1lYXN1cmUgYWdhaW5zdCBhbmQgYSBmaXhlZCByYXRpbyBpcyB3aGF0IHJlbW92ZXMgdGhlIGhlaWdodCBicmVha3BvaW50LiBUaGVcbiAgIGhvbWVwYWdlJ3MgQmVzdCBTZWxsZXJzIGJhbmQgaXMgdGhlIG90aGVyIGNhc2U6IG9uZSB0YWxsIHRpbGUgYmVzaWRlIGEgMngyXG4gICBwcm9kdWN0IGdyaWQsIHdoZXJlIHRoZSB0aWxlJ3Mgam9iIGlzIHRvIHN0YW5kIGV4YWN0bHkgYXMgdGFsbCBhcyB0aGUgZm91clxuICAgY2FyZHMgbmV4dCB0byBpdC4gQSBzcXVhcmUgdGhlcmUgZWl0aGVyIGxlYXZlcyBhIGdhcCB1bmRlciBpdCBvciBjcm9wcyB0aGVcbiAgIGFydHdvcmsg4oCUIGFuZCB0aGUgYXJ0d29yayBpcyBhdXRob3JlZCA1NjB4NzYwIGZvciB0aGlzIHNsb3QuXG5cbiAgIFNvIHRoZSByYXRpbyBpcyBkcm9wcGVkIHJhdGhlciB0aGFuIHJlcGxhY2VkLiBUaGUgZ3JpZCByb3cgc3VwcGxpZXMgdGhlXG4gICBoZWlnaHQsIHRoZSBtZWRpYSBmaWxscyBpdCwgYW5kIG5vdGhpbmcgaGVyZSBuZWVkcyB0byBrbm93IGhvdyB0YWxsIHRoYXQgaXMuXG5cbiAgIE5PIGBoZWlnaHQ6IDEwMCVgIEhFUkUsIGFuZCB0aGF0IGlzIHRoZSB3b3JraW5nIHBhcnQgcmF0aGVyIHRoYW4gYW4gb21pc3Npb24uXG4gICBBIHBlcmNlbnRhZ2UgaGVpZ2h0IG9uIGEgZ3JpZCBpdGVtIHJlc29sdmVzIGFnYWluc3QgaXRzIGdyaWQgQVJFQSwgYW5kIGFuXG4gICBgYXV0b2Atc2l6ZWQgcm93IGlzIGluZGVmaW5pdGUgd2hpbGUgaXQgaXMgYmVpbmcgbGFpZCBvdXQg4oCUIHNvIHRoZSBwZXJjZW50YWdlXG4gICBmYWxscyBiYWNrIHRvIGF1dG8gYW5kIHRoZSB0aWxlIHNpemVzIHRvIGl0cyBpbWFnZSdzIG93biBhc3BlY3QgcmF0aW8gaW5zdGVhZC5cbiAgIE1lYXN1cmVkOiA2MjJweCBhZ2FpbnN0IGEgMTQ0NXB4IG5laWdoYm91ciwgd2hpY2ggaXMgdGhlIGZhdWx0IGl0IHdhcyBtZWFudCB0b1xuICAgZml4LiBMZWF2aW5nIHRoZSBoZWlnaHQgYXV0byBsZXRzIHRoZSBncmlkJ3MgZGVmYXVsdCBgYWxpZ24taXRlbXM6IHN0cmV0Y2hgXG4gICBkbyBpdCwgYW5kIGBfX21lZGlhYCBhdCBgaGVpZ2h0OiAxMDAlYCB0aGVuIGhhcyBhIGRlZmluaXRlIGJveCB0byBmaWxsLiAqL1xuLnByb21vLXRpbGUtLWZpbGwge1xuXG5cdGFzcGVjdC1yYXRpbzogYXV0bztcbn1cblxuLnByb21vLXRpbGVfX21lZGlhIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdGhlaWdodDogMTAwJTtcblx0b2JqZWN0LWZpdDogY292ZXI7XG59XG5cbi5wcm9tby10aWxlX19zY3JpbSB7XG5cblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRpbnNldDogMDtcblx0YmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCAwZGVnLCB2YXIoLS1iZy1vdmVybGF5KSAwJSwgdmFyKC0tYmctb3ZlcmxheSkgMzUlLCB0cmFuc3BhcmVudCA4MCUgKTtcbn1cblxuLnByb21vLXRpbGVfX2NvbnRlbnQge1xuXG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0aW5zZXQtaW5saW5lOiAwO1xuXHRpbnNldC1ibG9jay1lbmQ6IDA7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTgpO1xufVxuXG4ucHJvbW8tdGlsZV9fdGl0bGUge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDMpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1vbi1icmFuZCk7XG59XG5cbi5wcm9tby10aWxlX19jdWUge1xuXG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTMpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1vbi1icmFuZCk7XG59XG5cbi5wcm9tby10aWxlX19jdWUgc3ZnIHtcblxuXHR3aWR0aDogMTZweDtcblx0aGVpZ2h0OiAxNnB4O1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDExMDBweCApIHtcblxuXHQucHJvbW8tdGlsZSxcblx0LnByb21vLXRpbGVfX21lZGlhIHtcblxuXHRcdG1pbi1oZWlnaHQ6IDMwMHB4O1xuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgcHJvc2Vcbi8vXG4vLyBSdW5uaW5nIHRleHQg4oCUIHRoZSBicmFuZCdzIHBhcmFncmFwaCBzZXR0aW5nIGF0IHRoZSBlZGl0b3JpYWwgcmVhZGluZ1xuLy8gbWVhc3VyZSwgd2l0aCBpdHMgcGFyYWdyYXBoIHNwYWNpbmcgYW5kIGlubGluZSBsaW5rIHRyZWF0bWVudC4gVGhlIGJhc2Vcbi8vIHNoYXBlIGV2ZXJ5IHN1cHBsaWVyIGRlc2NyaXB0aW9uIGlzIGJ1aWx0IGZyb20uXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYHByb3NlYC4gUG9ydGVkIGZvciB0aGUgTVBHOSBwcm9kdWN0LXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLnByb3NlIHtcblxuXHRtYXgtd2lkdGg6IHZhcigtLWNvbnRhaW5lci1yZWFkaW5nKTtcbn1cblxuLnByb3NlIHAge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1ib2R5KTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG59XG5cbi5wcm9zZSBwICsgcCB7XG5cblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS02KTtcbn1cblxuLnByb3NlIGEge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG4ucHJvc2UgYTpob3ZlciB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtbGluay1ob3Zlcik7XG59XG5cbi8vIExpc3RzIGluIHJ1bm5pbmcgY29weSDigJQgYWRkZWQgZm9yIHRoZSBtYWdhemluZSBhcnRpY2xlIChNUEcxNiB3aXJpbmcsXG4vLyAyMDI2LTA5LTI4KS4gQXJ0aWNsZXMgaG9sZCBsb25nLXBhcmFncmFwaCBsaXN0cyAoXCJTaWRlIFF1ZXN0cy4gRHVyaW5nIHRoZVxuLy8gam91cm5leeKAplwiKSwgd2hpY2ggdGhlIHNwZWMtYnVsbGV0cyBjb21wb25lbnQg4oCUIHNob3J0IHByb2R1Y3QgcG9pbnRzLCBoZWFkaW5nXG4vLyBsZWFkaW5nLCBydWxlZCByb3dzIOKAlCBzZXQgYXMgYSBkaWZmZXJlbnQgYmxvY2sgZnJvbSB0aGUgY29weSBhcm91bmQgdGhlbS4gQVxuLy8gbGlzdCBpbiBwcm9zZSByZWFkcyBhcyBwcm9zZTogdGhlIHNhbWUgZmFjZSwgc2l6ZSBhbmQgbGVhZGluZywgdGhlIGJyYW5kIGRvdC5cblxuLnByb3NlIHVsLFxuLnByb3NlIG9sIHtcblxuXHRtYXJnaW46IDA7XG5cdHBhZGRpbmctaW5saW5lLXN0YXJ0OiB2YXIoLS1zcGFjZS02KTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1ib2R5KTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG5cbn1cblxuLnByb3NlIHVsIHtcblxuXHRsaXN0LXN0eWxlOiBub25lO1xuXG59XG5cbi5wcm9zZSB1bCA+IGxpIHtcblxuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cbn1cblxuLnByb3NlIHVsID4gbGk6OmJlZm9yZSB7XG5cblx0Y29udGVudDogXCJcIjtcblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRpbnNldC1pbmxpbmUtc3RhcnQ6IGNhbGMoIC0xICogdmFyKC0tc3BhY2UtNikgKTtcblx0aW5zZXQtYmxvY2stc3RhcnQ6IDAuN2VtO1xuXHR3aWR0aDogN3B4O1xuXHRoZWlnaHQ6IDdweDtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXBpbGwpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1icmFuZCk7XG5cbn1cblxuLnByb3NlIGxpICsgbGksXG4ucHJvc2UgdWwgKyB1bCxcbi5wcm9zZSBvbCArIG9sIHtcblxuXHQvLyBMaXN0cyBhbmQgaXRlbXMgc2hhcmUgb25lIGdhcDogdGhlIG9sZCBlZGl0b3Igc2F2ZWQgbWFueSBhIGJ1bGxldGVkIHJ1biBhc1xuXHQvLyBvbmUgbGlzdCBwZXIgYnVsbGV0LCBhbmQgdGhvc2UgbXVzdCByZWFkIGFzIG9uZSBsaXN0LlxuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTMpO1xuXG59XG5cbi5wcm9zZSBwICsgdWwsXG4ucHJvc2UgcCArIG9sLFxuLnByb3NlIHVsICsgcCxcbi5wcm9zZSBvbCArIHAge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtNik7XG5cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBwdWxsLXF1b3RlXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE1hZ2F6aW5lIEFydGljbGUgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxNiwgb3BlcmF0b3ItYXBwcm92ZWRcbi8vIDIwMjYtMDktMjgpIGZvciB0aGUgYXJ0aWNsZSB3YWxrLCBNUEcxNi4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIHB1bGwtcXVvdGUgIChORVcpXG4gICBFZGl0b3JpYWwgb25seS4gVGhlIGdyYWRpZW50IGZpbGxzIHRoZSBxdW90ZSdzIG93biBsZXR0ZXJmb3JtcyByYXRoZXIgdGhhbiBhXG4gICBwYW5lbCBiZWhpbmQgaXQsIHdoaWNoIGlzIHRoZSBzYW1lIG1vdmUgdGhlIHNjb3JlIHJpbmcgbWFrZXMgYW5kIHRoZSBvbmx5XG4gICBmb3JtIHRoZSBncmFkaWVudCB0YWtlcyBpbiB0aGlzIGJyYW5kLiBJdCBuZXZlciB0b3VjaGVzIGEgc3RvcmUgc3VyZmFjZS5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4ucHVsbC1xdW90ZSB7XG5cblx0bWFyZ2luOiB2YXIoLS1zcGFjZS04KSAwIDA7XG5cdHBhZGRpbmctaW5saW5lLXN0YXJ0OiB2YXIoLS1zcGFjZS02KTtcblx0Ym9yZGVyLWlubGluZS1zdGFydDogM3B4IHNvbGlkIHZhcigtLWNvbG9yLWJyYW5kKTtcblxufVxuXG4ucHVsbC1xdW90ZV9fdGV4dCB7XG5cblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDMpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbGlnaHQpO1xuXHRmb250LXN0eWxlOiBpdGFsaWM7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xuXHRiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1ncmFkaWVudC1lZGl0b3JpYWwpO1xuXHQtd2Via2l0LWJhY2tncm91bmQtY2xpcDogdGV4dDtcblx0YmFja2dyb3VuZC1jbGlwOiB0ZXh0O1xuXHQtd2Via2l0LXRleHQtZmlsbC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQucHVsbC1xdW90ZSB7XG5cblx0XHRwYWRkaW5nLWlubGluZS1zdGFydDogdmFyKC0tc3BhY2UtNCk7XG5cblx0fVxuXG5cdC5wdWxsLXF1b3RlX190ZXh0IHtcblxuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDQpO1xuXG5cdH1cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCByYW5nZS1jYXJkXG4vL1xuLy8gQSBzdWItcmFuZ2UgaW5zaWRlIGEgdG9wLWxldmVsIHJhbmdlOiBwaG90b2dyYXBoLCByYW5nZSBuYW1lLCBhbmQgdGhlIG51bWJlclxuLy8gb2YgcHJvZHVjdHMgdGhlIHJhbmdlIGhvbGRzLiBQYW5lbCB3aGl0ZSBhdCB0aGUgY2FyZCByYWRpdXMsIHdpdGggYSBibHVlLXRpbnRcbi8vIHdhc2ggb24gaG92ZXIuXG4vL1xuLy8gVGhlIGNvdW50IGlzIHRoZSBwb2ludCBvZiB0aGUgY29tcG9uZW50LiBBIHNob3BwZXIgY2hvb3NpbmcgYmV0d2VlbiBmb3VyXG4vLyBzdWItcmFuZ2VzIGlzIGNob29zaW5nIHdoZXJlIHRoZSBkZXB0aCBpcywgYW5kIHRoZSBjYXJkIGFuc3dlcnMgdGhhdCBiZWZvcmVcbi8vIHRoZSBjbGljayByYXRoZXIgdGhhbiBhZnRlciBpdC5cbi8vXG4vLyBEaXN0aW5jdCBmcm9tIGBjYXRlZ29yeS10aWxlYCAocGhvdG9ncmFwaCArIHRpdGxlIG9ubHkpIGFuZCBmcm9tXG4vLyBgcHJvZHVjdC1jYXJkYCAob25lIHByb2R1Y3QsIHdpdGggcHJpY2UgYW5kIGEgYnV5IGFjdGlvbikuXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYHJhbmdlLWNhcmRgLiBQb3J0ZWQgZm9yIHRoZSBNUEcxIGhvbWVwYWdlIHdhbGssIDIwMjYtMDktMTYuXG5cbi5yYW5nZS1jYXJkIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jYXJkKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHRib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctY2FyZCk7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLnJhbmdlLWNhcmQ6aG92ZXIge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWNhcmQtaG92ZXIpO1xufVxuXG4ucmFuZ2UtY2FyZF9fbWVkaWEge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHR3aWR0aDogMTAwJTtcblx0YXNwZWN0LXJhdGlvOiA0IC8gMztcblx0b2JqZWN0LWZpdDogY292ZXI7XG59XG5cbi5yYW5nZS1jYXJkX19ib2R5IHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0cGFkZGluZzogdmFyKC0tc3BhY2UtNik7XG59XG5cbi5yYW5nZS1jYXJkX190aXRsZSB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1oNCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWhlYWRpbmcpO1xuXHRtYXJnaW4tYmxvY2stZW5kOiB2YXIoLS1zcGFjZS0xKTtcbn1cblxuLnJhbmdlLWNhcmRfX2NvdW50IHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCByZWFkaW5nLXByb2dyZXNzXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE1hZ2F6aW5lIEFydGljbGUgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxNiwgb3BlcmF0b3ItYXBwcm92ZWRcbi8vIDIwMjYtMDktMjgpIGZvciB0aGUgYXJ0aWNsZSB3YWxrLCBNUEcxNi4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIHJlYWRpbmctcHJvZ3Jlc3MgIChORVcpXG4gICBBIHRoaW4gUGFyYWdvbi1ibHVlIGxpbmUgZml4ZWQgdG8gdGhlIHZlcnkgdG9wIG9mIHRoZSB2aWV3cG9ydCwgZmlsbGluZ1xuICAgYXMgdGhlIHJlYWRlciBtb3ZlcyB0aHJvdWdoIHRoZSBib2R5IOKAlCBmcm9tIHRoZSB0b3Agb2YgdGhlIHJlYWRpbmcgY2FyZFxuICAgdG8gdGhlIGVuZCBvZiB0aGUgbGFzdCBwYXJhZ3JhcGguIFF1aWV0OiBoaWRkZW4gdW50aWwgdGhlIHJlYWRlciBoYXNcbiAgIHNjcm9sbGVkIHBhc3QgdGhlIGhlcm8sIDNweCwgbm8gbGFiZWwuIE9mZiBvbiBwaG9uZXMsIHdoZXJlIG5vdGhpbmcgaXNcbiAgIGZpeGVkIG9yIHN0aWNreS5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4ucmVhZGluZy1wcm9ncmVzcyB7XG5cblx0cG9zaXRpb246IGZpeGVkO1xuXHRpbnNldC1ibG9jay1zdGFydDogMDtcblx0aW5zZXQtaW5saW5lOiAwO1xuXHR6LWluZGV4OiAyMDtcblx0aGVpZ2h0OiAzcHg7XG5cdHBvaW50ZXItZXZlbnRzOiBub25lO1xuXHRvcGFjaXR5OiAwO1xuXHR0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgbGluZWFyO1xuXG59XG5cbi5yZWFkaW5nLXByb2dyZXNzLS12aXNpYmxlIHtcblxuXHRvcGFjaXR5OiAxO1xuXG59XG5cbi5yZWFkaW5nLXByb2dyZXNzX19iYXIge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHRoZWlnaHQ6IDEwMCU7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWJyYW5kKTtcblx0dHJhbnNmb3JtOiBzY2FsZVgoIHZhcigtLXByb2dyZXNzLCAwKSApO1xuXHR0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjtcblxufVxuXG5AbWVkaWEgKCBwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UgKSB7XG5cblx0LnJlYWRpbmctcHJvZ3Jlc3Mge1xuXG5cdFx0dHJhbnNpdGlvbjogbm9uZTtcblxuXHR9XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LnJlYWRpbmctcHJvZ3Jlc3Mge1xuXG5cdFx0ZGlzcGxheTogbm9uZTtcblxuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgcmVjZW50LXJvd1xuLy9cbi8vIFRoZSByZWNlbnRseS12aWV3ZWQgcm93LiBTYW1lIG1lYXN1cmluZyBydWxlIGFzIHJvdXRlLXJvdy5cbi8vXG4vLyBTb3VyY2U6IE1QRzkgbW9ja3VwIChkZXNpZ24gMTc5NjcpLCBubyBjYXRhbG9ndWUgcm93LiBQb3J0ZWQgZm9yIHRoZSBNUEc5IHByb2R1Y3QtcGFnZSB3YWxrLCAyMDI2LTA5LTE2LlxuXG4ucmVjZW50LXJvdyB7XG5cblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoIGF1dG8tZmlsbCwgbWlubWF4KCAyMDBweCwgMWZyICkgKTtcblx0Z2FwOiB2YXIoLS1zcGFjZS1jb250ZW50LWdhcCk7XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgcmV2aWV3LWNhcmRcbi8vXG4vLyBQb3J0ZWQgZnJvbSB0aGUgTWFnYXppbmUgU2VjdGlvbiBMYW5kaW5nIG1vY2t1cCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTUsIG9wZXJhdG9yLVxuLy8gYXBwcm92ZWQgMjAyNi0wOS0yOCkgZm9yIHRoZSBzZWN0aW9uIGxhbmRpbmcgd2FsaywgTVBHMTUuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlXG4vLyBkZXNpZ247IHRoaXMgaXMgd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCByZXZpZXctY2FyZCAgKFJFVVNFRCwgdmVyYmF0aW0pXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnJldmlldy1jYXJkIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogcm93O1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jYXJkKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHRib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctY2FyZCk7XG5cbn1cblxuLnJldmlldy1jYXJkX19tZWRpYSB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdGZsZXg6IDAgMCAzNjBweDtcblx0YWxpZ24tc2VsZjogc3RyZXRjaDtcblxufVxuXG4ucmV2aWV3LWNhcmRfX21lZGlhIGltZyB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdHdpZHRoOiAxMDAlO1xuXHRoZWlnaHQ6IDEwMCU7XG5cdGFzcGVjdC1yYXRpbzogMTYgLyA5O1xuXHRvYmplY3QtZml0OiBjb3ZlcjtcblxufVxuXG4ucmV2aWV3LWNhcmRfX2JvZHkge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXg6IDEgMSBhdXRvO1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS1jYXJkLXBhZGRpbmcpO1xuXG59XG5cbi5yZXZpZXctY2FyZF9fa2lja2VyIHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1leWVicm93KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiAxO1xuXHRsZXR0ZXItc3BhY2luZzogMC4xMmVtO1xuXHR0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG5cbn1cblxuLnJldmlldy1jYXJkX190aXRsZSB7XG5cblx0bWFyZ2luOiB2YXIoLS1zcGFjZS0zKSAwIDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1oNCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0Zm9udC1zdHlsZTogaXRhbGljO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cbn1cblxuLnJldmlldy1jYXJkX190aXRsZSBhIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblxufVxuXG4ucmV2aWV3LWNhcmRfX3RpdGxlIGE6aG92ZXIge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmstaG92ZXIpO1xuXG59XG5cbi5yZXZpZXctY2FyZF9fc2NvcmUge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdG1hcmdpbjogdmFyKC0tc3BhY2UtNCkgMCAwO1xuXG59XG5cbi5yZXZpZXctY2FyZF9fdW5zY29yZWQge1xuXG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTMpO1xuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGxldHRlci1zcGFjaW5nOiAwLjFlbTtcblx0dGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuXG59XG5cbi5yZXZpZXctY2FyZF9fdW5zY29yZWQ6OmJlZm9yZSB7XG5cblx0Y29udGVudDogXCJcIjtcblx0ZmxleDogMCAwIGF1dG87XG5cdHdpZHRoOiAyNHB4O1xuXHRoZWlnaHQ6IDNweDtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItYnJhbmQpO1xuXG59XG5cbi5yZXZpZXctY2FyZF9fc3VtbWFyeSB7XG5cblx0ZGlzcGxheTogLXdlYmtpdC1ib3g7XG5cdC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XG5cdC13ZWJraXQtbGluZS1jbGFtcDogMztcblx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0bWFyZ2luOiB2YXIoLS1zcGFjZS00KSAwIDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblxufVxuXG4ucmV2aWV3LWNhcmRfX2RhdGUge1xuXG5cdG1hcmdpbjogMDtcblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiBhdXRvO1xuXHRwYWRkaW5nLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS00KTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcblxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5yZXZpZXctY2FyZCB7XG5cblx0XHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXG5cdH1cblxuXHQucmV2aWV3LWNhcmRfX21lZGlhIHtcblxuXHRcdGZsZXgtYmFzaXM6IGF1dG87XG5cblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHJvdXRlLXJvd1xuLy9cbi8vIFRoZSBjb21wdXRlZC1yb3V0ZSBjYXJkIHJvdy4gU2l6ZWQgd2l0aCBhdXRvLWZpbGwgYXQgYSAyOTJweCBtaW5pbXVtIOKAlCB0aGVcbi8vIGJhc2tldCBidXR0b24ncyAyNDQgcGx1cyBhIGNhcmQncyA0OCBvZiBwYWRkaW5nIOKAlCBzbyB0aGUgcm93IG1lYXN1cmVzIGl0c1xuLy8gY29sdW1ucyByYXRoZXIgdGhhbiBjb3VudGluZyB0aGVtIGFuZCB0aGUgYWN0aW9uIGNhbiBuZXZlciBiZSBzcXVlZXplZCBhdFxuLy8gYW55IHdpZHRoLlxuLy9cbi8vIFNvdXJjZTogTVBHOSBtb2NrdXAgKGRlc2lnbiAxNzk2NyksIG5vIGNhdGFsb2d1ZSByb3cuIFBvcnRlZCBmb3IgdGhlIE1QRzkgcHJvZHVjdC1wYWdlIHdhbGssIDIwMjYtMDktMTYuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgUEFHRSBMQVlPVVQg4oCUIHRoZSBzaGVsbCwgdGhlIHJhaWwgYW5kIHRoZSByZWdpb24gZ3JpZHMuXG5cbiAgIEJVSUxUIDIwMjYtMDktMTUgZnJvbSBzaXggcGllY2VzIG9mIG9wZXJhdG9yIGZlZWRiYWNrLCBhZnRlciB0aHJlZSBkZXNpZ25zXG4gICB3ZXJlIHJlamVjdGVkLiBFYWNoIG9mIHRoZSBzaXggaXMgYW5zd2VyZWQgaW4gb25lIHBsYWNlIGFuZCB0aGUgcGxhY2UgaXNcbiAgIG5hbWVkLCBzbyBhIGxhdGVyIHNlc3Npb24gY2FuIHNlZSB3aGljaCBjaG9pY2VzIGFyZSBsb2FkLWJlYXJpbmc6XG5cbiAgIDEuIFRoZSBzaG9ydCBkZXNjcmlwdGlvbiBnb2VzIEJFRk9SRSB0aGUgYnV5IGJveCAgICDihpIgLmJ1eS1yZWdpb25fX3N1bW1hcnlcbiAgIDIuIExveWFsdHkgcG9pbnRzIHNpdCBBRlRFUiB0aGUgYnV5IGJveCAgICAgICAgICAgICDihpIgLmJ1eS1yZWdpb25fX3N1bW1hcnlcbiAgIDMuIFN0YXQgcGlsbHMgbGl2ZSBpbnNpZGUgdGhlIHByb2R1Y3QgZGVzY3JpcHRpb24gICDihpIgLmRvYy1maWd1cmVzXG4gICA0LiBUaGUgZGVzY3JpcHRpb24gdGFrZXMgdGhlIGxpdmUgc2l0ZSdzIGNvbHVtbiAgICAg4oaSIC5zdG9yZS1sYXlvdXRcbiAgIDUuIEFkZCB0byBCYXNrZXQgbmV2ZXIgd3JhcHMgdG8gdHdvIGxpbmVzICAgICAgICAgICDihpIgLmJ0bi0tY29tbWVyY2UsIC5yb3V0ZS1yb3dcbiAgIDYuIFRoZSBuYXZpZ2F0aW9uIHJhaWwgY29tZXMgYmFjaywgZGVza3RvcCBvbmx5ICAgICDihpIgLnN0b3JlLWxheW91dF9fc2lkZWJhclxuXG4gICBUSEUgQ09MVU1OIElTIDEwNDJweCBBTkQgVEhBVCBJUyBUSEUgUE9JTlQgT0YgKDQpLiBJdCBpcyB3aGF0IHRoZSBsaXZlIHN0b3JlXG4gICBnaXZlcyBpdHMgY29udGVudDogYSAxNDAwIHBhZ2UsIGEgMzI4IHJhaWwsIGEgMzAgZ2FwLiBUaHJlZSBkcmFmdHMgcHV0IHRoZVxuICAgZGVzY3JpcHRpb24gYXQgNjgwIG9yIDc0MCBiZWNhdXNlIHRoYXQgaXMgdGhlIHN0eWxlZ3VpZGUncyBSRUFESU5HIG1lYXN1cmUsXG4gICBhbmQgYWxsIHRocmVlIHJlYWQgYXMgY3JhbXBlZCDigJQgYmVjYXVzZSB0aGUgbWVhc3VyZSB3YXMgc2V0IGZvciBlZGl0b3JpYWxcbiAgIHBhZ2VzLCB3aGVyZSBwcm9zZSBpcyBhbG9uZSBvbiB0aGUgcGFnZS4gQSBwcm9kdWN0IGRlc2NyaXB0aW9uIGlzIG5vdCBhbG9uZTpcbiAgIGl0IGNhcnJpZXMgc3RhdCBibG9ja3MsIHNwZWMgdGFibGVzIGFuZCBmZWF0dXJlIHJvd3MsIGFuZCBpdCB3YW50cyB0aGUgcm9vbVxuICAgdGhlIHN0b3JlIGFscmVhZHkgZ2l2ZXMgaXQuIFRoZSA2ODAgbWVhc3VyZSBzdGlsbCBnb3Zlcm5zIGFydGljbGUgcGFnZXMuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnBhZ2VfX2lubmVyIHtcblxuXHRtYXgtd2lkdGg6IGNhbGMoIHZhcigtLXNpdGUtbWF4LXdpZHRoKSArICggdmFyKC0tZ3V0dGVyLXNtYWxsKSAqIDIgKSApO1xuXHRtYXJnaW4taW5saW5lOiBhdXRvO1xuXHRwYWRkaW5nLWlubGluZTogdmFyKC0tZ3V0dGVyLXNtYWxsKTtcbn1cblxuLyogLS0tLSB0aGUgcm91dGUgYmFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICg1KSBUSEUgUk9XIE1FQVNVUkVTIElUUyBDT0xVTU5TLCBJVCBET0VTIE5PVCBDT1VOVCBUSEVNLiAnQWRkIHRvIEJhc2tldCdcbiAgIG5lZWRzIGFib3V0IDI0NHB4IHdpdGggaXRzIHdpc2hsaXN0IGJ1dHRvbiBiZXNpZGUgaXQsIGFuZCBhIGNhcmQncyBvd25cbiAgIHBhZGRpbmcgdGFrZXMgNDggbW9yZSDigJQgc28gMjkycHggaXMgdGhlIHdpZHRoIGJlbG93IHdoaWNoIHRoZSBhY3Rpb24gY2Fubm90XG4gICBiZSBzZXJ2ZWQsIGFuZCBgYXV0by1maWxsYCBmaXRzIGFzIG1hbnkgb2YgdGhvc2UgYXMgdGhlIHJvdyBoYXMgcm9vbSBmb3IuXG5cbiAgIEEgZml4ZWQgdGhyZWUtYWNyb3NzIHdhcyB0aGUgZmlyc3QgYW5zd2VyIGFuZCBpdCBicm9rZSBhdCAxMTUwLCB3aGVyZSB0aGVcbiAgIHJhaWwgaXMgc3RpbGwgcHJlc2VudCBhbmQgdGhlIGNvbnRlbnQgY29sdW1uIGhhcyBkcm9wcGVkIHRvIDcwMjogdGhyZWUgY2FyZHNcbiAgIG9mIDIxNCBlYWNoLCBhbmQgYHdoaXRlLXNwYWNlOiBub3dyYXBgIHR1cm5lZCB0aGUgc3F1ZWV6ZSBpbnRvIGEgaG9yaXpvbnRhbFxuICAgc2Nyb2xsYmFyIGFjcm9zcyB0aGUgd2hvbGUgcGFnZS4gVGhhdCBub3dyYXAgaXMgZG9pbmcgaXRzIGpvYiDigJQgaXQgbWFrZXMgdGhlXG4gICBmYWlsdXJlIHZpc2libGUgaW5zdGVhZCBvZiBxdWlldGx5IHdyYXBwaW5nIHRoZSBidXR0b24gYWdhaW4g4oCUIGJ1dCB0aGUgZml4IGlzXG4gICB0byBzdG9wIGhhcmQtY29kaW5nIGEgY29sdW1uIGNvdW50IHRoYXQgdGhlIGNvbnRlbnQgY29sdW1uIGNhbm5vdCBhbHdheXNcbiAgIGFmZm9yZC5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4ucm91dGUtcm93IHtcblxuXHRkaXNwbGF5OiBncmlkO1xuXHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCggYXV0by1maWxsLCBtaW5tYXgoIDI5MnB4LCAxZnIgKSApO1xuXHRnYXA6IHZhcigtLXNwYWNlLWNvbnRlbnQtZ2FwKTtcbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBzY29yZS1iYWRnZVxuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBNYWdhemluZSBBcnRpY2xlIG1vY2t1cCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTYsIG9wZXJhdG9yLWFwcHJvdmVkXG4vLyAyMDI2LTA5LTI4KSBmb3IgdGhlIGFydGljbGUgd2FsaywgTVBHMTYuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBzY29yZS1iYWRnZSAgKE5FVylcbiAgIFRoZSBjb21wYWN0IHNjb3JlIGJlc2lkZSBhIHJldmlldydzIHRpdGxlOiB0aGUgY2F0YWxvZ3VlJ3Mgc2NvcmUgcmluZyBhbmQgYVxuICAgcXVpZXQgXCJKdW1wIHRvIHZlcmRpY3RcIiBsaW5rIHVuZGVyIGl0LCB3cmFwcGVkIHRvIHRoZSByaW5nJ3Mgd2lkdGguIEhpZGRlblxuICAgYmVsb3cgMTEwMHB4LCB3aGVyZSB0aGUgc2NvcmUgc3RyaXAgdW5kZXIgdGhlIGJ5bGluZSB0YWtlcyBpdHMgcGxhY2UuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnNjb3JlLWJhZGdlIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xuXHRwYWRkaW5nLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS0xKTtcblx0dGV4dC1hbGlnbjogY2VudGVyO1xuXG59XG5cbi5zY29yZS1iYWRnZV9fbGluayB7XG5cblx0bWF4LXdpZHRoOiA3MnB4O1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtZXllYnJvdyk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGxldHRlci1zcGFjaW5nOiAwLjA4ZW07XG5cdHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xuXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cbn1cblxuLnNjb3JlLWJhZGdlX19saW5rOmhvdmVyIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rLWhvdmVyKTtcblxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDExMDBweCApIHtcblxuXHQuc2NvcmUtYmFkZ2Uge1xuXG5cdFx0ZGlzcGxheTogbm9uZTtcblxuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgc2NvcmUtZ2xhbmNlXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE1hZ2F6aW5lIEFydGljbGUgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxNiwgb3BlcmF0b3ItYXBwcm92ZWRcbi8vIDIwMjYtMDktMjgpIGZvciB0aGUgYXJ0aWNsZSB3YWxrLCBNUEcxNi4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIHNjb3JlLWdsYW5jZSAgKE5FVylcbiAgIFRoZSB2ZXJkaWN0IGF0IGEgZ2xhbmNlLCBmb3IgdGhlIHJhaWw6IHRoZSByaW5nIHdpdGggaXRzIHNjYWxlLCB0aGVuIHRoZVxuICAgZml2ZSBhc3BlY3RzIGFzIGNvbXBhY3Qgc3RhciByb3dzLiBUaGUgZnVsbCBzY29yZSBwYW5lbCBzdGF5cyBhdCB0aGUgZW5kIG9mXG4gICB0aGUgYXJ0aWNsZSB3aGVyZSByZXZpZXdzIGNvbmNsdWRlOyB0aGlzIGlzIHRoZSBvbmUtbG9vayB2ZXJzaW9uLiBTaXRzIGluIGFcbiAgIHdpZGdldCBib2R5LlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi5zY29yZS1nbGFuY2VfX2hlYWQge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtNCk7XG5cdHBhZGRpbmctYmxvY2stZW5kOiB2YXIoLS1zcGFjZS00KTtcblx0Ym9yZGVyLWJsb2NrLWVuZDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcblxufVxuXG4uc2NvcmUtZ2xhbmNlX19vdmVyYWxsIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLTEpO1xuXG59XG5cbi5zY29yZS1nbGFuY2VfX2xhYmVsIHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGxldHRlci1zcGFjaW5nOiAwLjFlbTtcblx0dGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcblx0Y29sb3I6IHZhcigtLXRleHQtaGVhZGluZyk7XG5cbn1cblxuLnNjb3JlLWdsYW5jZV9fc2NhbGUge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG5cbn1cblxuLnNjb3JlLWdsYW5jZV9fYXNwZWN0cyB7XG5cblx0bWFyZ2luOiB2YXIoLS1zcGFjZS0yKSAwIDA7XG5cdHBhZGRpbmc6IDA7XG5cdGxpc3Qtc3R5bGU6IG5vbmU7XG5cbn1cblxuLnNjb3JlLWdsYW5jZV9fYXNwZWN0IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdHBhZGRpbmctYmxvY2s6IHZhcigtLXNwYWNlLTIpO1xuXG59XG5cbi5zY29yZS1nbGFuY2VfX2FzcGVjdCArIC5zY29yZS1nbGFuY2VfX2FzcGVjdCB7XG5cblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xuXG59XG5cbi5zY29yZS1nbGFuY2VfX2FzcGVjdC1sYWJlbCB7XG5cblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG5cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBzY29yZS1saXN0XG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE1hZ2F6aW5lIFNlY3Rpb24gTGFuZGluZyBtb2NrdXAgKGRlc2lnbiBvZiByZWNvcmQ6IE1QRzE1LCBvcGVyYXRvci1cbi8vIGFwcHJvdmVkIDIwMjYtMDktMjgpIGZvciB0aGUgc2VjdGlvbiBsYW5kaW5nIHdhbGssIE1QRzE1LiBUaGUgbW9ja3VwJ3MgcnVsZXMgYXJlIHRoZVxuLy8gZGVzaWduOyB0aGlzIGlzIHdoYXQgc2hpcHBlZC4gRGVwYXJ0dXJlcyBmcm9tIGl0IGFyZSBjb21tZW50ZWQgd2hlcmUgdGhleSBvY2N1ci5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgc2NvcmUtbGlzdCAgKE5FVylcbiAgIFRoZSBjb21wYWN0ICdiZXN0IG9mJyBmb3IgYSByYWlsOiB0aGUgc2NvcmUsIHRoZW4gdGhlIHRpdGxlLCBvbmUgbGluZSBlYWNoLFxuICAgaGlnaGVzdCBmaXJzdC4gQnVpbHQgaW4gY291bnQtbGlzdCdzIGNvbnN0cnVjdGlvbiDigJQgaGFpcmxpbmUgc2VwYXJhdG9ycyxcbiAgIHRoZSBibHVlLXRpbnQgd2FzaCBvbiBob3ZlciwgMjRweCBpbmxpbmUgcGFkZGluZyDigJQgc28gdGhlIHJhaWwgY2FycmllcyBvbmVcbiAgIGxpc3Qgcmh5dGhtLCBub3QgdHdvLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGUgdGhpbmcgb24gdGhlIGxlZnQ6IGEgc2NvcmUgaXNcbiAgIHRoZSBwb2ludCBvZiB0aGUgcm93LCBzbyBpdCBsZWFkcyBhbmQgaXQgY2FycmllcyB0aGUgZWRpdG9yaWFsIGdyYWRpZW50IHRoZVxuICAgc3R5bGVndWlkZSBhbGxvd3Mgb24gcmV2aWV3IHNjb3JlIGZpZ3VyZXMsIHNpdHRpbmcgb24gdGhlIHJpbmcncyAzcHhcbiAgIFBhcmFnb24tYmx1ZSBzdHJva2UgbGFpZCBmbGF0LiBUaGUgdGl0bGUgaXMgdGhlIG1hZ2F6aW5lJ3M6IGhlYWRpbmcgZm9udCxcbiAgIHJlZ3VsYXIsIGl0YWxpYywgUGFyYWdvbiBibHVlLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi5zY29yZS1saXN0IHtcblxuXHRtYXJnaW46IDA7XG5cdHBhZGRpbmc6IDA7XG5cdGxpc3Qtc3R5bGU6IG5vbmU7XG5cbn1cblxuLnNjb3JlLWxpc3RfX2l0ZW0gKyAuc2NvcmUtbGlzdF9faXRlbSB7XG5cblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xuXG59XG5cbi5zY29yZS1saXN0X19saW5rIHtcblxuXHRkaXNwbGF5OiBncmlkO1xuXHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDQwcHggbWlubWF4KCAwLCAxZnIgKTtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiB2YXIoLS1zcGFjZS00KTtcblx0cGFkZGluZzogdmFyKC0tc3BhY2UtMykgdmFyKC0tc3BhY2UtNik7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblxufVxuXG4uc2NvcmUtbGlzdF9fbGluazpob3ZlciB7XG5cblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2FyZC1ob3Zlcik7XG5cbn1cblxuLnNjb3JlLWxpc3RfX3Njb3JlIHtcblxuXHRqdXN0aWZ5LXNlbGY6IHN0YXJ0O1xuXHRwYWRkaW5nLWJsb2NrLWVuZDogdmFyKC0tc3BhY2UtMSk7XG5cdGJvcmRlci1ibG9jay1lbmQ6IDNweCBzb2xpZCB2YXIoLS1ib3JkZXItYnJhbmQpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDQpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IDE7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJyYW5kKTtcblx0YmFja2dyb3VuZC1pbWFnZTogdmFyKC0tZ3JhZGllbnQtZWRpdG9yaWFsKTtcblx0LXdlYmtpdC1iYWNrZ3JvdW5kLWNsaXA6IHRleHQ7XG5cdGJhY2tncm91bmQtY2xpcDogdGV4dDtcblx0LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6IHRyYW5zcGFyZW50O1xuXG59XG5cbi5zY29yZS1saXN0X190aXRsZSB7XG5cblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG5cbn1cblxuLnNjb3JlLWxpc3RfX2xpbms6aG92ZXIgLnNjb3JlLWxpc3RfX3RpdGxlIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rLWhvdmVyKTtcblxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHNjb3JlLW1ldGVyXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE1hZ2F6aW5lIEFydGljbGUgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxNiwgb3BlcmF0b3ItYXBwcm92ZWRcbi8vIDIwMjYtMDktMjgpIGZvciB0aGUgYXJ0aWNsZSB3YWxrLCBNUEcxNi4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIHNjb3JlLW1ldGVyICAoTkVXKVxuICAgVGhlIGxhcmdlIHNjb3JlOiBhIHdoaXRlIGRpc2Mgd2l0aCB0aGUgc2NvcmUgZHJhd24gYXMgYW4gYXJjIG9mIFBhcmFnb25cbiAgIGJsdWUgYXJvdW5kIGl0IOKAlCA1OCBmaWxscyA1OCUgb2YgdGhlIHJpbmcg4oCUIGFuZCB0aGUgZmlndXJlIGluIHRoZVxuICAgZWRpdG9yaWFsIGdyYWRpZW50IGluc2lkZS4gVGhlIHNhbWUgaW5kaWNhdG9yIGFzIHNjb3JlLXJpbmcsIGdyb3duLCB3aXRoXG4gICB0aGUgYXJjIGRvaW5nIHdoYXQgYSBib3JkZXIgY2Fubm90OiBzaG93aW5nIGhvdyBtdWNoIG9mIHRoZSByaW5nIGlzXG4gICBlYXJuZWQuIFJvdW5kLCBiZWNhdXNlIGl0IGlzIGFuIGluZGljYXRvci5cblxuICAgVHdvIHNpemVzOiB0aGUgZGVmYXVsdCBmb3IgdGhlIGhlcm8gKHRoZSBvbmx5IGJpZyByaW5nIGFib3ZlIHRoZSBmb2xkKVxuICAgYW5kIC0tbGcgZm9yIHRoZSB2ZXJkaWN0IGZpbmFsZS4gVGhlIGFyYyBpcyBjb21wbGV0ZSBpbiB0aGUgbWFya3VwLCBzbyB0aGVcbiAgIG1ldGVyIGlzIHJpZ2h0IHdpdGggbm8gc2NyaXB0IGF0IGFsbC4gVGhlIGZpbmFsZSdzIG1ldGVyIG9wdHMgaW4gdG8gdGhlXG4gICByZXZlYWwgd2l0aCBkYXRhLXJldmVhbDogdGhlIHNjcmlwdCBzZXRzIC0tcGVuZGluZyAoYXJjIGVtcHR5KSBhbmQgbGlmdHMgaXRcbiAgIHdoZW4gdGhlIG1ldGVyIHNjcm9sbHMgaW50byB2aWV3LCBhbmQgdGhlIGFyYyBkcmF3cyBpdHNlbGYuIFVuZGVyIHJlZHVjZWRcbiAgIG1vdGlvbiB0aGUgc2NyaXB0IG5ldmVyIHNldHMgLS1wZW5kaW5nIGFuZCB0aGUgdHJhbnNpdGlvbiBpcyBvZmYuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnNjb3JlLW1ldGVyIHtcblxuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRmbGV4OiAwIDAgYXV0bztcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdHdpZHRoOiAxMTJweDtcblx0aGVpZ2h0OiAxMTJweDtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXBpbGwpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jYXJkKTtcblxufVxuXG4uc2NvcmUtbWV0ZXJfX3Jpbmcge1xuXG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0aW5zZXQ6IDA7XG5cdHdpZHRoOiAxMDAlO1xuXHRoZWlnaHQ6IDEwMCU7XG5cdHRyYW5zZm9ybTogcm90YXRlKCAtOTBkZWcgKTtcblxufVxuXG4uc2NvcmUtbWV0ZXJfX3RyYWNrLFxuLnNjb3JlLW1ldGVyX19hcmMge1xuXG5cdGZpbGw6IG5vbmU7XG5cdHN0cm9rZS13aWR0aDogNztcblxufVxuXG4uc2NvcmUtbWV0ZXJfX3RyYWNrIHtcblxuXHRzdHJva2U6IHZhcigtLWFyY3RpYy0yMDApO1xuXG59XG5cbi5zY29yZS1tZXRlcl9fYXJjIHtcblxuXHRzdHJva2U6IHZhcigtLWJvcmRlci1icmFuZCk7XG5cdC8vIC0tc2NvcmUgaXMgdGhlIHJldmlldydzIG92ZXJhbGwgcmF0aW5nLCBzZXQgb24gdGhlIGVsZW1lbnQgYnkgdGhlIHRlbXBsYXRlLlxuXHRzdHJva2UtZGFzaGFycmF5OiB2YXIoLS1zY29yZSwgMCkgMTAwO1xuXHR0cmFuc2l0aW9uOiBzdHJva2UtZGFzaGFycmF5IDEuNnMgY3ViaWMtYmV6aWVyKCAwLjIyLCAwLjgsIDAuMjUsIDEgKTtcblxufVxuXG4uc2NvcmUtbWV0ZXItLXBlbmRpbmcgLnNjb3JlLW1ldGVyX19hcmMge1xuXG5cdHN0cm9rZS1kYXNoYXJyYXk6IDAgMTAwO1xuXG59XG5cbi5zY29yZS1tZXRlcl9fdmFsdWUge1xuXG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0xKTtcblxufVxuXG4uc2NvcmUtbWV0ZXJfX2ZpZ3VyZSB7XG5cblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWgxKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiAxO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG5cdGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLWdyYWRpZW50LWVkaXRvcmlhbCk7XG5cdC13ZWJraXQtYmFja2dyb3VuZC1jbGlwOiB0ZXh0O1xuXHRiYWNrZ3JvdW5kLWNsaXA6IHRleHQ7XG5cdC13ZWJraXQtdGV4dC1maWxsLWNvbG9yOiB0cmFuc3BhcmVudDtcblx0Zm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcblxufVxuXG4uc2NvcmUtbWV0ZXJfX3NjYWxlIHtcblxuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtZXllYnJvdyk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogMTtcblx0bGV0dGVyLXNwYWNpbmc6IDAuMDhlbTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuXG59XG5cbi5zY29yZS1tZXRlci0tbGcge1xuXG5cdHdpZHRoOiAxNjhweDtcblx0aGVpZ2h0OiAxNjhweDtcblxufVxuXG4uc2NvcmUtbWV0ZXItLWxnIC5zY29yZS1tZXRlcl9fZmlndXJlIHtcblxuXHRmb250LXNpemU6IGNhbGMoIHZhcigtLWZzLWgxKSAqIDEuNSApO1xuXG59XG5cbkBtZWRpYSAoIHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSApIHtcblxuXHQuc2NvcmUtbWV0ZXJfX2FyYyB7XG5cblx0XHR0cmFuc2l0aW9uOiBub25lO1xuXG5cdH1cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuc2NvcmUtbWV0ZXItLWxnIHtcblxuXHRcdHdpZHRoOiAxMjhweDtcblx0XHRoZWlnaHQ6IDEyOHB4O1xuXG5cdH1cblxuXHQuc2NvcmUtbWV0ZXItLWxnIC5zY29yZS1tZXRlcl9fZmlndXJlIHtcblxuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDEpO1xuXG5cdH1cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBzY29yZS1wYW5lbFxuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBNYWdhemluZSBBcnRpY2xlIG1vY2t1cCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTYsIG9wZXJhdG9yLWFwcHJvdmVkXG4vLyAyMDI2LTA5LTI4KSBmb3IgdGhlIGFydGljbGUgd2FsaywgTVBHMTYuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBzY29yZS1wYW5lbCAgKE5FVylcbiAgIFRoZSB2ZXJkaWN0LCByZWFkIHdpdGhvdXQgcmVhZGluZyB0aGUgcGllY2U6IG9uZSBmaWd1cmUsIGZpdmUgYXNwZWN0cywgYW5kXG4gICB3aGF0IHdhcyBnb29kIGFnYWluc3Qgd2hhdCB3YXMgbm90LiBJdCBjYXJyaWVzIG5vIGJvcmRlciBvciBncm91bmQgYmVjYXVzZVxuICAgaXQgc2l0cyBpbnNpZGUgdGhlIGJyYW5kJ3MgYm9yZGVyZWQgZ3JvdXAg4oCUIHRoZSBvbmUgbGFiZWxsZWQtcGFuZWxcbiAgIHRyZWF0bWVudCDigJQgYW5kIHRoZSBvdmVyYWxsIGZpZ3VyZSByZXVzZXMgdGhlIGNhdGFsb2d1ZSdzIHNjb3JlIHJpbmcsIHdoaWNoXG4gICBpcyB3aGVyZSB0aGUgZWRpdG9yaWFsIGdyYWRpZW50IGlzIGFsbG93ZWQgdG8gYXBwZWFyLlxuXG4gICBUaGUgdHdvIHZlcmRpY3QgbGlzdHMgYXJlIGdlbnVpbmVseSB1bmV2ZW4g4oCUIHR3byBwb3NpdGl2ZXMgYWdhaW5zdCBmb3VyXG4gICBuZWdhdGl2ZXMgb24gdGhpcyByZXZpZXcg4oCUIHNvIHRoZSBjb2x1bW5zIHN0YXJ0IGF0IHRoZSB0b3AgYW5kIGFyZSBuZXZlclxuICAgc3RyZXRjaGVkIGxldmVsLiBBIGZvcmNlZC1sZXZlbCBwYWlyIHdvdWxkIHJlYWQgYXMgYSBkZXNpZ25lZCBiYWxhbmNlIHRoZVxuICAgcmV2aWV3IGRvZXMgbm90IGhhdmUuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnNjb3JlLXBhbmVsIHtcblxuXHRkaXNwbGF5OiBncmlkO1xuXHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gbWlubWF4KCAwLCAxZnIgKTtcblx0YWxpZ24taXRlbXM6IHN0YXJ0O1xuXHRnYXA6IHZhcigtLXNwYWNlLTYpIHZhcigtLXNwYWNlLTEyKTtcblxufVxuXG4uc2NvcmUtcGFuZWxfX292ZXJhbGwge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdHRleHQtYWxpZ246IGNlbnRlcjtcblxufVxuXG4uc2NvcmUtcGFuZWxfX292ZXJhbGwtbGFiZWwge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0bGV0dGVyLXNwYWNpbmc6IDAuMWVtO1xuXHR0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1oZWFkaW5nKTtcblxufVxuXG4uc2NvcmUtcGFuZWxfX292ZXJhbGwtc2NhbGUge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcblxufVxuXG4uc2NvcmUtcGFuZWxfX2FzcGVjdHMge1xuXG5cdG1hcmdpbjogMDtcblx0cGFkZGluZzogMDtcblx0bGlzdC1zdHlsZTogbm9uZTtcblxufVxuXG4uc2NvcmUtcGFuZWxfX2FzcGVjdCB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuXHRnYXA6IHZhcigtLXNwYWNlLTQpO1xuXHRwYWRkaW5nLWJsb2NrOiB2YXIoLS1zcGFjZS0yKTtcblxufVxuXG4uc2NvcmUtcGFuZWxfX2FzcGVjdCArIC5zY29yZS1wYW5lbF9fYXNwZWN0IHtcblxuXHRib3JkZXItYmxvY2stc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cbn1cblxuLnNjb3JlLXBhbmVsX19hc3BlY3QtbGFiZWwge1xuXG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG5cbn1cblxuLnNjb3JlLXBhbmVsX192ZXJkaWN0IHtcblxuXHRncmlkLWNvbHVtbjogMSAvIC0xO1xuXHRkaXNwbGF5OiBncmlkO1xuXHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCggMiwgbWlubWF4KCAwLCAxZnIgKSApO1xuXHRhbGlnbi1pdGVtczogc3RhcnQ7XG5cdGdhcDogdmFyKC0tc3BhY2UtNikgdmFyKC0tc3BhY2UtMTIpO1xuXHRwYWRkaW5nLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS02KTtcblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xuXG59XG5cbi5zY29yZS1wYW5lbF9fY29sdW1uIHtcblxuXHRtaW4td2lkdGg6IDA7XG5cbn1cblxuLnNjb3JlLXBhbmVsX19jb2x1bW4tdGl0bGUge1xuXG5cdG1hcmdpbjogMCAwIHZhcigtLXNwYWNlLTMpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRsZXR0ZXItc3BhY2luZzogMC4xZW07XG5cdHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWhlYWRpbmcpO1xuXG59XG5cbi5zY29yZS1wYW5lbF9fbGlzdCB7XG5cblx0bWFyZ2luOiAwO1xuXHRwYWRkaW5nOiAwO1xuXHRsaXN0LXN0eWxlOiBub25lO1xuXG59XG5cbi5zY29yZS1wYW5lbF9faXRlbSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG5cdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdHBhZGRpbmctYmxvY2s6IHZhcigtLXNwYWNlLTIpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblxufVxuXG4uc2NvcmUtcGFuZWxfX2l0ZW0gc3ZnIHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0d2lkdGg6IDE4cHg7XG5cdGhlaWdodDogMThweDtcblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiAwLjM0ZW07XG5cbn1cblxuLnNjb3JlLXBhbmVsX19pdGVtLS1wb3NpdGl2ZSBzdmcge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJyYW5kKTtcblxufVxuXG4uc2NvcmUtcGFuZWxfX2l0ZW0tLW5lZ2F0aXZlIHN2ZyB7XG5cblx0Y29sb3I6IHZhcigtLWNvbG9yLW5lZ2F0aXZlKTtcblxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5zY29yZS1wYW5lbCxcblx0LnNjb3JlLXBhbmVsX192ZXJkaWN0IHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KCAwLCAxZnIgKTtcblxuXHR9XG5cblx0LnNjb3JlLXBhbmVsX19vdmVyYWxsIHtcblxuXHRcdGZsZXgtZGlyZWN0aW9uOiByb3c7XG5cdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0XHRqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG5cdFx0Z2FwOiB2YXIoLS1zcGFjZS00KTtcblx0XHR0ZXh0LWFsaWduOiBsZWZ0O1xuXG5cdH1cblxuXHQuc2NvcmUtcGFuZWxfX2FzcGVjdCB7XG5cblx0XHRmbGV4LXdyYXA6IHdyYXA7XG5cdFx0Z2FwOiB2YXIoLS1zcGFjZS0yKTtcblxuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgc2NvcmUtcmluZ1xuLy9cbi8vIEEgcmV2aWV3IHNjb3JlIGluc2lkZSBhIFBhcmFnb24tYmx1ZSByaW5nLCBzYXQgb3ZlciBhbiBhcnRpY2xlIGNhcmQncyBpbWFnZS5cbi8vXG4vLyBFRElUT1JJQUwgT05MWS4gVGhlIGZpZ3VyZSBjYXJyaWVzIHRoZSBibHVlLXRvLWJyaWdodC1ibHVlIGdyYWRpZW50LCB3aGljaCBieVxuLy8gYnJhbmQgcnVsZSBuZXZlciBhcHBlYXJzIG9uIGEgc3RvcmUgc3VyZmFjZSDigJQgaXQgaXMgd2hhdCBzZXBhcmF0ZXMgYSBzY29yZWRcbi8vIG9waW5pb24gZnJvbSBhIHByb2R1Y3QgY2xhaW0uXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYHNjb3JlLXJpbmdgLiBQb3J0ZWQgZm9yIHRoZSBNUEcxIGhvbWVwYWdlIHdhbGssIDIwMjYtMDktMTYuXG5cbi5zY29yZS1yaW5nIHtcblxuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdHdpZHRoOiA2NHB4O1xuXHRoZWlnaHQ6IDY0cHg7XG5cdGJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWJvcmRlci1icmFuZCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1waWxsKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2FyZCk7XG59XG5cbi5zY29yZS1yaW5nX19maWd1cmUge1xuXG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1oMyk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogMTtcblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xuXHRiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1ncmFkaWVudC1lZGl0b3JpYWwpO1xuXHQtd2Via2l0LWJhY2tncm91bmQtY2xpcDogdGV4dDtcblx0YmFja2dyb3VuZC1jbGlwOiB0ZXh0O1xuXHQtd2Via2l0LXRleHQtZmlsbC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgc2NvcmUtc3RyaXBcbi8vXG4vLyBQb3J0ZWQgZnJvbSB0aGUgTWFnYXppbmUgQXJ0aWNsZSBtb2NrdXAgKGRlc2lnbiBvZiByZWNvcmQ6IE1QRzE2LCBvcGVyYXRvci1hcHByb3ZlZFxuLy8gMjAyNi0wOS0yOCkgZm9yIHRoZSBhcnRpY2xlIHdhbGssIE1QRzE2LiBUaGUgbW9ja3VwJ3MgcnVsZXMgYXJlIHRoZSBkZXNpZ247IHRoaXMgaXNcbi8vIHdoYXQgc2hpcHBlZC4gRGVwYXJ0dXJlcyBmcm9tIGl0IGFyZSBjb21tZW50ZWQgd2hlcmUgdGhleSBvY2N1ci5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgc2NvcmUtc3RyaXAgIChORVcpXG4gICBUaGUgcmFpbCdzIHZlcmRpY3QtYXQtYS1nbGFuY2UsIGZvbGRlZCBpbnRvIHRoZSBmbG93IHVuZGVyIHRoZSBieWxpbmUgb25jZVxuICAgdGhlIHJhaWwgaGFzIGdvbmUgKGJlbG93IDExMDBweCk6IHRoZSBzY29yZSByaW5nLCB0aGUgZml2ZSBzdWItc2NvcmVzIGFzIGFcbiAgIHdyYXBwaW5nIGxpbmUgb2YgZmlndXJlcywgYW5kIHRoZSBqdW1wIGxpbmsuIE9uIHRoZSBwYW5lbCdzIHN0cmlwZS1ncmV5XG4gICBpbnNldCwgdGhlIHdheSBzZXJpZXMtYmFyIHNpdHMsIHNvIGl0IHJlYWRzIGFzIGZ1cm5pdHVyZSwgbm90IGFzIGEgYmFuZC5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4uc2NvcmUtc3RyaXAge1xuXG5cdGRpc3BsYXk6IG5vbmU7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtNCk7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTQpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbC1hbHQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtY2FyZCk7XG5cbn1cblxuLnNjb3JlLXN0cmlwX19yaW5nIHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0ZGlzcGxheTogZmxleDtcblxufVxuXG4uc2NvcmUtc3RyaXBfX2JvZHkge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogdmFyKC0tc3BhY2UtMik7XG5cdG1pbi13aWR0aDogMDtcblxufVxuXG4uc2NvcmUtc3RyaXBfX2FzcGVjdHMge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtd3JhcDogd3JhcDtcblx0Z2FwOiB2YXIoLS1zcGFjZS0xKSB2YXIoLS1zcGFjZS00KTtcblx0bWFyZ2luOiAwO1xuXHRwYWRkaW5nOiAwO1xuXHRsaXN0LXN0eWxlOiBub25lO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcblxufVxuXG4uc2NvcmUtc3RyaXBfX3ZhbHVlIHtcblxuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG5cbn1cblxuLnNjb3JlLXN0cmlwX19saW5rIHtcblxuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rKTtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogMTEwMHB4ICkge1xuXG5cdC5zY29yZS1zdHJpcCB7XG5cblx0XHRkaXNwbGF5OiBmbGV4O1xuXG5cdH1cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBzZWN0aW9uLWhlYWRcbi8vXG4vLyBUSEUgc2VjdGlvbiB0aXRsZSBmb3IgdGhpcyBicmFuZC4gU2l0cyBkaXJlY3RseSBvbiB0aGUgY2FudmFzIGFib3ZlIHRoZVxuLy8gdGlsZXMsIGNhcmRzIG9yIHBhbmVscyBpdCBpbnRyb2R1Y2VzIOKAlCBoZWFkaW5nIGZvbnQsIGxhcmdlLCBUaXRsZSBDYXNlLFxuLy8gaW5rLCBsZWZ0LWFsaWduZWQuXG4vL1xuLy8gQUJTT1JCRUQgYGJhbmQtdGl0bGVgIE9OIDIwMjYtMDktMTYuIFRoZSB0d28gY2FycmllZCBieXRlLWlkZW50aWNhbFxuLy8gdHlwb2dyYXBoeSDigJQgc2FtZSBmYWNlLCBzYW1lIHN0ZXAsIHNhbWUgd2VpZ2h0LCBzYW1lIGxlYWRpbmcsIHNhbWUgY29sb3VyIOKAlFxuLy8gYW5kIGRpZmZlcmVkIG9ubHkgaW4gd2hvIG93bmVkIHRoZSBtYXJnaW46IGBiYW5kLXRpdGxlYCBjYXJyaWVkIGl0cyBvd25cbi8vIGJvdHRvbSBtYXJnaW4sIGBzZWN0aW9uLWhlYWRgIHB1dHMgdGhlIHNhbWUgMjRweCBvbiB0aGUgd3JhcHBlci4gR2xvYmFsJ3Ncbi8vIHJlc2V0IHplcm9lcyBoZWFkaW5nIG1hcmdpbnMsIHNvIHRoZSBzd2FwIG1vdmVzIG5vdGhpbmcuXG4vL1xuLy8gVGhlIHN0b3JlIHRlbXBsYXRlcyBub3cgY29tcG9zZSB0aGUgc2FtZSBgPGhlYWRlciBjbGFzcz1cInNlY3Rpb24taGVhZFwiPmBcbi8vIHRoZSBsYW5kaW5nIHRlbXBsYXRlcyBkbywgd2hpY2ggaXMgdGhlIHNoYXBlIHRoYXQgY2FuIGFsc28gaG9sZCBhXG4vLyBgc2VjdGlvbi1saW5rYCBiZXNpZGUgdGhlIHRpdGxlIOKAlCB0aGUgcmVhc29uIHRvIGtlZXAgdGhpcyBvbmUgcmF0aGVyIHRoYW5cbi8vIHRoZSBiYXJlIGhlYWRpbmcuXG4vL1xuLy8gT25lIHJlYWwgY2hhbmdlIGNhbWUgd2l0aCBpdDogdGhlc2UgdGl0bGVzIG5vdyB0YWtlIHRoZSA5MDBweCBzdGVwIGRvd24gdG9cbi8vIGgzIHRoYXQgYGJhbmQtdGl0bGVgIG5ldmVyIGhhZC4gVGhhdCBpcyBjb25zaXN0ZW50IHJhdGhlciB0aGFuIGEgZGVwYXJ0dXJlIOKAlFxuLy8gZXZlcnkgYmFuZCB0aXRsZSBzdGlsbCByZWFkcyBhdCBvbmUgc2l6ZSBhdCBhbnkgZ2l2ZW4gd2lkdGgsIHdoaWNoIGlzIHdoYXRcbi8vIHRoZSAyMDI2LTA5LTE2IGRlY2lzaW9uIGFza2VkIGZvcjsgaXQgaXMgdGhlIHNpemUgaXRzZWxmIHRoYXQgbm93IHJlc3BvbmRzLlxuLy9cbi8vIFNvdXJjZTogY2F0YWxvZ3VlIGJsb2NrIGBzZWN0aW9uLWhlYWRgLiBQb3J0ZWQgZm9yIHRoZSBNUEc5IHByb2R1Y3QtcGFnZSB3YWxrLCAyMDI2LTA5LTE2LlxuXG4uc2VjdGlvbi1oZWFkIHtcblxuXHRtYXJnaW4tYmxvY2stZW5kOiB2YXIoLS1zcGFjZS02KTtcbn1cblxuLnNlY3Rpb24taGVhZF9fdGl0bGUge1xuXG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1oMik7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1saWdodCk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtaGVhZGluZyk7XG5cdHRleHQtYWxpZ246IGxlZnQ7XG59XG5cbi8qIFRoZSBtYWdhemluZSdzIHZvaWNlIOKAlCBhIHN0ZXAgc21hbGxlciBhbmQgbXV0ZWQsIGJlY2F1c2UgdGhlIGVkaXRvcmlhbCBzaWRlXG4gICBzcGVha3MgbW9yZSBxdWlldGx5IHRoYW4gdGhlIHNob3AuIE5PVEhJTkcgT04gVEhFIFNUT1JFIFNJREUgVVNFUyBJVCwgYW5kIGl0XG4gICBpcyBub3QgZm9yIHN0b3JlIGZ1cm5pdHVyZTogYSAyNnB4IG11dGVkIHRpdGxlIGJlc2lkZSBhIDMycHggc2libGluZyByZWFkcyBhc1xuICAgYSBtaXN0YWtlIHJhdGhlciB0aGFuIGEgcmVnaXN0ZXIsIHdoaWNoIGlzIHdoeSB0aGUgcHJvZHVjdCBwYWdlIGRyb3BwZWQgaXQgb25cbiAgIDIwMjYtMDktMTYuIEtlcHQgZm9yIHRoZSBhcnRpY2xlIGFuZCBtYWdhemluZS1hcmNoaXZlIHRlbXBsYXRlcywgd2hpY2ggaXMgdGhlXG4gICBjb250ZXh0IGl0IHdhcyB3cml0dGVuIGZvci4gQ2FycmllZCBvdmVyIGZyb20gYGJhbmQtdGl0bGUtLXF1aWV0YC4gKi9cbi8qIEEgQkFORCBUSVRMRSBDT01QT1NFRCBXSVRIT1VUIElUUyBXUkFQUEVSLlxuICAgT24gYSBjb21wb3NlZCBwYWdlIGEgYmFuZCBoZWFkIGlzIGEgY29yZS9oZWFkaW5nIGNhcnJ5aW5nIHRoaXMgY2xhc3MsIG5vdCBhXG4gICBgPGhlYWRlciBjbGFzcz1cInNlY3Rpb24taGVhZFwiPmAg4oCUIHRoZXJlIGlzIG5vIHdyYXBwZXIgdG8gaG9sZCB0aGUgbWFyZ2luLCBhbmRcbiAgIGdsb2JhbCdzIHJlc2V0IHplcm9lcyBoZWFkaW5nIG1hcmdpbnMuIFRoZSBhbHRlcm5hdGl2ZSB3YXMgdGhlIGVkaXRvclxuICAgc2VyaWFsaXNpbmcgYHN0eWxlPVwibWFyZ2luLWJvdHRvbTrigKZcImAgaW50byBhIHBhdHRlcm4gZmlsZSwgd2hpY2ggaXMgYVxuICAgaGFyZGNvZGVkIGlubGluZSBzdHlsZSBpbiBzaGlwcGVkIHRlbXBsYXRlIGNvZGUgYW5kIHJlZnVzZWQgYXQgY29tbWl0LlxuICAgU2FtZSB2YWx1ZSBhcyB0aGUgd3JhcHBlcidzLCBmcm9tIHRoZSBzYW1lIHRva2VuLiAqL1xuLnNlY3Rpb24taGVhZF9fdGl0bGUtLXN0YW5kYWxvbmUge1xuXG5cdG1hcmdpbi1ibG9jay1lbmQ6IHZhcigtLXNwYWNlLTYpO1xufVxuXG4uc2VjdGlvbi1oZWFkX190aXRsZS0tcXVpZXQge1xuXG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDMpO1xuXHRjb2xvcjogdmFyKC0tbmV1dHJhbC02MDApO1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDkwMHB4ICkge1xuXG5cdC5zZWN0aW9uLWhlYWRfX3RpdGxlIHtcblxuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDMpO1xuXHR9XG59XG5cbi8qIC0taW5saW5lICsgX19jb3VudDogYSBjb3VudCBzZXQgQkVTSURFIHRoZSB0aXRsZSByYXRoZXIgdGhhbiB1bmRlciBpdCDigJQgdGhlXG4gICBiYXNrZXQncyBcIjQgaXRlbXMgwrcgMyBwYWNrYWdlc1wiIChNUEcxMCkuIFBvcnRlZCBmcm9tIHRoZSBtb2NrdXAnc1xuICAgYXJjaGl2ZS1oZWFkZXItLWlubGluZTsgYSBtb2RpZmllciBvbiB0aGUgZXhpc3RpbmcgaGVhZCBpcyBhIHNtYWxsZXIgY2hhbmdlXG4gICB0aGFuIHBvcnRpbmcgYSBzZWNvbmQgb3BlbmluZyBibG9jayBmb3Igb25lIGxpbmUuICovXG4uc2VjdGlvbi1oZWFkLS1pbmxpbmUge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtd3JhcDogd3JhcDtcblx0YWxpZ24taXRlbXM6IGJhc2VsaW5lO1xuXHRjb2x1bW4tZ2FwOiB2YXIoLS1zcGFjZS00KTtcbn1cblxuLnNlY3Rpb24taGVhZF9fY291bnQge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuXG4vKiAtLWNhcmQ6IGEgY2FyZCdzIG93biB0aXRsZSBpbnNpZGUgYSBwYWdlIOKAlCBvbmUgc3RlcCBiZWxvdyB0aGUgcGFnZSB0aXRsZSwgc28gdGhlXG4gICBwYWdlIGtlZXBzIG9uZSB0b3AtbGV2ZWwgaGVhZGluZyAob3BlcmF0b3IgcmV2aWV3IG9mIE1QRzExKTogQ2hlY2tvdXQgYXQgaDIgc2l6ZSxcbiAgIGVhY2ggZm9ybSBjYXJkIGF0IGgzLiBQb3J0ZWQgZnJvbSBNUEcxMSBmb3IgdGhlIGNoZWNrb3V0IHdhbGsuICovXG4uc2VjdGlvbi1oZWFkLS1jYXJkIC5zZWN0aW9uLWhlYWRfX3RpdGxlIHtcblxuXHRmb250LXNpemU6IHZhcigtLWZzLWgzKTtcbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA5MDBweCApIHtcblxuXHQuc2VjdGlvbi1oZWFkLS1jYXJkIC5zZWN0aW9uLWhlYWRfX3RpdGxlIHtcblxuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDQpO1xuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgc2VjdGlvbi1saW5rXG4vL1xuLy8gVGhlIHRyYWlsaW5nICdzZWUgZXZlcnl0aGluZycgbGluayB0aGF0IGNsb3NlcyBhIHNlY3Rpb24ncyByb3cg4oCUICdTaG9wIGFsbFxuLy8gY29uc29sZSBnYW1pbmcnLCAnVmlldyBBbGwgQnJhbmRzJywgJ1JlYWQgdGhlIG1hZ2F6aW5lJy4gUGFyYWdvbiBibHVlLCBub1xuLy8gdW5kZXJsaW5lLCBjaGV2cm9uLlxuLy9cbi8vIFNvdXJjZTogY2F0YWxvZ3VlIGJsb2NrIGBzZWN0aW9uLWxpbmtgLiBQb3J0ZWQgZm9yIHRoZSBNUEc5IHByb2R1Y3QtcGFnZSB3YWxrLCAyMDI2LTA5LTE2LlxuXG4uc2VjdGlvbi1saW5rIHtcblxuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKTtcblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS02KTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbGluayk7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLnNlY3Rpb24tbGluazpob3ZlciB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtbGluay1ob3Zlcik7XG59XG5cbi5zZWN0aW9uLWxpbmtfX2ljb24ge1xuXG5cdHdpZHRoOiAxNnB4O1xuXHRoZWlnaHQ6IDE2cHg7XG5cdGZsZXg6IDAgMCBhdXRvO1xufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHNlby1kb2Ncbi8vXG4vLyBBIGxvbmcgZG9jdW1lbnQgYmVzaWRlIGEgc3RpY2t5IGNvbnRlbnRzIHJhaWw6IHRoZSByZWFkaW5nIGNvbHVtbiB0YWtlcyB0aGVcbi8vIHJvb20sIHRoZSByYWlsIGlzIGEgZml4ZWQgMjYwIGFuZCBmb2xsb3dzIHRoZSByZWFkZXIgZG93bi5cbi8vXG4vLyBBVVRIT1JFRCwgTk9UIFBPUlRFRCDigJQgdGhlIG9ubHkgY29tcG9uZW50IG9uIHRoaXMgcGFnZSB0aGUgY2F0YWxvZ3VlIGhhcyBub1xuLy8gcm93IGZvci4gYGFydGljbGUtZG9jYCB3YXMgY2hlY2tlZCBmaXJzdCBhbmQgaXMgYSBkaWZmZXJlbnQgdGhpbmc6IGFuXG4vLyBhcnRpY2xlJ3MgcmVhZGluZyBtZWFzdXJlIGFuZCBoZWFkaW5nIHJoeXRobSwgd2l0aCBubyByYWlsIGJlc2lkZSBpdC5cbi8vXG4vLyBUaGUgcmFpbCdzIG93biBzdGFja2luZyBydWxlcyBsaXZlIGhlcmUgcmF0aGVyIHRoYW4gaW4gYHBhZ2UtY29udGVudHNgLFxuLy8gYmVjYXVzZSBhIGNvbnRlbnRzIGxpc3QgcnVubmluZyBhcyBhIHdyYXBwZWQgcm93IGlzIHRoYXQgY29tcG9uZW50J3MgZGVmYXVsdFxuLy8gYW5kIHN0YW5kaW5nIGl0IHVwcmlnaHQgaXMgc29tZXRoaW5nIHRoaXMgbGF5b3V0IGRvZXMgdG8gaXQuXG4vL1xuLy8gVEhFIFJBSUwgSVMgMjYwIEFORCBGSVhFRC4gQSBmcmFjdGlvbmFsIGNvbHVtbiB3b3VsZCBoYXZlIGl0IGdyb3dpbmcgd2l0aCB0aGVcbi8vIHBhZ2UsIGFuZCBhIGNvbnRlbnRzIGxpc3QgZG9lcyBub3Qgd2FudCB0aGUgcm9vbSDigJQgaXQgd2FudHMgdG8gc2l0IHN0aWxsIHdoaWxlXG4vLyB0aGUgZG9jdW1lbnQgbW92ZXMuXG4vL1xuLy8gU291cmNlOiBNUEc4IG1vY2t1cCAoZGVzaWduIDE3OTU1KSwgbm8gY2F0YWxvZ3VlIHJvdy4gQXV0aG9yZWQgZm9yIHRoZSBNUEc4XG4vLyBjYXRlZ29yeS1mdW5uZWwgd2FsaywgMjAyNi0wOS0xNi5cblxuLyogVGhlIGNvbXBvc2VkIGNvcHkgaXMgYSB0d28tY29sdW1uIGRvY3VtZW50OiBwcm9zZSBhdCB0aGUgcmVhZGluZyBtZWFzdXJlIG9uXG4gICB0aGUgbGVmdCwgdGhlIGNvbnRlbnRzIGxpc3QgYXMgYSByYWlsIG9uIHRoZSByaWdodC4gVGhlIHBhbmVsIHdhcyBhbHdheXMgZnVsbFxuICAgd2lkdGg7IHRoZSBwcm9zZSBpcyBub3QsIGFuZCBtdXN0IG5vdCBiZSDigJQgMTA0MnB4IG9mIGJvZHkgY29weSBydW5zIHRvIGFib3V0XG4gICAxMzAgY2hhcmFjdGVycyBhIGxpbmUuIFRoZSByYWlsIGlzIHdoYXQgZWFybnMgdGhlIHNwYWNlIHRoZSBtZWFzdXJlIGxlYXZlcy5cbiAgIE9wZXJhdG9yLCAyMDI2LTA5LTE0LiAqL1xuLnNlby1kb2Mge1xuXG5cdGRpc3BsYXk6IGdyaWQ7XG5cdGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KCAwLCAxZnIgKSAyNjBweDtcblx0Z2FwOiB2YXIoLS1zcGFjZS0xMik7XG5cdGFsaWduLWl0ZW1zOiBzdGFydDtcbn1cblxuLnNlby1kb2NfX3JhaWwge1xuXG5cdHBvc2l0aW9uOiBzdGlja3k7XG5cdGluc2V0LWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS02KTtcblx0cGFkZGluZy1pbmxpbmUtc3RhcnQ6IHZhcigtLXNwYWNlLTYpO1xuXHRib3JkZXItaW5saW5lLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xufVxuXG4vKiBJbiB0aGUgcmFpbCB0aGUgY29udGVudHMgbGlzdCBzdGFja3MgaW5zdGVhZCBvZiBydW5uaW5nIGFzIGEgd3JhcHBlZCByb3cuICovXG4uc2VvLWRvY19fcmFpbCAucGFnZS1jb250ZW50cyB7XG5cblx0bWFyZ2luOiAwO1xuXHRwYWRkaW5nOiAwO1xuXHRib3JkZXI6IDA7XG59XG5cbi5zZW8tZG9jX19yYWlsIC5wYWdlLWNvbnRlbnRzX19saXN0IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLTMpO1xufVxuXG4uc2VvLWRvY19fcmFpbCAucGFnZS1jb250ZW50c19faXRlbTo6YWZ0ZXIge1xuXG5cdGNvbnRlbnQ6IG5vbmU7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogOTAwcHggKSB7XG5cblx0LnNlby1kb2Mge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoIDAsIDFmciApO1xuXHR9XG5cblx0LnNlby1kb2NfX3JhaWwge1xuXG5cdFx0cG9zaXRpb246IHN0YXRpYztcblx0XHRwYWRkaW5nLWlubGluZS1zdGFydDogMDtcblx0XHRib3JkZXItaW5saW5lLXN0YXJ0OiAwO1xuXHRcdGJvcmRlci1ibG9jay1zdGFydDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcblx0XHRwYWRkaW5nLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS00KTtcblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHNlcmllcy1iYXJcbi8vXG4vLyBQb3J0ZWQgZnJvbSB0aGUgTWFnYXppbmUgQXJ0aWNsZSBtb2NrdXAgKGRlc2lnbiBvZiByZWNvcmQ6IE1QRzE2LCBvcGVyYXRvci1hcHByb3ZlZFxuLy8gMjAyNi0wOS0yOCkgZm9yIHRoZSBhcnRpY2xlIHdhbGssIE1QRzE2LiBUaGUgbW9ja3VwJ3MgcnVsZXMgYXJlIHRoZSBkZXNpZ247IHRoaXMgaXNcbi8vIHdoYXQgc2hpcHBlZC4gRGVwYXJ0dXJlcyBmcm9tIGl0IGFyZSBjb21tZW50ZWQgd2hlcmUgdGhleSBvY2N1ci5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgc2VyaWVzLWJhciAgKE5FVylcbiAgIFRoZSBjb21wYWN0IHNlcmllcyBuYXZpZ2F0aW9uIGRpcmVjdGx5IHVuZGVyIHRoZSBhcnRpY2xlIGhlYWRlci4gSXQgaGFzIG9uZVxuICAgam9iIOKAlCBsZXQgYSByZWFkZXIgd2hvIGxhbmRlZCBtaWQtc2VyaWVzIHN0ZXAgYmFjayBvciBmb3J3YXJkIOKAlCBhbmQgb25lXG4gICBjb25zdHJhaW50OiBpdCBtdXN0IG5vdCBwdXNoIHRoZSBmaXJzdCBwYXJhZ3JhcGggYmVsb3cgdGhlIGZvbGQuIFNvIGl0IGlzIGFcbiAgIHNpbmdsZSByb3cgb24gdGhlIHBhbmVsJ3MgbGlnaHRlc3QgaW5zZXQgKHN0cmlwZSBncmV5LCB0aGUgc3R5bGVndWlkZSdzXG4gICBpbnNldCB0b25lLCBub3QgYSBiYW5kIHRpbnQpLCB3aXRoIHNtYWxsIHR5cGUgYW5kIG5vIGltYWdlcnkuXG5cbiAgIFRocmVlIGNlbGxzOiBwcmV2aW91cyBvbiB0aGUgbGVmdCwgdGhlIHNlcmllcyBhbmQgcG9zaXRpb24gaW4gdGhlIG1pZGRsZSxcbiAgIG5leHQgb24gdGhlIHJpZ2h0LiBVbmRlciB0aGUgcG9zaXRpb24gc2l0cyBhIHJvdyBvZiBmaWZ0ZWVuIHNob3J0IHRpY2tzIOKAlFxuICAgb25lIHBlciBlbnRyeSwgdGhlIGN1cnJlbnQgb25lIGluIFBhcmFnb24gYmx1ZS4gSXQgc2hvd3MgV0hFUkUsIG5vdCB3aGF0XG4gICBoYXMgYmVlbiByZWFkOiB0aGVyZSBhcmUgbm8gYWNjb3VudHMsIHNvIG5vdGhpbmcgaXMgdHJhY2tlZC5cblxuICAgQXQgcGhvbmUgd2lkdGggdGhlIGJhciBjb2xsYXBzZXMgdG8gdGhlIG9uZSBsaW5lIHRoZSBidWlsZCBicmllZiBhc2tzIGZvcjpcbiAgIFwiNSBvZiAxNSDCtyBOZXh0IOKGklwiLiBQcmV2aW91cyBhbmQgYm90aCBwYXJ0IHRpdGxlcyBkcm9wIG91dC5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4uc2VyaWVzLWJhciB7XG5cblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoIDAsIDFmciApIGF1dG8gbWlubWF4KCAwLCAxZnIgKTtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiB2YXIoLS1zcGFjZS02KTtcblx0cGFkZGluZzogdmFyKC0tc3BhY2UtNCkgdmFyKC0tc3BhY2UtNik7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsLWFsdCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXG59XG5cbi5zZXJpZXMtYmFyX19zdGVwIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLTEpO1xuXHRtaW4td2lkdGg6IDA7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblxufVxuXG4uc2VyaWVzLWJhcl9fc3RlcC0tbmV4dCB7XG5cblx0YWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuXHR0ZXh0LWFsaWduOiByaWdodDtcblxufVxuXG4uc2VyaWVzLWJhcl9fZGlyZWN0aW9uIHtcblxuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0xKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1leWVicm93KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxldHRlci1zcGFjaW5nOiAwLjA4ZW07XG5cdHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcblxufVxuXG4uc2VyaWVzLWJhcl9fZGlyZWN0aW9uIHN2ZyB7XG5cblx0ZmxleDogMCAwIGF1dG87XG5cdHdpZHRoOiAxMnB4O1xuXHRoZWlnaHQ6IDEycHg7XG5cbn1cblxuLnNlcmllcy1iYXJfX3RpdGxlIHtcblxuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHRtYXgtd2lkdGg6IDEwMCU7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rKTtcblx0dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG5cdHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cbn1cblxuLnNlcmllcy1iYXJfX3N0ZXA6aG92ZXIgLnNlcmllcy1iYXJfX3RpdGxlIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rLWhvdmVyKTtcblxufVxuXG4uc2VyaWVzLWJhcl9faGVyZSB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKTtcblxufVxuXG4uc2VyaWVzLWJhcl9fcG9zaXRpb24ge1xuXG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcblxufVxuXG4uc2VyaWVzLWJhcl9fdGlja3Mge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGdhcDogM3B4O1xuXHRtYXJnaW46IDA7XG5cdHBhZGRpbmc6IDA7XG5cdGxpc3Qtc3R5bGU6IG5vbmU7XG5cbn1cblxuLnNlcmllcy1iYXJfX3RpY2sge1xuXG5cdHdpZHRoOiA4cHg7XG5cdGhlaWdodDogM3B4O1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ib3JkZXItc3Ryb25nKTtcblxufVxuXG4uc2VyaWVzLWJhcl9fdGljay0tY3VycmVudCB7XG5cblx0d2lkdGg6IDE2cHg7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWJyYW5kKTtcblxufVxuXG4uc2VyaWVzLWJhcl9fY29tcGFjdCB7XG5cblx0ZGlzcGxheTogbm9uZTtcblxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5zZXJpZXMtYmFyIHtcblxuXHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0cGFkZGluZzogdmFyKC0tc3BhY2UtMykgdmFyKC0tc3BhY2UtNCk7XG5cblx0fVxuXG5cdC5zZXJpZXMtYmFyX19zdGVwLFxuXHQuc2VyaWVzLWJhcl9faGVyZSB7XG5cblx0XHRkaXNwbGF5OiBub25lO1xuXG5cdH1cblxuXHQuc2VyaWVzLWJhcl9fY29tcGFjdCB7XG5cblx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdFx0anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuXHRcdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdFx0d2lkdGg6IDEwMCU7XG5cblx0fVxuXG5cdC5zZXJpZXMtYmFyX19jb21wYWN0LXBvc2l0aW9uIHtcblxuXHRcdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRcdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xuXG5cdH1cblxuXHQuc2VyaWVzLWJhcl9fY29tcGFjdC1uZXh0IHtcblxuXHRcdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdFx0Z2FwOiB2YXIoLS1zcGFjZS0xKTtcblx0XHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0XHRjb2xvcjogdmFyKC0tdGV4dC1saW5rKTtcblx0XHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cblx0fVxuXG5cdC5zZXJpZXMtYmFyX19jb21wYWN0LW5leHQgc3ZnIHtcblxuXHRcdHdpZHRoOiAxNHB4O1xuXHRcdGhlaWdodDogMTRweDtcblxuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgc2VyaWVzLWluZGV4XG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE1hZ2F6aW5lIEFydGljbGUgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxNiwgb3BlcmF0b3ItYXBwcm92ZWRcbi8vIDIwMjYtMDktMjgpIGZvciB0aGUgYXJ0aWNsZSB3YWxrLCBNUEcxNi4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIHNlcmllcy1pbmRleCAgKE5FVylcbiAgIFRoZSBmdWxsIHJ1biBvZiBhIHNlcmllcywgZXZlcnkgZW50cnksIHRoZSBjdXJyZW50IG9uZSBtYXJrZWQuIEl0IGlzIG5vdCBhXG4gICBuZXcgbGlzdCB0cmVhdG1lbnQ6IGl0IGlzIHRoZSBicmFuZCdzIHdpZGdldCAoYSBQYXJhZ29uLWJsdWUgdGl0bGUgYmFyIG92ZXJcbiAgIGEgcGFuZWwtd2hpdGUgYm9keSkgaG9sZGluZyB0aGUgYnJhbmQncyBjb3VudC1saXN0LCB3aXRoIHRoZSBwdWJsaWNhdGlvblxuICAgZGF0ZSBzdGFuZGluZyBpbiB0aGUgY291bnQgc2xvdCBhbmQgLS1jdXJyZW50IG1hcmtpbmcgdGhpcyBwYXJ0LiBUaGlzIGJsb2NrXG4gICBvd25zIG9ubHkgd2hhdCBhIHNlcmllcyBhZGRzIG9uIHRvcCBvZiB0aG9zZSB0d28g4oCUIHRoZSBwaG9uZS13aWR0aFxuICAgY29sbGFwc2UgYW5kIHRoZSBkaXNjbG9zdXJlIHRoYXQgdW5kb2VzIGl0LlxuXG4gICBBdCBwaG9uZSB3aWR0aCB0aGUgbGlzdCBmb2xkcyB0byB0aGUgY3VycmVudCBlbnRyeSBhbmQgaXRzIHR3byBuZWlnaGJvdXJzO1xuICAgZXZlcnkgb3RoZXIgZW50cnkgY2FycmllcyBzZXJpZXMtaW5kZXhfX2ZhciBhbmQgaXMgaGlkZGVuIHVudGlsIHRoZSByZWFkZXJcbiAgIHByZXNzZXMgXCJTaG93IGFsbCAxNVwiLiBPcmRlciBpcyBwdWJsaWNhdGlvbiBvcmRlciwgc28gdGhlIG5laWdoYm91cnMgYXJlXG4gICB0aGUgcHJldmlvdXMgYW5kIG5leHQgcGFydHMsIHdoYXRldmVyIHRoZXkgYXJlIGNhbGxlZC5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4uc2VyaWVzLWluZGV4IHtcblxuXHRkaXNwbGF5OiBibG9jaztcblxufVxuXG4uc2VyaWVzLWluZGV4X190b2dnbGUge1xuXG5cdGRpc3BsYXk6IG5vbmU7XG5cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuc2VyaWVzLWluZGV4Om5vdCggLnNlcmllcy1pbmRleC0tb3BlbiApIC5zZXJpZXMtaW5kZXhfX2ZhciB7XG5cblx0XHRkaXNwbGF5OiBub25lO1xuXG5cdH1cblxuXHQuc2VyaWVzLWluZGV4X190b2dnbGUge1xuXG5cdFx0ZGlzcGxheTogZmxleDtcblx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRcdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXHRcdGdhcDogdmFyKC0tc3BhY2UtMik7XG5cdFx0d2lkdGg6IDEwMCU7XG5cdFx0cGFkZGluZzogdmFyKC0tc3BhY2UtMykgdmFyKC0tc3BhY2UtNik7XG5cdFx0Ym9yZGVyOiAwO1xuXHRcdGJvcmRlci1ibG9jay1zdGFydDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcblx0XHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtYnRuKTtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcblx0XHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdFx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdFx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdFx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRcdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xuXHRcdGN1cnNvcjogcG9pbnRlcjtcblxuXHR9XG5cblx0LnNlcmllcy1pbmRleF9fdG9nZ2xlOmhvdmVyIHtcblxuXHRcdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWNhcmQtaG92ZXIpO1xuXG5cdH1cblxuXHQuc2VyaWVzLWluZGV4X190b2dnbGUgc3ZnIHtcblxuXHRcdHdpZHRoOiAxNHB4O1xuXHRcdGhlaWdodDogMTRweDtcblxuXHR9XG5cblx0LnNlcmllcy1pbmRleC0tb3BlbiAuc2VyaWVzLWluZGV4X190b2dnbGUgc3ZnIHtcblxuXHRcdHRyYW5zZm9ybTogcm90YXRlKCAxODBkZWcgKTtcblxuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgc2VyaWVzLW1hcmtlclxuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBNYWdhemluZSBBcnRpY2xlIG1vY2t1cCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTYsIG9wZXJhdG9yLWFwcHJvdmVkXG4vLyAyMDI2LTA5LTI4KSBmb3IgdGhlIGFydGljbGUgd2FsaywgTVBHMTYuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBzZXJpZXMtbWFya2VyICAoTkVXKVxuICAgVGhlIGxpbmUgYWJvdmUgYW4gYXJ0aWNsZSdzIGtpY2tlciB0aGF0IHNheXMgd2hpY2ggc2VyaWVzIHRoZSBwaWVjZSBiZWxvbmdzXG4gICB0byBhbmQgd2hlcmUgaXQgc2l0cyBpbiBpdC4gVGhlIHNlcmllcyBuYW1lIGlzIGEgbGluayB0byB0aGUgc2VyaWVzIHBhZ2U7XG4gICB0aGUgcG9zaXRpb24gaXMgYSBjb3VudCBiYWRnZSwgYW5kIGEgY291bnQgYmFkZ2UgaXMgb25lIG9mIHRoZSBicmFuZCdzIHJvdW5kXG4gICBpbmRpY2F0b3JzLCBzbyBpdCB0YWtlcyB0aGUgcGlsbCByYWRpdXMuIE91dGxpbmUgcmF0aGVyIHRoYW4gZmlsbCwgYmVjYXVzZVxuICAgdGhlIG1hcmtlciBpcyBpZGVudGl0eSwgbm90IGEgY29udHJvbCDigJQgdGhlIG9uZSBmaWxsZWQgYmx1ZSBlbGVtZW50IG5lYXIgdGhlXG4gICB0aXRsZSBzaG91bGQgYmUgbm90aGluZy5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBzZXJpZXMtbWFya2VyICAoVVBEQVRFRCDigJQgLS1vbi1pbWFnZSlcbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4uc2VyaWVzLW1hcmtlciB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC13cmFwOiB3cmFwO1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpIHZhcigtLXNwYWNlLTMpO1xuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cbn1cblxuLnNlcmllcy1tYXJrZXJfX25hbWUge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xuXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cbn1cblxuLnNlcmllcy1tYXJrZXJfX25hbWU6aG92ZXIge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmstaG92ZXIpO1xuXG59XG5cbi5zZXJpZXMtbWFya2VyX19wb3NpdGlvbiB7XG5cblx0ZGlzcGxheTogaW5saW5lLWZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTEpIHZhcigtLXNwYWNlLTMpO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItYnJhbmQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtcGlsbCk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtZXllYnJvdyk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogMTtcblx0bGV0dGVyLXNwYWNpbmc6IDAuMDRlbTtcblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xuXHR3aGl0ZS1zcGFjZTogbm93cmFwO1xuXG59XG5cbi5zZXJpZXMtbWFya2VyLS1vbi1pbWFnZSAuc2VyaWVzLW1hcmtlcl9fbmFtZSB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtb24tYnJhbmQpO1xuXG59XG5cbi5zZXJpZXMtbWFya2VyLS1vbi1pbWFnZSAuc2VyaWVzLW1hcmtlcl9fbmFtZTpob3ZlciB7XG5cblx0Y29sb3I6IHZhcigtLXBhcmFnb24tMzAwKTtcblxufVxuXG4uc2VyaWVzLW1hcmtlci0tb24taW1hZ2UgLnNlcmllcy1tYXJrZXJfX3Bvc2l0aW9uIHtcblxuXHRib3JkZXItY29sb3I6IHZhcigtLXBhcmFnb24tMzAwKTtcblx0Y29sb3I6IHZhcigtLXBhcmFnb24tMzAwKTtcblxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHNlcmllcy1uZXh0XG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE1hZ2F6aW5lIEFydGljbGUgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxNiwgb3BlcmF0b3ItYXBwcm92ZWRcbi8vIDIwMjYtMDktMjgpIGZvciB0aGUgYXJ0aWNsZSB3YWxrLCBNUEcxNi4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIHNlcmllcy1uZXh0ICAoTkVXKVxuICAgVGhlIGNhcmQgYSByZWFkZXIgd2hvIGhhcyBqdXN0IGZpbmlzaGVkIGEgcGFydCBpcyBvZmZlcmVkIGZpcnN0OiB0aGUgbmV4dFxuICAgcGFydCBvZiB0aGUgc2FtZSBzZXJpZXMsIGxhcmdlLiBBIHNpYmxpbmcgb2YgYXJ0aWNsZS1jYXJkIOKAlCBzYW1lIGxlYWRcbiAgIGltYWdlIGF0IDE2OjksIHNhbWUgUGFyYWdvbi1ibHVlIGtpY2tlciwgc2FtZSBsaWdodCBpdGFsaWMgdGl0bGUgaW4gYmx1ZSDigJRcbiAgIGJ1dCBpdCBjYXJyaWVzIHRocmVlIHRoaW5ncyBhcnRpY2xlLWNhcmQgaGFzIG5vIHNsb3QgZm9yOiB0aGUgcGFydCdzXG4gICBwb3NpdGlvbiBpbiB0aGUgc2VyaWVzLCBpdHMgc3RhbmRmaXJzdCwgYW5kIGEgYnV0dG9uLCBiZWNhdXNlIHRoaXMgaXMgdGhlXG4gICBvbmUgY2FyZCBvbiB0aGUgcGFnZSB3aG9zZSB3aG9sZSBwdXJwb3NlIGlzIHRvIGJlIHByZXNzZWQuXG5cbiAgIFRoZSBtYWdhemluZSdzIGNhcmQtdGl0bGUgcnVsZSBhcHBsaWVzOiByZWd1bGFyIHdlaWdodCwgb25lIGxpZ2h0ZXIgdGhhblxuICAgdGhlIHN0b3JlIHdvdWxkIHNldCB0aGUgc2FtZSBzaXplLiBJdCBpcyBzZXQgYXQgdGhlIGgzIHNpemUgcmF0aGVyIHRoYW5cbiAgIGFydGljbGUtY2FyZCdzIGg0IGJlY2F1c2UgaXQgaXMgdGhlIHNpbmdsZSBjYXJkIG9mIGl0cyByb3cuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnNlcmllcy1uZXh0IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jYXJkKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHRib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctY2FyZCk7XG5cbn1cblxuLnNlcmllcy1uZXh0X19tZWRpYSB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdHdpZHRoOiAxMDAlO1xuXHRhc3BlY3QtcmF0aW86IDE2IC8gOTtcblx0b2JqZWN0LWZpdDogY292ZXI7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLW5ldXRyYWwtODAwKTtcblxufVxuXG4uc2VyaWVzLW5leHRfX2JvZHkge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXg6IDEgMSBhdXRvO1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblx0Z2FwOiB2YXIoLS1zcGFjZS00KTtcblx0cGFkZGluZzogdmFyKC0tc3BhY2UtY2FyZC1wYWRkaW5nKTtcblxufVxuXG4uc2VyaWVzLW5leHRfX21ldGEge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtd3JhcDogd3JhcDtcblx0YWxpZ24taXRlbXM6IGJhc2VsaW5lO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpIHZhcigtLXNwYWNlLTQpO1xuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1leWVicm93KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiAxO1xuXHRsZXR0ZXItc3BhY2luZzogMC4xMmVtO1xuXHR0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuXG59XG5cbi5zZXJpZXMtbmV4dF9fa2lja2VyIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG5cbn1cblxuLnNlcmllcy1uZXh0X19wb3NpdGlvbiB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuXG59XG5cbi5zZXJpZXMtbmV4dF9fdGl0bGUge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWgzKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRmb250LXN0eWxlOiBpdGFsaWM7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblxufVxuXG4uc2VyaWVzLW5leHRfX3RpdGxlIGEge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJyYW5kKTtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXG59XG5cbi5zZXJpZXMtbmV4dF9fdGl0bGUgYTpob3ZlciB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtbGluay1ob3Zlcik7XG5cbn1cblxuLnNlcmllcy1uZXh0X19zdGFuZGZpcnN0IHtcblxuXHRtYXgtd2lkdGg6IHZhcigtLWNvbnRhaW5lci1hcnRpY2xlKTtcblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblxufVxuXG4uc2VyaWVzLW5leHRfX2RhdGUge1xuXG5cdG1hcmdpbjogMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG5cbn1cblxuLnNlcmllcy1uZXh0X19hY3Rpb24ge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogYXV0bztcblx0cGFkZGluZy1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtMik7XG5cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuc2VyaWVzLW5leHRfX2JvZHkge1xuXG5cdFx0cGFkZGluZzogdmFyKC0tc3BhY2UtNik7XG5cblx0fVxuXG5cdC5zZXJpZXMtbmV4dF9fdGl0bGUge1xuXG5cdFx0Zm9udC1zaXplOiB2YXIoLS1mcy1oNCk7XG5cblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHNlcmllcy1zdGVwc1xuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBNYWdhemluZSBBcnRpY2xlIG1vY2t1cCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTYsIG9wZXJhdG9yLWFwcHJvdmVkXG4vLyAyMDI2LTA5LTI4KSBmb3IgdGhlIGFydGljbGUgd2FsaywgTVBHMTYuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBzZXJpZXMtc3RlcHMgIChORVcpXG4gICBQcmV2aW91cyBhbmQgbmV4dCBwYXJ0LCBzaWRlIGJ5IHNpZGUsIGZvciB0aGUgcmFpbCdzIHNlcmllcyBwYW5lbCDigJRcbiAgIHNlcmllcy1iYXIncyB0d28gb3V0ZXIgY2VsbHMgd2l0aG91dCBpdHMgbWlkZGxlLCBiZWNhdXNlIGluIGEgMzI4cHggcmFpbFxuICAgdGhlIHBvc2l0aW9uIGFscmVhZHkgc2l0cyBpbiB0aGUgc2VyaWVzLW1hcmtlciBhYm92ZSBpdC5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4uc2VyaWVzLXN0ZXBzIHtcblxuXHRkaXNwbGF5OiBncmlkO1xuXHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCggMiwgbWlubWF4KCAwLCAxZnIgKSApO1xuXHRnYXA6IHZhcigtLXNwYWNlLTQpO1xuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTQpO1xuXHRwYWRkaW5nLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS00KTtcblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xuXG59XG5cbi5zZXJpZXMtc3RlcHNfX3N0ZXAge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogdmFyKC0tc3BhY2UtMSk7XG5cdG1pbi13aWR0aDogMDtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXG59XG5cbi5zZXJpZXMtc3RlcHNfX3N0ZXAtLW5leHQge1xuXG5cdGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcblx0dGV4dC1hbGlnbjogcmlnaHQ7XG5cbn1cblxuLnNlcmllcy1zdGVwc19fZGlyZWN0aW9uIHtcblxuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtZXllYnJvdyk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGxldHRlci1zcGFjaW5nOiAwLjA4ZW07XG5cdHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcblxufVxuXG4uc2VyaWVzLXN0ZXBzX190aXRsZSB7XG5cblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbGluayk7XG5cbn1cblxuLnNlcmllcy1zdGVwc19fc3RlcDpob3ZlciAuc2VyaWVzLXN0ZXBzX190aXRsZSB7XG5cblx0Y29sb3I6IHZhcigtLXRleHQtbGluay1ob3Zlcik7XG5cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBzZXR1cC1iYW5kXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIG9yZGVyIGNvbmZpcm1hdGlvbiBtb2NrdXAgKGRlc2lnbiBvZiByZWNvcmQ6IE1QRzEyLCBvcGVyYXRvci1hY2NlcHRlZFxuLy8gMjAyNi0wOS0yNCkgZm9yIHRoZSBjb25maXJtYXRpb24gd2FsaywgTVBHMTIuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCBzZXR1cC1iYW5kICAoTkVXLCBsYXlvdXQpXG4gICBDb21wbGV0ZSBZb3VyIFNldHVwOiB0aGUgb25lIHJlY29tbWVuZGF0aW9uIGJhbmQgdGhlIGNvbmZpcm1hdGlvbiBjYXJyaWVzLFxuICAgYmVsb3cgdGhlIG9yZGVyIGRldGFpbHMgYW5kIHRoZSBoZWxwIHJvdyBzbyBpdCBuZXZlciBzaXRzIGFib3ZlIHdoYXRcbiAgIGhhcHBlbnMgbmV4dC4gVGhlIGNhbnZhcyBjYXJyaWVzIHRoZSBzZWN0aW9uIGhlYWQgYW5kLCBwdWxsZWQgdXAgYWdhaW5zdFxuICAgaXQsIG9uZSBtdXRlZCBsaW5lIHRoYXQgYmVsb25ncyB0byB0aGUgdGl0bGU7IHRoZW4gZm91ciBvZiB0aGUgc3RvcmUnc1xuICAgc3RhbmRhcmQgcHJvZHVjdCBjYXJkcyBhdCB0aGUgcGFuZWwgZ2FwOyB0aGVuIHRoZSBvbmUgd2F5IG9uLCBDb250aW51ZVxuICAgU2hvcHBpbmcsIGFzIHRoZSBiYW5kJ3MgdHJhaWxpbmcgYWN0aW9uLiBObyBncm91bmQgb2YgaXRzIG93biDigJQgdGhpcyBicmFuZFxuICAgaGFzIG9uZSBncm91bmQsIGFuZCB0aGUgY2FyZHMgYXJlIHRoZSBzdXJmYWNlcy5cbiAgIERFUEFSVFVSRTogbm8gX19ncmlkLiBUaGUgZm91ciBjYXJkcyBzaXQgaW4gdGhlIGJyYW5kJ3Mgb3duIC5ncmlkLmdyaWQtLTQsIHdoaWNoXG4gICBhbHJlYWR5IHN0ZXBzIDQg4oaSIDIgYXQgMTEwMCBhbmQg4oaSIDEgYXQgNjQwIGV4YWN0bHkgYXMgdGhpcyBiYW5kIGRvZXNcbiAgIChsYXlvdXRzL19ncmlkLnNjc3MpLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4uc2V0dXAtYmFuZCB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG59XG5cbi5zZXR1cC1iYW5kX19sZWFkIHtcblxuXHRtYXJnaW46IGNhbGMoIC0xICogdmFyKC0tc3BhY2UtNCkgKSAwIHZhcigtLXNwYWNlLTYpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1saWdodCk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1ib2R5KTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG59XG5cbi5zZXR1cC1iYW5kX19mb290IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTgpO1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC5zZXR1cC1iYW5kX19sZWFkIHtcblxuXHRcdG1hcmdpbi1ibG9jay1zdGFydDogY2FsYyggLTEgKiB2YXIoLS1zcGFjZS0zKSApO1xuXHR9XG5cblx0LnNldHVwLWJhbmRfX2Zvb3QgLmJ0biB7XG5cblx0XHR3aWR0aDogMTAwJTtcblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHNoYXJlLWxpbmtzXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE1hZ2F6aW5lIEFydGljbGUgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxNiwgb3BlcmF0b3ItYXBwcm92ZWRcbi8vIDIwMjYtMDktMjgpIGZvciB0aGUgYXJ0aWNsZSB3YWxrLCBNUEcxNi4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIHNoYXJlLWxpbmtzICAoTkVXKVxuICAgU21hbGwgdGV4dCBzaGFyZSBsaW5rcyBhdCB0aGUgZW5kIG9mIHRoZSBhcnRpY2xlIOKAlCBub3QgYSBmbG9hdGluZyBiYXIgYW5kXG4gICBub3QgdGhlIGJyYW5kJ3Mgc29jaWFsLXJvdywgd2hpY2ggaXMgZm9yIGZvbGxvd2luZyB0aGUgc3RvcmUuIENsb3NlcyBhXG4gICBwYW5lbCBib2R5IHVuZGVyIGEgaGFpcmxpbmUuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnNoYXJlLWxpbmtzIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LXdyYXA6IHdyYXA7XG5cdGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKSB2YXIoLS1zcGFjZS00KTtcblx0bWFyZ2luOiB2YXIoLS1zcGFjZS00KSAwIDA7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTQpIDAgMDtcblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xuXHRsaXN0LXN0eWxlOiBub25lO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cbn1cblxuLnNoYXJlLWxpbmtzX19sYWJlbCB7XG5cblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0Y29sb3I6IHZhcigtLXRleHQtaGVhZGluZyk7XG5cbn1cblxuLnNoYXJlLWxpbmtzX19saW5rIHtcblxuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbGluayk7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblxufVxuXG4uc2hhcmUtbGlua3NfX2xpbms6aG92ZXIge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmstaG92ZXIpO1xuXG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgc2hpcG1lbnQtbGlzdFxuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBvcmRlciBjb25maXJtYXRpb24gbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxMiwgb3BlcmF0b3ItYWNjZXB0ZWRcbi8vIDIwMjYtMDktMjQpIGZvciB0aGUgY29uZmlybWF0aW9uIHdhbGssIE1QRzEyLiBUaGUgbW9ja3VwJ3MgcnVsZXMgYXJlIHRoZSBkZXNpZ247IHRoaXMgaXNcbi8vIHdoYXQgc2hpcHBlZC4gRGVwYXJ0dXJlcyBmcm9tIGl0IGFyZSBjb21tZW50ZWQgd2hlcmUgdGhleSBvY2N1ci5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgc2hpcG1lbnQtbGlzdCAgKE5FVylcbiAgIFdoYXQgaGFwcGVucyBuZXh0LCBhIHJvdyBwZXIgcGFja2FnZTogdGhlIGJhc2tldCdzIG93biBwYWNrYWdlLWhlYWQsIHNvIHRoZVxuICAgc2hvcHBlciByZWNvZ25pc2VzIHRoZSB0aHJlZSBncm91cHMgdGhleSBzYXcgYmVmb3JlIHBheWluZywgd2l0aCB0aGVcbiAgIHBhY2thZ2UncyBpdGVtcyBhcyBzbWFsbCBtYW51ZmFjdHVyZXIgc2hvdHMgYXQgdGhlIGZhciBlbmQuIEEgcm93IGNhbiBjYXJyeVxuICAgb25lIG5vdGUgdW5kZXIgaXRzIHN0YXR1cyBsaW5lIOKAlCB0aGUgcHJlLW9yZGVyJ3MgXCJQYWlkIHRvZGF5XCIg4oCUIGluZGVudGVkIHRvXG4gICB0aGUgc3RhdHVzIHRleHQgc28gaXQgcmVhZHMgYXMgcGFydCBvZiB0aGUgc2FtZSBwYWNrYWdlLiBSb3dzIGFyZSBkaXZpZGVkXG4gICBieSB0aGUgaGFpcmxpbmUsIGFzIHJvd3MgaW5zaWRlIGEgcGFuZWwgYXJlLCBhbmQgdGhlIGxpc3QgY2xvc2VzIG9uIG9uZVxuICAgbGluZSB0aGF0IGFwcGxpZXMgdG8gZXZlcnkgcGFja2FnZTogaG93IHRyYWNraW5nIGFycml2ZXMuXG5cbiAgIENvbnRlbnRzIG9ubHkg4oCUIHRoZSBzdXJmYWNlIGlzIHRoZSBwYW5lbCBpdCBzaXRzIGluLiBUaGUgdGh1bWJuYWlscyBhcmUgdGhlXG4gICBzYW1lIGhhaXJsaW5lIHRpbGUgYXQgdGhlIHN1cmZhY2UgcmFkaXVzIG9yZGVyLWxpbmVzIHVzZXMsIGEgc2l6ZSB1cCxcbiAgIGJlY2F1c2UgaGVyZSB0aGV5IGFyZSB0aGUgb25seSBwcm9kdWN0IGluZm9ybWF0aW9uIGluIHRoZSByb3cuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi5zaGlwbWVudC1saXN0X19yb3dzIHtcblxuXHRtYXJnaW46IDA7XG5cdHBhZGRpbmc6IDA7XG5cdGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi5zaGlwbWVudC1saXN0X19pdGVtIHtcblxuXHRkaXNwbGF5OiBncmlkO1xuXHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCggMCwgMWZyICkgYXV0bztcblx0YWxpZ24taXRlbXM6IHN0YXJ0O1xuXHRnYXA6IHZhcigtLXNwYWNlLTQpIHZhcigtLXNwYWNlLWNvbnRlbnQtZ2FwKTtcblx0cGFkZGluZy1ibG9jazogdmFyKC0tc3BhY2UtNik7XG59XG5cbi5zaGlwbWVudC1saXN0X19pdGVtOmZpcnN0LWNoaWxkIHtcblxuXHRwYWRkaW5nLWJsb2NrLXN0YXJ0OiAwO1xufVxuXG4uc2hpcG1lbnQtbGlzdF9faXRlbSArIC5zaGlwbWVudC1saXN0X19pdGVtIHtcblxuXHRib3JkZXItYmxvY2stc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG59XG5cbi5zaGlwbWVudC1saXN0X19ib2R5IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xuXHRtaW4td2lkdGg6IDA7XG59XG5cbi5zaGlwbWVudC1saXN0X19ub3RlIHtcblxuXHRtYXJnaW46IDA7XG5cdHBhZGRpbmctaW5saW5lLXN0YXJ0OiBjYWxjKCAyNHB4ICsgdmFyKC0tc3BhY2UtMykgKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcbn1cblxuLnNoaXBtZW50LWxpc3RfX3RodW1icyB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC13cmFwOiB3cmFwO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xuXHRtYXJnaW46IDA7XG5cdHBhZGRpbmc6IDA7XG5cdGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi5zaGlwbWVudC1saXN0X190aHVtYiB7XG5cblx0d2lkdGg6IDcycHg7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTEpO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2FyZCk7XG59XG5cbi5zaGlwbWVudC1saXN0X190aHVtYiBpbWcge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHR3aWR0aDogMTAwJTtcblx0YXNwZWN0LXJhdGlvOiAxIC8gMTtcblx0b2JqZWN0LWZpdDogY29udGFpbjtcbn1cblxuLyogRVhURU5ERUQgb24gdGhlIHNlY29uZCByZXZpZXcgKG9wZXJhdG9yLCAyMDI2LTA5LTI0KTogdGhlIGZvb3QgaXMgYSByb3cgdGhhdFxuICAgY2FuIGNhcnJ5IGFuIGFjdGlvbiBiZXNpZGUgdGhlIHRyYWNraW5nIGxpbmUgKGEgVHJhY2sgYnV0dG9uIHdhcyB0cmllZCB0aGVyZVxuICAgYW5kIHJlbW92ZWQg4oCUIG5vdGhpbmcgaXMgdHJhY2thYmxlIHVudGlsIGEgcGFja2FnZSBzaGlwcyksIGFuZCB0aGUgbGlzdCBjYW5cbiAgIGNsb3NlIG9uIG9uZSBxdWlldGVyIGxpbmUgYmVuZWF0aCAoX19hZnRlciksIGluZGVudGVkIHRvIHRoZSBmb290J3MgdGV4dC4gVGhlXG4gICBsaW5lJ3MgdHlwZSBtb3ZlZCBmcm9tIF9fZm9vdCB0byBfX2Zvb3QtdGV4dC4gKi9cbi5zaGlwbWVudC1saXN0X19mb290IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LXdyYXA6IHdyYXA7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjtcblx0Z2FwOiB2YXIoLS1zcGFjZS00KSB2YXIoLS1zcGFjZS04KTtcblx0cGFkZGluZy1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtNik7XG5cdGJvcmRlci1ibG9jay1zdGFydDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcbn1cblxuLnNoaXBtZW50LWxpc3RfX2Zvb3QtdGV4dCB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiB2YXIoLS1zcGFjZS0zKTtcblx0bWFyZ2luOiAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG4uc2hpcG1lbnQtbGlzdF9fYWZ0ZXIge1xuXG5cdG1hcmdpbjogdmFyKC0tc3BhY2UtMykgMCAwO1xuXHRwYWRkaW5nLWlubGluZS1zdGFydDogY2FsYyggMjRweCArIHZhcigtLXNwYWNlLTMpICk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG59XG5cbi5zaGlwbWVudC1saXN0X19mb290LWljb24ge1xuXG5cdGZsZXg6IDAgMCBhdXRvO1xuXHR3aWR0aDogMjRweDtcblx0aGVpZ2h0OiAyNHB4O1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG59XG5cbi5zaGlwbWVudC1saXN0X19mb290LWljb24gc3ZnIHtcblxuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdGhlaWdodDogMTAwJTtcbn1cblxuLyogUGhvbmU6IHRoZSB0aHVtYm5haWxzIGRyb3AgdW5kZXIgdGhlIHN0YXR1cyBsaW5lLCBpbmRlbnRlZCB0byBpdHMgdGV4dC4gKi9cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LnNoaXBtZW50LWxpc3RfX2l0ZW0ge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoIDAsIDFmciApO1xuXHRcdGdhcDogdmFyKC0tc3BhY2UtMyk7XG5cdH1cblxuXHQuc2hpcG1lbnQtbGlzdF9fdGh1bWJzIHtcblxuXHRcdGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcblx0XHRwYWRkaW5nLWlubGluZS1zdGFydDogY2FsYyggMjRweCArIHZhcigtLXNwYWNlLTMpICk7XG5cdH1cblxuXHQuc2hpcG1lbnQtbGlzdF9fdGh1bWIge1xuXG5cdFx0d2lkdGg6IDU2cHg7XG5cdH1cblxuXHQuc2hpcG1lbnQtbGlzdF9fbm90ZSB7XG5cblx0XHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0fVxuXG5cdC5zaGlwbWVudC1saXN0X19mb290IHtcblxuXHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdFx0YWxpZ24taXRlbXM6IHN0cmV0Y2g7XG5cdH1cblxuXHQuc2hpcG1lbnQtbGlzdF9fZm9vdC10ZXh0IHtcblxuXHRcdGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRcdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1ib2R5KTtcblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHNpdGUgc2VhcmNoXG4vL1xuLy8gVGhlIGZyYW1ld29yayBnaXZlcyB0aGUgc2VhcmNoIG1vZGFsIGl0cyBtZWNoYW5pY3MgYW5kIGEgZGVsaWJlcmF0ZWx5IHBsYWluXG4vLyBkZWZhdWx0ICh3aGl0ZSBmaWVsZCwgNHB4IHJhZGl1cywgZmxvYXRpbmcgb24gdGhlIHNjcmltKS4gVGhpcyBpcyB0aGUgYnJhbmRcbi8vIGRlbHRhIG92ZXIgdGhhdDogYSBjaHJvbWUgcGFuZWwgaGFuZ2luZyBvZmYgdGhlIGhlYWRlciB3aXRoIHRoZSBmaWVsZCBpbnNpZGVcbi8vIGl0LCBzbyBzZWFyY2ggcmVhZHMgYXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSBoZWFkZXIgcmF0aGVyIHRoYW4gYSBib3ggZHJvcHBlZCBvblxuLy8gYSBkaW1tZWQgcGFnZS5cbi8vXG4vLyBXcmFwcyBET00gdGhlIHBhcmVudCB0aGVtZSBvd25zIGFuZCB0aGlzIGZpbGUgbmV2ZXIgZWRpdHMg4oCUXG4vLyBjYW1jb20tdjIvcGFydGlhbHMvbW9kYWwtc2VhcmNoLnBocCAodGhlIG1vZGFsKSBhbmQgY2FtY29tLXYyL3NlYXJjaGZvcm0ucGhwXG4vLyAodGhlIHJlc3VsdHMtcGFnZSBmb3JtKS4gQmxvY2tzIHRvdWNoZWQ6XG4vL1xuLy8gICAubW9kYWxfX3dyYXBwZXIgIOKAlCB0aGUgcGFuZWwsIG1vZGFsIG9ubHlcbi8vICAgLm1vZGFsX19jbG9zZSAgICDigJQgbW92ZWQgaW5zaWRlIHRoZSBwYW5lbCwgbW9kYWwgb25seVxuLy8gICAuc2VhcmNoLWZvcm0gICAgIOKAlCB0aGUgZmllbGQsIGluIEJPVEggdGhlIG1vZGFsIGFuZCBvbiB0aGUgcmVzdWx0cyBwYWdlXG4vL1xuLy8g4pqgIFRIRSBGSUVMRCBSVUxFUyBBUkUgTk9UIFNDT1BFRCBUTyBUSEUgTU9EQUwsIE9OIFBVUlBPU0UuIGBzZWFyY2hmb3JtLnBocGBcbi8vIHJlbmRlcnMgdGhlIHNhbWUgYC5zZWFyY2gtZm9ybWAgb24gdGhlIHJlc3VsdHMgdGVtcGxhdGUsIGZ1bGwgd2lkdGgsIGFuZCB0aGVcbi8vIG9wZXJhdG9yJ3MgY2FsbCBvbiAyMDI2LTA5LTIxIHdhcyB0aGF0IGJvdGggc3VyZmFjZXMgcmVhZCB0aGUgc2FtZS4gU2NvcGluZ1xuLy8gdGhlc2UgdG8gYC5tb2RhbGAgd291bGQgbGVhdmUgdGhlIHJlc3VsdHMgcGFnZSBvbiB0aGUgZnJhbWV3b3JrIGRlZmF1bHQuXG4vL1xuLy8gUGFyYWdvbiBpcyBhIGZsYXQgYnJhbmQg4oCUIGAtLXJhZGl1cy1pbnB1dGAgYW5kIGAtLXJhZGl1cy1idG5gIGFyZSBib3RoIDAgYW5kXG4vLyBgLS1zaGFkb3ctcGFuZWxgIGlzIGBub25lYC4gU3F1YXJlIGVkZ2VzIGFuZCBhIGJyYW5kIGhhaXJsaW5lIGFyZSB0aGUgd2hvbGVcbi8vIHRyZWF0bWVudDsgZG8gbm90IGFkZCBhIHJhZGl1cyBvciBhIGRyb3Agc2hhZG93IHRvIG1ha2UgaXQgXCJzaXQgYmV0dGVyXCIuXG5cbi8qIC0tLS0gcGFuZWwgKG1vZGFsIG9ubHkpIC0tLS0gKi9cbi5tb2RhbF9fd3JhcHBlciB7XG5cblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXG5cdC8vIEZsdXNoIHRvIHRoZSBoZWFkZXIuIFRoZSBmcmFtZXdvcmsncyA0MHB4IG1hcmdpbiBpcyB0aGUgY2xlYXJhbmNlIGFuXG5cdC8vIFVOVFJFQVRFRCBicmFuZCBuZWVkcywgYW5kIGl0IHN0b3BzIGJlaW5nIG5lZWRlZCB0aGUgbW9tZW50IHRoZSBwYW5lbCBoYXNcblx0Ly8gcGFkZGluZyBvZiBpdHMgb3duIOKAlCB0aGUgcGFuZWwgaXMgbWVhbnQgdG8gdG91Y2ggdGhlIGhlYWRlciBpdCBoYW5ncyBmcm9tLlxuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IDA7XG5cblx0Ly8g4pqgIFRIRSBUT1AgUEFERElORyBJUyBTSVpFRCBCWSBUSEUgQ0xPU0UgQlVUVE9OLCBOT1QgQlkgRVlFLiBUaGUgY2xvc2UgaXNcblx0Ly8gNDBweCBhdCBhIDEycHggaW5zZXQsIHNvIGFueXRoaW5nIHVuZGVyIDUycHggbGV0cyBpdCBzaXQgb24gdG9wIG9mIHRoZVxuXHQvLyBmaWVsZC4gQXQgdGhlIDMycHggdGhpcyBmaXJzdCB1c2VkLCB0aGUgZ2x5cGggb3ZlcmxhcHBlZCB0aGUgd2hpdGUgZmllbGQnc1xuXHQvLyB0b3AtcmlnaHQgY29ybmVyIGJ5IDI0eDE5cHguIEFSVFNBQkVSUyBoYXMgdGhlIHNhbWUgYXJpdGhtZXRpYyBhbmQgZ2V0c1xuXHQvLyBhd2F5IHdpdGggaXQgb25seSBiZWNhdXNlIGl0cyBmaWVsZCBpcyB0cmFuc3BhcmVudCDigJQgZG8gbm90IGNvcHkgaXRzIDMycHhcblx0Ly8gaGVyZSwgYW5kIGNoYW5nZSB0aGlzIHZhbHVlIG9ubHkgYWxvbmdzaWRlIHRoZSBjbG9zZSdzIHNpemUgb3IgaW5zZXQuXG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTE2KSB2YXIoLS1zcGFjZS04KSB2YXIoLS1zcGFjZS0xMik7XG5cblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2hyb21lLWRlZXApO1xuXG59XG5cbi8vIEJyYW5kIGhhaXJsaW5lIGFsb25nIHRoZSBwYW5lbCdzIHRvcCBlZGdlLCByZWFkaW5nIGFzIHRoZSBoZWFkZXIncyBvd24gcnVsZVxuLy8gY29udGludWluZyBkb3duIG92ZXIgdGhlIHNlYXJjaC4gQWJzb2x1dGVseSBwb3NpdGlvbmVkIHJhdGhlciB0aGFuIGEgYm9yZGVyIHNvXG4vLyBpdCBzaXRzIGFib3ZlIHRoZSBwYW5lbCdzIGJhY2tncm91bmQgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGJveC5cbi5tb2RhbF9fd3JhcHBlcjo6YmVmb3JlIHtcblxuXHRjb250ZW50OiAnJztcblx0cG9zaXRpb246IGFic29sdXRlO1xuXHR0b3A6IDA7XG5cdGxlZnQ6IDA7XG5cdHJpZ2h0OiAwO1xuXG5cdGhlaWdodDogMnB4O1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWJyYW5kKTtcblxufVxuXG4vKiAtLS0tIGNsb3NlIChtb2RhbCBvbmx5KSAtLS0tICovXG4ubW9kYWxfX2Nsb3NlIHtcblxuXHQvLyBJTlNJREUgdGhlIHBhbmVsIG5vdy4gVGhlIGZyYW1ld29yayBmbG9hdHMgaXQgMzBweCBhYm92ZSwgd2hpY2ggaXMgcmlnaHRcblx0Ly8gd2hlbiB0aGVyZSBpcyBubyBwYW5lbCB0byBzaXQgaW4gYW5kIHdyb25nIHdoZW4gdGhlcmUgaXMg4oCUIGFuZCBhdCDiiaQ3NjggaXRcblx0Ly8gaXMgd2hhdCB1c2VkIHRvIHB1dCB0aGUgZ2x5cGggb24gdG9wIG9mIHRoZSBoZWFkZXIuXG5cdC8vXG5cdC8vIFJhdyBwaXhlbHMgcmF0aGVyIHRoYW4gdGhlIHNwYWNpbmcgc2NhbGU6IHRoaXMgaXMgYSBnbHlwaCdzIGluc2V0IGluc2lkZVxuXHQvLyBpdHMgb3duIGNvcm5lciwgbm90IHBhZ2Ugcmh5dGhtLCBhbmQgdGhlIHBhbmVsJ3MgdG9wIHBhZGRpbmcgYWJvdmUgaXNcblx0Ly8gZGVyaXZlZCBmcm9tIHRoZXNlIHR3byBudW1iZXJzLlxuXHR0b3A6IDEycHg7XG5cdHJpZ2h0OiAxMnB4O1xuXG5cdHdpZHRoOiA0MHB4O1xuXHRoZWlnaHQ6IDQwcHg7XG5cbn1cblxuLm1vZGFsX19jbG9zZSAuaWNvbiB7XG5cblx0ZmlsbDogdmFyKC0tdGV4dC1vbi1jaHJvbWUpO1xuXHR0cmFuc2l0aW9uOiBmaWxsIDIwMG1zIGVhc2U7XG5cbn1cblxuLm1vZGFsX19jbG9zZTpob3ZlciAuaWNvbiB7XG5cblx0ZmlsbDogdmFyKC0tY29sb3ItYnJhbmQpO1xuXG59XG5cbi8qIC0tLS0gZmllbGQgKG1vZGFsIEFORCByZXN1bHRzIHBhZ2UpIC0tLS0gKi9cbi5zZWFyY2gtZm9ybV9fd3JhcHBlciB7XG5cblx0Ym9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWlucHV0KTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWlucHV0KTtcblxuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1pbnB1dCk7XG5cblx0dHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDIwMG1zIGVhc2U7XG5cbn1cblxuLnNlYXJjaC1mb3JtX193cmFwcGVyOmZvY3VzLXdpdGhpbiB7XG5cblx0Ym9yZGVyLWNvbG9yOiB2YXIoLS1ib3JkZXItZm9jdXMpO1xuXG59XG5cbi5zZWFyY2gtZm9ybV9faW5wdXQge1xuXG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5LWxnKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG5cbn1cblxuLnNlYXJjaC1mb3JtX19pbnB1dDo6cGxhY2Vob2xkZXIge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcblxufVxuXG4vLyBUaGUgZnJhbWV3b3JrIGRyYXdzIGEgZm9jdXMgb3V0bGluZSBvbiB0aGUgaW5wdXQgaXRzZWxmLiBUaGUgd3JhcHBlciBjYXJyaWVzXG4vLyB0aGUgZm9jdXMgdHJlYXRtZW50IGhlcmUgaW5zdGVhZCwgc28gdGhlIHJpbmcgd291bGQgZG91YmxlIHVwLlxuLnNlYXJjaC1mb3JtX19pbnB1dDpmb2N1cyB7XG5cblx0b3V0bGluZTogbm9uZTtcblxufVxuXG4uc2VhcmNoLWZvcm1fX3N1Ym1pdCAuaWNvbiB7XG5cblx0ZmlsbDogdmFyKC0tdGV4dC1tdXRlZCk7XG5cdHRyYW5zaXRpb246IGZpbGwgMjAwbXMgZWFzZTtcblxufVxuXG4uc2VhcmNoLWZvcm1fX3N1Ym1pdDpob3ZlciAuaWNvbiB7XG5cblx0ZmlsbDogdmFyKC0tY29sb3ItYnJhbmQpO1xuXG59XG5cbi8vIDc2N3B4LCBub3QgdGhlIDY0MC85MDAgdGhpcyBzaWxvIHVzdWFsbHkgcmVhY2hlcyBmb3I6IHRoZXNlIHJ1bGVzIG92ZXJyaWRlIHRoZVxuLy8gZnJhbWV3b3JrJ3Mgb3duIG1vZGFsIGJyZWFrcG9pbnQsIGFuZCBgbWVkaWEtcXVlcnkoJzc2OCcpYCBleHBhbmRzIHRvXG4vLyBgbWF4LXdpZHRoOiA3NjdweGAuIEF0IDc2OCB0aGUgdHdvIHdvdWxkIGRpc2FncmVlIGJ5IGEgcGl4ZWwuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDc2N3B4ICkge1xuXG5cdC5tb2RhbF9fd3JhcHBlciB7XG5cblx0XHQvLyBPbmx5IHRoZSBpbmxpbmUgYW5kIGJvdHRvbSBwYWRkaW5nIHNocmluayBoZXJlIOKAlCB0b3AgaXMgbGVmdCB1bnNldCxcblx0XHQvLyBzbyBpdCBzdGF5cyBgdmFyKC0tc3BhY2UtMTYpYCBmcm9tIHRoZSBkZXNrdG9wIHJ1bGUgYWJvdmUsIGJlY2F1c2Vcblx0XHQvLyBpdCBpcyB0aGUgY2xvc2UgYnV0dG9uJ3MgaGVpZ2h0IHBsdXMgaXRzIGluc2V0IGFuZCBuZWl0aGVyIHNocmlua3Ncblx0XHQvLyBvbiBhIHBob25lLlxuXHRcdHBhZGRpbmctaW5saW5lOiB2YXIoLS1zcGFjZS00KTtcblx0XHRwYWRkaW5nLWJsb2NrLWVuZDogdmFyKC0tc3BhY2UtOCk7XG5cblx0fVxuXG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgc3BlYy1idWxsZXRzXG4vL1xuLy8gQSBidWxsZXRlZCBzcGVjaWZpY2F0aW9uIGxpc3Qgd2l0aCBzbWFsbCBQYXJhZ29uLWJsdWUgZG90cyBhbmQgaGFpcmxpbmUgcm93XG4vLyBzZXBhcmF0b3JzLiBUd28gZXF1YWwgY29sdW1ucyBieSBkZWZhdWx0IOKAlCB0aGUgY2F0YWxvZ3VlJ3MgbW9zdCBjb21tb25cbi8vIHNoYXBlIOKAlCBjb2xsYXBzaW5nIHRvIG9uZSBhdCBwaG9uZSB3aWR0aDsgLS1zaW5nbGUgaXMgdGhlIG9uZS1jb2x1bW4gZm9ybVxuLy8gdXNlZCBmb3IgJ1doYXQncyBJbiBUaGUgQm94Jy5cbi8vXG4vLyBTb3VyY2U6IGNhdGFsb2d1ZSBibG9jayBgc3BlYy1idWxsZXRzYC4gUG9ydGVkIGZvciB0aGUgTVBHOSBwcm9kdWN0LXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLnNwZWMtYnVsbGV0cyB7XG5cblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoIDIsIG1pbm1heCggMCwgMWZyICkgKTtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKSB2YXIoLS1zcGFjZS0xMik7XG59XG5cbi5zcGVjLWJ1bGxldHMtLXNpbmdsZSB7XG5cblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoIDAsIDFmciApO1xufVxuXG4uc3BlYy1idWxsZXRzX19saXN0IHtcblxuXHRtYXJnaW46IDA7XG5cdHBhZGRpbmc6IDA7XG5cdGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi5zcGVjLWJ1bGxldHNfX2l0ZW0ge1xuXG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0cGFkZGluZy1pbmxpbmUtc3RhcnQ6IHZhcigtLXNwYWNlLTYpO1xuXHRwYWRkaW5nLWJsb2NrOiB2YXIoLS1zcGFjZS0yKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG59XG5cbi5zcGVjLWJ1bGxldHNfX2l0ZW06OmJlZm9yZSB7XG5cblx0Y29udGVudDogXCJcIjtcblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRpbnNldC1pbmxpbmUtc3RhcnQ6IDA7XG5cdGluc2V0LWJsb2NrLXN0YXJ0OiAwLjcyZW07XG5cdHdpZHRoOiA3cHg7XG5cdGhlaWdodDogN3B4O1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtcGlsbCk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWJyYW5kKTtcbn1cblxuLnNwZWMtYnVsbGV0c19faXRlbSArIC5zcGVjLWJ1bGxldHNfX2l0ZW0ge1xuXG5cdGJvcmRlci1ibG9jay1zdGFydDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA2NDBweCApIHtcblxuXHQuc3BlYy1idWxsZXRzIHtcblxuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KCAwLCAxZnIgKTtcblx0XHRnYXA6IDA7XG5cdH1cblxuXHQuc3BlYy1idWxsZXRzX19saXN0ICsgLnNwZWMtYnVsbGV0c19fbGlzdCAuc3BlYy1idWxsZXRzX19pdGVtOmZpcnN0LWNoaWxkIHtcblxuXHRcdGJvcmRlci1ibG9jay1zdGFydDogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1kZWZhdWx0KTtcblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHNwZWMtZ3JpZFxuLy9cbi8vIEEgcHJvZHVjdCdzIGF0dHJpYnV0ZXMgYXMgbGFiZWwtYW5kLXZhbHVlIHJvd3MgZ3JvdXBlZCB1bmRlciBxdWlldFxuLy8gc3ViLWhlYWRpbmdzLCBidWlsdCB0byBiZSByZWFkIGRvd24gcmF0aGVyIHRoYW4gYWNyb3NzLiBJdCByZXBsYWNlcyBhXG4vLyBzdHJpcGVkIHRhYmxlIHRoYXQgaGFkIHRvIGJlIHNxdWVlemVkIGludG8gYSBuYXJyb3cgY29sdW1uLiBHcm91cHMgcmVuZGVyXG4vLyBvbmx5IHdoZW4gdGhleSBob2xkIGRhdGE6IDQ1JSBvZiB0aGlzIGNhdGFsb2d1ZSBoYXMgbm8gc3RydWN0dXJlZFxuLy8gYXR0cmlidXRlcyBhdCBhbGwsIHNvIG9uIHRob3NlIHByb2R1Y3RzIHRoZSBwYW5lbCBzdGlsbCBzdGFuZHMgb24gaXRzXG4vLyBpZGVudGl0eSBncm91cCBhbG9uZSBhbmQgaXMgbmV2ZXIgYW4gZW1wdHkgc2hlbGwgd2l0aCBhIGhlYWRlciBvbiBpdC5cbi8vXG4vLyBTb3VyY2U6IGNhdGFsb2d1ZSBibG9jayBgc3BlYy1ncmlkYC4gUG9ydGVkIGZvciB0aGUgTVBHOSBwcm9kdWN0LXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLyogQSBtb2RpZmllciBvbiB0aGUgYmxvY2ssIG5vdCBhIGNsYXNzIG9mIGl0cyBvd24uIEl0IHdhcyBgLnNwZWMtY29sdW1uc2AsIHdoaWNoXG4gICByZWFkIGFzIGEgc2VwYXJhdGUgY29tcG9uZW50IGFuZCBsZWZ0IGBzcGVjLWdyaWRgIHdpdGggbm8gZWxlbWVudCBjYXJyeWluZyBpdHNcbiAgIG93biBuYW1lIOKAlCB0aGUgYmxvY2sgd291bGQgaGF2ZSBlbnRlcmVkIHRoZSBjYXRhbG9ndWUgd2l0aCBhIHJvb3Qgbm90aGluZ1xuICAgbWF0Y2hlZC4gSXQgcmVzZXRzIGBkaXNwbGF5YCBiZWNhdXNlIHRoZSBiYXNlIHJ1bGUgaXMgYSBncmlkIGFuZCBhIGdyaWRcbiAgIGNvbnRhaW5lciBpZ25vcmVzIGBjb2x1bW5zYC4gKi9cbi5zcGVjLWdyaWQtLWNvbHVtbnMge1xuXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHRjb2x1bW5zOiAyO1xuXHRjb2x1bW4tZ2FwOiB2YXIoLS1zcGFjZS0xMik7XG59XG5cbi5zcGVjLWdyaWQtLWNvbHVtbnMgLnNwZWMtZ3JpZF9fZ3JvdXAge1xuXG5cdGJyZWFrLWluc2lkZTogYXZvaWQ7XG5cdG1hcmdpbjogMCAwIHZhcigtLXNwYWNlLTgpO1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDkwMHB4ICkge1xuXG4uc3BlYy1ncmlkLS1jb2x1bW5zIHtcblxuXHRcdGNvbHVtbnM6IDE7XG5cdH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgc3BlYy1ncmlkICAoTkVXKVxuICAgQSBsYWJlbC1hbmQtdmFsdWUgbGlzdCBmb3IgdGhlIHByb2R1Y3QncyBhdHRyaWJ1dGVzLCBidWlsdCB0byBiZSByZWFkIGRvd25cbiAgIHJhdGhlciB0aGFuIGFjcm9zcy4gSXQgcmVwbGFjZXMgdGhlIHN0cmlwZWQgdHdvLWNvbHVtbiB0YWJsZSB0aGUgZWFybGllclxuICAgZHJhZnRzIHVzZWQsIHdoaWNoIGhhZCB0byBiZSBzcXVlZXplZCBpbnRvIGEgbmFycm93IGNvbHVtbiBhbmQgbG9zdCB0aGVcbiAgIHRoaW5nIGEgdGFibGUgaXMgZm9yLlxuXG4gICBGSUZUWS1GSVZFIFBFUiBDRU5UIG9mIHRoZSBjYXRhbG9ndWUgY2FycmllcyBhdHRyaWJ1dGVzOyB0aGUgb3RoZXIgNDUlIGhhc1xuICAgbm9uZS4gU28gdGhlIHBhbmVsIGlzIGEgc3RhY2sgb2YgR1JPVVBTLCBlYWNoIHdpdGggaXRzIG93biBzbWFsbCBoZWFkaW5nLFxuICAgYW5kIGEgZ3JvdXAgdGhhdCBoYXMgbm8gZGF0YSBpcyBzaW1wbHkgbm90IHJlbmRlcmVkLiBPbiBhIHByb2R1Y3Qgd2l0aCBub1xuICAgYXR0cmlidXRlcyB0aGUgcGFuZWwgc3RpbGwgc3RhbmRzIHdpdGggaXRzIGlkZW50aXR5IGdyb3VwLCB3aGljaCBldmVyeVxuICAgcHJvZHVjdCBoYXMg4oCUIGl0IGlzIG5ldmVyIGFuIGVtcHR5IHNoZWxsIHdpdGggYSBoZWFkZXIgb24gaXQuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnNwZWMtZ3JpZCB7XG5cblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoIDAsIDFmciApO1xufVxuXG4uc3BlYy1ncmlkX19ncm91cCArIC5zcGVjLWdyaWRfX2dyb3VwIHtcblxuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTgpO1xufVxuXG4uc3BlYy1ncmlkX19oZWFkaW5nIHtcblxuXHRtYXJnaW46IDAgMCB2YXIoLS1zcGFjZS0zKTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0bGV0dGVyLXNwYWNpbmc6IDAuMDhlbTtcblx0dGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuXG4uc3BlYy1ncmlkX19yb3cge1xuXG5cdGRpc3BsYXk6IGdyaWQ7XG5cdGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KCAwLCA0MiUgKSBtaW5tYXgoIDAsIDFmciApO1xuXHRnYXA6IHZhcigtLXNwYWNlLTQpO1xuXHRwYWRkaW5nLWJsb2NrOiB2YXIoLS1zcGFjZS0zKTtcbn1cblxuLnNwZWMtZ3JpZF9fcm93ICsgLnNwZWMtZ3JpZF9fcm93IHtcblxuXHRib3JkZXItYmxvY2stc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG59XG5cbi5zcGVjLWdyaWRfX2xhYmVsIHtcblxuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbn1cblxuLnNwZWMtZ3JpZF9fdmFsdWUge1xuXG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDExODBweCApIHtcblxuLnNwZWMtZ3JpZF9fcm93cyB7XG5cblx0XHRkaXNwbGF5OiBncmlkO1xuXHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KCAyLCBtaW5tYXgoIDAsIDFmciApICk7XG5cdFx0Y29sdW1uLWdhcDogdmFyKC0tc3BhY2UtMTIpO1xuXHR9XG5cbi5zcGVjLWdyaWRfX3JvdyB7XG5cblx0XHRib3JkZXItYmxvY2stc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cdH1cbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiA4NjBweCApIHtcblxuLnNwZWMtZ3JpZF9fcm93cyB7XG5cblx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCggMCwgMWZyICk7XG5cdH1cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCBzdGFyLXJhdGluZ1xuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBNYWdhemluZSBBcnRpY2xlIG1vY2t1cCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTYsIG9wZXJhdG9yLWFwcHJvdmVkXG4vLyAyMDI2LTA5LTI4KSBmb3IgdGhlIGFydGljbGUgd2FsaywgTVBHMTYuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiBCTE9DSyDigJQgc3Rhci1yYXRpbmcgKE5FVykgKi9cblxuLnN0YXItcmF0aW5nIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTIpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRsaW5lLWhlaWdodDogMTtcblxufVxuXG4uc3Rhci1yYXRpbmdfX3N0YXJzIHtcblxuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0Y29sb3I6IHZhcigtLW5ldXRyYWwtMzAwKTtcblx0bGV0dGVyLXNwYWNpbmc6IDFweDtcblx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcblxufVxuXG4uc3Rhci1yYXRpbmdfX2ZpbGwge1xuXG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0aW5zZXQtYmxvY2stc3RhcnQ6IDA7XG5cdGluc2V0LWlubGluZS1zdGFydDogMDtcblx0d2lkdGg6IHZhcigtLWZpbGwsIDAlKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xuXHR3aGl0ZS1zcGFjZTogbm93cmFwO1xuXG59XG5cbi8vIERFUEFSVFVSRTogdGhlIG1vY2t1cCBzZXQgdGhlIGZpbGwgYXMgYW4gaW5saW5lIGBzdHlsZT1cIndpZHRoOiA3MCVcImAuIFRlbXBsYXRlcyBtYXlcbi8vIGNhcnJ5IG9ubHkgY3VzdG9tIHByb3BlcnRpZXMgaW5saW5lLCBzbyB0aGUgZmlsbCByZWFkcyBgLS1maWxsYCAodGhlIHJhdGluZyBhcyBhXG4vLyBwZXJjZW50YWdlLCBzZXQgb24gdGhlIGVsZW1lbnQgYnkgdGhlIHRlbXBsYXRlKSDigJQgd2Fsay1iYWNrLCBNUEcxNiBQaGFzZSBELlxuXG4uc3Rhci1yYXRpbmdfX2NvdW50IHtcblxuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuXG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgc3RvcmUtbGF5b3V0XG4vL1xuLy8gVGhlIHR3by1jb2x1bW4gc3RvcmUgc2hlbGw6IGEgMzI4cHggbmF2aWdhdGlvbiByYWlsIGFuZCB0aGUgY29udGVudCBjb2x1bW5cbi8vIGJlc2lkZSBpdC4gVGhlIHJhaWwgaXMgUkVNT1ZFRCBiZWxvdyAxMTAwIHJhdGhlciB0aGFuIHN0YWNrZWQg4oCUIGFcbi8vIG5hdmlnYXRpb24gY29sdW1uIGJlbmVhdGggYSBwcm9kdWN0IGlzIGZ1cm5pdHVyZSBub2JvZHkgc2Nyb2xscyB0bywgYW5kIHRoZVxuLy8gaGVhZGVyIG1lbnUgY292ZXJzIGl0IG9uIGEgcGhvbmUuXG4vL1xuLy8gU291cmNlOiBNUEc5IG1vY2t1cCAoZGVzaWduIDE3OTY3KSwgbm8gY2F0YWxvZ3VlIHJvdy4gUG9ydGVkIGZvciB0aGUgTVBHOSBwcm9kdWN0LXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBQQUdFIExBWU9VVCDigJQgdGhlIHNoZWxsLCB0aGUgcmFpbCBhbmQgdGhlIHJlZ2lvbiBncmlkcy5cblxuICAgQlVJTFQgMjAyNi0wOS0xNSBmcm9tIHNpeCBwaWVjZXMgb2Ygb3BlcmF0b3IgZmVlZGJhY2ssIGFmdGVyIHRocmVlIGRlc2lnbnNcbiAgIHdlcmUgcmVqZWN0ZWQuIEVhY2ggb2YgdGhlIHNpeCBpcyBhbnN3ZXJlZCBpbiBvbmUgcGxhY2UgYW5kIHRoZSBwbGFjZSBpc1xuICAgbmFtZWQsIHNvIGEgbGF0ZXIgc2Vzc2lvbiBjYW4gc2VlIHdoaWNoIGNob2ljZXMgYXJlIGxvYWQtYmVhcmluZzpcblxuICAgMS4gVGhlIHNob3J0IGRlc2NyaXB0aW9uIGdvZXMgQkVGT1JFIHRoZSBidXkgYm94ICAgIOKGkiAuYnV5LXJlZ2lvbl9fc3VtbWFyeVxuICAgMi4gTG95YWx0eSBwb2ludHMgc2l0IEFGVEVSIHRoZSBidXkgYm94ICAgICAgICAgICAgIOKGkiAuYnV5LXJlZ2lvbl9fc3VtbWFyeVxuICAgMy4gU3RhdCBwaWxscyBsaXZlIGluc2lkZSB0aGUgcHJvZHVjdCBkZXNjcmlwdGlvbiAgIOKGkiAuZG9jLWZpZ3VyZXNcbiAgIDQuIFRoZSBkZXNjcmlwdGlvbiB0YWtlcyB0aGUgbGl2ZSBzaXRlJ3MgY29sdW1uICAgICDihpIgLnN0b3JlLWxheW91dFxuICAgNS4gQWRkIHRvIEJhc2tldCBuZXZlciB3cmFwcyB0byB0d28gbGluZXMgICAgICAgICAgIOKGkiAuYnRuLS1jb21tZXJjZSwgLnJvdXRlLXJvd1xuICAgNi4gVGhlIG5hdmlnYXRpb24gcmFpbCBjb21lcyBiYWNrLCBkZXNrdG9wIG9ubHkgICAgIOKGkiAuc3RvcmUtbGF5b3V0X19zaWRlYmFyXG5cbiAgIFRIRSBDT0xVTU4gSVMgMTA0MnB4IEFORCBUSEFUIElTIFRIRSBQT0lOVCBPRiAoNCkuIEl0IGlzIHdoYXQgdGhlIGxpdmUgc3RvcmVcbiAgIGdpdmVzIGl0cyBjb250ZW50OiBhIDE0MDAgcGFnZSwgYSAzMjggcmFpbCwgYSAzMCBnYXAuIFRocmVlIGRyYWZ0cyBwdXQgdGhlXG4gICBkZXNjcmlwdGlvbiBhdCA2ODAgb3IgNzQwIGJlY2F1c2UgdGhhdCBpcyB0aGUgc3R5bGVndWlkZSdzIFJFQURJTkcgbWVhc3VyZSxcbiAgIGFuZCBhbGwgdGhyZWUgcmVhZCBhcyBjcmFtcGVkIOKAlCBiZWNhdXNlIHRoZSBtZWFzdXJlIHdhcyBzZXQgZm9yIGVkaXRvcmlhbFxuICAgcGFnZXMsIHdoZXJlIHByb3NlIGlzIGFsb25lIG9uIHRoZSBwYWdlLiBBIHByb2R1Y3QgZGVzY3JpcHRpb24gaXMgbm90IGFsb25lOlxuICAgaXQgY2FycmllcyBzdGF0IGJsb2Nrcywgc3BlYyB0YWJsZXMgYW5kIGZlYXR1cmUgcm93cywgYW5kIGl0IHdhbnRzIHRoZSByb29tXG4gICB0aGUgc3RvcmUgYWxyZWFkeSBnaXZlcyBpdC4gVGhlIDY4MCBtZWFzdXJlIHN0aWxsIGdvdmVybnMgYXJ0aWNsZSBwYWdlcy5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiBgLnBhZ2VfX2lubmVyYCBpcyBOT1QgZGVjbGFyZWQgaGVyZS4gSXQgd2FzLCBpZGVudGljYWxseSwgaW4gdGhpcyBmaWxlIGFuZCBpblxuICAgYF9wYWdlLnNjc3NgIOKAlCB0aGUgc2FtZSBydWxlIGFuZCB0aGUgc2FtZSBkb2NibG9jaywgY29waWVkIOKAlCB1bnRpbCB0aGUgTVBHOFxuICAgd2FsayBmb3VuZCB0aGUgcGFpci4gVGhlIHBhZ2Ugb3ducyB0aGUgcGFnZSBjb250YWluZXI7IHRoaXMgZmlsZSBvd25zIHRoZVxuICAgc3RvcmUgc2hlbGwgaW5zaWRlIGl0LiAqL1xuXG4uc3RvcmUtbGF5b3V0IHtcblxuXHRkaXNwbGF5OiBncmlkO1xuXHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLXdpZHRoLXNpZGViYXIpIG1pbm1heCggMCwgMWZyICk7XG5cdGdhcDogdmFyKC0tc3BhY2UtY29udGVudC1nYXApO1xufVxuXG4vKiAoNikgVGhlIHJhaWwuIEl0IGNhcnJpZXMgdGhlIHN0b3JlIG5hdmlnYXRpb24gYW5kIHRoZW4gdGhlIHNwYWNlIHRoZVxuICAgb3BlcmF0b3IgYXNrZWQgZm9yIOKAlCBwcm9tb3Rpb25hbCB0aWxlcywgd2hpY2ggYXJlIHRoZSBicmFuZCdzIG93blxuICAgYHByb21vLXRpbGVgIGJsb2NrIHJhdGhlciB0aGFuIGFueXRoaW5nIG5ldy4gT24gZGVza3RvcCBpdCBmaWxscyB0aGUgcGFnZSdzXG4gICBsZWZ0IGVkZ2UgZm9yIGl0cyB3aG9sZSBoZWlnaHQ7IGJlbG93IDExMDAgaXQgaXMgcmVtb3ZlZCBvdXRyaWdodCByYXRoZXJcbiAgIHRoYW4gZm9sZGVkIHVuZGVybmVhdGgsIGJlY2F1c2UgYSBuYXZpZ2F0aW9uIGNvbHVtbiBzdGFja2VkIHVuZGVyIGEgcHJvZHVjdFxuICAgaXMgZnVybml0dXJlIG5vYm9keSBzY3JvbGxzIHRvIGFuZCB0aGUgc2l0ZSBoZWFkZXIncyBtZW51IGFscmVhZHkgY292ZXJzXG4gICB0aGUgc2FtZSBncm91bmQgb24gYSBwaG9uZS4gKi9cbi5zdG9yZS1sYXlvdXRfX3NpZGViYXIge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogdmFyKC0tc3BhY2UtY29udGVudC1nYXApO1xuXHRtaW4td2lkdGg6IDA7XG59XG5cbi8qIFRIRSBQUk9NTyBQQUlSIFBJTlMgQVMgT05FIFVOSVQsIHRoZSBuYXZpZ2F0aW9uIHNjcm9sbHMgYXdheS5cbiAgIFRoZSByYWlsIGNhbm5vdCBiZSBmaWxsZWQgdG8gbWF0Y2ggdGhlIGNvbHVtbiwgYW5kIHRoZSBhcml0aG1ldGljIGlzIG5vdCBjbG9zZTpcbiAgIGl0cyBjb250ZW50IGlzIH4xLDgwMHB4IGFnYWluc3QgYSBwcm9kdWN0IHpvbmUgb2YgfjgsODAwcHggb24gdGhpcyBwcm9kdWN0LCBhbmRcbiAgIGFjcm9zcyAzLDkwNCBkZXNjcmlwdGlvbnMgdGhlIG1lZGlhbiBpcyA3LDU2OCBjaGFyYWN0ZXJzIHdpdGggb25seSAxOCB1bmRlclxuICAgMSw1MDAuIEZpbGxpbmcgYnkgdm9sdW1lIHdvdWxkIG5lZWQgdGVuIGNhcmRzIG9uIGEgbWVkaWFuIHByb2R1Y3QgYW5kIHR3ZW50eSBvblxuICAgYSBsb25nIG9uZSwgYW5kIHdvdWxkIHN0aWxsIGJlIHdyb25nIG9uIHRoZSBuZXh0IG9uZS4gU28gdGhlIHJhaWwgc3RvcHMgdHJ5aW5nXG4gICB0byBtYXRjaCBhIGhlaWdodCBub2JvZHkgY2FuIGtub3c6IHRoZSBuYXZpZ2F0aW9uIHNjcm9sbHMgcGFzdCDigJQgaXQgaXMgdXNlZCBhdFxuICAgdGhlIHN0YXJ0IG9mIGEgdmlzaXQsIG5vdCBkdXJpbmcgYSByZWFkIOKAlCBhbmQgdGhlIHByb21vIHBhaXIgc3RheXMgYmVzaWRlIHRoZVxuICAgcmVhZGVyIGZvciB0aGUgd2hvbGUgZGVzY3JpcHRpb24uXG5cbiAgIFNRVUFSRSBUSUxFUyBBUkUgV0hBVCBNQUtFIFRISVMgU0lNUExFLiBBdCB0aGUgcmFpbCdzIDMyOHB4IGEgc3F1YXJlIGlzIDMyOFxuICAgdGFsbCwgc28gdGhlIHBhaXIgaXMgNjg2IHdpdGggaXRzIGdhcCwgYW5kIHRoYXQgZml0cyBldmVyeSB3aW5kb3cgdGhlIHJhaWxcbiAgIHJlbmRlcnMgaW4g4oCUIGl0IGlzIHJlbW92ZWQgYmVsb3cgMTEwMHB4IHdpZGUsIGFuZCB0aGUgc2hvcnRlc3QgbGFwdG9wIGl0IG1lZXRzXG4gICBpcyBhYm91dCA4MDAgdGFsbC4gTm8gaGVpZ2h0IGJyZWFrcG9pbnQsIG5vIHNocmlua2luZywgYW5kIG9uZSBpbWFnZSByYXRpbyB0b1xuICAgZGVzaWduIHRvLlxuXG4gICBUaGUgcGFpciB3YXMgODgzcHggd2hlbiBhIHRpbGUgdG9vayBpdHMgaGVpZ2h0IGZyb20gdGhlIGltYWdlJ3Mgb3duIGFzcGVjdFxuICAgcmF0aW8sIHdoaWNoIGRpZCBub3QgZml0IGFuIDgwMHB4IHdpbmRvdyBhbmQgd2FudGVkIGEgbWF4LWhlaWdodCBydWxlIGF0IGFcbiAgIGhlaWdodCBicmVha3BvaW50IHRvIGNvcGUuIEEgZml4ZWQgcmF0aW8gcmVtb3ZlcyB0aGUgcHJvYmxlbSByYXRoZXIgdGhhblxuICAgaGFuZGxpbmcgaXQuICovXG4uc3RvcmUtbGF5b3V0X19wcm9tb3Mge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogdmFyKC0tc3BhY2UtY29udGVudC1nYXApO1xuXHRwb3NpdGlvbjogc3RpY2t5O1xuXHR0b3A6IHZhcigtLXNwYWNlLTgpO1xufVxuXG4vKiBUaGUgdGlsZXMgbXVzdCBub3Qgc3RyZXRjaC4gYHByb21vLXRpbGVgIGNhcnJpZXMgaXRzIG93biBzcXVhcmUgcmF0aW8sIGFuZCB0aGVcbiAgIHJhaWwgaXMgYSBncmlkIGl0ZW0gYXMgdGFsbCBhcyB0aGUgd2hvbGUgcGFnZSDigJQgd2l0aG91dCB0aGlzIHRoZSB0d28gd291bGQgc2hhcmVcbiAgIHRoYXQgaGVpZ2h0IGJldHdlZW4gdGhlbSBhbmQgcmVuZGVyIGFzIG9uZSBkYXJrIHNsYWIgZG93biB0aGUgbGVmdCBvZiB0aGUgcGFnZSxcbiAgIHdoaWNoIGlzIHdoYXQgaGFwcGVuZWQgYmVmb3JlIHRoZSByYXRpbyBleGlzdGVkLiAqL1xuLnN0b3JlLWxheW91dF9fc2lkZWJhciAucHJvbW8tdGlsZSxcbi5zdG9yZS1sYXlvdXRfX3NpZGViYXIgLnByb21vLXRpbGVfX21lZGlhIHtcblxuXHRmbGV4OiAwIDAgYXV0bztcbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiAxMTAwcHggKSB7XG5cblx0LnN0b3JlLWxheW91dCB7XG5cblx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCggMCwgMWZyICk7XG5cdH1cblxuXHQvKiAoNikgUmVtb3ZlZCBvdXRyaWdodCBvbiBhIHBob25lLCBub3Qgc3RhY2tlZCB1bmRlcm5lYXRoLiBBIG5hdmlnYXRpb25cblx0ICAgY29sdW1uIGJlbmVhdGggYSBwcm9kdWN0IGlzIGZ1cm5pdHVyZSBub2JvZHkgc2Nyb2xscyB0bywgYW5kIHRoZSBzaXRlXG5cdCAgIGhlYWRlcidzIG1lbnUgYWxyZWFkeSBjb3ZlcnMgdGhlIHNhbWUgZ3JvdW5kIHRoZXJlLiAqL1xuXHQuc3RvcmUtbGF5b3V0X19zaWRlYmFyIHtcblxuXHRcdGRpc3BsYXk6IG5vbmU7XG5cdH1cblxuXHQvKiDigKZFWENFUFQgV0hFUkUgVEhFIFJBSUwgSVMgVEhFIFBPSU5UIE9GIFRIRSBQQUdFLiBUaGF0IHJlYXNvbmluZyBpcyBhYm91dCBhXG5cdCAgIFBST0RVQ1Qg4oCUIGEgc2hvcHBlciByZWFkaW5nIG9uZSBpdGVtIGRvZXMgbm90IHdhbnQgYSByYW5nZSBsaXN0IHVuZGVyIGl0LlxuXHQgICBBIGNhdGVnb3J5IGZ1bm5lbCBpcyB0aGUgb3Bwb3NpdGUgY2FzZTogdGhlIHBhZ2UncyB3aG9sZSBqb2IgaXMgcm91dGluZ1xuXHQgICBpbnRvIHRoZSByYW5nZSwgYW5kIHRoZSByYWlsIGlzIHRoZSByb3V0aW5nLiBTbyB0aGUgcmVtb3ZhbCBzdGF5cyB0aGVcblx0ICAgZGVmYXVsdCBhbmQgYSBmdW5uZWwgb3B0cyBvdXQsIHJhdGhlciB0aGFuIHRoZSBydWxlIGJlaW5nIHNvZnRlbmVkIGZvclxuXHQgICBldmVyeSB0ZW1wbGF0ZSB0aGF0IHNoYXJlcyB0aGlzIHNoZWxsLlxuXG5cdCAgIEl0IGdvZXMgQkVMT1cgdGhlIGNvbnRlbnQgcmF0aGVyIHRoYW4gYWJvdmUgaXQuIFRoZSByYW5nZSdzIG93biBoZWFkZXIgYW5kXG5cdCAgIGl0cyB0eXBlIHRpbGVzIGFyZSB3aGF0IHRoZSB2aXNpdG9yIGNhbWUgZm9yOyB0aGUgZnVsbCBzdG9yZSBsaXN0IGlzIHdoZXJlXG5cdCAgIHRoZXkgZ28gaWYgdGhpcyByYW5nZSB3YXMgdGhlIHdyb25nIHR1cm4sIGFuZCB0aGF0IGlzIGEgZGVjaXNpb24gbWFkZSBhZnRlclxuXHQgICByZWFkaW5nLCBub3QgYmVmb3JlLiBNUEc4IChkZXNpZ24gMTc5NTUpIGRyYXdzIGl0IHRoaXMgd2F5LiAqL1xuXHQuc3RvcmUtbGF5b3V0LS1uYXYtcGVyc2lzdHMgLnN0b3JlLWxheW91dF9fc2lkZWJhciB7XG5cblx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdG9yZGVyOiAyO1xuXHR9XG5cblx0LnN0b3JlLWxheW91dC0tbmF2LXBlcnNpc3RzIC5zdG9yZS1sYXlvdXRfX2NvbnRlbnQge1xuXG5cdFx0b3JkZXI6IDE7XG5cdH1cblxufVxuXG5cbi8qIC0tLS0gdGhlIGFjY291bnQgdmFyaWFudCAoTVBHMTMpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgVGhlIGFjY291bnQgYXJlYSBpcyB0aGUgc3RvcmUncyB0d28tY29sdW1uIHNoZWxsIGF0IHRoZSBzdG9yZSdzIG93biBtZWFzdXJlcyDigJRcbiAgIHRoZSBhY2NvdW50IG1lbnUgaW4gdGhlIDMyOHB4IHJhaWwsIHRoZSBlbmRwb2ludCdzIGNvbnRlbnQgaW4gdGhlIDEwNDJweCBjb2x1bW4uXG4gICBUd28gdGhpbmdzIGRpZmZlciwgYW5kIGJvdGggYXJlIHRoaXMgbW9kaWZpZXIuXG5cbiAgIEJPVEggQ09MVU1OUyBTVEFSVCBPTiBPTkUgTElORTogdGhlIGNvbnRlbnQgY29sdW1uIHN0YWNrcyBpdHMgcGFuZWxzIHdpdGggdGhlXG4gICBjb250ZW50IGdhcCBhbmQgZXZlcnkgY2hpbGQncyBvd24gYmxvY2sgbWFyZ2lucyBhcmUgemVyb2VkLCBleGFjdGx5IGFzIG9uIHRoZVxuICAgYmFza2V0LCB0aGUgY2hlY2tvdXQgYW5kIHRoZSBjb25maXJtYXRpb24uXG5cbiAgIFRIRSBNRU5VIE5FVkVSIERJU0FQUEVBUlMuIEJlbG93IDExMDAgdGhlIHJhaWwgaXMgcmVtb3ZlZCwgYXMgaXQgaXMgb24gYSBwcm9kdWN0LFxuICAgYW5kIHRoZSBhY2NvdW50IG1lbnUgY29tZXMgYmFjayBhcyBvbmUgc2VsZWN0LXN0eWxlIGNvbnRyb2wgYXQgdGhlIHRvcCBvZiB0aGVcbiAgIGNvbnRlbnQgKGBhY2NvdW50LXN3aXRjaGApLCBpbiBgX19zd2l0Y2hgLiBUaGUgbW9ja3VwIHN3aXRjaGVkIGF0IDkwMDsgaXQgbW92ZXMgdG9cbiAgIDExMDAgc28gdGhlIGFjY291bnQgYW5kIHRoZSBzdG9yZSBsb3NlIHRoZWlyIHJhaWwgYXQgdGhlIHNhbWUgd2lkdGgsIHJhdGhlciB0aGFuXG4gICBsZWF2aW5nIDkwMOKAkzExMDAgd2l0aCBubyBtZW51IGF0IGFsbCAob3BlcmF0b3IsIE1QRzEzIGNoZWNrcG9pbnQgMikuIEFib3ZlIHRoYXQgdGhlXG4gICBzd2l0Y2ggcmVuZGVycyBubyBib3gsIGFuZCBhIGZsZXggZ2FwIGlzIG9ubHkgbGFpZCBiZXR3ZWVuIGJveGVzIHRoYXQgcmVuZGVyLCBzbyBpdFxuICAgY29zdHMgdGhlIGZpcnN0IHBhbmVsIG5vdGhpbmcuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi5zdG9yZS1sYXlvdXQtLWFjY291bnQge1xuXG5cdGFsaWduLWl0ZW1zOiBzdGFydDtcbn1cblxuLnN0b3JlLWxheW91dC0tYWNjb3VudCAuc3RvcmUtbGF5b3V0X19jb250ZW50IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLWNvbnRlbnQtZ2FwKTtcblx0bWluLXdpZHRoOiAwO1xufVxuXG4uc3RvcmUtbGF5b3V0LS1hY2NvdW50IC5zdG9yZS1sYXlvdXRfX2NvbnRlbnQgPiAqIHtcblxuXHRtYXJnaW4tYmxvY2s6IDA7XG59XG5cbi5zdG9yZS1sYXlvdXRfX3N3aXRjaCB7XG5cblx0ZGlzcGxheTogbm9uZTtcbn1cblxuQG1lZGlhICggbWF4LXdpZHRoOiAxMTAwcHggKSB7XG5cblx0LnN0b3JlLWxheW91dF9fc3dpdGNoIHtcblxuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXHR9XG59XG5cbi8qIC0tLS0gdGhlIHNpZGViYXIncyBvbmUgcGllY2Ugb2YgY2FudmFzIGZ1cm5pdHVyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgVGhlIG1vY2t1cCBjYWxscyB0aGlzIGBzdG9yZS1zaWRlYmFyX19oZWFkaW5nYCwgd2hpY2ggd291bGQgbWFrZSBpdCB0aGUgb25seVxuICAgZWxlbWVudCBvZiBhIGJsb2NrIHRoYXQgaGFzIG5vIHJ1bGVzIG9mIGl0cyBvd24g4oCUIGFuZCB0aGUgY2xhc3MgbGludCBjYXVnaHRcbiAgIGV4YWN0bHkgdGhhdDogYSBwYXJlbnQgYmxvY2sgbm90aGluZyBkZWNsYXJlcy4gSXQgaXMgdGhlIHN0b3JlIGxheW91dCdzXG4gICBzaWRlYmFyIGhlYWRpbmcsIHNvIGl0IGlzIGFuIGVsZW1lbnQgb2YgYHN0b3JlLWxheW91dGAsIHdoaWNoIGlzIHRoZSBibG9ja1xuICAgdGhhdCBhbHJlYWR5IG93bnMgdGhlIGNvbHVtbiBpdCBzaXRzIGluLiBSZW5hbWVkIHJhdGhlciB0aGFuIGdpdmVuIGFuIGVtcHR5XG4gICBwYXJlbnQgcnVsZSB0byBzYXRpc2Z5IHRoZSBjaGVjay5cblxuICAgVGhlIG5lZ2F0aXZlIGJvdHRvbSBtYXJnaW4gcHVsbHMgdGhlIGZpcnN0IGZpbHRlciBwYW5lbCBiYWNrIHVwIHRvIHRoZVxuICAgc2lkZWJhcidzIG93biBnYXA6IHRoZSBoZWFkaW5nIGxhYmVscyB0aGUgcGFuZWxzIGJlbG93IGl0IGFuZCBzaG91bGQgcmVhZCBhc1xuICAgcGFydCBvZiB0aGF0IGdyb3VwLCBub3QgYXMgYSBiYW5kIG9mIGl0cyBvd24uXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi8qIFRoZSBzaWRlYmFyJ3Mgb25lIHBpZWNlIG9mIGNhbnZhcyBmdXJuaXR1cmUuICovXG4uc3RvcmUtbGF5b3V0X19zaWRlYmFyLWhlYWRpbmcge1xuXG5cdG1hcmdpbjogdmFyKC0tc3BhY2UtMikgMCBjYWxjKCAtMSAqIHZhcigtLXNwYWNlLTIpICk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1oNCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWhlYWRpbmcpO1xufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHN0b3JlLW5hdlxuLy9cbi8vIFRoZSBzdG9yZSBuYXZpZ2F0aW9uIHNpZGViYXIsIG9uIGV2ZXJ5IHN0b3JlIHBhZ2U6IGEgc3RhY2sgb2YgUGFyYWdvbi1ibHVlXG4vLyBiYXJzLCBvbmUgcGVyIHRvcC1sZXZlbCByYW5nZSwgZWFjaCBhIHdoaXRlIHVwcGVyY2FzZSBib2R5LWZvbnQgbGFiZWwgd2l0aFxuLy8gYSBkb3duIGNoZXZyb24gb3ZlciBhIHRoaW4gcnVsZS4gQSBiYXIgaXMgYSByZWFsIGRpc2Nsb3N1cmUgYW5kIGV4cGFuZHMgaW5cbi8vIHBsYWNlIHRvIGEgcGFuZWwtd2hpdGUgY291bnQtbGlzdCBvZiBpdHMgc3ViY2F0ZWdvcmllcywgd2hlcmUgdGhlIGN1cnJlbnRcbi8vIGl0ZW0gdGFrZXMgdGhlIGJyYW5kJ3MgYmx1ZS10aW50IHdhc2ggYW5kIFBhcmFnb24tYmx1ZSBsZWFkaW5nIHJ1bGUuXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYHN0b3JlLW5hdmAuIFBvcnRlZCBmb3IgdGhlIE1QRzkgcHJvZHVjdC1wYWdlIHdhbGssIDIwMjYtMDktMTYuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIHN0b3JlLW5hdiAgKE5FVylcbiAgIFRoZSBzdG9yZSBuYXZpZ2F0aW9uIHNpZGViYXIsIGRlc2lnbmVkIGhlcmUgZm9yIHRoZSBmaXJzdCB0aW1lIGFuZCBpbmhlcml0ZWRcbiAgIGJ5IGV2ZXJ5IHN0b3JlIHBhZ2UgYWZ0ZXIgaXQg4oCUIGNhdGVnb3J5LCBicmFuZCwgc2VhcmNoIHJlc3VsdHMsIGRlYWxzLFxuICAgcHJvZHVjdC5cblxuICAgQSBzdGFjayBvZiBQYXJhZ29uLWJsdWUgYmFycywgb25lIHBlciB0b3AtbGV2ZWwgcmFuZ2UsIGVhY2ggYSB3aGl0ZVxuICAgYm9keS1mb250IGxhYmVsIHdpdGggYSBkb3duIGNoZXZyb24sIHNlcGFyYXRlZCBieSB0aGluIHJ1bGVzLiBUaGUgcnVsZSBpc1xuICAgdGhlIHBhbmVsIHNob3dpbmcgdGhyb3VnaCBiZXR3ZWVuIHR3byBiYXJzLCB3aGljaCBpcyB3aGF0IGEgc3RhY2sgb2YgYmFycyBvblxuICAgYSB3aGl0ZSBwYW5lbCBhY3R1YWxseSBsb29rcyBsaWtlLlxuXG4gICBUSEUgRElTQ0xPU1VSRSBpcyB0aGUgb25lIHRoZSByZWZlcmVuY2Ugc3BlY2ltZW4gc2V0dGxlZCBhbmQgbm90IGEgc2Vjb25kXG4gICBvbmU6IGEgcmVhbCBgZGV0YWlsc2AgYW5kIGBzdW1tYXJ5YCwgdGhlIGJyYW5kJ3Mgb3duIGNoZXZyb24gdHVybmVkIHRvIHBvaW50XG4gICBkb3duLCB0dXJuZWQgdXAgd2hlbiB0aGUgcm93IGlzIG9wZW4uIEl0IHdvcmtzIHdpdGggbm8gc2NyaXB0LCBhbmQgYSBsaW5rXG4gICBwb2ludGluZyBpbnRvIGEgY2xvc2VkIHJhbmdlIG9wZW5zIGl0LlxuXG4gICBUSEUgT1BFTiBCQVIgZXhwYW5kcyBpbiBwbGFjZSB0byBhIHBhbmVsLXdoaXRlIGxpc3Qgb2YgaXRzIHN1YmNhdGVnb3JpZXMsXG4gICBhbmQgdGhhdCBsaXN0IGlzIGBjb3VudC1saXN0YCDigJQgdGhlIHNhbWUgbGlzdCB0aGUgZmlsdGVyIGdyb3VwcyBhbmQgdGhlXG4gICBmZWF0dXJlZCBicmFuZHMgdGFrZSwgc28gdGhlIGNvbHVtbiBjYXJyaWVzIG9uZSBsaXN0IHRyZWF0bWVudCBhbmQgbm90XG4gICB0aHJlZS4gVGhlIGN1cnJlbnQgaXRlbSBpcyBtYXJrZWQgZXhhY3RseSBhcyBjb3VudC1saXN0IGFscmVhZHkgbWFya3MgaXQ6XG4gICB0aGUgYmx1ZS10aW50IHdhc2ggYWNyb3NzIHRoZSByb3cgYW5kIHRoZSB0aHJlZS1waXhlbCBQYXJhZ29uLWJsdWUgbGVhZGluZ1xuICAgcnVsZSwgcGFpZCBmb3Igb3V0IG9mIHRoZSByb3cncyBvd24gcGFkZGluZyBzbyBub3RoaW5nIHNoaWZ0cy5cblxuICAgVGhlIGJhciBsYWJlbCBmb2xsb3dzIHRoZSBzdHlsZWd1aWRlJ3MgbmF2aWdhdGlvbiBzZXR0aW5nIOKAlCBib2R5IGZvbnQsXG4gICAxNnB4LCBsaWdodCwgdXBwZXJjYXNlIOKAlCB3aGljaCBpcyB3aGF0IGRpc3Rpbmd1aXNoZXMgYSBuYXZpZ2F0aW9uIGJhciBmcm9tXG4gICB0aGUgaGVhZGluZy1mb250IHRpdGxlIGJhciBhIHdpZGdldCBjYXJyaWVzLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi5zdG9yZS1uYXYge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHRib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctcGFuZWwpO1xufVxuXG4uc3RvcmUtbmF2X19yYW5nZSArIC5zdG9yZS1uYXZfX3JhbmdlIHtcblxuXHRib3JkZXItYmxvY2stc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1iZy1wYW5lbCk7XG59XG5cbi5zdG9yZS1uYXZfX2JhciB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuXHRnYXA6IHZhcigtLXNwYWNlLTMpO1xuXHQvKiBTeW1tZXRyaWNhbCBhZ2Fpbi4gVGhlIHR3by1waXhlbCBudWRnZSBhYm92ZSB0aGlzIGxpbmUgZXhpc3RlZCB0byBjb3JyZWN0IGFuXG5cdCAgIEFMTC1DQVBTIGxhYmVsIHNpdHRpbmcgaGlnaCBpbiBpdHMgY2FwIGJhbmQ7IHdpdGggdGhlIGxhYmVscyBzZXQgYXMgd3JpdHRlbixcblx0ICAgdGhlIGRlc2NlbmRlcnMgZmlsbCB0aGUgbG93ZXIgaGFsZiBhbmQgdGhlIGNvcnJlY3Rpb24gd291bGQgcHVzaCB0aGUgdGV4dFxuXHQgICBsb3cuIEFuIG9wdGljYWwgZml4IGlzIHRpZWQgdG8gdGhlIHRyZWF0bWVudCB0aGF0IG5lZWRlZCBpdC4gKi9cblx0cGFkZGluZzogdmFyKC0tc3BhY2UtMykgdmFyKC0tc3BhY2UtNik7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWJyYW5kKTtcblx0bGlzdC1zdHlsZTogbm9uZTtcblx0Y3Vyc29yOiBwb2ludGVyO1xufVxuXG4uc3RvcmUtbmF2X19iYXI6Oi13ZWJraXQtZGV0YWlscy1tYXJrZXIge1xuXG5cdGRpc3BsYXk6IG5vbmU7XG59XG5cbi5zdG9yZS1uYXZfX2Jhcjo6bWFya2VyIHtcblxuXHRjb250ZW50OiBcIlwiO1xufVxuXG4uc3RvcmUtbmF2X19iYXI6Zm9jdXMtdmlzaWJsZSB7XG5cblx0b3V0bGluZTogMnB4IHNvbGlkIHZhcigtLW5ldXRyYWwtNTApO1xuXHRvdXRsaW5lLW9mZnNldDogLTNweDtcbn1cblxuLnN0b3JlLW5hdl9fbGFiZWwge1xuXG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdC8qIFRoZSBsYWJlbCBpcyBzZXQgQVMgV1JJVFRFTiDigJQgXCJQQyBDb21wb25lbnRzXCIsIG5vdCBcIlBDIENPTVBPTkVOVFNcIi4gT3BlcmF0b3IsXG5cdCAgIDIwMjYtMDktMTY6IHRoZSB1cHBlcmNhc2UgcmVhZCB3cm9uZyBpbiB0aGUgcmFpbC5cblx0ICAgV2hpY2ggdGFrZXMgdGhlIGxpbmUtaGVpZ2h0IGJhY2sgdG8gdGhlIGhlYWRpbmcgc3RlcCBhbmQgdGhlIHRyYWNraW5nIGJhY2sgdG9cblx0ICAgbm9ybWFsLiBCb3RoIHdlcmUgY29tcGVuc2F0aW9ucyBmb3IgY2FwaXRhbHM6IDEuMiByZXNlcnZlcyBkZXNjZW5kZXIgc3BhY2Vcblx0ICAgdGhhdCBjYXBzIG5ldmVyIHVzZSwgYW5kIDAuMDRlbSBvcGVucyB1cCBsZXR0ZXJmb3JtcyB0aGF0IHVwcGVyY2FzZSBuZWVkcyBhbmRcblx0ICAgbWl4ZWQgY2FzZSBkb2VzIG5vdC4gKi9cblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRsZXR0ZXItc3BhY2luZzogbm9ybWFsO1xuXHQvKiBUd28gcGl4ZWxzIGFib3ZlIHRoZSBsYWJlbCwgYW5kIE9OTFkgdGhlIGxhYmVsIOKAlCB0aGUgYmFyJ3Mgb3duIHBhZGRpbmcgc3RheXNcblx0ICAgc3ltbWV0cmljYWwgc28gdGhlIG1hcmtlciBpcyBub3QgcHVzaGVkIHdpdGggaXQuIFRoZSB0d28gYWxpZ24gb24gdGhlaXJcblx0ICAgb3B0aWNhbCBjZW50cmVzIHJhdGhlciB0aGFuIHRoZWlyIGJveGVzOiB0aGUgbGFiZWwncyBsaW5lIGJveCBjYXJyaWVzXG5cdCAgIGRlc2NlbmRlciBzcGFjZSBiZWxvdyB0aGUgbGV0dGVycyB0aGF0IHRoZSBleWUgZG9lcyBub3QgY291bnQsIHNvIGEgYm94XG5cdCAgIGNlbnRyZWQgb24gdGhlIGJhciBzaXRzIGhpZ2ggYWdhaW5zdCBhIGNoZXZyb24gY2VudHJlZCBvbiB0aGUgc2FtZSBheGlzLiAqL1xuXHRwYWRkaW5nLWJsb2NrLXN0YXJ0OiAycHg7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW9uLWJyYW5kKTtcbn1cblxuLyogMjFweCDigJQgaGFsZiBhZ2FpbiBvbiB0aGUgMTQgaXQgd2FzLiBBdCAxNCB0aGUgY2hldnJvbiByZWFkIGFzIGEgaGludCByYXRoZXJcbiAgIHRoYW4gYSBjb250cm9sIG5leHQgdG8gYSAxNnB4IGxhYmVsLiAqL1xuLnN0b3JlLW5hdl9fbWFya2VyIHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0ZGlzcGxheTogaW5saW5lLWZsZXg7XG5cdHdpZHRoOiAyMXB4O1xuXHRoZWlnaHQ6IDIxcHg7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW9uLWJyYW5kKTtcbn1cblxuLnN0b3JlLW5hdl9fbWFya2VyIHN2ZyB7XG5cblx0d2lkdGg6IDEwMCU7XG5cdGhlaWdodDogMTAwJTtcblx0dHJhbnNmb3JtOiByb3RhdGUoIDkwZGVnICk7XG59XG5cbi5zdG9yZS1uYXZfX3JhbmdlW29wZW5dIC5zdG9yZS1uYXZfX21hcmtlciBzdmcge1xuXG5cdHRyYW5zZm9ybTogcm90YXRlKCAtOTBkZWcgKTtcbn1cblxuLyogVEhJUkQgTEVWRUwg4oCUIGluZGVudGVkLCBzbyB0aGUgaGllcmFyY2h5IHJlYWRzIGRvd24gdGhlIHJhaWwuXG4gICBUaGUgaW5kZW50IGdvZXMgb24gdGhlIExJTksncyBpbmxpbmUgcGFkZGluZywgbm90IG9uIHRoZSBsaXN0OiBhIHBhZGRlZCBsaXN0XG4gICB3b3VsZCBsZWF2ZSBhIHN0cmlwIG9mIHVuaGlnaGxpZ2h0ZWQgcmFpbCBkb3duIHRoZSBsZWZ0IG9mIGV2ZXJ5IGNoaWxkIHJvdyxcbiAgIGJlY2F1c2UgdGhlIGhvdmVyIGdyb3VuZCBpcyB0aGUgbGluaydzIG93biBiYWNrZ3JvdW5kLiBTYW1lIHJlYXNvbiB0aGUgc2Vjb25kXG4gICBsZXZlbCdzIHBhZGRpbmcgbGl2ZXMgdGhlcmUuXG4gICBgc3RvcmUtbmF2X19jaGlsZHJlbmAgaGFkIG5vIHJ1bGUgYXQgYWxsIHVudGlsIG5vdyDigJQgaXQgaXMgaW4gdGhlIG1hcmt1cCB0aGVcbiAgIG1vY2t1cCBjYXJyaWVzLCBhbmQgbm90aGluZyBoYWQgZXZlciBzdHlsZWQgaXQsIHNvIGEgdGhpcmQtbGV2ZWwgaXRlbSBzYXQgZmx1c2hcbiAgIHdpdGggaXRzIHBhcmVudC4gKi9cbi5zdG9yZS1uYXZfX2NoaWxkcmVuIC5jb3VudC1saXN0X19saW5rIHtcblxuXHRwYWRkaW5nLWlubGluZS1zdGFydDogY2FsYyggdmFyKC0tc3BhY2UtNikgKyB2YXIoLS1zcGFjZS00KSApO1xufVxuXG4uc3RvcmUtbmF2X19wYW5lbCB7XG5cblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctcGFuZWwpO1xuXHRib3JkZXItYmxvY2stc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LnN0b3JlLW5hdl9fYmFyIHtcblxuXHRcdHBhZGRpbmctaW5saW5lOiB2YXIoLS1zcGFjZS00KTtcblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHN1bW1hcnktdG9nZ2xlXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIGNoZWNrb3V0IG1vY2t1cCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTEsIG9wZXJhdG9yLWFjY2VwdGVkXG4vLyAyMDI2LTA5LTIzKSBmb3IgdGhlIGNoZWNrb3V0IHdhbGssIE1QRzExLiBUaGUgbW9ja3VwJ3MgcnVsZXMgYXJlIHRoZSBkZXNpZ247IHRoaXMgaXNcbi8vIHdoYXQgc2hpcHBlZC4gRGVwYXJ0dXJlcyBmcm9tIGl0IGFyZSBjb21tZW50ZWQgd2hlcmUgdGhleSBvY2N1ci5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgc3VtbWFyeS10b2dnbGUgIChORVcpXG4gICBUaGUgb3JkZXIgc3VtbWFyeSBhdCBwaG9uZSB3aWR0aCwgZm9sZGVkIGludG8gb25lIGJhciBhdCB0aGUgdG9wIG9mIHRoZVxuICAgZm9ybTogXCJTaG93IG9yZGVyIHN1bW1hcnlcIiBpbiBsaW5rIGJsdWUgd2l0aCB0aGUgY2hldnJvbiwgdGhlIHRvdGFsIGF0IHRoZVxuICAgZmFyIGVuZCBpbiB0aGUgY29tbWVyY2UgZmFjZS4gT3BlbiwgaXQgc2hvd3MgdGhlIHNhbWUgb3JkZXItbGluZXMgYW5kXG4gICBvcmRlci10b3RhbHMgdGhlIHNpZGViYXIgc2hvd3MuIEEgcmVhbCBkaXNjbG9zdXJlLCBzbyBpdCBuZWVkcyBubyBzY3JpcHQuXG5cbiAgIE9uIGl0cyBvd24gcGFuZWwtd2hpdGUgY2FyZCwgYXMgZXZlcnl0aGluZyBvbiB0aGlzIGNhbnZhcyBpcy4gVGhlIHBhZ2VcbiAgIGRlY2lkZXMgd2hlbiBpdCBhcHBlYXJzIOKAlCBhdCB3aWRlciB3aWR0aHMgdGhlIHNpZGViYXIgZG9lcyB0aGlzIGpvYi5cbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLnN1bW1hcnktdG9nZ2xlIHtcblxuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0Ym94LXNoYWRvdzogdmFyKC0tc2hhZG93LXBhbmVsKTtcbn1cblxuLnN1bW1hcnktdG9nZ2xlX19iYXIge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjtcblx0Z2FwOiB2YXIoLS1zcGFjZS00KTtcblx0cGFkZGluZzogdmFyKC0tc3BhY2UtNCkgdmFyKC0tc3BhY2UtNik7XG5cdGxpc3Qtc3R5bGU6IG5vbmU7XG5cdGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLnN1bW1hcnktdG9nZ2xlX19iYXI6Oi13ZWJraXQtZGV0YWlscy1tYXJrZXIge1xuXG5cdGRpc3BsYXk6IG5vbmU7XG59XG5cbi5zdW1tYXJ5LXRvZ2dsZV9fYmFyOjptYXJrZXIge1xuXG5cdGNvbnRlbnQ6IFwiXCI7XG59XG5cbi5zdW1tYXJ5LXRvZ2dsZV9fYmFyOmZvY3VzLXZpc2libGUge1xuXG5cdG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItZm9jdXMpO1xuXHRvdXRsaW5lLW9mZnNldDogLTJweDtcbn1cblxuLnN1bW1hcnktdG9nZ2xlX19sYWJlbCB7XG5cblx0ZGlzcGxheTogaW5saW5lLWZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtMik7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbGluayk7XG59XG5cbi5zdW1tYXJ5LXRvZ2dsZV9fbGFiZWwtLW9wZW4ge1xuXG5cdGRpc3BsYXk6IG5vbmU7XG59XG5cbi5zdW1tYXJ5LXRvZ2dsZVtvcGVuXSAuc3VtbWFyeS10b2dnbGVfX2xhYmVsLS1jbG9zZWQge1xuXG5cdGRpc3BsYXk6IG5vbmU7XG59XG5cbi5zdW1tYXJ5LXRvZ2dsZVtvcGVuXSAuc3VtbWFyeS10b2dnbGVfX2xhYmVsLS1vcGVuIHtcblxuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcbn1cblxuLnN1bW1hcnktdG9nZ2xlX19pY29uIHtcblxuXHRmbGV4OiAwIDAgYXV0bztcblx0d2lkdGg6IDE0cHg7XG5cdGhlaWdodDogMTRweDtcblx0Y29sb3I6IHZhcigtLXRleHQtYnJhbmQpO1xuXHR0cmFuc2Zvcm06IHJvdGF0ZSggOTBkZWcgKTtcbn1cblxuLnN1bW1hcnktdG9nZ2xlW29wZW5dIC5zdW1tYXJ5LXRvZ2dsZV9faWNvbiB7XG5cblx0dHJhbnNmb3JtOiByb3RhdGUoIC05MGRlZyApO1xufVxuXG4uc3VtbWFyeS10b2dnbGVfX3RvdGFsIHtcblxuXHRmb250LWZhbWlseTogdmFyKC0tZmYtY2hyb21lKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1oNCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1ib2xkKTtcblx0Zm9udC1zdHlsZTogaXRhbGljO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xuXHR3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4uc3VtbWFyeS10b2dnbGVfX2JvZHkge1xuXG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTYpO1xuXHRib3JkZXItYmxvY2stc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LnN1bW1hcnktdG9nZ2xlX19iYXIsXG5cdC5zdW1tYXJ5LXRvZ2dsZV9fYm9keSB7XG5cblx0XHRwYWRkaW5nLWlubGluZTogdmFyKC0tc3BhY2UtNCk7XG5cdH1cbn1cbiIsIi8vIFBhcmFnb24gR2FtaW5nIOKAlCB0YWctY2xvdWRcbi8vXG4vLyBBIHRhZyBjbG91ZCBzaXplZCBieSBmcmVxdWVuY3kgaW4gdGhyZWUgc3RlcHMuIFBsYWluIFBhcmFnb24tYmx1ZSBsaW5rcyxcbi8vIGRlbGliZXJhdGVseSBub3QgcGlsbHM6IHRoZSBicmFuZCdzIHNoYXBlIGxhdyBnaXZlcyBhIHN1cmZhY2UgdGhlIGNhcmRcbi8vIHJhZGl1cywgYSBjb250cm9sIGEgc3F1YXJlIGNvcm5lciBhbmQgYW4gaW5kaWNhdG9yIGEgcm91bmQgb25lLCBhbmQgYSB0YWdcbi8vIGlzIG5vbmUgb2YgdGhvc2UuIFRoZSBob3ZlciB3YXNoIHNpdHMgaW4gcGFkZGluZyB0aGUgdGFnIGFsd2F5cyBjYXJyaWVzLCBzb1xuLy8gbm90aGluZyByZWZsb3dzIHVuZGVyIHRoZSBjdXJzb3IuXG4vL1xuLy8gU291cmNlOiBjYXRhbG9ndWUgYmxvY2sgYHRhZy1jbG91ZGAuIFBvcnRlZCBmb3IgdGhlIE1QRzkgcHJvZHVjdC1wYWdlIHdhbGssIDIwMjYtMDktMTYuXG5cbi50YWctY2xvdWQge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtd3JhcDogd3JhcDtcblx0YWxpZ24taXRlbXM6IGJhc2VsaW5lO1xuXHRnYXA6IHZhcigtLXNwYWNlLTEpIHZhcigtLXNwYWNlLTIpO1xufVxuXG4udGFnLWNsb3VkX190YWcge1xuXG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTEpIHZhcigtLXNwYWNlLTIpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtY2FyZCk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LXJlZ3VsYXIpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xuXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi50YWctY2xvdWRfX3RhZy0tc20ge1xuXG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xufVxuXG4udGFnLWNsb3VkX190YWctLWxnIHtcblxuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHktbGcpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcbn1cblxuLnRhZy1jbG91ZF9fdGFnOmhvdmVyIHtcblxuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1jYXJkLWhvdmVyKTtcblx0Y29sb3I6IHZhcigtLXRleHQtbGluay1ob3Zlcik7XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgdGVybS1jaGlwc1xuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBNYWdhemluZSBTZWN0aW9uIExhbmRpbmcgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxNSwgb3BlcmF0b3ItXG4vLyBhcHByb3ZlZCAyMDI2LTA5LTI4KSBmb3IgdGhlIHNlY3Rpb24gbGFuZGluZyB3YWxrLCBNUEcxNS4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGVcbi8vIGRlc2lnbjsgdGhpcyBpcyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIHRlcm0tY2hpcHMgIChSRVVTRUQsIHZlcmJhdGltKVxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi50ZXJtLWNoaXBzIHtcblxuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS0yKSB2YXIoLS1zcGFjZS1jYXJkLXBhZGRpbmcpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0Ym94LXNoYWRvdzogdmFyKC0tc2hhZG93LXBhbmVsKTtcblxufVxuXG4udGVybS1jaGlwc19fcm93IHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogYmFzZWxpbmU7XG5cdGdhcDogdmFyKC0tc3BhY2UtNik7XG5cdHBhZGRpbmctYmxvY2s6IHZhcigtLXNwYWNlLTQpO1xuXG59XG5cbi50ZXJtLWNoaXBzX19yb3cgKyAudGVybS1jaGlwc19fcm93IHtcblxuXHRib3JkZXItYmxvY2stc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cbn1cblxuLnRlcm0tY2hpcHNfX2xhYmVsIHtcblxuXHRmbGV4OiAwIDAgOTZweDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtaGVhZGluZyk7XG5cbn1cblxuLnRlcm0tY2hpcHNfX2xpc3Qge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtd3JhcDogd3JhcDtcblx0Z2FwOiB2YXIoLS1zcGFjZS0yKTtcblx0bWluLXdpZHRoOiAwO1xuXHRtYXJnaW46IDA7XG5cdHBhZGRpbmc6IDA7XG5cdGxpc3Qtc3R5bGU6IG5vbmU7XG5cbn1cblxuLnRlcm0tY2hpcHNfX2NoaXAge1xuXG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogYmFzZWxpbmU7XG5cdGdhcDogdmFyKC0tc3BhY2UtMik7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTIpIHZhcigtLXNwYWNlLTQpO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZGVmYXVsdCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1idG4pO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbCk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1yZWd1bGFyKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXHR3aGl0ZS1zcGFjZTogbm93cmFwO1xuXG59XG5cbi50ZXJtLWNoaXBzX19jaGlwOmhvdmVyIHtcblxuXHRib3JkZXItY29sb3I6IHZhcigtLWJvcmRlci1icmFuZCk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWNhcmQtaG92ZXIpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rKTtcblxufVxuXG4udGVybS1jaGlwc19fY291bnQge1xuXG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtZXllYnJvdyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcblxufVxuXG4udGVybS1jaGlwc19fY2hpcDpob3ZlciAudGVybS1jaGlwc19fY291bnQge1xuXG5cdGNvbG9yOiB2YXIoLS10ZXh0LWxpbmspO1xuXG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LnRlcm0tY2hpcHMge1xuXG5cdFx0cGFkZGluZy1pbmxpbmU6IHZhcigtLXNwYWNlLTQpO1xuXG5cdH1cblxuXHQudGVybS1jaGlwc19fcm93IHtcblxuXHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdFx0Z2FwOiB2YXIoLS1zcGFjZS0zKTtcblxuXHR9XG5cblx0LnRlcm0tY2hpcHNfX2xhYmVsIHtcblxuXHRcdGZsZXgtYmFzaXM6IGF1dG87XG5cblx0fVxuXG5cdC50ZXJtLWNoaXBzX19saXN0IHtcblxuXHRcdGZsZXgtd3JhcDogbm93cmFwO1xuXHRcdGFsaWduLXNlbGY6IHN0cmV0Y2g7XG5cdFx0b3ZlcmZsb3cteDogYXV0bztcblx0XHRzY3JvbGxiYXItd2lkdGg6IG5vbmU7XG5cdFx0bWFyZ2luLWlubGluZS1lbmQ6IGNhbGMoIHZhcigtLXNwYWNlLTQpICogLTEgKTtcblx0XHRwYWRkaW5nLWlubGluZS1lbmQ6IHZhcigtLXNwYWNlLTQpO1xuXG5cdH1cblxuXHQudGVybS1jaGlwc19fbGlzdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXG5cdFx0ZGlzcGxheTogbm9uZTtcblxuXHR9XG5cblx0LnRlcm0tY2hpcHNfX2xpc3QgPiBsaSB7XG5cblx0XHRmbGV4OiAwIDAgYXV0bztcblxuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgdHJ1c3Qtcm93XG4vL1xuLy8gVGhlIGZvdXItdXAgcmVhc3N1cmFuY2UgYmFuZCDigJQgVHJ1c3RwaWxvdCwgZGVsaXZlcnksIGxveWFsdHkgcG9pbnRzLCBwYXlcbi8vIGxhdGVyLiBFYWNoIHN0YXRlbWVudCBpcyBpdHMgb3duIHBhbmVsLXdoaXRlIGNhcmQsIHNwYWNlZCBieSB0aGUgcGFuZWwgZ2FwXG4vLyDigJQgdGhpcyBicmFuZCBuZXZlciBwdXRzIGNvbnRlbnQgZGlyZWN0bHkgb24gdGhlIGdyb3VuZC5cbi8vXG4vLyBTb3VyY2U6IGNhdGFsb2d1ZSBibG9jayBgdHJ1c3Qtcm93YC4gUG9ydGVkIGZvciB0aGUgTVBHOSBwcm9kdWN0LXBhZ2Ugd2FsaywgMjAyNi0wOS0xNi5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBCTE9DSyDigJQgdHJ1c3Qtcm93ICAoVVBEQVRFRCDigJQgZXZlcnkgc3RhdGVtZW50IGlzIG5vdyBhIGxpbmspXG5cbiAgIEEgY2xhaW0gdGhlIHNob3BwZXIgY2FuIGNoZWNrIGlzIHdvcnRoIG1vcmUgdGhhbiBhIGNsYWltIHRoZXkgY2Fubm90LCBzb1xuICAgZWFjaCBvZiB0aGUgZm91ciBzdGF0ZW1lbnRzIG5vdyByb3V0ZXMgdG8gdGhlIHBhZ2UgdGhhdCBiYWNrcyBpdDogdGhlXG4gICBUcnVzdHBpbG90IHByb2ZpbGUsIFN0b3JlICYgU2hpcHBpbmcgSW5mb3JtYXRpb24gdHdpY2UsIGFuZCB0aGUgQ2xlYXJwYXlcbiAgIEZBUS4gVGhhdCB0dXJucyB0aGUgcm93IGZyb20gZm91ciBwaWVjZXMgb2YgZGVjb3JhdGlvbiBpbnRvIGZvdXIgcm91dGVzXG4gICBpbnRvIHRoZSBpbmZvcm1hdGlvbiBjZW50cmUuXG5cbiAgIFRoZSBjYXJkIGlzIHVuY2hhbmdlZC4gV2hhdCBtb3ZlZCBpcyB0aGUgcGFkZGluZzogaXQgbm93IHNpdHMgb24gdGhlIGxpbmtcbiAgIHJhdGhlciB0aGFuIHRoZSBpdGVtLCBzbyB0aGUgd2hvbGUgY2FyZCBpcyB0aGUgaGl0IHRhcmdldCBhbmQgdGhlIHJvdyBsb29rc1xuICAgZXhhY3RseSBhcyBpdCBkaWQuIEhvdmVyIHRha2VzIHRoZSBsYWJlbCB0byBQYXJhZ29uIGJsdWUg4oCUIHRoZSBicmFuZCdzIGxpbmtcbiAgIGNvbG91ciwgbm8gdW5kZXJsaW5lIOKAlCBhbmQgbm90aGluZyBlbHNlIG1vdmVzLlxuXG4gICBUaGUgb2xkIGJsb2NrJ3MgcGhvbmUgcnVsZXMgYWxzbyBzdHJpcHBlZCB0aGUgY2FyZHMgYmFjayB0byBoYWlybGluZS1cbiAgIHNlcGFyYXRlZCByb3dzLiBUaGF0IGNvbnRyYWRpY3RlZCB0aGUgZGVzaWduIGJyaWVmJ3Mgb3duIGluc3RydWN0aW9uIHRoYXQgYVxuICAgcm93IG9mIGZvdXIgc2hvcnQgdHJ1c3Qgc3RhdGVtZW50cyBpcyBmb3VyIGNhcmRzIGFuZCBub3QgZm91ciBjb2x1bW5zLCBzb1xuICAgdGhlIGNhcmRzIG5vdyBzdGF5IGNhcmRzIGF0IGV2ZXJ5IHdpZHRoIGFuZCBzaW1wbHkgc3RhY2suXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyogVEhFIFJPVyBGSVRTIElUUyBDT05UQUlORVIsIE5PVCBJVFMgRklSU1QgUEFHRSAoTVBHMSB3YWxrLCAyMDI2LTA5LTE2KS5cblxuICAgVGhpcyB3YXMgYHJlcGVhdCggMywg4oCmIClgLCBmaXhlZCBvbiAyMDI2LTA5LTE2IGJlY2F1c2UgZm91ciBzdGF0ZW1lbnRzIGluIHRoZVxuICAgcHJvZHVjdCBwYWdlJ3MgOTYycHggY29sdW1uIGdhdmUgMjIycHggZWFjaCDigJQgYSBmb290ZXIgY29sdW1uJ3Mgd2lkdGggZm9yIGFcbiAgIGxpbmUgbWVhbnQgdG8gYmUgcmVhZCBhdCBhIGdsYW5jZS4gVGhyZWUgc2F0IGF0IDMwMSBhbmQgcmVhZCBjb3JyZWN0bHkuXG5cbiAgIFRoYXQgaXMgYSBtZWFzdXJlbWVudCBvZiB0aGUgQ09MVU1OLCBhbmQgdGhlIGNsYXNzIHdhcyBjYXJyeWluZyBpdCBhcyB0aG91Z2hcbiAgIGl0IHdlcmUgYSBwcm9wZXJ0eSBvZiB0aGUgY29tcG9uZW50LiBUaGUgaG9tZXBhZ2UncyBiYW5kIGlzIGZvdXIgc3RhdGVtZW50c1xuICAgYXQgdGhlIGZ1bGwgMTQwMHB4IHBhZ2Ugd2lkdGgsIHdoZXJlIGZvdXIgZml0IGF0IH4zMzBweCDigJQgd2lkZXIgdGhhbiB0aGUgMzAxXG4gICB0aGUgcHJvZHVjdCBwYWdlIHNldHRsZWQgb24g4oCUIGFuZCBhIGhhcmQgdGhyZWUtY29sdW1uIHJ1bGUgcHV0IHRoZSBmb3VydGggb25cbiAgIGEgcm93IG9mIGl0cyBvd24uXG5cbiAgIGBhdXRvLWZpdGAgYXQgYSAyNjBweCBmbG9vciBzdGF0ZXMgdGhlIGFjdHVhbCBydWxlOiBhcyBtYW55IGFjcm9zcyBhcyBmaXRcbiAgIHdpdGhvdXQgZ29pbmcgdW5kZXIgdGhlIHdpZHRoIHRoZSBjb3B5IG5lZWRzLiBUaGUgcHJvZHVjdCBwYWdlIGlzIHVuY2hhbmdlZFxuICAgYnkgaXQg4oCUIHRocmVlIGl0ZW1zIGluIDk2MnB4IHN0aWxsIG1lYXN1cmUgMzAxcHggZWFjaC4gVGhlIHR3byBicmVha3BvaW50c1xuICAgYmVsb3cgc3RpbGwgb3ZlcnJpZGUgZGVsaWJlcmF0ZWx5OiB0d28gYWNyb3NzIG9uIGEgdGFibGV0IHJhdGhlciB0aGFuIHRoZVxuICAgdGhyZWUgYXV0by1maXQgd291bGQgb3RoZXJ3aXNlIGFsbG93LCBhbmQgb25lIG9uIGEgcGhvbmUuICovXG4udHJ1c3Qtcm93IHtcblxuXHRkaXNwbGF5OiBncmlkO1xuXHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCggYXV0by1maXQsIG1pbm1heCggMjYwcHgsIDFmciApICk7XG5cdG1hcmdpbjogMDtcblx0cGFkZGluZzogMDtcblx0bGlzdC1zdHlsZTogbm9uZTtcblx0Z2FwOiB2YXIoLS1zcGFjZS1jb250ZW50LWdhcCk7XG59XG5cbi50cnVzdC1yb3dfX2l0ZW0ge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctcGFuZWwpO1xufVxuXG4udHJ1c3Qtcm93X19saW5rIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IHZhcigtLXNwYWNlLTMpO1xuXHRoZWlnaHQ6IDEwMCU7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLWNhcmQtcGFkZGluZyk7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLyogNDBweCwgbWF0Y2hpbmcgdGhlIGRlbGl2ZXJ5IGljb24gaW4gdGhlIGJ1eSBib3gg4oCUIHRoZSBicmFuZCdzIGV4aXN0aW5nIHNpemVcbiAgIGZvciBhbiBpY29uIHRoYXQgY2FycmllcyBhIGZhY3QgcmF0aGVyIHRoYW4gZGVjb3JhdGVzIGEgbGFiZWwuIEF0IDMwIHRoZXNlXG4gICByZWFkIGFzIGJ1bGxldHMgYmVzaWRlIHRoZWlyIGNvcHk7IHRoZSByb3cgaXMgZm91ciBjbGFpbXMsIGFuZCB0aGUgaWNvbiBpc1xuICAgaGFsZiBvZiBlYWNoIGNsYWltLiBPbmUgcnVsZSwgc28gdGhlIHByb2R1Y3QgcGFnZSdzIHRocmVlIHRha2UgaXQgdG9vLiAqL1xuLnRydXN0LXJvd19faWNvbiB7XG5cblx0ZmxleDogMCAwIGF1dG87XG5cdHdpZHRoOiA0MHB4O1xuXHRoZWlnaHQ6IDQwcHg7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJyYW5kKTtcbn1cblxuLnRydXN0LXJvd19faWNvbiBzdmcge1xuXG5cdHdpZHRoOiAxMDAlO1xuXHRoZWlnaHQ6IDEwMCU7XG59XG5cbi50cnVzdC1yb3dfX2xhYmVsIHtcblxuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG4udHJ1c3Qtcm93X19saW5rOmhvdmVyIC50cnVzdC1yb3dfX2xhYmVsIHtcblxuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rKTtcbn1cblxuLnRydXN0LXJvd19fbGluazpmb2N1cy12aXNpYmxlIHtcblxuXHRvdXRsaW5lOiAycHggc29saWQgdmFyKC0tYm9yZGVyLWZvY3VzKTtcblx0b3V0bGluZS1vZmZzZXQ6IC0ycHg7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogMTEwMHB4ICkge1xuXG5cdC50cnVzdC1yb3cge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoIDIsIG1pbm1heCggMCwgMWZyICkgKTtcblx0fVxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDY0MHB4ICkge1xuXG5cdC50cnVzdC1yb3cge1xuXG5cdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoIDAsIDFmciApO1xuXHR9XG5cblx0LnRydXN0LXJvd19fbGluayB7XG5cblx0XHRwYWRkaW5nOiB2YXIoLS1zcGFjZS02KTtcblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHZlcmRpY3QtYmFuZFxuLy9cbi8vIFBvcnRlZCBmcm9tIHRoZSBNYWdhemluZSBBcnRpY2xlIG1vY2t1cCAoZGVzaWduIG9mIHJlY29yZDogTVBHMTYsIG9wZXJhdG9yLWFwcHJvdmVkXG4vLyAyMDI2LTA5LTI4KSBmb3IgdGhlIGFydGljbGUgd2FsaywgTVBHMTYuIFRoZSBtb2NrdXAncyBydWxlcyBhcmUgdGhlIGRlc2lnbjsgdGhpcyBpc1xuLy8gd2hhdCBzaGlwcGVkLiBEZXBhcnR1cmVzIGZyb20gaXQgYXJlIGNvbW1lbnRlZCB3aGVyZSB0aGV5IG9jY3VyLlxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEJMT0NLIOKAlCB2ZXJkaWN0LWJhbmQgIChORVcsIGxheW91dClcbiAgIFRoZSByZXZpZXcncyBmaW5hbGU6IGEgZnVsbC1ibGVlZCBiYW5kIGFmdGVyIHRoZSBib2R5IHdpdGggdGhlIGtleSBhcnRcbiAgIGJlaGluZCBpdCwgZGFya2VyIHRoYW4gdGhlIGhlcm8g4oCUIHRoZSBzYW1lIHNjcmltLCB0dXJuZWQgdXAg4oCUIHNvIHRoZVxuICAgZmluYWxlIGlzIHJlY29nbmlzYWJseSB0aGUgYXJ0aWNsZSdzIG93biBlbmRpbmcgYW5kIG5vdCBhbiBhZHZlcnQuIE9uIGl0LFxuICAgb3ZlciB0aGUgcmVhZGluZyBjb2x1bW46IHRoZSBleWVicm93LCBcIlRoZSBWZXJkaWN0XCIsIGFuZCB0aGUgb25lLWxpbmVcbiAgIHZlcmRpY3QgaW4gdGhlIG1hZ2F6aW5lJ3MgaXRhbGljLCByZXZlcnNlZC4gQmVuZWF0aCB0aGVtLCBvbiBhIHBhbmVsXG4gICBiZWNhdXNlIGNvbnRlbnQgYmVsb25ncyBvbiBwYW5lbHMsIHRoZSBjYXRhbG9ndWUncyBzY29yZS1wYW5lbCB3aXRoIHRoZVxuICAgbGFyZ2Ugc2NvcmUgbWV0ZXIgYXMgaXRzIG92ZXJhbGwgZmlndXJlIOKAlCB0aGUgbWV0ZXIgZmlsbHMgdG8gdGhlIHNjb3JlXG4gICBhcyB0aGUgYmFuZCBzY3JvbGxzIGludG8gdmlldy4gVGhlIHJhaWwgY29sdW1uIHN0YXlzIG9wZW4gc28gdGhlIGFydFxuICAgc2hvd3MgdGhyb3VnaCBvbiB0aGUgcmlnaHQuXG5cbiAgIEEgbmV3cyBhcnRpY2xlIGhhcyBubyBmaW5hbGUuIFJlcGxhY2VzIE1QRzE2J3MgaW4tY2FyZCB2ZXJkaWN0IHBhbmVsLlxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi52ZXJkaWN0LWJhbmQge1xuXG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS0xMik7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWNocm9tZSk7XG5cdHNjcm9sbC1tYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTYpO1xuXG59XG5cbi52ZXJkaWN0LWJhbmRfX21lZGlhIHtcblxuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdGluc2V0OiAwO1xuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdGhlaWdodDogMTAwJTtcblx0b2JqZWN0LWZpdDogY292ZXI7XG5cdG9iamVjdC1wb3NpdGlvbjogY2VudGVyIDMwJTtcblxufVxuXG4udmVyZGljdC1iYW5kX19zY3JpbSB7XG5cblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRpbnNldDogMDtcblx0YmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KFxuXHRcdDkwZGVnLFxuXHRcdGNvbG9yLW1peCggaW4gc3JnYiwgdmFyKC0tYmctY2hyb21lKSA5NCUsIHRyYW5zcGFyZW50ICkgMCUsXG5cdFx0Y29sb3ItbWl4KCBpbiBzcmdiLCB2YXIoLS1iZy1jaHJvbWUpIDg2JSwgdHJhbnNwYXJlbnQgKSA1NSUsXG5cdFx0Y29sb3ItbWl4KCBpbiBzcmdiLCB2YXIoLS1iZy1jaHJvbWUpIDU1JSwgdHJhbnNwYXJlbnQgKSAxMDAlXG5cdCk7XG5cbn1cblxuLnZlcmRpY3QtYmFuZF9faW5uZXIge1xuXG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0d2lkdGg6IDEwMCU7XG5cdG1heC13aWR0aDogY2FsYyggdmFyKC0tc2l0ZS1tYXgtd2lkdGgpICsgKCB2YXIoLS1ndXR0ZXItc21hbGwpICogMiApICk7XG5cdG1hcmdpbi1pbmxpbmU6IGF1dG87XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTE2KSB2YXIoLS1ndXR0ZXItc21hbGwpO1xuXG59XG5cbi52ZXJkaWN0LWJhbmRfX2ZyYW1lIHtcblxuXHRkaXNwbGF5OiBncmlkO1xuXHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCggMCwgY2FsYyggdmFyKC0tY29udGFpbmVyLWFydGljbGUpICsgKCB2YXIoLS1zcGFjZS1jYXJkLXBhZGRpbmcpICogMiApICkgKSB2YXIoLS13aWR0aC1zaWRlYmFyKTtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGdhcDogdmFyKC0tc3BhY2UtOCkgdmFyKC0tc3BhY2UtMTYpO1xuXG59XG5cbi52ZXJkaWN0LWJhbmRfX2hlYWQsXG4udmVyZGljdC1iYW5kX19wYW5lbCB7XG5cblx0Z3JpZC1jb2x1bW46IDE7XG5cdG1pbi13aWR0aDogMDtcblxufVxuXG4udmVyZGljdC1iYW5kX19oZWFkIHtcblxuXHRwYWRkaW5nLWlubGluZTogdmFyKC0tc3BhY2UtY2FyZC1wYWRkaW5nKTtcblxufVxuXG4udmVyZGljdC1iYW5kX19leWVicm93IHtcblxuXHRtYXJnaW46IDA7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1leWVicm93KTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiAxO1xuXHRsZXR0ZXItc3BhY2luZzogMC4xMmVtO1xuXHR0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuXHRjb2xvcjogdmFyKC0tcGFyYWdvbi0zMDApO1xuXG59XG5cbi52ZXJkaWN0LWJhbmRfX3RpdGxlIHtcblxuXHRtYXJnaW46IHZhcigtLXNwYWNlLTMpIDAgMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWhlYWRpbmcpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWgyKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblx0Y29sb3I6IHZhcigtLXRleHQtb24tYnJhbmQpO1xuXG59XG5cbi52ZXJkaWN0LWJhbmRfX2xpbmUge1xuXG5cdG1hcmdpbjogdmFyKC0tc3BhY2UtNikgMCAwO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDMpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1vbi1icmFuZCk7XG5cbn1cblxuLnZlcmRpY3QtYmFuZF9fYnlsaW5lIHtcblxuXHRtYXJnaW46IHZhcigtLXNwYWNlLTQpIDAgMDtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLXNtYWxsKTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWhlYWRpbmcpO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1vbi1jaHJvbWUpO1xuXG59XG5cbi52ZXJkaWN0LWJhbmRfX3BhbmVsIHtcblxuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS1jYXJkLXBhZGRpbmcpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wYW5lbCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblxufVxuXG5AbWVkaWEgKCBtYXgtd2lkdGg6IDExMDBweCApIHtcblxuXHQudmVyZGljdC1iYW5kX19mcmFtZSB7XG5cblx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCggMCwgY2FsYyggdmFyKC0tY29udGFpbmVyLWFydGljbGUpICsgKCB2YXIoLS1zcGFjZS1jYXJkLXBhZGRpbmcpICogMiApICkgKTtcblxuXHR9XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LnZlcmRpY3QtYmFuZF9faW5uZXIge1xuXG5cdFx0cGFkZGluZy1ibG9jazogdmFyKC0tc3BhY2UtMTIpO1xuXG5cdH1cblxuXHQudmVyZGljdC1iYW5kX19oZWFkIHtcblxuXHRcdHBhZGRpbmctaW5saW5lOiAwO1xuXG5cdH1cblxuXHQudmVyZGljdC1iYW5kX190aXRsZSB7XG5cblx0XHRmb250LXNpemU6IHZhcigtLWZzLWgzKTtcblxuXHR9XG5cblx0LnZlcmRpY3QtYmFuZF9fbGluZSB7XG5cblx0XHRmb250LXNpemU6IHZhcigtLWZzLWg0KTtcblxuXHR9XG5cblx0LnZlcmRpY3QtYmFuZF9fcGFuZWwge1xuXG5cdFx0cGFkZGluZzogdmFyKC0tc3BhY2UtNik7XG5cblx0fVxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHZpZGVvLWVtYmVkXG4vL1xuLy8gUG9ydGVkIGZyb20gdGhlIE1hZ2F6aW5lIEFydGljbGUgbW9ja3VwIChkZXNpZ24gb2YgcmVjb3JkOiBNUEcxNiwgb3BlcmF0b3ItYXBwcm92ZWRcbi8vIDIwMjYtMDktMjgpIGZvciB0aGUgYXJ0aWNsZSB3YWxrLCBNUEcxNi4gVGhlIG1vY2t1cCdzIHJ1bGVzIGFyZSB0aGUgZGVzaWduOyB0aGlzIGlzXG4vLyB3aGF0IHNoaXBwZWQuIERlcGFydHVyZXMgZnJvbSBpdCBhcmUgY29tbWVudGVkIHdoZXJlIHRoZXkgb2NjdXIuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgQkxPQ0sg4oCUIHZpZGVvLWVtYmVkICAoTkVXKVxuICAgVGhlIHBsYXkgY29udHJvbCBpcyBhIGNvbnRyb2wsIHNvIGl0IGlzIHNxdWFyZSBsaWtlIGV2ZXJ5IG90aGVyIGNvbnRyb2wgaW5cbiAgIHRoZSBicmFuZCDigJQgYSByb3VuZCBvbmUgd291bGQgcmVhZCBhcyBhbiBpbmRpY2F0b3IuIFRoZSBjYXB0aW9uIHRha2VzIHRoZVxuICAgc2FtZSBzZXR0aW5nIG1lZGlhLWZpZ3VyZSBnaXZlcyBhIGNhcHRpb24sIHNvIGFuIGFydGljbGUncyB0d28ga2luZHMgb2ZcbiAgIG1lZGlhIGFyZSBjYXB0aW9uZWQgaWRlbnRpY2FsbHkuXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLnZpZGVvLWVtYmVkIHtcblxuXHRtYXJnaW46IHZhcigtLXNwYWNlLTgpIDAgMDtcblxufVxuXG4udmlkZW8tZW1iZWRfX2ZhY2FkZSB7XG5cblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRkaXNwbGF5OiBibG9jaztcblx0d2lkdGg6IDEwMCU7XG5cdHBhZGRpbmc6IDA7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1uZXV0cmFsLTgwMCk7XG5cdGN1cnNvcjogcG9pbnRlcjtcblxufVxuXG4udmlkZW8tZW1iZWRfX3Bvc3RlciB7XG5cblx0ZGlzcGxheTogYmxvY2s7XG5cdHdpZHRoOiAxMDAlO1xuXHRhc3BlY3QtcmF0aW86IDE2IC8gOTtcblx0b2JqZWN0LWZpdDogY292ZXI7XG5cbn1cblxuLnZpZGVvLWVtYmVkX19wbGF5IHtcblxuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdGluc2V0LWJsb2NrLXN0YXJ0OiA1MCU7XG5cdGluc2V0LWlubGluZS1zdGFydDogNTAlO1xuXHR0cmFuc2Zvcm06IHRyYW5zbGF0ZSggLTUwJSwgLTUwJSApO1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdHdpZHRoOiA2NHB4O1xuXHRoZWlnaHQ6IDY0cHg7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1idG4pO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1idG4tcHJpbWFyeS1iZyk7XG5cdGNvbG9yOiB2YXIoLS1idG4tcHJpbWFyeS10ZXh0KTtcblxufVxuXG4udmlkZW8tZW1iZWRfX2ZhY2FkZTpob3ZlciAudmlkZW8tZW1iZWRfX3BsYXkge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJ0bi1wcmltYXJ5LWJnLWhvdmVyKTtcblxufVxuXG4udmlkZW8tZW1iZWRfX3BsYXkgc3ZnIHtcblxuXHR3aWR0aDogMjRweDtcblx0aGVpZ2h0OiAyNHB4O1xuXHRmaWxsOiBjdXJyZW50Q29sb3I7XG5cbn1cblxuLnZpZGVvLWVtYmVkX19jYXB0aW9uIHtcblxuXHRtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNwYWNlLTMpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtYm9keSk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1ib2R5KTtcblx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuXG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LnZpZGVvLWVtYmVkX19wbGF5IHtcblxuXHRcdHdpZHRoOiA1MnB4O1xuXHRcdGhlaWdodDogNTJweDtcblxuXHR9XG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgV29vQ29tbWVyY2Ugbm90aWNlc1xuLy9cbi8vIFdvb0NvbW1lcmNlJ3Mgb3duIG1lc3NhZ2VzIOKAlCBcIuKApiBhZGRlZCB0byB5b3VyIGJhc2tldFwiLCBcIkNvdXBvbiBjb2RlIGFwcGxpZWRcIixcbi8vIFwiUGxlYXNlIGVudGVyIGEgcG9zdGNvZGVcIiDigJQgaW4gdGhlaXIgb3duIG1hcmt1cCAoYHdvb2NvbW1lcmNlLW1lc3NhZ2VgLFxuLy8gYHdvb2NvbW1lcmNlLWluZm9gLCBgd29vY29tbWVyY2UtZXJyb3JgKSwgc3R5bGVkIGFzIHRoZSBicmFuZCdzIG5vdGljZTogYSB3aGl0ZVxuLy8gcGFuZWwgYXQgdGhlIHN1cmZhY2UgcmFkaXVzIHdpdGggYSBjb2xvdXJlZCBsZWFkaW5nIGVkZ2UuIEJyYW5kIGJsdWUgZm9yIG1lc3NhZ2VzXG4vLyBhbmQgaW5mb3JtYXRpb24sIHRoZSBuZWdhdGl2ZSBjb2xvdXIgZm9yIGVycm9ycy4gQWRkZWQgaW4gdGhlIGJhc2tldCB3aXJpbmcgcGFzc1xuLy8gKE1QRzEwLCBvcGVyYXRvciAyMDI2LTA5LTI0KTogdGhlIGRlc2lnbiBkcmF3cyBub25lLCBidXQgYSByZWFsIGJhc2tldCBzaG93cyB0aGVtXG4vLyBvZnRlbiwgYW5kIHVuc3R5bGVkIHRoZXkgcmVhZCBhcyBzdHJheSBib2R5IHRleHQuXG4vL1xuLy8gUGxhdGZvcm0gY2xhc3Nlcywgc3R5bGVkIHJhdGhlciB0aGFuIHJlbmFtZWQg4oCUIFdvb0NvbW1lcmNlIHByaW50cyBhbmQgcmVwbGFjZXMgdGhpc1xuLy8gbWFya3VwIGl0c2VsZiAodGhlIGNhcnQgc2NyaXB0IHN3YXBzIG5vdGljZXMgb24gdXBkYXRlKS5cblxuLndvb2NvbW1lcmNlLW1lc3NhZ2UsXG4ud29vY29tbWVyY2UtaW5mbyxcbi53b29jb21tZXJjZS1lcnJvciB7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC13cmFwOiB3cmFwO1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cdGdhcDogdmFyKC0tc3BhY2UtMykgdmFyKC0tc3BhY2UtNik7XG5cdG1hcmdpbjogMDtcblx0cGFkZGluZzogdmFyKC0tc3BhY2UtNCkgdmFyKC0tc3BhY2UtNik7XG5cdGJvcmRlci1pbmxpbmUtc3RhcnQ6IDRweCBzb2xpZCB2YXIoLS1ib3JkZXItYnJhbmQpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtY2FyZCk7XG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsKTtcblx0bGlzdC1zdHlsZTogbm9uZTtcblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWJvZHkpO1xufVxuXG4ud29vY29tbWVyY2UtZXJyb3Ige1xuXG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuXHRib3JkZXItaW5saW5lLXN0YXJ0LWNvbG9yOiB2YXIoLS1jb2xvci1uZWdhdGl2ZSk7XG59XG5cbi53b29jb21tZXJjZS1lcnJvciBsaSB7XG5cblx0bWFyZ2luOiAwO1xufVxuXG4ud29vY29tbWVyY2Utbm90aWNlcy13cmFwcGVyIHtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IHZhcigtLXNwYWNlLTMpO1xufVxuXG4vLyBXb29Db21tZXJjZSdzIGxpbmsgaW5zaWRlIGEgbWVzc2FnZSAoXCJWaWV3IGJhc2tldFwiLCBcIlVuZG9cIikgcmVhZHMgYXMgYSBxdWlldCBsaW5rLFxuLy8gbm90IGEgc2Vjb25kIGJ1dHRvbiBjb21wZXRpbmcgd2l0aCB0aGUgcGFnZSdzIG93biBhY3Rpb25zLlxuLndvb2NvbW1lcmNlLW1lc3NhZ2UgYS5idXR0b24sXG4ud29vY29tbWVyY2UtaW5mbyBhLmJ1dHRvbixcbi53b29jb21tZXJjZS1tZXNzYWdlIC5yZXN0b3JlLWl0ZW0ge1xuXG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1icmFuZCk7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLy8gV29vQ29tbWVyY2UgcHJpbnRzIGl0cyBidXR0b24gQkVGT1JFIHRoZSBtZXNzYWdlIChcIjxhIGNsYXNzPWJ1dHRvbj5WaWV3IGJhc2tldDwvYT5cbi8vIOKApiBhZGRlZCB0byB5b3VyIGJhc2tldFwiLCBcIkNvbmZpcm0gZW1haWwgYWRkcmVzcyBDb25maXJtIHlvdXIgZW1haWwgdG8gY2hlY2sgZm9yIHBhc3Rcbi8vIG9yZGVyc1wiKSBhbmQgbGVhdmVzIGl0IHRvIHRoZSB0aGVtZSB0byBmbG9hdCByaWdodC4gVGhlIG5vdGljZSBpcyBhbHJlYWR5IGFcbi8vIHNwYWNlLWJldHdlZW4gZmxleCByb3csIHNvIHRoZSBidXR0b24gaXMgb3JkZXJlZCBhZnRlciB0aGUgdGV4dDogdGhlIHNlbnRlbmNlIGxlYWRzXG4vLyBhbmQgdGhlIGFjdGlvbiBjbG9zZXMgdGhlIGxpbmUgKG9wZXJhdG9yJ3MgcmVmaW5lbWVudCBsaXN0LCAyMDI2LTA5LTI3KS5cbi53b29jb21tZXJjZS1tZXNzYWdlIGEuYnV0dG9uLFxuLndvb2NvbW1lcmNlLWluZm8gYS5idXR0b24ge1xuXG5cdG9yZGVyOiAxO1xufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIHdpZGdldFxuLy9cbi8vIEEgdGl0bGVkIHBhbmVsIGluIHRoZSBzaWRlYmFyLiBgLS1mbHVzaGAgaXMgZm9yIGEgbGlzdCB0aGF0IHJ1bnMgZWRnZSB0byBlZGdlXG4vLyBpbnNpZGUgaXQg4oCUIGEgYGNvdW50LWxpc3RgIG9mIHJhbmdlcyBvciBicmFuZHMsIHdoZXJlIGFuIGluc2V0IHdvdWxkIGxlYXZlIHRoZVxuLy8gaG92ZXIgZ3JvdW5kIHN0b3BwaW5nIHNob3J0IG9mIHRoZSBwYW5lbC5cbi8vXG4vLyBTb3VyY2U6IGNhdGFsb2d1ZSBibG9jayBgd2lkZ2V0YCwgcmVjb25jaWxlZCBhZ2FpbnN0IE1QRzggKGRlc2lnbiAxNzk1NSkuXG4vLyBQb3J0ZWQgZm9yIHRoZSBNUEc4IGNhdGVnb3J5LWZ1bm5lbCB3YWxrLCAyMDI2LTA5LTE2LlxuXG4vKiAtLS0tIHdpZGdldCAocmV1c2VkIGZyb20gdGhlIGJyYW5kIGNhdGFsb2d1ZSwgdmVyYmF0aW0pIC0tLS0gKi9cbi53aWRnZXQge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXBhbmVsKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xuXHRib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctcGFuZWwpO1xufVxuXG4ud2lkZ2V0X190aXRsZSB7XG5cblx0bWFyZ2luOiAwO1xuXHRwYWRkaW5nOiB2YXIoLS1zcGFjZS0zKSB2YXIoLS1zcGFjZS02KTtcblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItYnJhbmQpO1xuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW9uLWJyYW5kKTtcbn1cblxuLndpZGdldF9fYm9keSB7XG5cblx0cGFkZGluZzogdmFyKC0tc3BhY2UtNik7XG59XG5cbi53aWRnZXRfX2JvZHktLWZsdXNoIHtcblxuXHRwYWRkaW5nOiAwO1xufVxuIiwiLy8gY29yZS9jb2x1bW5zLlxuLy9cbi8vIDMsNTQ5IHByb2R1Y3RzIOKAlCB0aGUgc2Vjb25kIG1vc3QtdXNlZCBibG9jayBvbiB0aGUgc3RvcmUsIGJlY2F1c2UgdGhlIG1pZ3JhdGVkXG4vLyBkZXNjcmlwdGlvbnMgbGF5IHRoZWlyIGZlYXR1cmUgcnVucyBvdXQgaW4gY29sdW1ucy5cbi8vXG4vLyBDb3JlIHNpemVzIHRoZSBnYXAgZnJvbSBpdHMgb3duIGN1c3RvbSBwcm9wZXJ0eSwgc28gdGhhdCBpcyB3aGF0IGdldHMgZmVkIGhlcmVcbi8vIHJhdGhlciB0aGFuIGEgYGdhcGAgZGVjbGFyYXRpb246IGNvcmUgcHJpbnRzIGEgcGVyLWluc3RhbmNlIHJ1bGUgYXQgZXF1YWxcbi8vIHNwZWNpZmljaXR5IGFuZCBMQVRFUiBpbiB0aGUgZG9jdW1lbnQsIGFuZCBhIHBsYWluIGdhcCBsb3NlcyB0byBpdCBzaWxlbnRseS5cbi8vXG4vLyBDb3JlIHN0YWNrcyBjb2x1bW5zIGF0IDc4MXB4IG9mIGl0cyBvd24gYWNjb3JkLiBUaGF0IGlzIGxlZnQgYWxvbmUg4oCUIHRoaXMgYnJhbmRcbi8vIGhhcyBubyByZWFzb24gdG8gZGlzYWdyZWUgd2l0aCBpdCwgYW5kIG92ZXJyaWRpbmcgdGhlIGJyZWFrcG9pbnQgd291bGQgbWVhblxuLy8gcmUtaW1wbGVtZW50aW5nIHRoZSBzdGFja2luZyBydWxlcyB1bmRlcm5lYXRoIGl0LlxuXG4ud3AtYmxvY2stY29sdW1ucyB7XG5cblx0Ly8gRmVlZHMgY29yZSdzIG93biBnYXAgcHJvcGVydHksIG5vdCBhIGJyYW5kIHRva2VuLlxuXHQtLXdwLS1zdHlsZS0tYmxvY2stZ2FwOiB2YXIoLS1zcGFjZS04KTsgLy8gc2Nzcy1ydWxlLWxpbnQ6IGFsbG93LWRlY2xcblxuXHRtYXJnaW4tYmxvY2s6IHZhcigtLXNwYWNlLTgpO1xuXG59XG5cbi53cC1ibG9jay1jb2x1bW4ge1xuXG5cdC8vIEEgY29sdW1uIHdob3NlIGNvbnRlbnQgaXMgYSBncm91cCB3aXRoIGEgZ3JvdW5kIG9mIGl0cyBvd24gc2hvdWxkIG5vdCBhbHNvXG5cdC8vIGNhcnJ5IHRoZSBnYXAgYXMgcGFkZGluZyDigJQgdGhlIGdyb3VuZCB3b3VsZCByZWFkIGFzIGluc2V0LlxuXHRtaW4td2lkdGg6IDA7XG5cbn1cbiIsIi8vIGNvcmUvY292ZXIuXG4vL1xuLy8gMywzNTMgcHJvZHVjdHMuXG4vL1xuLy8gQ09MT1VSIElTIENPUkUnUywgTk9UIE9VUlMsIEFORCBUSEUgQU5BVE9NWSBJUyBOT1QgV0hBVCBJVCBMT09LUyBMSUtFLlxuLy9cbi8vIEFuIGVhcmxpZXIgdmVyc2lvbiBvZiB0aGlzIHBhcnRpYWwgc2V0IGxpZ2h0IHRleHQgb25cbi8vIGAud3AtYmxvY2stY292ZXIuaGFzLWJhY2tncm91bmQtZGltYC4gVGhhdCBzZWxlY3RvciBtYXRjaGVzIG5vdGhpbmc6IHRoZSBkaW1cbi8vIGNsYXNzIGxpdmVzIG9uIGEgQ0hJTEQsIGA8c3BhbiBjbGFzcz1cIndwLWJsb2NrLWNvdmVyX19iYWNrZ3JvdW5kXG4vLyBoYXMtYmFja2dyb3VuZC1kaW0gaGFzLWJhY2tncm91bmQtZGltLU5cIj5gLCBuZXZlciBvbiB0aGUgY292ZXIgaXRzZWxmLiBUaGUgcnVsZVxuLy8gY29tcGlsZWQsIHNoaXBwZWQsIGFuZCBkaWQgbm90aGluZyDigJQgd2hpY2ggaXMgdGhlIHNoYXBlIG9mIGZhdWx0IHRoaXMgd2hvbGVcbi8vIHNpbG8gZXhpc3RzIHRvIGF2b2lkLCBzbyBpdCBpcyB3cml0dGVuIGRvd24gcmF0aGVyIHRoYW4gcXVpZXRseSBkZWxldGVkLlxuLy9cbi8vIFdoYXQgY29yZSBhY3R1YWxseSBkb2VzOiBpdCBtZWFzdXJlcyB0aGUgYmFja2dyb3VuZCBhdCBpbnNlcnQgdGltZSBhbmQgc3RhbXBzXG4vLyBgaXMtbGlnaHRgIG9yIGBpcy1kYXJrYCBvbiB0aGUgY292ZXIsIHRoZW4gcGFpbnRzIHRoZSB0ZXh0IGFjY29yZGluZ2x5LiBTbyBhXG4vLyBjb3ZlciB3aG9zZSB0ZXh0IHJlYWRzIGJsYWNrIG92ZXIgYSBkYXJrIHBob3RvZ3JhcGggaXMgY29yZSByZXBvcnRpbmcgdGhhdCBpdFxuLy8ganVkZ2VkIHRoZSBpbWFnZSBsaWdodCDigJQgdXN1YWxseSBiZWNhdXNlIHRoZSBvdmVybGF5IG9wYWNpdHkgaXMgMCBhbmQgdGhlXG4vLyBzYW1wbGVkIGFyZWEgZ2VudWluZWx5IGlzLiBUaGUgZml4IGlzIGluIHRoZSBlZGl0b3IsIG9uIHRoYXQgYmxvY2s6IHJhaXNlIHRoZVxuLy8gb3ZlcmxheSwgb3Igc2V0IHRoZSB0ZXh0IGNvbG91ci4gT3ZlcnJpZGluZyBpdCBoZXJlIHdvdWxkIGJyZWFrIGV2ZXJ5IGNvdmVyXG4vLyB3aGVyZSBjb3JlIGdvdCBpdCByaWdodCwgd2hpY2ggaXMgbW9zdCBvZiB0aGVtLlxuLy9cbi8vIFRoaXMgcGFydGlhbCB0aGVyZWZvcmUgdGFrZXMgdGhlIHN1cmZhY2UgYW5kIG5vdGhpbmcgZWxzZS5cblxuLy8gQSBjb3ZlciBpbnNpZGUgdGhlIGRlc2NyaXB0aW9uIHBhbmVsIEJMRUVEUyB0byB0aGUgcGFuZWwncyBlZGdlLiBJdCBpcyBhIGJhbmQsXG4vLyBhbmQgYSBiYW5kIGluc2V0IGJ5IDMwcHggb2Ygd2hpdGUgZWl0aGVyIHNpZGUgd2l0aCByb3VuZGVkIGNvcm5lcnMgcmVhZHMgYXMgYVxuLy8gbWlzdGFrZSByYXRoZXIgdGhhbiBhcyBhIGJhbmQuIFRoZSBwYWlyIGlzIGxvYWQtYmVhcmluZzogdGhlIG5lZ2F0aXZlIGlubGluZVxuLy8gbWFyZ2luIHB1bGxzIGl0IG91dCBvdmVyIHRoZSBwYW5lbCdzIHBhZGRpbmcsIGFuZCB0aGUgbWF0Y2hpbmcgd2lkdGggcHV0cyBiYWNrXG4vLyB3aGF0IHRoZSBtYXJnaW4gdG9vaywgb3IgdGhlIGJsb2NrIGVuZHMgdXAgNjBweCBuYXJyb3dlciB0aGFuIGl0cyBjb250YWluZXIuXG4vL1xuLy8gVGhlIHJhZGl1cyBnb2VzIHdpdGggaXQg4oCUIGEgZnVsbC1ibGVlZCBiYW5kIGhhcyBubyBjb3JuZXJzIHRvIHJvdW5kLlxuLmNvbnRlbnQgPiAud3AtYmxvY2stY292ZXIge1xuXG5cdHdpZHRoOiBjYWxjKCAxMDAlICsgdmFyKC0tc3BhY2UtY2FyZC1wYWRkaW5nKSAqIDIgKTtcblx0bWFyZ2luLWJsb2NrOiB2YXIoLS1zcGFjZS04KTtcblx0bWFyZ2luLWlubGluZTogY2FsYyggdmFyKC0tc3BhY2UtY2FyZC1wYWRkaW5nKSAqIC0xICk7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTEyKSB2YXIoLS1zcGFjZS04KTtcblx0Ym9yZGVyLXJhZGl1czogMDtcblxufVxuXG4vLyBBbnl3aGVyZSBlbHNlIOKAlCBhIGNvdmVyIG5lc3RlZCBpbiBhIGNvbHVtbiwgc2F5IOKAlCBpdCBzdGF5cyBhIHN1cmZhY2UuXG4ud3AtYmxvY2stY292ZXIge1xuXG5cdG1hcmdpbi1ibG9jazogdmFyKC0tc3BhY2UtOCk7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTEyKSB2YXIoLS1zcGFjZS04KTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWNhcmQpO1xuXG59XG5cbi8vIEhlYWRpbmdzIGluc2lkZSBhIGNvdmVyIGluaGVyaXQgdGhlIGNvdmVyJ3MgY29sb3VyIHJhdGhlciB0aGFuIHRoZSBwYWdlJ3MsIHNvXG4vLyBjb3JlJ3MgaXMtbGlnaHQgLyBpcy1kYXJrIGRlY2lzaW9uIHJlYWNoZXMgdGhlbSB0b28uXG4vL1xuLy8gVGhleSBhbHNvIHRha2UgdGhlIGJhbmQgd2VpZ2h0IHJhdGhlciB0aGFuIGEgaGVhZGluZyB3ZWlnaHQ6IHNldCBvdmVyIGFcbi8vIHBob3RvZ3JhcGggYXQgY292ZXIgc2NhbGUsIHRoZSBicmFuZCdzIGxpZ2h0IHN0ZXAgaXMgd2hhdCByZWFkcyBhcyB0aGUgZGVzaWduLFxuLy8gYW5kIGFueXRoaW5nIGhlYXZpZXIgcmVhZHMgYXMgYSBjYXB0aW9uIHNob3V0aW5nLlxuLndwLWJsb2NrLWNvdmVyIC53cC1ibG9jay1oZWFkaW5nIHtcblxuXHRtYXJnaW4tYmxvY2s6IHZhcigtLXNwYWNlLTgpIHZhcigtLXNwYWNlLTMpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbGlnaHQpO1xuXHRjb2xvcjogaW5oZXJpdDtcblxufVxuXG4vLyBBIGhlYWRpbmcgYW5kIHRoZSBwYXJhZ3JhcGggdW5kZXIgaXQgYXJlIG9uZSB1bml0LiBMZWZ0IGFsb25lLCB0aGUgcGFyYWdyYXBoXG4vLyBhbHNvIHRha2VzIHRoZSBmcmFtZXdvcmsncyBkb2N1bWVudCByaHl0aG0gb24gdG9wIG9mIHRoZSBoZWFkaW5nJ3Mgb3duIGJvdHRvbVxuLy8gbWFyZ2luLCBhbmQgdGhlIHR3byByZWFkIGFzIHNlcGFyYXRlIGJsb2Nrcy5cbi53cC1ibG9jay1jb3ZlciAud3AtYmxvY2staGVhZGluZyArICoge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogMDtcblxufVxuXG4vLyBBIGhlYWRpbmcgdGhhdCBPUEVOUyB0aGUgY292ZXIgbmVlZHMgbm8gc3BhY2UgYWJvdmUgaXQg4oCUIHRoZSBjb3ZlcidzIG93blxuLy8gcGFkZGluZyBpcyB0aGF0IHNwYWNlLCBhbmQgZG91YmxpbmcgaXQgcHVzaGVzIHRoZSBjb250ZW50IG9mZiBjZW50cmUuIE9uZSB0aGF0XG4vLyBmb2xsb3dzIGFueXRoaW5nIGVsc2UgZG9lcywgb3IgaXQgc2l0cyBvbiB0aGUgbGluZSBiZWZvcmUgaXQuXG4ud3AtYmxvY2stY292ZXIgLndwLWJsb2NrLWhlYWRpbmc6Zmlyc3QtY2hpbGQge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogMDtcblxufVxuXG4ud3AtYmxvY2stY292ZXIgLndwLWJsb2NrLWhlYWRpbmc6bGFzdC1jaGlsZCB7XG5cblx0bWFyZ2luLWJsb2NrLWVuZDogMDtcblxufVxuIiwiLy8gUGFyYWdvbiBHYW1pbmcg4oCUIGNvcmUvZGV0YWlsc1xuLy9cbi8vIFRoZSBGQVEsIGNvbXBvc2VkIGZyb20gY29yZSBibG9ja3MgcmF0aGVyIHRoYW4gYnVpbHQgYXMgb25lLlxuLy9cbi8vIFdIWSBUSEVSRSBJUyBOTyBmYXEtYWNjb3JkaW9uIEJMT0NLLiBgY29yZS9kZXRhaWxzYCBJUyBhIGA8ZGV0YWlscz5gIGFuZFxuLy8gYDxzdW1tYXJ5PmAsIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB0aGUgYnJhbmQncyBvd24gRkFRIGNvbXBvbmVudCB3YXMgYWxyZWFkeVxuLy8gYnVpbHQgb24g4oCUIGl0IG9wZW5zIHdpdGggbm8gSmF2YVNjcmlwdCwgYSBzZWFyY2ggZW5naW5lIGFuZCBhIHNjcmVlbiByZWFkZXJcbi8vIHNlZSBldmVyeSBhbnN3ZXIgd2hldGhlciBvciBub3QgaXRzIHJvdyBpcyBvcGVuLCBhbmQgdGhlIHBsYXRmb3JtJ3Mgb3duXG4vLyBmcmFnbWVudC1yZXZlYWwgb3BlbnMgYSBjbG9zZWQgcm93IHdoZW4gYSBsaW5rIHBvaW50cyBpbnNpZGUgaXQuIEEgY3VzdG9tXG4vLyBibG9jayB3b3VsZCBoYXZlIHJlYnVpbHQgYWxsIG9mIHRoYXQgdG8gYXJyaXZlIGF0IHRoZSBzYW1lIGVsZW1lbnQuIE9wZXJhdG9yJ3Ncbi8vIGNhbGwsIDIwMjYtMDktMTcuXG4vL1xuLy8gV0hBVCBDSEFOR0VTIElTIFRIRSBNQVJLVVAsIE5PVCBUSEUgTE9PSy4gYGNvbXBvbmVudHMvX2ZhcS1hY2NvcmRpb24uc2Nzc2Bcbi8vIHN0eWxlcyBlbGVtZW50IGNsYXNzZXMgdGhpcyBicmFuZCBlbWl0cyDigJQgYF9fc3VtbWFyeWAsIGBfX3F1ZXN0aW9uYCxcbi8vIGBfX21hcmtlcmAsIGBfX2Fuc3dlcmAuIENvcmUgZW1pdHMgYC53cC1ibG9jay1kZXRhaWxzYCwgYSBiYXJlIGA8c3VtbWFyeT5gIGFuZFxuLy8gdGhlIGFuc3dlciBhcyBvcmRpbmFyeSBpbm5lciBibG9ja3MsIHNvIHRoZSBzYW1lIHRyZWF0bWVudCBoYXMgdG8gYmUgd3JpdHRlblxuLy8gYWdhaW5zdCBkaWZmZXJlbnQgc2VsZWN0b3JzLlxuLy9cbi8vIOKaoCBJVCBJUyBSRVNUQVRFRCwgTk9UIEBleHRlbmQtZWQsIEFORCBUSEFUIFdBUyBOT1QgVEhFIEZJUlNUIENIT0lDRS4gU2FzcydzXG4vLyBtb2R1bGUgc3lzdGVtIHNjb3BlcyBgQGV4dGVuZGAgdG8gdGhlIGZpbGUgaXQgYXBwZWFycyBpbiBhbmQgdGhlIGZpbGVzIHRoYXRcbi8vIGxvYWQgVEhBVCBmaWxlIOKAlCBsb2FkaW5nIHRoZSBjb21wb25lbnQgZnJvbSBoZXJlIGRvZXMgbm90IG1ha2UgaXRzIHNlbGVjdG9yc1xuLy8gcmVhY2hhYmxlLCB3aGljaCB0aGUgYnVpbGQgc2F5cyBwbGFpbmx5IG9uY2UgeW91IHRyeSBpdC4gVGhlIGNvbXBvbmVudCBhbHNvXG4vLyBoYXMgbm8gc3RhbmRhbG9uZSBgLmZhcS1hY2NvcmRpb25fX2l0ZW1gIHJ1bGUgdG8gZXh0ZW5kIGV2ZW4gd2l0aGluIGEgbW9kdWxlOlxuLy8gaXQgZXhpc3RzIG9ubHkgaW4gY29tcG91bmQgc2VsZWN0b3JzLiBTbyB0aGUgdmFsdWVzIGxpdmUgaW4gdHdvIHBsYWNlcyB1bnRpbFxuLy8gdGhlIFBIUCBmdW5uZWwgYmFuZHMgcmV0aXJlIGF0IHRoZSBwcmUtbGF1bmNoIHRpZHktdXAsIGF0IHdoaWNoIHBvaW50IHRoZVxuLy8gY29tcG9uZW50IGlzIHRoZSBvbmUgdGhhdCBnb2VzIGFuZCB0aGlzIGZpbGUgaXMgdGhlIG9ubHkgRkFRIHN0eWxpbmcgbGVmdC5cbi8vXG4vLyBUSEUgTUFSS0VSIElTIERSQVdOIElOIENTUywgYW5kIHRoYXQgaXMgYSBkZWxpYmVyYXRlIGRlcGFydHVyZS4gRXZlcnl3aGVyZVxuLy8gZWxzZSB0aGUgYnJhbmQncyBjaGV2cm9uIGlzIHRoZSBzaGFyZWQgU1ZHIHNwcml0ZSwgYnV0IGEgY29yZSBibG9jayBnaXZlcyBub1xuLy8gZWxlbWVudCB0byBwdXQgb25lIGluIGFuZCBubyBmaWx0ZXIgd29ydGggcmVhY2hpbmcgZm9yLiBBIGJvcmRlciBjaGV2cm9uIGlzXG4vLyB0aGUgc2FtZSBzaGFwZSBhdCB0aGUgc2FtZSBhbmdsZTsgaXQgdHVybnMgdGhlIHNhbWUgd2F5IG9uIG9wZW4uXG5cblxuLndwLWJsb2NrLWRldGFpbHMgKyAud3AtYmxvY2stZGV0YWlscyB7XG5cblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xufVxuXG4ud3AtYmxvY2stZGV0YWlsc1tvcGVuXSB7XG5cblx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY2FyZC1ob3Zlcik7XG5cdGJvcmRlci1pbmxpbmUtc3RhcnQ6IDNweCBzb2xpZCB2YXIoLS1jb2xvci1icmFuZCk7XG59XG5cbi8qIENvcmUncyBvd24gd3JhcHBlciBjYXJyaWVzIG5vIG1lYXN1cmUsIHNvIHRoZSBiYW5kIHdvdWxkIG90aGVyd2lzZSBydW4gdGhlXG4gICBmdWxsIHdpZHRoIG9mIHRoZSBjb2x1bW4gd2hpbGUgdGhlIGNvbXBvbmVudCBpdCBtYXRjaGVzIGlzIGhlbGQgdG8gdGhlXG4gICByZWFkaW5nIG1lYXN1cmUuICovXG4uZG9jLXNlY3Rpb24gLndwLWJsb2NrLWRldGFpbHM6Zmlyc3Qtb2YtdHlwZSB7XG5cblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zcGFjZS04KTtcblx0Ym9yZGVyLWJsb2NrLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xufVxuXG4uZG9jLXNlY3Rpb24gLndwLWJsb2NrLWRldGFpbHM6bGFzdC1vZi10eXBlIHtcblxuXHRib3JkZXItYmxvY2stZW5kOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWRlZmF1bHQpO1xufVxuXG4ud3AtYmxvY2stZGV0YWlscyA+IHN1bW1hcnkge1xuXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cdGdhcDogdmFyKC0tc3BhY2UtNik7XG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTQpO1xuXHRsaXN0LXN0eWxlOiBub25lO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1oZWFkaW5nKTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1oNCk7XG5cdGZvbnQtd2VpZ2h0OiB2YXIoLS1mdy1tZWRpdW0pO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtaGVhZGluZyk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LWhlYWRpbmcpO1xufVxuXG4vKiBUaGUgYnJvd3NlcidzIG93biBkaXNjbG9zdXJlIHRyaWFuZ2xlLCByZW1vdmVkIGluIGJvdGggZGlhbGVjdHMg4oCUIHRoZSBicmFuZFxuICAgc3VwcGxpZXMgaXRzIG93biBtYXJrZXIgYmVsb3cuICovXG4ud3AtYmxvY2stZGV0YWlscyA+IHN1bW1hcnk6Oi13ZWJraXQtZGV0YWlscy1tYXJrZXIge1xuXG5cdGRpc3BsYXk6IG5vbmU7XG59XG5cbi53cC1ibG9jay1kZXRhaWxzID4gc3VtbWFyeTo6bWFya2VyIHtcblxuXHRjb250ZW50OiBcIlwiO1xufVxuXG4ud3AtYmxvY2stZGV0YWlscyA+IHN1bW1hcnk6aG92ZXIge1xuXG5cdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWNhcmQtaG92ZXIpO1xufVxuXG4ud3AtYmxvY2stZGV0YWlscyA+IHN1bW1hcnk6Zm9jdXMtdmlzaWJsZSB7XG5cblx0b3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWJvcmRlci1mb2N1cyk7XG5cdG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xufVxuXG4ud3AtYmxvY2stZGV0YWlsc1tvcGVuXSA+IHN1bW1hcnkge1xuXG5cdHBhZGRpbmctaW5saW5lLXN0YXJ0OiBjYWxjKCB2YXIoLS1zcGFjZS00KSAtIDNweCApO1xuXHRjb2xvcjogdmFyKC0tdGV4dC1saW5rKTtcbn1cblxuLyogVGhlIGNoZXZyb24sIGF0IHRoZSBmYXIgZW5kIG9mIHRoZSByb3cg4oCUIHRoZSBzYW1lIHBvc2l0aW9uIGFuZCB0aGUgc2FtZVxuICAgZGlyZWN0aW9uIHRoZSBzdG9yZSBzaWRlYmFyIGFuZCB0aGUgbWFpbiBuYXZpZ2F0aW9uIGFscmVhZHkgdXNlIHRvIHNheSBhXG4gICB0aGluZyBvcGVucy4gKi9cbi53cC1ibG9jay1kZXRhaWxzID4gc3VtbWFyeTo6YWZ0ZXIge1xuXG5cdGNvbnRlbnQ6IFwiXCI7XG5cdGZsZXg6IDAgMCBhdXRvO1xuXHR3aWR0aDogOXB4O1xuXHRoZWlnaHQ6IDlweDtcblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiAwLjQ1ZW07XG5cdGJvcmRlci1pbmxpbmUtZW5kOiAycHggc29saWQgdmFyKC0tY29sb3ItYnJhbmQpO1xuXHRib3JkZXItYmxvY2stZW5kOiAycHggc29saWQgdmFyKC0tY29sb3ItYnJhbmQpO1xuXHR0cmFuc2Zvcm06IHJvdGF0ZSggNDVkZWcgKTtcbn1cblxuLndwLWJsb2NrLWRldGFpbHNbb3Blbl0gPiBzdW1tYXJ5OjphZnRlciB7XG5cblx0dHJhbnNmb3JtOiByb3RhdGUoIC0xMzVkZWcgKTtcblx0bWFyZ2luLWJsb2NrLXN0YXJ0OiAwLjdlbTtcbn1cblxuLyogVGhlIGFuc3dlciBpcyB3aGF0ZXZlciBpbm5lciBibG9ja3MgdGhlIG9wZXJhdG9yIHB1dCB0aGVyZSwgc28gdGhlIHBhZGRpbmdcbiAgIGdvZXMgb24gdGhlIGNoaWxkcmVuIHJhdGhlciB0aGFuIG9uIGEgd3JhcHBlciB0aGF0IGRvZXMgbm90IGV4aXN0LiAqL1xuLndwLWJsb2NrLWRldGFpbHMgPiA6bm90KCBzdW1tYXJ5ICkge1xuXG5cdHBhZGRpbmc6IDAgdmFyKC0tc3BhY2UtNCkgdmFyKC0tc3BhY2UtNik7XG5cdG1hcmdpbi1ibG9jazogMDtcblx0c2Nyb2xsLW1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtMTYpO1xufVxuXG4ud3AtYmxvY2stZGV0YWlsc1tvcGVuXSA+IDpub3QoIHN1bW1hcnkgKSB7XG5cblx0cGFkZGluZy1pbmxpbmUtc3RhcnQ6IGNhbGMoIHZhcigtLXNwYWNlLTQpIC0gM3B4ICk7XG59XG5cbkBtZWRpYSAoIG1heC13aWR0aDogNjQwcHggKSB7XG5cblx0LndwLWJsb2NrLWRldGFpbHMgPiBzdW1tYXJ5IHtcblxuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtYm9keSk7XG5cdH1cblxuXHQud3AtYmxvY2stZGV0YWlscyA+IDpub3QoIHN1bW1hcnkgKSB7XG5cblx0XHRwYWRkaW5nLWlubGluZTogdmFyKC0tc3BhY2UtMyk7XG5cdH1cblxuXHQud3AtYmxvY2stZGV0YWlsc1tvcGVuXSA+IDpub3QoIHN1bW1hcnkgKSB7XG5cblx0XHRwYWRkaW5nLWlubGluZS1zdGFydDogY2FsYyggdmFyKC0tc3BhY2UtMykgLSAzcHggKTtcblx0fVxufVxuIiwiLy8gY29yZS9lbWJlZC5cbi8vXG4vLyA4MDQgcHJvZHVjdHMg4oCUIG1hbnVmYWN0dXJlciB2aWRlb3MsIGFsbW9zdCBhbGwgWW91VHViZS5cbi8vXG4vLyBDb3JlIGFscmVhZHkgc2hpcHMgdGhlIHJlc3BvbnNpdmUgd3JhcHBlciAoYC53cC1ibG9jay1lbWJlZF9fd3JhcHBlcmAgd2l0aCBpdHNcbi8vIGFzcGVjdC1yYXRpbyBjbGFzc2VzKSwgc28gdGhpcyBhZGRzIHRoZSBicmFuZCdzIHN1cmZhY2UgdHJlYXRtZW50IGFuZCBub3RoaW5nXG4vLyBzdHJ1Y3R1cmFsLiBUYWtpbmcgb3ZlciB0aGUgcmF0aW8gd291bGQgbWVhbiByZS1pbXBsZW1lbnRpbmcgd2hhdCBjb3JlIG1haW50YWluc1xuLy8gcGVyIHByb3ZpZGVyLlxuXG4ud3AtYmxvY2stZW1iZWQge1xuXG5cdG1hcmdpbi1ibG9jazogdmFyKC0tc3BhY2UtOCk7XG5cblx0aWZyYW1lIHtcblxuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblxuXHR9XG5cbn1cbiIsIi8vIGNvcmUvZ3JvdXAuXG4vL1xuLy8gOTQzIHByb2R1Y3RzLCBhbmQgaXQgaXMgdGhlIGJsb2NrIHRoZSBsZWdhY3kgc3BlYyBwaWxscyBhcmUgYnVpbHQgZnJvbSDigJQgZWFjaFxuLy8gcGlsbCBpcyBhIGdyb3VwIHdpdGggYSBiYWNrZ3JvdW5kIGNvbG91ciBpbnNpZGUgYSBjb2x1bW4uXG4vL1xuLy8gQ0hJTERSRU4gTkVTVCBPTkUgTEVWRUwgREVFUEVSIHRoYW4gdGhleSBsb29rLiBDb3JlIHdyYXBzIHRoZW0gaW5cbi8vIGAud3AtYmxvY2stZ3JvdXBfX2lubmVyLWNvbnRhaW5lcmAsIHNvIGEgYD4gKmAgcnVsZSBvbiB0aGUgZ3JvdXAgbWF0Y2hlcyB0aGVcbi8vIHdyYXBwZXIgYW5kIG5vdCB0aGUgY29udGVudC4gVGhhdCBpcyB3aGF0IHNpbGVudGx5IGtpbGxlZCB0aHJlZSBvZiBmb3VyXG4vLyBhbGlnbm1lbnQgYnJlYWtvdXRzIG9uIEFSVFNBQkVSUy5cblxuLndwLWJsb2NrLWdyb3VwIHtcblxuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtY2FyZCk7XG5cbn1cblxuLy8gQSBncm91cCBvbmx5IGdldHMgcGFkZGluZyB3aGVuIGl0IGNhcnJpZXMgYSBncm91bmQg4oCUIG90aGVyd2lzZSB0aGUgcGFkZGluZ1xuLy8gcmVhZHMgYXMgYSBzdHJheSBpbmRlbnQgaW4gdGhlIG1pZGRsZSBvZiBydW5uaW5nIGNvcHkuXG4ud3AtYmxvY2stZ3JvdXAuaGFzLWJhY2tncm91bmQge1xuXG5cdHBhZGRpbmc6IHZhcigtLXNwYWNlLTYpO1xuXG59XG5cblxuLyogVGhlIHJlc3RvcmVkLXdyYXBwZXIgcmVwYWlyIChgZGlzcGxheTogY29udGVudHNgIG9uIGEgYC5ncmlkYCBncm91cCdzIGlubmVyXG4gICBjb250YWluZXIsIHBsdXMgemVyb2luZyBjb3JlJ3MgZmxvdyBtYXJnaW4gb24gaXRzIGNoaWxkcmVuKSBNT1ZFRCBUTyBHTE9CQUwgb25cbiAgIDIwMjYtMDktMTcg4oCUIGBmcmFtZXdvcmstdjIvZ2xvYmFsL3Njc3MvYmxvY2tzL193cC1ibG9jay1ncm91cC5zY3NzYC5cblxuICAgSXQgaXMgYSBjb25zZXF1ZW5jZSBvZiB0aGUgbm8tYHRoZW1lLmpzb25gIHBvbGljeSBtZWV0aW5nIHRoZSBnbG9iYWwgYC5ncmlkYFxuICAgcHJpbWl0aXZlLCBub3QgYnJhbmQgdm9jYWJ1bGFyeSwgYW5kIEFSVFNBQkVSUyBoYWQgaW5kZXBlbmRlbnRseSB3cml0dGVuIHRoZVxuICAgaWRlbnRpY2FsIHBhaXIuIERvIG5vdCByZS1hZGQgaXQgaGVyZTsgaWYgYSBncmlkIGdyb3VwIHN0YWNrcywgdGhlIGdsb2JhbCBydWxlXG4gICBpcyB0aGUgcGxhY2UgdG8gbG9vay4gKi9cbiIsIi8vIGNvcmUvaGVhZGluZy5cbi8vXG4vLyBXaXRob3V0IHRoaXMsIGFuIG9wZXJhdG9yJ3MgaGVhZGluZyBmYWxscyB0aHJvdWdoIHRvIHRoZSByZXNldCBhbmQgcmVuZGVycyBpblxuLy8gdGhlIEJPRFkgZmFjZSBhdCB0aGUgVUEncyBvd24gc2l6ZXMg4oCUIFBvcHBpbnMgMjRweCBib2xkIHdoZXJlIHRoZSBicmFuZCB3YW50c1xuLy8gVWJ1bnR1IG9uIGl0cyBvd24gc2NhbGUuIEV2ZXJ5IGRlc2NyaXB0aW9uIGNvbXBvc2VkIGluIHRoZSBlZGl0b3Igd2FzIG1pcy10eXBlZFxuLy8gdW50aWwgdGhpcyBsYW5kZWQ7IDMsODc5IG9mIDMsOTEyIHByb2R1Y3RzIGNhcnJ5IGF0IGxlYXN0IG9uZSBoZWFkaW5nLlxuLy9cbi8vIENPTE9VUiBJUyBORVZFUiBTRVQgSEVSRS4gQSBoZWFkaW5nIGluaGVyaXRzIHdoYXRldmVyIGdyb3VuZCBpdCBzaXRzIG9uLCB3aGljaFxuLy8gaXMgd2hhdCBsZXRzIHRoZSBzYW1lIGhlYWRpbmcgcmVhZCBvbiB0aGUgd2hpdGUgcGFuZWwgYW5kIGluc2lkZSBhIGRhcmsgY292ZXJcbi8vIHdpdGhvdXQgdGhlIG9wZXJhdG9yIGNob29zaW5nIGFueXRoaW5nLlxuLy9cbi8vIFdlaWdodCBmb2xsb3dzIHRoZSBicmFuZCdzIHR5cGUgbGF3OiBsaWdodCBhdCBoMiBhbmQgYWJvdmUsIG1lZGl1bSBiZWxvdy4gVGhlXG4vLyB0d28gbGVnaWJpbGl0eSBleGNlcHRpb25zIHRoZSBsYXcgbmFtZXMg4oCUIHRoZSBoZXJvIHRpdGxlIGFuZCBhbnkgdGl0bGUgb3ZlclxuLy8gcGhvdG9ncmFwaHkg4oCUIGFyZSB0ZW1wbGF0ZS1yZW5kZXJlZCwgbm90IG9wZXJhdG9yLWF1dGhvcmVkLCBzbyB0aGV5IGRvIG5vdFxuLy8gYXBwZWFyIGhlcmUuXG5cbi53cC1ibG9jay1oZWFkaW5nIHtcblxuXHRmb250LWZhbWlseTogdmFyKC0tZmYtaGVhZGluZyk7XG5cdGxpbmUtaGVpZ2h0OiB2YXIoLS1saC1oZWFkaW5nKTtcblxuXHQvLyBBc3ltbWV0cmljLCBhbmQgZGVsaWJlcmF0ZWx5IHNvOiBhIGhlYWRpbmcgYmVsb25ncyB0byB3aGF0IGZvbGxvd3MgaXQsIHNvIGl0XG5cdC8vIGNhcnJpZXMgbW9yZSBzcGFjZSBhYm92ZSB0aGFuIGJlbG93LiBOb3RoaW5nIHN1cHBsaWVzIHRoZXNlIG90aGVyd2lzZSDigJQgdGhlXG5cdC8vIHJlc2V0IHplcm9lcyBoZWFkaW5nIG1hcmdpbnMgYW5kIGNvcmUncyBsYXlvdXQgQ1NTIGlzIG5vdCBlbWl0dGVkIHdpdGhvdXQgYVxuXHQvLyB0aGVtZS5qc29uLlxuXHRtYXJnaW4tYmxvY2s6IHZhcigtLXNwYWNlLTgpIHZhcigtLXNwYWNlLTMpO1xuXG59XG5cbmgxLndwLWJsb2NrLWhlYWRpbmcge1xuXG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDEpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbGlnaHQpO1xuXG59XG5cbmgyLndwLWJsb2NrLWhlYWRpbmcge1xuXG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDIpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbGlnaHQpO1xuXG59XG5cbmgzLndwLWJsb2NrLWhlYWRpbmcge1xuXG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDMpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbGlnaHQpO1xuXG59XG5cbmg0LndwLWJsb2NrLWhlYWRpbmcge1xuXG5cdGZvbnQtc2l6ZTogdmFyKC0tZnMtaDQpO1xuXHRmb250LXdlaWdodDogdmFyKC0tZnctbWVkaXVtKTtcblxufVxuXG5oNS53cC1ibG9jay1oZWFkaW5nLFxuaDYud3AtYmxvY2staGVhZGluZyB7XG5cblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5LWxnKTtcblx0Zm9udC13ZWlnaHQ6IHZhcigtLWZ3LW1lZGl1bSk7XG5cbn1cbiIsIi8vIGNvcmUvaW1hZ2UuXG4vL1xuLy8gMyw0MTkgcHJvZHVjdHMuXG4vL1xuLy8gVFdPIERPTSBTSEFQRVMsIGFuZCBhIHNlbGVjdG9yIG1hdGNoaW5nIG9uZSBzaWxlbnRseSBtaXNzZXMgdGhlIG90aGVyOiBjb3JlXG4vLyBlbWl0cyBgZmlndXJlLndwLWJsb2NrLWltYWdlYCBmb3IgdGhlIGRlZmF1bHQsIHdpZGUgYW5kIGZ1bGwgYWxpZ25tZW50cywgYnV0XG4vLyBgZGl2LndwLWJsb2NrLWltYWdlID4gZmlndXJlYCBmb3IgYWxpZ25jZW50ZXIg4oCUIHRoZSBjbGFzcyBsYW5kcyBvbiB0aGUgaW5uZXJcbi8vIGZpZ3VyZSB0aGVyZS4gQm90aCBhcmUgbWF0Y2hlZCBiZWxvdy5cbi8vXG4vLyBFdmVyeSBzdXJmYWNlIG9uIHRoaXMgYnJhbmQgdGFrZXMgdGhlIG9uZSBjYXJkIHJhZGl1czsgYW4gaW1hZ2UgaXMgYSBzdXJmYWNlLlxuXG46aXMoIGZpZ3VyZS53cC1ibG9jay1pbWFnZSwgZGl2LndwLWJsb2NrLWltYWdlID4gZmlndXJlICkge1xuXG5cdG1hcmdpbi1ibG9jazogdmFyKC0tc3BhY2UtNik7XG5cblx0aW1nIHtcblxuXHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblxuXHR9XG5cbn1cblxuLndwLWJsb2NrLWltYWdlIGZpZ2NhcHRpb24ge1xuXG5cdG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc3BhY2UtMyk7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1zbWFsbCk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcblxufVxuIiwiLy8gY29yZS9saXN0LlxuLy9cbi8vIDMsMjQ1IHByb2R1Y3RzLiBNYW51ZmFjdHVyZXIgY29weSBsZWFucyBvbiBsaXN0cyBoZWF2aWx5IOKAlCBmZWF0dXJlIHJ1bnMsIHNwZWNcbi8vIGJ1bGxldHMsIGJveCBjb250ZW50cyDigJQgc28gdGhlIGluZGVudCBhbmQgdGhlIG1hcmtlciBtYXR0ZXIgbW9yZSBoZXJlIHRoYW4gdGhleVxuLy8gd291bGQgb24gYW4gZWRpdG9yaWFsIHNpdGUuXG4vL1xuLy8gVGhlIG1hcmtlciB0YWtlcyB0aGUgYnJhbmQgYmx1ZTogaXQgaXMgdGhlIG9uZSBwbGFjZSBpbiBydW5uaW5nIGNvcHkgd2hlcmUgdGhlXG4vLyBicmFuZCBjb2xvdXIgYXBwZWFycyB3aXRob3V0IGJlaW5nIGEgbGluaywgYW5kIGl0IGRvZXMgdGhlIHdvcmsgb2Ygc2VwYXJhdGluZyBhXG4vLyBzcGVjIHJ1biBmcm9tIHRoZSBwcm9zZSBhcm91bmQgaXQuXG5cbi53cC1ibG9jay1saXN0IHtcblxuXHRtYXJnaW4tYmxvY2s6IHZhcigtLXNwYWNlLTQpO1xuXHRwYWRkaW5nLWlubGluZS1zdGFydDogdmFyKC0tc3BhY2UtNik7XG5cdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0Zm9udC1zaXplOiB2YXIoLS1mcy1ib2R5KTtcblx0bGluZS1oZWlnaHQ6IHZhcigtLWxoLWJvZHkpO1xuXG5cdGxpIHtcblxuXHRcdG1hcmdpbi1ibG9jay1lbmQ6IHZhcigtLXNwYWNlLTIpO1xuXG5cdH1cblxuXHQvLyBUaGUgZnJhbWV3b3JrIHJlc2V0IHNldHMgYGxpc3Qtc3R5bGU6IG5vbmVgLCBzbyB0aGUgbmF0aXZlIG1hcmtlciBpcyBnb25lXG5cdC8vIGFuZCBjb2xvdXJpbmcgYDo6bWFya2VyYCBwYWludHMgbm90aGluZy4gVGhlIGJ1bGxldCBpcyBkcmF3biBpbnN0ZWFkLCB3aGljaFxuXHQvLyBpcyBhbHNvIHdoYXQgdGhlIG9sZCBzdG9yZSBkaWQg4oCUIGFuZCBhIGRyYXduIGJ1bGxldCBjYW4gYmUgc2l6ZWQgYW5kIHBsYWNlZCxcblx0Ly8gd2hpY2ggYSBuYXRpdmUgb25lIGNhbm5vdC5cblx0bGkge1xuXG5cdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXG5cdH1cblxuXHRsaTo6YmVmb3JlIHtcblxuXHRcdGNvbnRlbnQ6IFwiXCI7XG5cdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdGluc2V0LWlubGluZS1zdGFydDogY2FsYyggdmFyKC0tc3BhY2UtNCkgKiAtMSApO1xuXHRcdGluc2V0LWJsb2NrLXN0YXJ0OiAwLjZlbTtcblx0XHR3aWR0aDogNnB4O1xuXHRcdGhlaWdodDogNnB4O1xuXHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1waWxsKTtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1icmFuZCk7XG5cblx0fVxuXG59XG4iLCIvLyBjb3JlL21lZGlhLXRleHQuXG4vL1xuLy8gMyw1NDUgcHJvZHVjdHMuIFRoZSB3b3JraG9yc2Ugb2YgdGhlIG1pZ3JhdGVkIGNvcHk6IGFuIGltYWdlIGJlc2lkZSBhIGZlYXR1cmVcbi8vIHBhcmFncmFwaCwgYWx0ZXJuYXRpbmcgZG93biB0aGUgZGVzY3JpcHRpb24uXG4vL1xuLy8gVEhFIENPTlRFTlQgUEFORSBORUVEUyBUV08gQ0xBU1NFUy4gQ29yZSBzaGlwc1xuLy8gYC53cC1ibG9jay1tZWRpYS10ZXh0ID4gLndwLWJsb2NrLW1lZGlhLXRleHRfX2NvbnRlbnRgIGFuZCBhIGZsYXQgb25lLWNsYXNzIHJ1bGVcbi8vIGxvc2VzIHRvIGl0LCBsZWF2aW5nIHRoZSBwYW5lIG9uIGNvcmUncyBvd24gOCUgcGVyY2VudGFnZSBpbnNldC4gUmVjb3JkZWQgb25cbi8vIEFSVFNBQkVSUzsgdGhlIHNhbWUgcnVsZSBhcHBsaWVzIGhlcmUuXG5cbi53cC1ibG9jay1tZWRpYS10ZXh0IHtcblxuXHRtYXJnaW4tYmxvY2s6IHZhcigtLXNwYWNlLTgpO1xuXHRib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtY2FyZCk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5cbn1cblxuLndwLWJsb2NrLW1lZGlhLXRleHQgPiAud3AtYmxvY2stbWVkaWEtdGV4dF9fY29udGVudCB7XG5cblx0cGFkZGluZzogdmFyKC0tc3BhY2UtOCk7XG5cbn1cblxuLndwLWJsb2NrLW1lZGlhLXRleHRfX21lZGlhIGltZyB7XG5cblx0Ym9yZGVyLXJhZGl1czogMDtcblxufVxuIiwiLy8gY29yZS9wYXJhZ3JhcGguXG4vL1xuLy8gT24gMyw5MDMgb2YgMyw5MTIgcHJvZHVjdHMsIHNvIHRoaXMgaXMgdGhlIG9uZSB0aGF0IGRlY2lkZXMgd2hhdCBhIGRlc2NyaXB0aW9uXG4vLyByZWFkcyBsaWtlLlxuLy9cbi8vIEludGVyZmFjZSBzaXppbmcsIG5vdCBwcm9zZSBzaXppbmc6IGEgcHJvZHVjdCBkZXNjcmlwdGlvbiBzaXRzIGJlc2lkZSBhIGJ1eSBib3hcbi8vIGFuZCBhIHNwZWMgdGFibGUsIGFuZCBpcyByZWFkIGluIGdsYW5jZXMgcmF0aGVyIHRoYW4gc2V0dGxlZCBpbnRvLiBUaGUgYnJhbmQgaGFzXG4vLyBvbmUgYm9keSBzdGVwIGFuZCB0aGlzIHVzZXMgaXQuXG4vL1xuLy8gTm8gY29sb3VyLCBubyBtYXgtd2lkdGguIFRoZSBtZWFzdXJlIGlzIHRoZSBwYW5lbCdzLCBzZXQgYnkgYC5jb250ZW50YC5cblxuLndwLWJsb2NrLXBhcmFncmFwaCB7XG5cblx0Zm9udC1mYW1pbHk6IHZhcigtLWZmLWJvZHkpO1xuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHkpO1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGgtYm9keSk7XG5cbn1cblxuLy8gQ29yZSdzIG93biBcImxhcmdlciB0ZXh0XCIgdG9nZ2xlLCBrZXB0IG9uIHRoZSBicmFuZCBzY2FsZSByYXRoZXIgdGhhbiBjb3JlJ3MgcmVtLlxuLndwLWJsb2NrLXBhcmFncmFwaC5oYXMtbGFyZ2UtZm9udC1zaXplIHtcblxuXHRmb250LXNpemU6IHZhcigtLWZzLWJvZHktbGcpO1xuXG59XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgc3BlYyBwaWxsc1xuLy9cbi8vIFRoZSBzdGF0IHJvdyBpbnNpZGUgYSBwcm9kdWN0IGRlc2NyaXB0aW9uOiBhIGZpZ3VyZSBhbmQgaXRzIGxhYmVsIGluIGFcbi8vIGJsdWUtb3V0bGluZWQgcGlsbCwgdGhyZWUgb3IgZm91ciBhY3Jvc3MuIEF1dGhvcmVkIGluIHRoZSBibG9jayBlZGl0b3IgYXMgYVxuLy8gY29yZS9jb2x1bW5zIGJsb2NrIGNhcnJ5aW5nIGAuc3BlYy1waWxsc2AsIHdoaWNoIGlzIHdoeSB0aGlzIGlzIGEgQkxPQ0sgcGFydGlhbFxuLy8gYW5kIG5vdCBhIGNvbXBvbmVudCDigJQgbm90aGluZyBpbiB0aGUgdGhlbWUgcmVuZGVycyBpdCwgdGhlIGNvbnRlbnQgZG9lcy5cbi8vXG4vLyBJdCBhcnJpdmVkIHdpdGggdGhlIG1pZ3JhdGlvbiBhcyBgLnVncC1zcGVjcy1ibG9ja2AsIHRoZSBvbGQgc3RvcmUncyBvd24gY2xhc3MsXG4vLyBhbmQgd2FzIHJlbmFtZWQgYWNyb3NzIHRoZSBmb3VyIHBhdHRlcm5zIGFuZCA3MzIgZGVzY3JpcHRpb25zIG9uIDIwMjYtMDktMTYgc29cbi8vIHRoZSBicmFuZCdzIG1hcmt1cCBjYXJyaWVzIGEgYnJhbmQgbmFtZS4gVGhlIHBhdHRlcm4gaXMgdGhlIHRoaW5nIHRvIGtlZXAgaW5cbi8vIHN0ZXA6IHJlLWN1dCBvbmUgd2l0aCB0aGUgb2xkIGNsYXNzIGFuZCBpdCB3aWxsIHJlbmRlciB1bnN0eWxlZC5cbi8vXG4vLyBUaGUgdHJlYXRtZW50IGlzIG1lYXN1cmVkIG9mZiB0aGUgb2xkIHN0b3JlIHJhdGhlciB0aGFuIHJlZGVzaWduZWQg4oCUIGEgMnB4IGJsdWVcbi8vIG91dGxpbmUgYXQgdGhlIGNhcmQgcmFkaXVzLCBjZW50cmVkIOKAlCB3aGljaCBpcyBhbHNvIHdoYXQgdGhlIG1vY2t1cCBkcmF3cyBhc1xuLy8gYC5maWd1cmUtcm93X19jZWxsYC4gVGhlIGJvcmRlciBpcyB0aGUgYnJhbmQncyBvbmUgZmxvdXJpc2ggaGVyZSwgc28gdGhlIGZpZ3VyZVxuLy8gaW5zaWRlIHN0YXlzIGJsYWNrIGluIHRoZSBib2R5IGZhY2U6IGEgYmx1ZSBmaWd1cmUgaW5zaWRlIGEgYmx1ZSBvdXRsaW5lIHNheXMgaXRcbi8vIHR3aWNlLCBhbmQgdGhlIGNvbW1lcmNlIGZhY2UgYmVsb25ncyB0byBwcmljZXMgYW5kIHRoZSBiYXNrZXQgYnV0dG9uLlxuXG4uc3BlYy1waWxscyB7XG5cblx0bWFyZ2luLWJsb2NrOiB2YXIoLS1zcGFjZS0xMik7XG5cblx0LndwLWJsb2NrLWNvbHVtbiB7XG5cblx0XHRwYWRkaW5nOiB2YXIoLS1zcGFjZS00KSB2YXIoLS1zcGFjZS0zKTtcblx0XHRib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItYnJhbmQpO1xuXHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jYXJkKTtcblx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cblx0fVxuXG5cdC8vIFRoZSBwaWxsJ3MgaW5uZXIgZ3JvdXAgY2FycmllcyB0aGUgb2xkIHBhbGV0dGUncyBibHVlIGdyb3VuZCB3aXRoIHdoaXRlXG5cdC8vIHRleHQuIEluc2lkZSBhIGJvcmRlcmVkIHBpbGwgdGhhdCByZWFkcyBhcyBhIGJhZGdlIG9uIGEgYmFkZ2UsIHNvIHRoZSBncm91bmRcblx0Ly8gaXMgZHJvcHBlZCDigJQgYW5kIHRoZSBURVhUIENPTE9VUiBIQVMgVE8gR08gV0lUSCBJVC4gRHJvcHBpbmcgdGhlIGdyb3VuZCBhbG9uZVxuXHQvLyBsZWF2ZXMgYGhhcy11Z3Atd2hpdGUtY29sb3JgIHBhaW50aW5nIHdoaXRlIHRleHQgb24gYSB3aGl0ZSBwaWxsOiBwcmVzZW50LFxuXHQvLyBjb3JyZWN0IGluIHRoZSBtYXJrdXAsIGFuZCBpbnZpc2libGUuIFRoZSBvbGQgdGhlbWUgY2FycmllZCB0aGUgc2FtZSBvdmVycmlkZVxuXHQvLyBmb3IgdGhlIHNhbWUgcmVhc29uLlxuXHQvL1xuXHQvLyBUaGlzIGlzIHdoeSB0aGUgY29tcGF0aWJpbGl0eSBsYXllcidzIGNvbG91ciBtYXBwaW5ncyBhcmUgc2NvcGVkIHJhdGhlciB0aGFuXG5cdC8vIGdsb2JhbCDigJQgYSBzbHVnIG1lYW5zIHNvbWV0aGluZyBkaWZmZXJlbnQgb25jZSB0aGUgZ3JvdW5kIGl0IHdhcyB3cml0dGVuXG5cdC8vIGFnYWluc3QgaXMgZ29uZS5cblx0LndwLWJsb2NrLWdyb3VwLmhhcy1iYWNrZ3JvdW5kIHtcblxuXHRcdHBhZGRpbmc6IDA7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cblx0fVxuXG5cdC5oYXMtdWdwLXdoaXRlLWNvbG9yLFxuXHQud3AtYmxvY2stZ3JvdXAuaGFzLXVncC13aGl0ZS1jb2xvciB7XG5cblx0XHRjb2xvcjogdmFyKC0tdGV4dC1ib2R5KTtcblxuXHR9XG5cblx0Ly8gQm9keSBmYWNlIGFuZCBib2R5IGNvbG91ciwgTk9UIHRoZSBoZWFkaW5nIGZhY2UgYW5kIG5vdCB0aGUgYnJhbmQgYmx1ZS5cblx0Ly8gVGhlIHBpbGwncyBib3JkZXIgYWxyZWFkeSBjYXJyaWVzIHRoZSBicmFuZDsgYSBibHVlIGZpZ3VyZSBpbnNpZGUgYSBibHVlXG5cdC8vIG91dGxpbmUgc2F5cyBpdCB0d2ljZSwgYW5kIHRoZSBjb21tZXJjZSBmYWNlIGJlbG9uZ3MgdG8gcHJpY2VzIGFuZCB0aGVcblx0Ly8gYmFza2V0IGJ1dHRvbiByYXRoZXIgdGhhbiB0byBhIHNwZWMgZmlndXJlLiBPcGVyYXRvciwgMjAyNi0wOS0xNi5cblx0LndwLWJsb2NrLWdyb3VwIC5oYXMtbGFyZ2UtZm9udC1zaXplIHtcblxuXHRcdGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1ib2R5KTtcblx0XHRmb250LXNpemU6IHZhcigtLWZzLWgzKTtcblx0XHRmb250LXdlaWdodDogdmFyKC0tZnctcmVndWxhcik7XG5cdFx0Y29sb3I6IHZhcigtLXRleHQtYm9keSk7XG5cblx0fVxuXG5cdC8vIFRoZSBmaWd1cmUgYW5kIGl0cyBsYWJlbCBhcmUgT05FIHVuaXQuIFRoZSAyNHB4IHRoZXkgaW5oZXJpdCBmcm9tIHRoZVxuXHQvLyBmcmFtZXdvcmsncyBgPiAqICsgKmAgcnVsZSBpcyB0aGUgc3BhY2luZyBiZXR3ZWVuIHVucmVsYXRlZCBibG9ja3M7IGF0IDM2cHhcblx0Ly8gdGhlIGZpZ3VyZSdzIG93biBsaW5lLWhlaWdodCBhbHJlYWR5IGNhcnJpZXMgdGhlIHNlcGFyYXRpb24sIHNvIHRoZSBsYWJlbFxuXHQvLyB0YWtlcyBubyBtYXJnaW4gYXQgYWxsLlxuXHQud3AtYmxvY2stZ3JvdXAgcCArIHAge1xuXG5cdFx0bWFyZ2luLWJsb2NrLXN0YXJ0OiAwO1xuXG5cdH1cblxuXHQud3AtYmxvY2stZ3JvdXAgLmhhcy1tZWRpdW0tZm9udC1zaXplIHtcblxuXHRcdGZvbnQtc2l6ZTogdmFyKC0tZnMtc21hbGwpO1xuXHRcdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcblxuXHR9XG5cbn1cbiIsIi8vIE1pZ3JhdGVkIGNvbnRlbnQg4oCUIHRoZSBvbGQgc3RvcmUncyBibG9jayB2b2NhYnVsYXJ5LlxuLy9cbi8vIDIsMzQyIHByb2R1Y3QgZGVzY3JpcHRpb25zIGNhcnJ5IGNvbG91ciBjbGFzc2VzIGZyb20gdGhlIE9MRCB0aGVtZSdzIGVkaXRvclxuLy8gcGFsZXR0ZSwgYW5kIDczMSBjYXJyeSBgLnVncC1zcGVjcy1ibG9ja2AuIE5vbmUgb2YgdGhvc2Ugc2x1Z3MgZXhpc3QgaW4gdGhpc1xuLy8gdGhlbWUsIHNvIHdpdGhvdXQgdGhpcyBwYXJ0aWFsIGV2ZXJ5IG9uZSBvZiB0aG9zZSBibG9ja3MgcmVuZGVycyB1bnN0eWxlZDogdGhlXG4vLyBzdGF0IHBpbGxzIGxvc2UgdGhlaXIgYmx1ZSBib3JkZXIsIGFuZCAyLDEyNiBncmV5LWdyb3VuZCBwYW5lbHMgbG9zZSB0aGVpclxuLy8gZ3JvdW5kLlxuLy9cbi8vIFRoaXMgaXMgYSBDT01QQVRJQklMSVRZIGxheWVyIG92ZXIgY29udGVudCB3ZSBkaWQgbm90IGF1dGhvci4gSXQgaXMgbm90IGJyYW5kXG4vLyB2b2NhYnVsYXJ5IGFuZCBub3RoaW5nIG5ldyBzaG91bGQgdXNlIHRoZXNlIGNsYXNzZXMuXG4vL1xuLy8gVGhlIHBpbGwgTEFZT1VUIHVzZWQgdG8gbGl2ZSBoZXJlIHRvbywgdW5kZXIgdGhlIG9sZCBgLnVncC1zcGVjcy1ibG9ja2AgY2xhc3MuXG4vLyBUaGF0IGNsYXNzIHdhcyByZW5hbWVkIHRvIGAuc3BlYy1waWxsc2AgYWNyb3NzIHRoZSBmb3VyIG1pZ3JhdGVkIHBhdHRlcm5zIGFuZFxuLy8gdGhlIDczMiBkZXNjcmlwdGlvbnMgY2FycnlpbmcgYSBkZXRhY2hlZCBjb3B5IG9mIGl0ICgyMDI2LTA5LTE2LCBvcGVyYXRvcidzXG4vLyBjYWxsKSwgc28gdGhlIHBpbGxzIGFyZSBub3cgYnJhbmQgdm9jYWJ1bGFyeSBhbmQgbGl2ZSBpbiB0aGVpciBvd24gcGFydGlhbC5cbi8vIFdoYXQgc3RheXMgaGVyZSBpcyBvbmx5IHdoYXQgaXMgZ2VudWluZWx5IHN0aWxsIHRoZSBvbGQgc3RvcmUnczogaXRzIGNvbG91clxuLy8gc2x1Z3MuXG4vL1xuLy8gRXZlcnkgbGVnYWN5IHNsdWcgbWFwcyBleGFjdGx5IG9udG8gYSBicmFuZCB0b2tlbiDigJQgbWVhc3VyZWQgYWdhaW5zdCB0aGUgb2xkXG4vLyB0aGVtZSdzIG93biBwYWxldHRlIHJlZ2lzdHJhdGlvbiwgbm90IGd1ZXNzZWQ6XG4vL1xuLy8gICB1Z3AtYmx1ZSAgICAgICAgIzFkN2RiYiAg4oaSIC0tcGFyYWdvbi02MDAgICh0aGUgYnJhbmQgYmx1ZSwgdW5jaGFuZ2VkKVxuLy8gICB1Z3AtLWxpZ2h0LWJsdWUgIzYwQjlGNiAg4oaSIC0tcGFyYWdvbi0zMDBcbi8vICAgdWdwLWdyZXkgICAgICAgICMzMDMwMzAgIOKGkiAtLW5ldXRyYWwtNzAwXG4vLyAgIHVncC1ibGFjayAgICAgICAjMDAwICAgICDihpIgLS1uZXV0cmFsLTkwMFxuLy8gICB1Z3Atd2hpdGUgICAgICAgI2ZmZiAgICAg4oaSIC0tbmV1dHJhbC01MFxuLy9cbi8vIFNvIHRoaXMgY2hhbmdlcyBub3RoaW5nIGFib3V0IGhvdyB0aGUgY29udGVudCBsb29rcyDigJQgaXQgcmVzdG9yZXMgd2hhdCBpdCBsb29rZWRcbi8vIGxpa2Ugb24gdGhlIG9sZCBzdG9yZSwgaW4gdGhlIG5ldyB0aGVtZSdzIHRva2Vucy5cbi8vXG4vLyBUaGUgYWx0ZXJuYXRpdmUgd2FzIHJld3JpdGluZyAyLDM0MiBkZXNjcmlwdGlvbnMuIFRoYXQgaXMgYSBjb250ZW50IG1pZ3JhdGlvblxuLy8gd2l0aCBubyB1cHNpZGU6IHRoZSBjbGFzc2VzIGFyZSBpbmVydCBvbmNlIHRoZSBwYXR0ZXJucyBhcmUgcmUtY3V0LCBhbmQgdGhlc2Vcbi8vIHJ1bGVzIGNvc3Qgbm90aGluZyB1bnRpbCB0aGVuLlxuXG4uaGFzLXVncC1ibHVlLWNvbG9yICAgICAgICAgICAgeyBjb2xvcjogdmFyKC0tcGFyYWdvbi02MDApOyB9XG4uaGFzLXVncC0tbGlnaHQtYmx1ZS1jb2xvciAgICAgeyBjb2xvcjogdmFyKC0tcGFyYWdvbi0zMDApOyB9XG4uaGFzLXVncC1ncmV5LWNvbG9yICAgICAgICAgICAgeyBjb2xvcjogdmFyKC0tbmV1dHJhbC03MDApOyB9XG4uaGFzLXVncC1ibGFjay1jb2xvciAgICAgICAgICAgeyBjb2xvcjogdmFyKC0tbmV1dHJhbC05MDApOyB9XG4uaGFzLXVncC13aGl0ZS1jb2xvciAgICAgICAgICAgeyBjb2xvcjogdmFyKC0tbmV1dHJhbC01MCk7IH1cblxuLmhhcy11Z3AtYmx1ZS1iYWNrZ3JvdW5kLWNvbG9yICAgICAgICB7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcmFnb24tNjAwKTsgfVxuLmhhcy11Z3AtLWxpZ2h0LWJsdWUtYmFja2dyb3VuZC1jb2xvciB7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcmFnb24tMzAwKTsgfVxuLmhhcy11Z3AtZ3JleS1iYWNrZ3JvdW5kLWNvbG9yICAgICAgICB7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLW5ldXRyYWwtNzAwKTsgfVxuLmhhcy11Z3AtYmxhY2stYmFja2dyb3VuZC1jb2xvciAgICAgICB7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLW5ldXRyYWwtOTAwKTsgfVxuLmhhcy11Z3Atd2hpdGUtYmFja2dyb3VuZC1jb2xvciAgICAgICB7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLW5ldXRyYWwtNTApOyB9XG4iLCIvLyBQYXJhZ29uIEdhbWluZyDigJQgYnJhbmQgdG9rZW5zLlxuLy9cbi8vIENBTk9OSUNBTCBTT1VSQ0U6IHRoZSBQYXJhZ29uR2FtaW5nIHN0eWxlZ3VpZGUsIGRlc2lnbiBwb3N0IDE3MzU1LCBpbiB0aGVcbi8vIHRocmVlLWxheWVyIHNjaGVtYS4gVGhpcyBmaWxlIG1pcnJvcnMgaXQ7IGl0IGRvZXMgbm90IGRlY2lkZSBpdC4gSWYgYSB2YWx1ZVxuLy8gaGVyZSBkaXNhZ3JlZXMgd2l0aCB0aGUgc3R5bGVndWlkZSwgdGhlIHN0eWxlZ3VpZGUgaXMgcmlnaHQuXG4vL1xuLy8gRXZlcnkgY29sb3VyIHdhcyBNRUFTVVJFRCBvZmYgdGhlIGxpdmUgc3RvcmUg4oCUIGVpZ2h0ZWVuIG9mIHRoZW0sIGZvdXIgYmx1ZXMsXG4vLyB0aHJlZSBhcmN0aWMgZ3JleXMsIGVpZ2h0IG5ldXRyYWxzLCB0aHJlZSBzdGF0dXMgY29sb3VycyDigJQgcmF0aGVyIHRoYW5cbi8vIGdlbmVyYXRlZCBmcm9tIGEgc2VlZC4gT25lIHZhbHVlIHNpbmNlIHdhcyBOT1QgbWVhc3VyZWQ6IG5ldXRyYWwtNTUwIChzdHlsZWd1aWRlXG4vLyAxLjMuMCwgMjAyNi0wOS0yNiksIGFkZGVkIGJlY2F1c2UgdGhlIG1lYXN1cmVkIGJvcmRlcnMgd2VyZSB0b28gZmFpbnQgdG8gc2VlIOKAlCBpdFxuLy8gaXMgdGhlIGxpZ2h0ZXN0IGdyZXkgdGhhdCBnaXZlcyBhIGZpZWxkIG9yIGNoZWNrYm94IG91dGxpbmUgMzoxIG9uIHdoaXRlLiBGYW1pbGllcyBkZWNsYXJlIG9ubHkgdGhlIHNoYWRlcyB0aGF0IGV4aXN0LCB3aGljaCBpc1xuLy8gd2h5IHRoZXJlIGlzIG5vIGAtLXBhcmFnb24tNzAwYDogdGhlIGJyYW5kIHNpbXBseSBoYXMgbm8gZGFya2VyIGJsdWUuXG4vL1xuLy8gVGhhdCBhYnNlbmNlIGlzIGxvYWQtYmVhcmluZy4gYC0tY29sb3ItYnJhbmQtc3Ryb25nYCBleGlzdHMgdG8gYmUgdGhlIHN0cm9uZ2VyXG4vLyBwYXJ0bmVyIG9mIGAtLWNvbG9yLWJyYW5kYCBmb3IgaG92ZXIgYW5kIHByZXNzZWQgc3RhdGVzLCBhbmQgdGhlIGNhbm9uaWNhbCByb2xlXG4vLyB0ZW1wbGF0ZSBleHBlY3RzIGEgYHByaW1hcnk6NzAwYCB0byBmaWxsIGl0LiBXaXRoIG5vbmUgYXZhaWxhYmxlIGl0IHdhc1xuLy8gb3JpZ2luYWxseSBwaW5uZWQgdG8gYC0tcGFyYWdvbi02MDBgIOKAlCB0aGUgc2FtZSB2YWx1ZSBhcyBgLS1jb2xvci1icmFuZGAg4oCUIHNvXG4vLyBldmVyeSBidXR0b24gYW5kIGxpbmsgaG92ZXIgb24gdGhlIGJyYW5kIHJlc29sdmVkIHRvIGl0cyBvd24gYmFzZSBjb2xvdXIgYW5kXG4vLyBjaGFuZ2VkIG5vdGhpbmcsIGludmlzaWJseSwgYWNyb3NzIG5pbmUgbW9ja3Vwcy4gSXQgbm93IHBvaW50cyBhdCBuZXV0cmFsLTcwMCxcbi8vIHdoaWNoIGlzIHRoZSBsaXZlIHN0b3JlJ3Mgb3duIGFuc3dlcjogYC5idXR0b246aG92ZXJgIGdvZXMgdG8gIzMwMzAzMCB0aGVyZS5cbi8vIFNlZSBgX0NvbW1zLzIwMjYtMDktMTYtYS1yb2xlLXBpbm5lZC10by1pdHMtb3duLWJhc2UtbWFrZXMtZXZlcnktaG92ZXItaW5lcnRgLlxuLy9cbi8vIEVtaXR0ZWQgdGhyb3VnaCBhIG1peGluIHNvIHRoZSBzYW1lIHNldCBjYW4gYmUgYXBwbGllZCB0d2ljZSDigJQgb25jZSBvbiBgOnJvb3RgXG4vLyBmb3IgdGhlIGZyb250IGVuZCwgYW5kIG9uY2Ugc2NvcGVkIHRvIHRoZSBlZGl0b3IgY2FudmFzIHdoZW4gYmxvY2tzIGFycml2ZS5cblxuQG1peGluIGJyYW5kLXRva2VuLXZhcnMge1xuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlxcXG5cdFx0TEFZRVIgMSDigJQgcGFsZXR0ZVxuXHRcdE1lYXN1cmVkIHZhbHVlcy4gTm90aGluZyBkZXJpdmVkLCBub3RoaW5nIGdlbmVyYXRlZC5cblx0XFwqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQtLXBhcmFnb24tNjAwOiAjMUQ3REJCO1xuXHQtLXBhcmFnb24tNDAwOiAjMjVBNkY5O1xuXHQtLXBhcmFnb24tMzAwOiAjNjBCOUY2O1xuXHQtLXBhcmFnb24tNTA6ICAjRThGMkY4O1xuXG5cdC0tYXJjdGljLTEwMDogICNGNkY2RjY7XG5cdC0tYXJjdGljLTIwMDogICNFN0VBRUQ7XG5cdC0tYXJjdGljLTMwMDogICNEQ0RFREY7XG5cblx0LS1uZXV0cmFsLTUwOiAgI0ZGRkZGRjtcblx0LS1uZXV0cmFsLTMwMDogI0RDRENEQztcblx0LS1uZXV0cmFsLTQwMDogI0M0QzRDNDtcblx0LS1uZXV0cmFsLTUwMDogIzlGOUY5Rjtcblx0LS1uZXV0cmFsLTU1MDogIzhBOEE4QTtcblx0LS1uZXV0cmFsLTYwMDogIzYwNjA2MDtcblx0LS1uZXV0cmFsLTcwMDogIzMwMzAzMDtcblx0LS1uZXV0cmFsLTgwMDogIzI2MjYyNjtcblx0LS1uZXV0cmFsLTkwMDogIzAwMDAwMDtcblxuXHQtLXN0YXR1cy1wb3NpdGl2ZTogIzM1OTQzQTtcblx0LS1zdGF0dXMtbmVnYXRpdmU6ICNERDAwMDA7XG5cdC0tc3RhdHVzLXdhcm5pbmc6ICB2YXIoLS1wYXJhZ29uLTUwKTsgLy8gPSAtLXBhcmFnb24tNTAg4oCUIG5vIGRpc3RpbmN0IHdhcm5pbmcgdG9uZSBvbiB0aGUgbGl2ZSBzdG9yZVxuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlxcXG5cdFx0TEFZRVIgMiDigJQgcm9sZXNcblx0XFwqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQtLWNvbG9yLWJyYW5kOiAgICAgICAgICAgIHZhcigtLXBhcmFnb24tNjAwKTtcblx0LS1jb2xvci1icmFuZC1zdHJvbmc6ICAgICB2YXIoLS1uZXV0cmFsLTcwMCk7XG5cdC0tY29sb3ItYnJhbmQtc29mdDogICAgICAgdmFyKC0tcGFyYWdvbi01MCk7XG5cdC0tY29sb3ItYmFja2dyb3VuZDogICAgICAgdmFyKC0tYXJjdGljLTMwMCk7XG5cdC0tY29sb3Itc3VyZmFjZTogICAgICAgICAgdmFyKC0tbmV1dHJhbC01MCk7XG5cdC0tY29sb3Itc3VyZmFjZS1hbHQ6ICAgICAgdmFyKC0tYXJjdGljLTEwMCk7XG5cdC0tY29sb3Itc3VyZmFjZS1lbGV2YXRlZDogdmFyKC0tbmV1dHJhbC01MCk7IC8vIG5vIGRpc3RpbmN0IGxpZnRlZC1jYXJkIHRyZWF0bWVudCBpbiB0aGUgTVBHIG1vY2t1cHNcblx0LS1jb2xvci10ZXh0OiAgICAgICAgICAgICB2YXIoLS1uZXV0cmFsLTkwMCk7XG5cdC0tY29sb3ItdGV4dC1tdXRlZDogICAgICAgdmFyKC0tbmV1dHJhbC02MDApO1xuXHQtLWNvbG9yLXRleHQtb24tYnJhbmQ6ICAgIHZhcigtLW5ldXRyYWwtNTApO1xuXHQtLWNvbG9yLWJvcmRlcjogICAgICAgICAgIHZhcigtLW5ldXRyYWwtNDAwKTtcblx0LS1jb2xvci1ib3JkZXItc3Ryb25nOiAgICB2YXIoLS1uZXV0cmFsLTUwMCk7XG5cdC0tY29sb3ItcG9zaXRpdmU6ICAgICAgICAgdmFyKC0tc3RhdHVzLXBvc2l0aXZlKTtcblx0LS1jb2xvci13YXJuaW5nOiAgICAgICAgICB2YXIoLS1zdGF0dXMtd2FybmluZyk7XG5cdC0tY29sb3ItbmVnYXRpdmU6ICAgICAgICAgdmFyKC0tc3RhdHVzLW5lZ2F0aXZlKTtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcXFxuXHRcdExBWUVSIDMg4oCUIHVzYWdlXG5cdFxcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0Ly8gU3VyZmFjZXMuIE9uZSBncm91bmQ6IHJoeXRobSBjb21lcyBmcm9tIGltYWdlLWxlZCBiYW5kcyBhZ2FpbnN0IHBhbmVsLWxlZFxuXHQvLyBvbmVzLCBuZXZlciBmcm9tIGFsdGVybmF0aW5nIGJhbmQgdG9uZXMg4oCUIFwibm90IGEgYnJhbmQgdGhhdCB1c2VzIHRoZW1cIi5cblx0LS1iZy1wYWdlOiAgICAgICB2YXIoLS1jb2xvci1iYWNrZ3JvdW5kKTtcblx0LS1iZy1wYW5lbDogICAgICB2YXIoLS1jb2xvci1zdXJmYWNlKTtcblx0LS1iZy1wYW5lbC1hbHQ6ICB2YXIoLS1jb2xvci1zdXJmYWNlLWFsdCk7XG5cdC0tYmctY2FyZDogICAgICAgdmFyKC0tY29sb3Itc3VyZmFjZSk7XG5cdC0tYmctY2FyZC1ob3ZlcjogdmFyKC0tY29sb3ItYnJhbmQtc29mdCk7XG5cdC0tYmctaW5wdXQ6ICAgICAgdmFyKC0tY29sb3Itc3VyZmFjZSk7XG5cdC0tYmctb3ZlcmxheTogICAgcmdiYSggMCwgMCwgMCwgMC42MiApO1xuXG5cdC8vIENocm9tZSDigJQgdGhlIG5ldHdvcmsgaGVhZGVyIGFuZCBmb290ZXIsIGRyZXNzZWQgaW4gYnJhbmQgY29sb3Vycy5cblx0LS1iZy1jaHJvbWU6ICAgICAgICAgIHZhcigtLW5ldXRyYWwtNzAwKTtcblx0LS1iZy1jaHJvbWUtZGVlcDogICAgIHZhcigtLW5ldXRyYWwtODAwKTtcblx0LS1iZy1ub3RpY2U6ICAgICAgICAgIHZhcigtLXBhcmFnb24tNjAwKTtcblx0LS10ZXh0LW9uLWNocm9tZTogICAgIHZhcigtLW5ldXRyYWwtNDAwKTtcblx0LS1ncmFkaWVudC1lZGl0b3JpYWw6IGxpbmVhci1ncmFkaWVudCggMTM1ZGVnLCB2YXIoLS1wYXJhZ29uLTYwMCkgMCUsIHZhcigtLXBhcmFnb24tNDAwKSAxMDAlICk7XG5cblx0Ly8gVGV4dC5cblx0LS10ZXh0LWJvZHk6ICAgICAgIHZhcigtLWNvbG9yLXRleHQpO1xuXHQtLXRleHQtaGVhZGluZzogICAgdmFyKC0tY29sb3ItdGV4dCk7XG5cdC0tdGV4dC1tdXRlZDogICAgICB2YXIoLS1jb2xvci10ZXh0LW11dGVkKTtcblx0LS10ZXh0LWJyYW5kOiAgICAgIHZhcigtLWNvbG9yLWJyYW5kKTtcblx0LS10ZXh0LWxpbms6ICAgICAgIHZhcigtLWNvbG9yLWJyYW5kKTtcblx0LS10ZXh0LWxpbmstaG92ZXI6IHZhcigtLWNvbG9yLWJyYW5kLXN0cm9uZyk7XG5cdC0tdGV4dC1vbi1icmFuZDogICB2YXIoLS1jb2xvci10ZXh0LW9uLWJyYW5kKTtcblxuXHQvLyBCb3JkZXJzLlxuXHQtLWJvcmRlci1kZWZhdWx0OiB2YXIoLS1jb2xvci1ib3JkZXIpO1xuXHQtLWJvcmRlci1zdHJvbmc6ICB2YXIoLS1jb2xvci1ib3JkZXItc3Ryb25nKTtcblx0LS1ib3JkZXItYnJhbmQ6ICAgdmFyKC0tY29sb3ItYnJhbmQpO1xuXHQtLWJvcmRlci1mb2N1czogICB2YXIoLS1jb2xvci1icmFuZCk7XG5cdC0tYm9yZGVyLWlucHV0OiAgIHZhcigtLW5ldXRyYWwtNTUwKTtcblxuXHQvLyBDb250cm9scy5cblx0LS1idG4tcHJpbWFyeS1iZzogICAgICAgdmFyKC0tY29sb3ItYnJhbmQpO1xuXHQtLWJ0bi1wcmltYXJ5LWJnLWhvdmVyOiB2YXIoLS1jb2xvci1icmFuZC1zdHJvbmcpO1xuXHQtLWJ0bi1wcmltYXJ5LXRleHQ6ICAgICB2YXIoLS1jb2xvci10ZXh0LW9uLWJyYW5kKTtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcXFxuXHRcdFRZUEVcblx0XHRUaHJlZSBmYWNlcywgb25lIEFkb2JlIGtpdCAocXN2NHBxdCDigJQgdGhlIHNhbWUga2l0IHRoZSBvbGQgc3RvcmVcblx0XHRsb2FkcywgYW5kIGRvbWFpbi1sb2NrZWQpLiBQdXJpc3RhIGlzIHRoZSBTRUxMSU5HIHZvaWNlOiBwcm9kdWN0XG5cdFx0dGl0bGVzLCBwcmljZXMsIGFkZC10by1iYXNrZXQsIHNhbGUgYmFkZ2VzLCBhbHdheXMgYm9sZCBhbmQgc2xhbnRlZC5cblx0XFwqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQtLWZmLWhlYWRpbmc6IFwidWJ1bnR1XCIsIFwiVWJ1bnR1XCIsIHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgXCJTZWdvZSBVSVwiLCBzYW5zLXNlcmlmO1xuXHQtLWZmLWJvZHk6ICAgIFwicG9wcGluc1wiLCBcIlBvcHBpbnNcIiwgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBcIlNlZ29lIFVJXCIsIHNhbnMtc2VyaWY7XG5cdC0tZmYtY2hyb21lOiAgXCJwdXJpc3RhLXdlYlwiLCBcIlB1cmlzdGFcIiwgXCJ1YnVudHVcIiwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmO1xuXG5cdC0tZnMtaDE6ICAgICAgIDQwcHg7XG5cdC0tZnMtaDI6ICAgICAgIDMycHg7XG5cdC0tZnMtaDM6ICAgICAgIDI2cHg7XG5cdC0tZnMtaDQ6ICAgICAgIDIwcHg7XG5cdC0tZnMtYm9keS1sZzogIDE4cHg7XG5cdC0tZnMtYm9keTogICAgIDE2cHg7XG5cdC0tZnMtc21hbGw6ICAgIDE0cHg7XG5cdC0tZnMtZXllYnJvdzogIDEycHg7XG5cblx0Ly8gQmFuZCB0aXRsZXMgYXJlIExJR0hUIGF0IGgyIGFuZCBhYm92ZSwgd2l0aCB0d28gbGVnaWJpbGl0eSBleGNlcHRpb25zIGF0XG5cdC8vIG1lZGl1bTogdGhlIGhlcm8gdGl0bGUsIGFuZCBhbnkgdGl0bGUgc2V0IG92ZXIgcGhvdG9ncmFwaHkuIFNtYWxsIHRpdGxlc1xuXHQvLyBhbmQgbGFiZWxzIGFyZSBtZWRpdW0g4oCUIGV4Y2VwdCB0aGUgbWFnYXppbmUncywgd2hpY2ggYXJlIHJlZ3VsYXIsIGJlY2F1c2Vcblx0Ly8gdGhlIGVkaXRvcmlhbCBzaWRlIHNwZWFrcyBtb3JlIHF1aWV0bHkgdGhhbiB0aGUgc2hvcC5cblx0LS1mdy1saWdodDogICAgMzAwO1xuXHQtLWZ3LXJlZ3VsYXI6ICA0MDA7XG5cdC0tZnctbWVkaXVtOiAgIDUwMDtcblx0LS1mdy1ib2xkOiAgICAgNzAwO1xuXG5cdC0tbGgtYm9keTogICAgIDEuNztcblx0LS1saC1oZWFkaW5nOiAgMS4yO1xuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlxcXG5cdFx0U1BBQ0Vcblx0XFwqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQtLXNwYWNlLTE6ICA0cHg7XG5cdC0tc3BhY2UtMjogIDhweDtcblx0LS1zcGFjZS0zOiAgMTJweDtcblx0LS1zcGFjZS00OiAgMTZweDtcblx0LS1zcGFjZS02OiAgMjRweDtcblx0LS1zcGFjZS04OiAgMzJweDtcblx0LS1zcGFjZS0xMjogNDhweDtcblx0LS1zcGFjZS0xNjogNjRweDtcblxuXHQtLXNwYWNlLWNvbnRlbnQtZ2FwOiAgMzBweDtcblx0LS1zcGFjZS1jYXJkLXBhZGRpbmc6IDMwcHg7XG5cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXFxcblx0XHRTSEFQRVxuXHRcdE9uZSByYWRpdXMuIEV2ZXJ5IHN1cmZhY2UgdGFrZXMgMTBweDsgZXZlcnkgY29udHJvbCBpcyBzcXVhcmU7IG9ubHlcblx0XHRpbmRpY2F0b3JzIGFyZSByb3VuZC4gVGhlcmUgaXMgbm8gc2Vjb25kIHN1cmZhY2UgcmFkaXVzIOKAlCB0aGUgdG9rZW5cblx0XHRmb3Igb25lIHdhcyByZXRpcmVkLlxuXHRcXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdC0tcmFkaXVzLWNhcmQ6ICAxMHB4O1xuXHQtLXJhZGl1cy1idG46ICAgMDtcblx0LS1yYWRpdXMtaW5wdXQ6IDA7XG5cdC0tcmFkaXVzLXBpbGw6ICA5OTlweDtcblxuXHQtLXNoYWRvdy1jYXJkOiAgbm9uZTtcblx0LS1zaGFkb3ctcGFuZWw6IG5vbmU7XG5cdC0tc2hhZG93LTE6ICAgICAwIDAgMTJweCAtM3B4IHZhcigtLW5ldXRyYWwtMzAwKTtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcXFxuXHRcdExBWU9VVFxuXHRcdC0tc2l0ZS1tYXgtd2lkdGggLyAtLWd1dHRlci1zbWFsbCBhcmUgdGhlIG5hbWVzIGdsb2JhbC9zY3NzL2xheW91dHMvXG5cdFx0X3dyYXBwZXIuc2NzcyBhbmQgX3NlY3Rpb24uc2NzcyBhY3R1YWxseSByZWFkICh3aXRoIGdlbmVyaWNcblx0XHQxNDQwcHgvMjBweCBmYWxsYmFja3MpIOKAlCB0aGV5IG11c3QgY2FycnkgdGhlIHN0eWxlZ3VpZGUncyBtZWFzdXJlZFxuXHRcdHZhbHVlcyBoZXJlLCBvciBgLndyYXBwZXJgIC8gYC5zZWN0aW9uX19pbm5lcmAgc2lsZW50bHkgcmVuZGVyIGF0IHRoZVxuXHRcdGdlbmVyaWMgZmFsbGJhY2sgaW5zdGVhZCBvZiB0aGUgYnJhbmQncyBvd24gY29sdW1uLlxuXHRcXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdC0tc2l0ZS1tYXgtd2lkdGg6ICAgIDE0MDBweDtcblx0LS1ndXR0ZXItc21hbGw6ICAgICAgMjBweDtcblx0LS1jb250YWluZXItcmVhZGluZzogNjgwcHg7XG5cdC8vIFRoZSBtYWdhemluZSBhcnRpY2xlJ3MgcmVhZGluZyBjb2x1bW4sIHdpZGVyIHRoYW4gdGhlIHNpdGUncyByZWFkaW5nIG1lYXN1cmU6XG5cdC8vIG9wZXJhdG9yIHRyaWFsIDIwMjYtMDktMjggKDY4MCByZWFkIGFzIG5hcnJvdzsgbG9uZ2VyIGxpbmVzIHByZWZlcnJlZCkuXG5cdC0tY29udGFpbmVyLWFydGljbGU6IDgwMHB4O1xuXHQtLXdpZHRoLXNpZGViYXI6ICAgICAzMjhweDtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcXFxuXHRcdE1PVElPTlxuXHRcdFRoZSB0d28gc3BlZWRzIGZyYW1ld29yay12MiBhbHJlYWR5IHNoaXBzIGFzIHRyYW5zaXRpb24gbWl4aW5zOiAxODBtc1xuXHRcdGZvciBhbnl0aGluZyBhIHBvaW50ZXIgdG91Y2hlcyBkaXJlY3RseSwgMzAwbXMgZm9yIGEgc3VyZmFjZSB0aGF0XG5cdFx0YXJyaXZlcyB1bmRlcm5lYXRoIGl0LiBOb3RoaW5nIGluIHRoaXMgdGhlbWUgaW52ZW50cyBhIHRoaXJkLlxuXHRcXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdC0tbW90aW9uLXF1aWNrOiAgICAxODBtcztcblx0LS1tb3Rpb24tc3RhbmRhcmQ6IDMwMG1zO1xuXHQtLW1vdGlvbi1lYXNlOiAgICAgZWFzZTtcblxufVxuIl19 */
