
@media (max-width: 1000px) {
.storefront-grid[data-v-3963ef45] {
    width: 100%;
}
.storefront-grid .storefront-column[data-v-3963ef45] {
    width: 100%;
    margin-bottom: 15px;
}
}
@media (min-width: 1000px) {
.storefront-grid[data-v-3963ef45] {
    display: grid;
    grid-template-columns: 50% 50%;
    grid-gap: 15px;
    grid-row-gap: 15px;
    width: 100%;
    margin-bottom: 0px;
}
.storefront-grid .storefront-column[data-v-3963ef45] {
    box-sizing: border-box;
    break-inside: avoid;
    page-break-inside: avoid;
}
}
.card-image[data-v-3963ef45] {
  position: relative;
  width: 100%;
  height: 200px;
  overflow: hidden;
}
.card-image img[data-v-3963ef45] {
  position: absolute;
  width: 100%;
  top: 50%;
  transform: translate(0, -50%);
}
.card-image span[data-v-3963ef45] {
  position: absolute;
  background: var(--button);
  bottom: 0;
  right: 1.5rem;
  color: var(--button-text);
  padding: 7.5px 15px;
  border-radius: 5px 5px 0 0;
  z-index: 1;
}



.card[data-v-f3b21a68] {
  pointer-events: initial;
}
.faq-section-card[data-v-f3b21a68] {
  background: rgba(var(--button-rgb, 26, 188, 156), 0.08);
  border-color: rgba(var(--button-rgb, 26, 188, 156), 0.3);
  box-shadow: 0 1.75rem 2.5rem -1.5rem rgba(var(--button-rgb, 26, 188, 156), 0.65);
}
.faq-section-card .card-inner[data-v-f3b21a68] {
  padding: 2.5rem 2rem;
}
.faq-hero .card-inner[data-v-f3b21a68] {
  padding-top: 3rem;
  padding-bottom: 3rem;
}
.faq-badge[data-v-f3b21a68] {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0.375rem 1rem;
  border-radius: 999px;
  background: rgba(var(--button-rgb, 26, 188, 156), 0.15);
  color: var(--button, #1abc9c);
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  margin-bottom: 1rem;
}
.faq-badge span[data-v-f3b21a68] {
  font-size: 0.875rem;
}
.faq-accordion-card[data-v-f3b21a68] {
  background: #fff;
  border-color: rgba(var(--paragraph-rgb, 82, 100, 132), 0.2);
  box-shadow: 0 1.5rem 3rem -2rem rgba(17, 24, 39, 0.25);
}
.faq-accordion-card .card-inner[data-v-f3b21a68] {
  padding: 0;
}
.faq-support-card[data-v-f3b21a68] {
  background: #fff;
  border-color: rgba(var(--paragraph-rgb, 82, 100, 132), 0.2);
  transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.faq-support-card[data-v-f3b21a68]:hover {
  transform: translateY(-6px);
  box-shadow: 0 1.75rem 2.75rem -1.5rem rgba(var(--button-rgb, 26, 188, 156), 0.5);
}
.faq-support-card .card-inner[data-v-f3b21a68] {
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  text-align: center;
  padding: 2rem 1.75rem;
  gap: 1.25rem;
}
.faq-support-illustration[data-v-f3b21a68] {
  width: 88px;
  height: 88px;
  margin: 0 auto;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: rgba(var(--button-rgb, 26, 188, 156), 0.12);
  color: var(--button, #1abc9c);
}
.faq-support-illustration .icon[data-v-f3b21a68] {
  font-size: 2rem;
  line-height: 1;
}
.faq-support-description[data-v-f3b21a68] {
  color: var(--paragraph, #526484);
}
.faq-support-action .btn[data-v-f3b21a68] {
  min-width: 140px;
}
.btn-close[data-v-f3b21a68] {
  box-sizing: content-box;
  display: flex;
  position: absolute;
  align-items: center;
  justify-content: center;
  height: 2rem;
  width: 2rem;
  right: .5rem;
  top: .5rem;
  padding: .25em .25em;
  border: 0;
  border-radius: 40px;
  font-size: 1.25rem;
  color: #000;
  background: #fff;
  transform: translate(50%, -50%);
  transition: .3s ease
}
.btn-close[data-v-f3b21a68]:hover {
  background: #000 !important;
  color: #fff;
}
.btn-close[data-v-f3b21a68]:active,
.btn-close[data-v-f3b21a68]:focus {
  outline: none;
}
ul[data-v-f3b21a68] {
  text-align: initial;
}



.nk-block-calendar[data-v-2d6c4495] {
  padding-bottom: 2rem;
}
.agenda-card[data-v-2d6c4495] {
  background: rgba(var(--background-rgb, 245, 246, 250), 0.72);
  border-color: rgba(var(--paragraph-rgb, 82, 100, 132), 0.14);
  box-shadow: 0 1.5rem 3rem -2rem rgba(var(--paragraph-rgb, 82, 100, 132), 0.55);
}
.agenda-toolbar[data-v-2d6c4495] {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
  align-items: center;
  gap: 1rem;
  margin-bottom: 1.25rem;
}
.agenda-nav-left[data-v-2d6c4495] {
  display: flex;
  flex-wrap: wrap;
  gap: 0.45rem;
}
.agenda-btn[data-v-2d6c4495],
.agenda-mode-btn[data-v-2d6c4495] {
  border: 1px solid rgba(var(--button-rgb, 26, 188, 156), 0.28);
  font-family: var(--font-title, inherit);
  font-weight: 700;
  transition: background-color 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease, color 0.18s ease;
}
.agenda-btn[data-v-2d6c4495] {
  align-items: center;
  background: rgba(var(--button-rgb, 26, 188, 156), 0.1);
  border-radius: 999px;
  color: var(--button, #1abc9c);
  display: inline-flex;
  gap: 0.35rem;
  min-height: 2.35rem;
  padding: 0.45rem 0.75rem;
}
.agenda-btn[data-v-2d6c4495]:hover,
.agenda-mode-btn[data-v-2d6c4495]:hover {
  background: rgba(var(--button-rgb, 26, 188, 156), 0.16);
  box-shadow: 0 0.75rem 1.5rem -1rem rgba(var(--button-rgb, 26, 188, 156), 0.75);
}
.agenda-btn-today[data-v-2d6c4495] {
  background: var(--button, #1abc9c);
  color: var(--button-text, #fff);
  margin-left: 0.15rem;
}
.agenda-btn-today[data-v-2d6c4495]:hover {
  background: var(--button, #1abc9c);
  color: var(--button-text, #fff);
}
.agenda-title[data-v-2d6c4495] {
  color: var(--title, #364a63) !important;
  font-family: var(--font-title, inherit);
  font-weight: 800;
  margin: 0;
  text-align: center;
  text-transform: capitalize;
}
.agenda-mode-switch[data-v-2d6c4495] {
  background: rgba(var(--button-rgb, 26, 188, 156), 0.08);
  border: 1px solid rgba(var(--button-rgb, 26, 188, 156), 0.28);
  border-radius: 999px;
  display: inline-flex;
  justify-self: end;
  overflow: hidden;
  padding: 0.2rem;
}
.agenda-mode-btn[data-v-2d6c4495] {
  background: transparent;
  border-color: transparent;
  border-radius: 999px;
  color: var(--button, #1abc9c);
  padding: 0.45rem 0.85rem;
}
.agenda-mode-btn.active[data-v-2d6c4495] {
  background: var(--button, #1abc9c);
  box-shadow: 0 0.75rem 1.5rem -1rem rgba(var(--button-rgb, 26, 188, 156), 0.85);
  color: var(--button-text, #fff);
}
.agenda-weekdays[data-v-2d6c4495],
.agenda-week[data-v-2d6c4495],
.agenda-month-grid[data-v-2d6c4495] {
  display: grid;
  grid-template-columns: repeat(7, minmax(0, 1fr));
}
.agenda-weekdays[data-v-2d6c4495] {
  background: rgba(var(--button-rgb, 26, 188, 156), 0.08);
  border: 1px solid rgba(var(--paragraph-rgb, 82, 100, 132), 0.14);
  border-bottom: none;
  border-radius: 0.75rem 0.75rem 0 0;
  overflow: hidden;
}
.agenda-weekday-cell[data-v-2d6c4495] {
  color: var(--paragraph, #526484);
  font-family: var(--font-title, inherit);
  font-weight: 800;
  padding: 0.65rem 0.35rem;
  text-align: center;
}
.agenda-month-grid[data-v-2d6c4495],
.agenda-week[data-v-2d6c4495] {
  border: 1px solid rgba(var(--paragraph-rgb, 82, 100, 132), 0.14);
  border-radius: 0 0 0.75rem 0.75rem;
  overflow: hidden;
}
.agenda-week[data-v-2d6c4495] {
  border-radius: 0.75rem;
}
.agenda-month-cell[data-v-2d6c4495],
.agenda-day[data-v-2d6c4495] {
  background: rgba(255, 255, 255, 0.88);
  border-bottom: 1px solid rgba(var(--paragraph-rgb, 82, 100, 132), 0.12);
  border-right: 1px solid rgba(var(--paragraph-rgb, 82, 100, 132), 0.12);
  min-height: 170px;
}
.agenda-month-cell[data-v-2d6c4495]:nth-child(7n),
.agenda-day[data-v-2d6c4495]:last-child {
  border-right: none;
}
.agenda-day[data-v-2d6c4495] {
  min-height: 420px;
}
.agenda-month-cell.active[data-v-2d6c4495],
.agenda-day.active[data-v-2d6c4495] {
  background: rgba(var(--button-rgb, 26, 188, 156), 0.08);
  box-shadow: inset 0 0 0 2px rgba(var(--button-rgb, 26, 188, 156), 0.45);
}
.agenda-month-cell.today .agenda-month-day-number[data-v-2d6c4495],
.agenda-day.today .agenda-day-head span[data-v-2d6c4495] {
  background: var(--button, #1abc9c);
  color: var(--button-text, #fff);
}
.agenda-month-day-number[data-v-2d6c4495] {
  align-items: center;
  border-radius: 999px;
  color: var(--title, #364a63);
  display: inline-flex;
  float: right;
  font-weight: 800;
  justify-content: center;
  margin: 0.45rem 0.45rem 0.15rem;
  min-height: 1.8rem;
  min-width: 1.8rem;
}
.agenda-month-items[data-v-2d6c4495],
.agenda-day-body[data-v-2d6c4495] {
  clear: both;
  padding: 0.45rem;
}
.agenda-day-head[data-v-2d6c4495] {
  align-items: center;
  border-bottom: 1px solid rgba(var(--paragraph-rgb, 82, 100, 132), 0.12);
  color: var(--paragraph, #526484);
  display: flex;
  font-size: 0.875rem;
  justify-content: space-between;
  padding: 0.65rem;
}
.agenda-day-head strong[data-v-2d6c4495] {
  color: var(--title, #364a63);
  font-family: var(--font-title, inherit);
}
.agenda-day-head span[data-v-2d6c4495] {
  align-items: center;
  border-radius: 999px;
  display: inline-flex;
  font-weight: 800;
  justify-content: center;
  min-height: 1.75rem;
  min-width: 1.75rem;
}
.agenda-item[data-v-2d6c4495] {
  background: var(--button, #1abc9c);
  border: none;
  border-radius: 0.45rem;
  box-shadow: 0 0.75rem 1.4rem -1.1rem rgba(var(--button-rgb, 26, 188, 156), 0.9);
  color: var(--button-text, #fff);
  cursor: pointer;
  display: flex;
  flex-direction: column;
  margin-bottom: 0.35rem;
  padding: 0.45rem 0.55rem;
  text-align: left;
  width: 100%;
}
.agenda-item[data-v-2d6c4495]:hover {
  background: rgb(var(--button-rgb, 26, 188, 156));
  color: var(--button-text, #fff);
}
.agenda-item-title[data-v-2d6c4495] {
  font-family: var(--font-title, inherit);
  font-size: 0.76rem;
  font-weight: 800;
  line-height: 1.2;
}
.agenda-item-price[data-v-2d6c4495] {
  font-size: 0.7rem;
  opacity: 0.9;
}
.agenda-day-view-head[data-v-2d6c4495] {
  align-items: center;
  color: var(--paragraph, #526484);
  display: flex;
  justify-content: space-between;
  margin-bottom: 0.75rem;
}
.agenda-day-view-head h5[data-v-2d6c4495] {
  margin-bottom: 0;
}
.agenda-day-list[data-v-2d6c4495] {
  display: grid;
  gap: 0.4rem;
}
.agenda-day-item[data-v-2d6c4495] {
  align-items: flex-start;
  justify-content: center;
  min-height: 64px;
  padding: 0.7rem 0.8rem;
}
.agenda-day-item .agenda-item-title[data-v-2d6c4495] {
  font-size: 0.96rem;
  line-height: 1.25;
}
.agenda-day-item .agenda-item-price[data-v-2d6c4495] {
  font-size: 0.86rem;
}
@media (max-width: 1199.98px) {
.agenda-toolbar[data-v-2d6c4495] {
    grid-template-columns: 1fr;
    gap: 0.75rem;
}
.agenda-title[data-v-2d6c4495] {
    order: -1;
    text-align: left;
}
.agenda-mode-switch[data-v-2d6c4495] {
    justify-self: start;
}
.agenda-weekdays[data-v-2d6c4495] {
    display: none;
}
.agenda-week[data-v-2d6c4495],
  .agenda-month-grid[data-v-2d6c4495] {
    grid-template-columns: 1fr;
    border-radius: 0.75rem;
}
.agenda-day[data-v-2d6c4495],
  .agenda-month-cell[data-v-2d6c4495] {
    border-right: none;
    min-height: 120px;
}
}


.storefront-back[data-v-51d4199c] {
  margin-bottom: 1.5rem;
}
@media (max-width: 1000px) {
.storefront-grid[data-v-51d4199c] {
    width: 100%;
}
.storefront-grid .storefront-column[data-v-51d4199c] {
    width: 100%;
    margin-bottom: 15px;
}
}
@media (min-width: 1000px) {
.storefront-grid[data-v-51d4199c] {
    display: grid;
    grid-template-columns: 50% 50%;
    grid-gap: 15px;
    grid-row-gap: 15px;
    width: 100%;
    margin-bottom: 0px;
}
.storefront-grid .storefront-column[data-v-51d4199c] {
    box-sizing: border-box;
    break-inside: avoid;
    page-break-inside: avoid;
}
}
.card-image[data-v-51d4199c] {
  position: relative;
  width: 100%;
  height: 200px;
  overflow: hidden;
}
.card-image img[data-v-51d4199c] {
  position: absolute;
  width: 100%;
  top: 50%;
  transform: translate(0, -50%);
}
.card-image span[data-v-51d4199c] {
  position: absolute;
  background: var(--button);
  bottom: 0;
  right: 1.5rem;
  color: var(--button-text);
  padding: 7.5px 15px;
  border-radius: 5px 5px 0 0;
  z-index: 1;
}



.card[data-v-3db91b72] {
  pointer-events: initial;
}
.btn-close[data-v-3db91b72] {
  box-sizing: content-box;
  display: flex;
  position: absolute;
  align-items: center;
  justify-content: center;
  height: 2rem;
  width: 2rem;
  right: .5rem;
  top: .5rem;
  padding: .25em .25em;
  border: 0;
  border-radius: 40px;
  font-size: 1.25rem;
  color: #000;
  background: #fff;
  transform: translate(50%, -50%);
  transition: .3s ease
}
.btn-close[data-v-3db91b72]:hover {
  background: #000 !important;
  color: #fff;
}
.btn-close[data-v-3db91b72]:active,
.btn-close[data-v-3db91b72]:focus {
  outline: none;
}
ul[data-v-3db91b72] {
  text-align: initial;
}



.hide[data-v-302d05ee] {
  display: none;
}



.datepicker .day .plot-date-color {
  flex: 0 0 auto;
  width: 0.5rem;
  height: 0.5rem;
  border-radius: 50%;
}
.datepicker .day .plot-date-content {
  display: inline-flex;
  align-items: flex-start;
  gap: 0.25rem;
}
.datepicker .day .plot-date-color {
  margin-top: 0.35rem;
}
.datepicker .day .plot-date-label {
  display: inline-block;
}
.datepicker .day small.day-price {
  display: block;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  font-size: clamp(0.5rem, 1.5vw, 0.8rem);
}
.datepicker {
  background: transparent !important;
  width: 100% !important;
  padding: 0;
  border: none !important;
  color: var(--paragraph) !important;
}
.datepicker .day {
  font-weight: 700;
  font-size: 15px;
  line-height: 18px !important;
  height: auto !important;
  padding: 12.5px 5px !important;
}
.datepicker span.high,
.datepicker span.medium,
.datepicker span.low,
#slots li.high::before,
#slots li.medium::before {
  content: '';
  background: transparent;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  margin-right: 5px;
  display: inline-block;
}
.datepicker span.high {
  background: rgb(var(--availability-high));
}
.datepicker span.medium {
  background: rgb(var(--availability-medium));
}
.datepicker span.low {
  background: rgb(var(--availability-low));
}
.datepicker .day.blank:hover {
  color: #ddd;
  cursor: default;
}
.datepicker .day.selected {
  background: var(--button) !important;
  border-radius: 5px;
  color: #fff;
  transition: 0.3s;
}
.datepicker .day.today {
  background: transparent !important;
  color: var(--hyperlink) !important;
}
.datepicker .day.today.selected {
  background: var(--button) !important;
  color: #fff !important;
}
.datepicker .day.active {
  background: var(--button) !important;
}
.datepicker table tr td.disabled,
.datepicker table tr td.disabled:hover {
  background: transparent;
  color: #dbdfea;
  cursor: default;
}
.datepicker .day:not(.disabled):not(.active):not(.selected):not(.blank):hover {
  background: rgba(var(--button-rgb), 0.6) !important;
  color: var(--hyperlink) !important;
  border-radius: 5px;
  transition: 0.3s;
}
.datepicker .day small {
  display: block;
  font-weight: normal;
  font-size: 12px;
}
.datepicker .day.new,
.datepicker .day.old {
  visibility: hidden;
}
a,
a:hover {
  color: var(--hyperlink);
  text-decoration: none;
  background-color: transparent;
}
#slots {
  margin: -10px;
}
#slots li {
  display: inline-block;
  background: rgba(var(--button-rgb), 0.6);
  color: var(--button-text);
  padding: 5px 10px;
  min-width: 150px;
  margin: 10px;
  cursor: pointer;
  text-align: center;
  border-radius: 4px;
  opacity: 0.6;
}
#slots li.selected {
  opacity: 1;
  background: rgb(var(--button-rgb));
}
#slots li.high::before {
  background: rgb(var(--availability-high));
}
#slots li.medium::before {
  background: rgb(var(--availability-medium));
}
#slots li .time {
  display: inline-block;
  font-weight: bold;
}
#slots li .d-inline-block {
  display: inline-flex !important;
  align-items: center;
  gap: 0.35rem;
}
.plot-color-indicator {
  flex: 0 0 auto;
  width: 0.65rem;
  height: 0.65rem;
  border-radius: 50%;
  vertical-align: middle;
}
.plot-balloon {
  position: relative;
  display: inline-block;
  max-width: 100%;
  padding: 8px 12px;
  border-radius: 5px;
  background: var(--paragraph);
  color: var(--background, #fff);
  white-space: pre-line;
}
.plot-balloon::before {
  position: absolute;
  top: -6px;
  left: 18px;
  width: 12px;
  height: 12px;
  content: '';
  background: inherit;
  transform: rotate(45deg);
}
@media (max-width: 575px) {
#slots li {
    display: block;
    padding: 15px 0;
    margin: 15px 10px;
}
}



.vue-tel-input[data-v-d51924f8] {
  height: calc(2.125rem + 2px);
  border: 1px solid #dbdfea;
  border-radius: 4px;
}
.vue-tel-input .vti__dropdown[data-v-d51924f8] {
  display: flex;
  align-items: center;
  padding: 0 0.5rem;
}
.vue-tel-input .vti__input[data-v-d51924f8] {
  height: 100%;
  padding: 0.4375rem 1rem;
  border: 0;
}
fieldset[data-field-type="country"] .v-select[data-v-d51924f8] {
  width: 100%;
}
fieldset[data-field-type="country"] .vs__dropdown-toggle[data-v-d51924f8] {
  height: calc(2.125rem + 2px);
  border: 1px solid #dbdfea;
  border-radius: 4px;
  padding: 0 0.5rem;
  display: flex;
  align-items: center;
}
fieldset[data-field-type="country"] .vs__selected[data-v-d51924f8],
fieldset[data-field-type="country"] .vs__search[data-v-d51924f8] {
  margin-top: 0;
}
fieldset[data-field-type="country"] .vs__search[data-v-d51924f8] {
  padding: 0;
}
fieldset[data-field-type="country"][data-v-d51924f8] .vs__open-indicator {
  display: none;
}


.vue-tel-input[data-v-2b65feec] {
  height: calc(2.125rem + 2px);
  border: 1px solid #dbdfea;
  border-radius: 4px;
}
.vue-tel-input .vti__dropdown[data-v-2b65feec] {
  display: flex;
  align-items: center;
  padding: 0 0.5rem;
}
.vue-tel-input .vti__input[data-v-2b65feec] {
  height: 100%;
  padding: 0.4375rem 1rem;
  border: 0;
}
fieldset[data-field-type="country"] .v-select[data-v-2b65feec] {
  width: 100%;
}
fieldset[data-field-type="country"] .vs__dropdown-toggle[data-v-2b65feec] {
  height: calc(2.125rem + 2px);
  border: 1px solid #dbdfea;
  border-radius: 4px;
  padding: 0 0.5rem;
  display: flex;
  align-items: center;
}
fieldset[data-field-type="country"] .vs__selected[data-v-2b65feec],
fieldset[data-field-type="country"] .vs__search[data-v-2b65feec] {
  margin-top: 0;
}
fieldset[data-field-type="country"] .vs__search[data-v-2b65feec] {
  padding: 0;
}
fieldset[data-field-type="country"][data-v-2b65feec] .vs__open-indicator {
  display: none;
}


.vue-tel-input[data-v-173327c8] {
  height: calc(2.125rem + 2px);
  border: 1px solid #dbdfea;
  border-radius: 4px;
}
.vue-tel-input .vti__dropdown[data-v-173327c8] {
  display: flex;
  align-items: center;
  padding: 0 0.5rem;
}
.vue-tel-input .vti__input[data-v-173327c8] {
  height: 100%;
  padding: 0.4375rem 1rem;
  border: 0;
}
fieldset[data-field-type="country"] .v-select[data-v-173327c8] {
  width: 100%;
}
fieldset[data-field-type="country"] .vs__dropdown-toggle[data-v-173327c8] {
  height: calc(2.125rem + 2px);
  border: 1px solid #dbdfea;
  border-radius: 4px;
  padding: 0 0.5rem;
  display: flex;
  align-items: center;
}
fieldset[data-field-type="country"] .vs__selected[data-v-173327c8],
fieldset[data-field-type="country"] .vs__search[data-v-173327c8] {
  margin-top: 0;
}
fieldset[data-field-type="country"] .vs__search[data-v-173327c8] {
  padding: 0;
}
fieldset[data-field-type="country"][data-v-173327c8] .vs__open-indicator {
  display: none;
}


.template-card[data-v-14975f92] {
  cursor: pointer;
  overflow: hidden;
  transition: transform 150ms ease, box-shadow 150ms ease, border-color 150ms ease;
}
.template-card[data-v-14975f92]:hover {
  transform: translateY(-2px);
  box-shadow: 0 0.5rem 1rem rgba(16, 24, 40, 0.12);
}
.template-card--selected[data-v-14975f92] {
  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.12);
}
.template-card[data-v-14975f92]:focus-visible {
  outline: none;
  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25), 0 0.5rem 1rem rgba(16, 24, 40, 0.12);
}
.template-card__image img[data-v-14975f92] {
  display: block;
  object-fit: cover;
  height: 280px;
}
@media (max-width: 767.98px) {
.template-card__image img[data-v-14975f92] {
    height: 220px;
}
}
.template-card__badge[data-v-14975f92] {
  top: 12px;
  right: 12px;
  width: 34px;
  height: 34px;
  display: flex;
  align-items: center;
  justify-content: center;
}


.required[data-v-2a556c6c] {
  color: var(--danger);
}
.vue-tel-input[data-v-2a556c6c] {
  height: calc(2.125rem + 2px);
  border: 1px solid #dbdfea;
  border-radius: 4px;
}
.vue-tel-input .vti__dropdown[data-v-2a556c6c] {
  display: flex;
  align-items: center;
  padding: 0 0.5rem;
}
.vue-tel-input .vti__input[data-v-2a556c6c] {
  height: 100%;
  padding: 0.4375rem 1rem;
  border: 0;
}
[data-field-type="country"] .v-select[data-v-2a556c6c] {
  width: 100%;
}
[data-field-type="country"] .vs__dropdown-toggle[data-v-2a556c6c] {
  height: calc(2.125rem + 2px);
  border: 1px solid #dbdfea;
  border-radius: 4px;
  padding: 0 0.5rem;
  display: flex;
  align-items: center;
}
[data-field-type="country"] .vs__selected[data-v-2a556c6c],
[data-field-type="country"] .vs__search[data-v-2a556c6c] {
  margin-top: 0;
}
[data-field-type="country"] .vs__search[data-v-2a556c6c] {
  padding: 0;
}
[data-field-type="country"][data-v-2a556c6c] .vs__open-indicator {
  display: none;
}



/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmNzcyIsIm1hcHBpbmdzIjoiO0FBZ1JBO0FBRUE7SUFDQTtBQUNBO0FBRUE7SUFDQTtJQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7QUFDQTtBQUVBO0lBQ0E7SUFDQTtJQUNBO0FBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBOzs7O0FDbEJBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0FBQ0E7QUFFQTs7RUFFQTtBQUNBO0FBRUE7RUFDQTtBQUNBOzs7O0FDaUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTs7RUFFQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTs7RUFFQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7OztFQUdBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTs7RUFFQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7QUFDQTtBQUVBOztFQUVBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTs7RUFFQTtBQUNBO0FBRUE7RUFDQTtBQUNBO0FBRUE7O0VBRUE7RUFDQTtBQUNBO0FBRUE7O0VBRUE7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7O0VBRUE7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7QUFDQTtBQUVBO0FBQ0E7SUFDQTtJQUNBO0FBQ0E7QUFFQTtJQUNBO0lBQ0E7QUFDQTtBQUVBO0lBQ0E7QUFDQTtBQUVBO0lBQ0E7QUFDQTtBQUVBOztJQUVBO0lBQ0E7QUFDQTtBQUVBOztJQUVBO0lBQ0E7QUFDQTtBQUNBOzs7QUMxaEJBO0VBQ0E7QUFDQTtBQUdBO0FBRUE7SUFDQTtBQUNBO0FBRUE7SUFDQTtJQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7QUFDQTtBQUVBO0lBQ0E7SUFDQTtJQUNBO0FBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBOzs7O0FDNUxBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0FBQ0E7QUFFQTs7RUFFQTtBQUNBO0FBRUE7RUFDQTtBQUNBOzs7O0FDMmVBO0VBQ0E7QUFDQTs7OztBQ1BBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTs7Ozs7RUFLQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtBQUNBO0FBRUE7RUFDQTtBQUNBO0FBRUE7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtBQUNBO0FBRUE7O0VBRUE7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7O0VBRUE7QUFDQTtBQUVBOztFQUVBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTtBQUNBO0lBQ0E7SUFDQTtJQUNBO0FBQ0E7QUFDQTs7OztBQzhHQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7O0VBRUE7QUFDQTtBQUVBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7QUFDQTs7O0FDL1RBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBQ0E7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTs7RUFFQTtBQUNBO0FBRUE7RUFDQTtBQUNBO0FBRUE7RUFDQTtBQUNBOzs7QUN0R0E7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUVBOztFQUVBO0FBQ0E7QUFFQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0FBQ0E7OztBQy9mQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTtBQUNBO0lBQ0E7QUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBOzs7QUN5U0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUVBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0FBRUE7RUFDQTtBQUNBO0FBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7QUFDQTtBQUVBOztFQUVBO0FBQ0E7QUFFQTtFQUNBO0FBQ0E7QUFFQTtFQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92dWUvdmlld3MvSW5kZXgudnVlIiwid2VicGFjazovLy8uL3Z1ZS92aWV3cy9GYXEudnVlIiwid2VicGFjazovLy8uL3Z1ZS92aWV3cy9DYWxlbmRhci52dWUiLCJ3ZWJwYWNrOi8vLy4vdnVlL3ZpZXdzL0NhdGVnb3J5LnZ1ZSIsIndlYnBhY2s6Ly8vLi92dWUvdmlld3MvVm91Y2hlckNoZWNrLnZ1ZSIsIndlYnBhY2s6Ly8vLi92dWUvdmlld3MvUmVzZXJ2YXRpb24udnVlIiwid2VicGFjazovLy8uL3Z1ZS9jb21wb25lbnRzL3Byb2R1Y3RzL1Bsb3QudnVlIiwid2VicGFjazovLy8uL3Z1ZS9jb21wb25lbnRzL3Byb2R1Y3RzL0N1c3RvbWVyLnZ1ZSIsIndlYnBhY2s6Ly8vLi92dWUvY29tcG9uZW50cy9zdWJzY3JpcHRpb25zL0N1c3RvbWVyLnZ1ZSIsIndlYnBhY2s6Ly8vLi92dWUvY29tcG9uZW50cy92b3VjaGVycy9DdXN0b21lci52dWUiLCJ3ZWJwYWNrOi8vLy4vdnVlL2NvbXBvbmVudHMvdm91Y2hlcnMvVGVtcGxhdGUudnVlIiwid2VicGFjazovLy8uL3Z1ZS9jb21wb25lbnRzL3Jlc2VydmF0aW9ucy9PdmVydmlldy52dWUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxuICA8bG9hZGVyIHYtaWY9XCIhbG9hZGVkXCIvPlxuICA8ZGl2IHYtZWxzZT5cbiAgICA8aDEgY2xhc3M9XCJzci1vbmx5XCI+e3sgdHJhbnMoJ3N0b3JlZnJvbnQudGl0bGUnKSB9fTwvaDE+XG4gICAgPGRpdiBjbGFzcz1cInN0b3JlZnJvbnQtY2F0ZWdvcnlsZXNzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RvcmVmcm9udC1ncmlkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZWZyb250LWNvbHVtblwiIHYtZm9yPVwiZW50cnkgaW4gZGlzcGxheUl0ZW1zXCIgOmlkPVwiZW50cnlJZChlbnRyeSlcIiA6a2V5PVwiZW50cnlJZChlbnRyeSlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJveCBvdmVyZmxvdy1oaWRkZW5cIiA6Y2xhc3M9XCJpc1JlbmV3YWwoZW50cnkpID8gJ2NhcmQtYWN0aXZlJyA6ICcnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1iYWRnZVwiIHYtaWY9XCJpc1JlbmV3YWwoZW50cnkpXCI+XG4gICAgICAgICAgICAgIDxyb3V0ZXItbGluayA6dG89XCJpdGVtTGluayhlbnRyeSlcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyB0cmFucygnaW5kZXguc3Vic2NyaXB0aW9ucy5jdXJyZW50JykgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvcm91dGVyLWxpbms+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWlubmVyIHAtMFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1pbWFnZVwiIHYtaWY9XCJlbnRyeS5pdGVtLmltYWdlXCI+XG4gICAgICAgICAgICAgICAgPHJvdXRlci1saW5rIDp0bz1cIml0ZW1MaW5rKGVudHJ5KVwiIDphcmlhLWxhYmVsPVwiaXRlbUFyaWFMYWJlbChlbnRyeSlcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgOnNyYz1cImNkbiArIGVudHJ5Lml0ZW0uaW1hZ2VcIiA6YWx0PVwiaXRlbUFsdChlbnRyeSlcIi8+XG4gICAgICAgICAgICAgICAgPC9yb3V0ZXItbGluaz5cbiAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZW50cnkuaXRlbS5sYWJlbFwiPnt7IGVudHJ5Lml0ZW0ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC00XCI+XG4gICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwiaDVcIj57eyBlbnRyeS5pdGVtLnRpdGxlIH19PC9oMj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInd5c2l3eWdcIlxuICAgICAgICAgICAgICAgICAgICB2LWlmPVwiZW50cnkuaXRlbS5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIHYtaHRtbD1cImVudHJ5Lml0ZW0uZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XCIoY29sbGFwc2VkW2VudHJ5R3JvdXAoZW50cnkudHlwZSldW2VudHJ5Lml0ZW0uaWRdID8gJ2NvbGxhcHNlZCcgOiAnJylcIlxuICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3eXNpd3lnLXJlYWRtb3JlXCJcbiAgICAgICAgICAgICAgICAgICAgOmFyaWEtbGFiZWw9XCJ0cmFucygnaW5kZXgucmVhZG1vcmUnKSArICcgJyArIGVudHJ5Lml0ZW0udGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICBAY2xpY2sucHJldmVudD1cImNvbGxhcHNlKGVudHJ5R3JvdXAoZW50cnkudHlwZSksIGVudHJ5Lml0ZW0uaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgdi1pZj1cImNvbGxhcHNlZFtlbnRyeUdyb3VwKGVudHJ5LnR5cGUpXVtlbnRyeS5pdGVtLmlkXVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxlbSBjbGFzcz1cImljb24gbmkgbmktY2hldnJvbnMtZG93blwiPjwvZW0+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHRyYW5zKCdpbmRleC5yZWFkbW9yZScpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInd5c2l3eWctcmVhZG1vcmVcIlxuICAgICAgICAgICAgICAgICAgICA6YXJpYS1sYWJlbD1cInRyYW5zKCdpbmRleC5yZWFkbGVzcycpICsgJyAnICsgZW50cnkuaXRlbS50aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgIEBjbGljay5wcmV2ZW50PVwiY29sbGFwc2UoZW50cnlHcm91cChlbnRyeS50eXBlKSwgZW50cnkuaXRlbS5pZClcIlxuICAgICAgICAgICAgICAgICAgICB2LWVsc2UtaWY9XCJyZWFkTW9yZU5lZWRlZChlbnRyeS5pdGVtLmRlc2NyaXB0aW9uKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxlbSBjbGFzcz1cImljb24gbmkgbmktY2hldnJvbnMtdXBcIj48L2VtPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyB0cmFucygnaW5kZXgucmVhZGxlc3MnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHJvdXRlci1saW5rIDp0bz1cIml0ZW1MaW5rKGVudHJ5KVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgOmFyaWEtbGFiZWw9XCJpdGVtQXJpYUxhYmVsKGVudHJ5KVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW1CdXR0b25UZXh0KGVudHJ5KSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3JvdXRlci1saW5rPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgIGluaXRpYWxpc2F0b3I6IG51bGwsXG4gICAgICBjbGllbnRfZ3JvdXBzOiBudWxsLFxuICAgICAgY2xpZW50X2dyb3Vwc19sb2FkaW5nOiBmYWxzZSxcbiAgICAgIGNvbGxhcHNlZDoge1xuICAgICAgICBjYXRlZ29yaWVzOiB7fSxcbiAgICAgICAgcHJvZHVjdHM6IHt9LFxuICAgICAgICBzdWJzY3JpcHRpb25zOiB7fSxcbiAgICAgICAgdm91Y2hlcnM6IHt9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5pbml0KCk7XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGNvbGxhcHNlKHR5cGUsIGlkKSB7XG4gICAgICB0aGlzLiRzZXQodGhpcy5jb2xsYXBzZWRbdHlwZV0sIGlkLCAhdGhpcy5jb2xsYXBzZWRbdHlwZV1baWRdKTtcbiAgICB9LFxuICAgIGVudHJ5R3JvdXAodHlwZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2F0ZWdvcnk6ICdjYXRlZ29yaWVzJyxcbiAgICAgICAgcHJvZHVjdDogJ3Byb2R1Y3RzJyxcbiAgICAgICAgc3Vic2NyaXB0aW9uOiAnc3Vic2NyaXB0aW9ucycsXG4gICAgICAgIHZvdWNoZXI6ICd2b3VjaGVycydcbiAgICAgIH1bdHlwZV0gfHwgJ3Byb2R1Y3RzJztcbiAgICB9LFxuICAgIGVudHJ5SWQoZW50cnkpIHtcbiAgICAgIHJldHVybiBgJHtlbnRyeS50eXBlfS0ke2VudHJ5Lml0ZW0uaWR9YDtcbiAgICB9LFxuICAgIGl0ZW1MaW5rKGVudHJ5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYXRlZ29yeTogYC9jYXRlZ29yeS8ke2VudHJ5Lml0ZW0uaWR9LyR7ZW50cnkuaXRlbS5zbHVnfWAsXG4gICAgICAgIHByb2R1Y3Q6IGAvcHJvZHVjdC8ke2VudHJ5Lml0ZW0uaWR9LyR7ZW50cnkuaXRlbS5zbHVnfWAsXG4gICAgICAgIHN1YnNjcmlwdGlvbjogYC9zdWJzY3JpcHRpb24vJHtlbnRyeS5pdGVtLmlkfS8ke2VudHJ5Lml0ZW0uc2x1Z31gLFxuICAgICAgICB2b3VjaGVyOiBgL3ZvdWNoZXIvJHtlbnRyeS5pdGVtLmlkfS8ke2VudHJ5Lml0ZW0uc2x1Z31gXG4gICAgICB9W2VudHJ5LnR5cGVdO1xuICAgIH0sXG4gICAgaXRlbUFsdChlbnRyeSkge1xuICAgICAgcmV0dXJuIGVudHJ5Lml0ZW0udGl0bGU7XG4gICAgfSxcbiAgICBpdGVtQnV0dG9uVGV4dChlbnRyeSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2F0ZWdvcnk6IHRoaXMudHJhbnMoJ2luZGV4LmNhdGVnb3JpZXMuc2VsZWN0JyksXG4gICAgICAgIHByb2R1Y3Q6IHRoaXMudHJhbnMoJ2luZGV4LnByb2R1Y3RzLnN1Ym1pdCcpLFxuICAgICAgICBzdWJzY3JpcHRpb246IHRoaXMudHJhbnMoJ2luZGV4LnN1YnNjcmlwdGlvbnMuc3VibWl0JyksXG4gICAgICAgIHZvdWNoZXI6IHRoaXMudHJhbnMoJ2luZGV4LnZvdWNoZXJzLnN1Ym1pdCcpXG4gICAgICB9W2VudHJ5LnR5cGVdO1xuICAgIH0sXG4gICAgaXRlbUFyaWFMYWJlbChlbnRyeSkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuaXRlbUJ1dHRvblRleHQoZW50cnkpfSAke2VudHJ5Lml0ZW0udGl0bGV9YDtcbiAgICB9LFxuICAgIGlzUmVuZXdhbChlbnRyeSkge1xuICAgICAgcmV0dXJuIGVudHJ5LnR5cGUgPT09ICdzdWJzY3JpcHRpb24nICYmIHRoaXMucmVuZXdhbCAhPT0gbnVsbCAmJiBlbnRyeS5pdGVtLmlkID09PSB0aGlzLnJlbmV3YWwuaWQ7XG4gICAgfSxcbiAgICBpbml0Q29sbGFwc2VkKGVudHJpZXMpIHtcbiAgICAgIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgdGhpcy4kc2V0KFxuICAgICAgICAgIHRoaXMuY29sbGFwc2VkW3RoaXMuZW50cnlHcm91cChlbnRyeS50eXBlKV0sXG4gICAgICAgICAgZW50cnkuaXRlbS5pZCxcbiAgICAgICAgICB0aGlzLnJlYWRNb3JlTmVlZGVkKGVudHJ5Lml0ZW0uZGVzY3JpcHRpb24pXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHJlYWRNb3JlTmVlZGVkKGRlc2NyaXB0aW9uKSB7XG4gICAgICBpZiAoIWRlc2NyaXB0aW9uKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3d5c2l3eWcnKTtcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICBjb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvdyA9ICd2aXNpYmxlJztcbiAgICAgIGNvbnRhaW5lci5zdHlsZS53aGl0ZVNwYWNlID0gJ25vcm1hbCc7XG5cbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBkZXNjcmlwdGlvbjtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcblxuICAgICAgY29uc3QgaGVpZ2h0ID0gY29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IG1heEhlaWdodCA9IDEwMDtcblxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChjb250YWluZXIpO1xuXG4gICAgICByZXR1cm4gaGVpZ2h0ID4gbWF4SGVpZ2h0O1xuICAgIH0sXG4gICAgYXN5bmMgaW5pdCgpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGlzYXRvciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub3JnYW5zYXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAodGhpcy5jbGllbnQgJiYgIXRoaXMuY2xpZW50X2dyb3Vwc19sb2FkaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmNsaWVudF9ncm91cHNfbG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICBheGlvcy5nZXQoYGFwaS9ncm91cHMvJHt0aGlzLmNsaWVudC5pZH1gKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5jbGllbnRfZ3JvdXBzID0gcmVzLmRhdGEucmVzcG9uc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmNsaWVudF9ncm91cHNfbG9hZGluZykge1xuICAgICAgICAgICAgdGhpcy5jbGllbnRfZ3JvdXBzID0ge307XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuSXNBbGxMb2FkZWQgJiYgdGhpcy5jbGllbnRfZ3JvdXBzKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuaW5pdGlhbGlzYXRvcik7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpc2F0b3IgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5pbml0Q29sbGFwc2VkKHRoaXMuZGlzcGxheUl0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIDI1MCk7XG4gICAgfSxcbiAgfSxcbiAgY29tcHV0ZWQ6IHtcbiAgICBJc0FsbExvYWRlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRzdG9yZS5nZXR0ZXJzLklzQWxsTG9hZGVkO1xuICAgIH0sXG4gICAgcHJvZHVjdENhcnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc3RvcmUuZ2V0dGVycy5Qcm9kdWN0Q2FydFxuICAgIH0sXG4gICAgb3JnYW5zYXRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc3RvcmUuZ2V0dGVycy5PcmdhbmlzYXRpb247XG4gICAgfSxcbiAgICBjbGllbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc3RvcmUuZ2V0dGVycy5DbGllbnQ7XG4gICAgfSxcbiAgICBjYXRlZ29yaWVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnMuQ2F0ZWdvcmllcztcbiAgICB9LFxuICAgIHJvb3RfaXRlbXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc3RvcmUuZ2V0dGVycy5Sb290SXRlbXM7XG4gICAgfSxcbiAgICBwcm9kdWN0cygpIHtcbiAgICAgIHJldHVybiB0aGlzLiRzdG9yZS5nZXR0ZXJzLlByb2R1Y3RzO1xuICAgIH0sXG4gICAgcHJvZHVjdF9ncm91cHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc3RvcmUuZ2V0dGVycy5Qcm9kdWN0R3JvdXBzO1xuICAgIH0sXG4gICAgcHJvZHVjdHNfY2F0ZWdvcnlsZXNzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnMuUHJvZHVjdHNXaXRob3V0Q2F0ZWdvcnk7XG4gICAgfSxcbiAgICBzdWJzY3JpcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvZHVjdENhcnQubGVuZ3RoID09PSAwID8gdGhpcy4kc3RvcmUuZ2V0dGVycy5TdWJzY3JpcHRpb25zIDogW107XG4gICAgfSxcbiAgICBzdWJzY3JpcHRpb25zX2NhdGVnb3J5bGVzcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2R1Y3RDYXJ0Lmxlbmd0aCA9PT0gMCA/IHRoaXMuJHN0b3JlLmdldHRlcnMuU3Vic2NyaXB0aW9uc1dpdGhvdXRDYXRlZ29yeSA6IFtdO1xuICAgIH0sXG4gICAgdm91Y2hlcnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9kdWN0Q2FydC5sZW5ndGggPT09IDAgPyB0aGlzLiRzdG9yZS5nZXR0ZXJzLlZvdWNoZXJzIDogW107XG4gICAgfSxcbiAgICB2b3VjaGVyc19jYXRlZ29yeWxlc3MoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9kdWN0Q2FydC5sZW5ndGggPT09IDAgPyB0aGlzLiRzdG9yZS5nZXR0ZXJzLlZvdWNoZXJzV2l0aG91dENhdGVnb3J5IDogW107XG4gICAgfSxcbiAgICByZW5ld2FsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnMuU3Vic2NyaXB0aW9uUmVuZXdhbDtcbiAgICB9LFxuICAgIHJlbmV3YWxTdWJzY3JpcHRpb25zKCkge1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IHRoaXMuJHN0b3JlLmdldHRlcnMuU3Vic2NyaXB0aW9ucyB8fCBbXTtcbiAgICAgIGlmICghdGhpcy5yZW5ld2FsKSB7XG4gICAgICAgIHJldHVybiBzdWJzY3JpcHRpb25zO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXlsb2FkU3Vic2NyaXB0aW9uID0gdGhpcy5yZW5ld2FsLnN1YnNjcmlwdGlvbiB8fCBudWxsO1xuICAgICAgaWYgKHBheWxvYWRTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIFtwYXlsb2FkU3Vic2NyaXB0aW9uXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVuZXdhbElkID0gcGFyc2VJbnQodGhpcy5yZW5ld2FsLmlkLCAxMCk7XG4gICAgICBjb25zdCBleHBsaWNpdFJlbmV3YWwgPSB0aGlzLiRzdG9yZS5nZXR0ZXJzLlN1YnNjcmlwdGlvbihyZW5ld2FsSWQpO1xuICAgICAgaWYgKCFleHBsaWNpdFJlbmV3YWwpIHtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdWJzY3JpcHRpb25zLnNvbWUoKHN1YnNjcmlwdGlvbikgPT4gcGFyc2VJbnQoc3Vic2NyaXB0aW9uLmlkLCAxMCkgPT09IHJlbmV3YWxJZCkpIHtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbLi4uc3Vic2NyaXB0aW9ucywgZXhwbGljaXRSZW5ld2FsXTtcbiAgICB9LFxuICAgIGZhbGxiYWNrX2l0ZW1zKCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4udGhpcy5wcm9kdWN0c19jYXRlZ29yeWxlc3MubWFwKGl0ZW0gPT4gKHt0eXBlOiAncHJvZHVjdCcsIGl0ZW19KSksXG4gICAgICAgIC4uLnRoaXMuY2F0ZWdvcmllcy5tYXAoaXRlbSA9PiAoe3R5cGU6ICdjYXRlZ29yeScsIGl0ZW19KSksXG4gICAgICAgIC4uLnRoaXMuc3Vic2NyaXB0aW9uc19jYXRlZ29yeWxlc3MubWFwKGl0ZW0gPT4gKHt0eXBlOiAnc3Vic2NyaXB0aW9uJywgaXRlbX0pKSxcbiAgICAgICAgLi4udGhpcy52b3VjaGVyc19jYXRlZ29yeWxlc3MubWFwKGl0ZW0gPT4gKHt0eXBlOiAndm91Y2hlcicsIGl0ZW19KSlcbiAgICAgIF07XG4gICAgfSxcbiAgICBkaXNwbGF5SXRlbXMoKSB7XG4gICAgICBsZXQgaXRlbXMgPSB0aGlzLnJvb3RfaXRlbXMubGVuZ3RoID4gMCA/IHRoaXMucm9vdF9pdGVtcyA6IHRoaXMuZmFsbGJhY2tfaXRlbXM7XG5cbiAgICAgIGlmICh0aGlzLnJlbmV3YWwpIHtcbiAgICAgICAgY29uc3QgcmVuZXdhbENhdGVnb3JpZXMgPSB0aGlzLmNhdGVnb3JpZXNcbiAgICAgICAgICAuZmlsdGVyKGNhdGVnb3J5ID0+IEFycmF5LmlzQXJyYXkoY2F0ZWdvcnkuc3Vic2NyaXB0aW9ucykgJiYgY2F0ZWdvcnkuc3Vic2NyaXB0aW9ucy5sZW5ndGggPiAwKVxuICAgICAgICAgIC5tYXAoaXRlbSA9PiAoe3R5cGU6ICdjYXRlZ29yeScsIGl0ZW19KSk7XG4gICAgICAgIGNvbnN0IHJlbmV3YWxTdWJzY3JpcHRpb25zID0gdGhpcy5yZW5ld2FsU3Vic2NyaXB0aW9ucy5tYXAoaXRlbSA9PiAoe3R5cGU6ICdzdWJzY3JpcHRpb24nLCBpdGVtfSkpO1xuICAgICAgICBpdGVtcyA9IFsuLi5yZW5ld2FsQ2F0ZWdvcmllcywgLi4ucmVuZXdhbFN1YnNjcmlwdGlvbnNdO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnByb2R1Y3RDYXJ0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoZW50cnkgPT4gZW50cnkudHlwZSAhPT0gJ3N1YnNjcmlwdGlvbicgJiYgZW50cnkudHlwZSAhPT0gJ3ZvdWNoZXInKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIiBzY29wZWQ+XG5cbkBtZWRpYSAobWF4LXdpZHRoOiAxMDAwcHgpIHtcblxuICAuc3RvcmVmcm9udC1ncmlkIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gIC5zdG9yZWZyb250LWdyaWQgLnN0b3JlZnJvbnQtY29sdW1uIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xuICB9XG59XG5cblxuQG1lZGlhIChtaW4td2lkdGg6IDEwMDBweCkge1xuXG4gIC5zdG9yZWZyb250LWdyaWQge1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA1MCUgNTAlO1xuICAgIGdyaWQtZ2FwOiAxNXB4O1xuICAgIGdyaWQtcm93LWdhcDogMTVweDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW4tYm90dG9tOiAwcHg7XG4gIH1cblxuICAuc3RvcmVmcm9udC1ncmlkIC5zdG9yZWZyb250LWNvbHVtbiB7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBicmVhay1pbnNpZGU6IGF2b2lkO1xuICAgIHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDtcbiAgfVxufVxuXG4uY2FyZC1pbWFnZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMjAwcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5jYXJkLWltYWdlIGltZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtNTAlKTtcbn1cblxuLmNhcmQtaW1hZ2Ugc3BhbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYmFja2dyb3VuZDogdmFyKC0tYnV0dG9uKTtcbiAgYm90dG9tOiAwO1xuICByaWdodDogMS41cmVtO1xuICBjb2xvcjogdmFyKC0tYnV0dG9uLXRleHQpO1xuICBwYWRkaW5nOiA3LjVweCAxNXB4O1xuICBib3JkZXItcmFkaXVzOiA1cHggNXB4IDAgMDtcbiAgei1pbmRleDogMTtcbn1cblxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGxvYWRlciB2LWlmPVwiIXJlYWR5XCIvPlxuICA8ZGl2IHYtZWxzZS1pZj1cImlzRW5hYmxlZChmYXEuZmFxX2VuYWJsZWQpXCI+XG4gICAgPGRpdiBjbGFzcz1cIm5rLWJsb2NrIG5rLWJsb2NrLWhlYWQtbGcgd2lkZS1sZyBteC1hdXRvXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvcmRlcmVkIGZhcS1zZWN0aW9uLWNhcmQgZmFxLWhlcm9cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaW5uZXIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmFxLWJhZGdlXCI+XG4gICAgICAgICAgICA8c3Bhbj5GQVEnczwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8aDIgY2xhc3M9XCJuay1ibG9jay10aXRsZSBmdy1ub3JtYWxcIj57eyB0cmFucygnZmFxLnRpdGxlJykgfX08L2gyPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJuay1ibG9jay1kZXNcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibGVhZFwiPnt7IHRyYW5zKCdmYXEuc3VidGl0bGUnKSB9fTwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibmstYmxvY2sgbmstYmxvY2stbGcgd2lkZS1sZyBteC1hdXRvXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvcmRlcmVkIGZhcS1hY2NvcmRpb24tY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1pbm5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb25cIiBpZD1cImZhcXNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taXRlbVwiIHYtZm9yPVwicXVlc3Rpb24sIGluZGV4IGluIGZhcS5xdWVzdGlvbnNcIiA6a2V5PVwiJ2ZhcS1xdWVzdGlvbi0nICsgaW5kZXhcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhY2NvcmRpb24taGVhZCBjb2xsYXBzZWRcIiA6ZGF0YS10YXJnZXQ9XCInI2ZhcScgKyAoaW5kZXggKyA3KVwiIGRhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIlxuICAgICAgICAgICAgICAgICAgICAgIDphcmlhLWNvbnRyb2xzPVwiJ2ZhcScgKyAoaW5kZXggKyA3KVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cInRpdGxlXCI+e3sgcXVlc3Rpb24ucXVlc3Rpb24gfX08L2g2PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWNjb3JkaW9uLWljb25cIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWJvZHkgY29sbGFwc2VcIiA6aWQ9XCInZmFxJyArIChpbmRleCArIDcpXCIgZGF0YS1wYXJlbnQ9XCIjZmFxc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taW5uZXJcIiB2LWh0bWw9XCJxdWVzdGlvbi5hbnN3ZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibmstYmxvY2sgbmstYmxvY2staGVhZC1sZyB3aWRlLWxnIG14LWF1dG9cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtYm9yZGVyZWQgZmFxLXNlY3Rpb24tY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1pbm5lciB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cIm5rLWJsb2NrLXRpdGxlIGZ3LW5vcm1hbFwiPnt7IHRyYW5zKCdmYXEuZXh0cmEudGl0bGUnKSB9fTwvaDM+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5rLWJsb2NrLWRlc1wiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJsZWFkXCI+e3sgdHJhbnMoJ2ZhcS5leHRyYS5zdWJ0aXRsZScpIH19PC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJuay1ibG9jayB3aWRlLWxnIG14LWF1dG9cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy1nc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgY29sLWxnLTRcIiB2LWZvcj1cImNhcmQgaW4gc3VwcG9ydENhcmRzXCIgOmtleT1cImNhcmQua2V5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib3JkZXJlZCBmYXEtc3VwcG9ydC1jYXJkIGgtMTAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1pbm5lclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmFxLXN1cHBvcnQtaWxsdXN0cmF0aW9uXCIgdi1pZj1cImNhcmQuaWNvblwiPlxuICAgICAgICAgICAgICAgIDxlbSA6Y2xhc3M9XCJbJ2ljb24nLCBjYXJkLmljb25dXCI+PC9lbT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGUgZnctbm9ybWFsXCI+e3sgY2FyZC50aXRsZSB9fTwvaDU+XG4gICAgICAgICAgICAgIDxwIHYtaWY9XCJjYXJkLmRlc2NyaXB0aW9uXCIgY2xhc3M9XCJmYXEtc3VwcG9ydC1kZXNjcmlwdGlvblwiPnt7IGNhcmQuZGVzY3JpcHRpb24gfX08L3A+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmYXEtc3VwcG9ydC1hY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8YSB2LWlmPVwiY2FyZC5tb2RhbFwiIDpocmVmPVwiY2FyZC5ocmVmXCIgY2xhc3M9XCJidG4gYnRuLWxnXCIgZGF0YS10b2dnbGU9XCJtb2RhbFwiPnt7IGNhcmQuYWN0aW9uIH19PC9hPlxuICAgICAgICAgICAgICAgIDxhIHYtZWxzZSA6aHJlZj1cImNhcmQuaHJlZlwiIGNsYXNzPVwiYnRuIGJ0bi1sZ1wiIDp0YXJnZXQ9XCJjYXJkLmV4dGVybmFsID8gJ19ibGFuaycgOiBudWxsXCI+e3sgY2FyZC5hY3Rpb24gfX08L2E+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGlkPVwiY29udGFjdFwiIGNsYXNzPVwibW9kYWwgZmFkZVwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWxnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IG1vZGFsLWJvZHktbGcgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvcmRlcmVkXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5cbiAgICAgICAgICAgICAgPGVtIGNsYXNzPVwiaWNvbiBuaSBuaS1jcm9zc1wiPjwvZW0+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWlubmVyXCI+XG4gICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGVcIj57eyB0cmFucygnZmFxLmNvbnRhY3QnKSB9fTwvaDU+XG4gICAgICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgICAgICA8bGkgdi1pZj1cImZhcS5waG9uZV9udW1iZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibmkgbmktY2FsbFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxhIDpocmVmPVwiJ3RlbDonICsgZmFxLnBob25lX251bWJlclwiPnt7IGZhcS5waG9uZV9udW1iZXIgfX08L2E+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgdi1pZj1cImZhcS5lbWFpbFwiPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJuaSBuaS1tYWlsXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPGEgOmhyZWY9XCInbWFpbHRvOicgKyBmYXEuZW1haWwgXCI+IHt7IGZhcS5lbWFpbCB9fTwvYT5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaSB2LWlmPVwiZmFxLndoYXRzYXBwX3VybFwiPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJuaSBuaS13aGF0c2FwcFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxhIDpocmVmPVwiZmFxLndoYXRzYXBwX3VybFwiPiB7eyBmYXEud2hhdHNhcHBfdXJsIH19PC9hPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIHYtaWY9XCJmYXEub3BlbmluZ19ob3Vyc191cmxcIj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibmkgbmktY2xvY2tcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8YSA6aHJlZj1cImZhcS5vcGVuaW5nX2hvdXJzX3VybFwiPiB7eyBmYXEub3BlbmluZ19ob3Vyc191cmwgfX08L2E+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBpZD1cInJlc3RpdHV0aW9uXCIgY2xhc3M9XCJtb2RhbCBmYWRlXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtbGdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgbW9kYWwtYm9keS1sZ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtYm9yZGVyZWRcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPlxuICAgICAgICAgICAgICA8ZW0gY2xhc3M9XCJpY29uIG5pIG5pLWNyb3NzXCI+PC9lbT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaW5uZXJcIj5cbiAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiY2FyZC10aXRsZSB0ZXh0LWNlbnRlclwiPnt7IHRyYW5zKCdmYXEucmVzdGl0dXRpb24uYXBwbGljYXRpb24nKSB9fTwvaDU+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tbGFiZWwtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyB0cmFucygnZmFxLnJlc3RpdHV0aW9uLmZpcnN0bmFtZScpIH19IDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiB2LW1vZGVsPVwibWFpbC5maXJzdF9uYW1lLnZhbHVlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIDpjbGFzcz1cInsgJ2JvcmRlci1kYW5nZXInOiAhbWFpbC5maXJzdF9uYW1lLnZhbGlkIH1cIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tbGFiZWwtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyB0cmFucygnZmFxLnJlc3RpdHV0aW9uLnN1cm5hbWUnKSB9fSA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgdi1tb2RlbD1cIm1haWwubGFzdF9uYW1lLnZhbHVlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIDpjbGFzcz1cInsgJ2JvcmRlci1kYW5nZXInOiAhbWFpbC5sYXN0X25hbWUudmFsaWQgfVwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1sYWJlbC1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IHRyYW5zKCdmYXEucmVzdGl0dXRpb24uZW1haWwnKSB9fSA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgdi1tb2RlbD1cIm1haWwuYWRyZXNzLnZhbHVlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIDpjbGFzcz1cInsgJ2JvcmRlci1kYW5nZXInOiAhbWFpbC5hZHJlc3MudmFsaWQgfVwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1sYWJlbC1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IHRyYW5zKCdmYXEucmVzdGl0dXRpb24ub3JkZXJfbnVtYmVyJykgfX0gPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250cm9sLXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHYtbW9kZWw9XCJtYWlsLm9yZGVyX251bWJlci52YWx1ZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJ7ICdib3JkZXItZGFuZ2VyJzogIW1haWwub3JkZXJfbnVtYmVyLnZhbGlkIH1cIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tbGFiZWwtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyB0cmFucygnZmFxLnJlc3RpdHV0aW9uLnJlYXNvbicpIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250cm9sLXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSByb3dzPVwiNFwiIHYtbW9kZWw9XCJtYWlsLmNvbW1lbnQudmFsdWVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGcgYnRuLXByaW1hcnkgYnRuLWJsb2NrXCIgQGNsaWNrPVwic2VuZF9tYWlsXCI+e3sgdHJhbnMoJ2ZhcS5yZXN0aXR1dGlvbi5zZW5kJylcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVhZHk6IGZhbHNlLFxuICAgICAgaG9zdDogbG9jYXRpb24uaG9zdCxcbiAgICAgIG1haWw6IHtcbiAgICAgICAgZmlyc3RfbmFtZToge3ZhbHVlOiBudWxsLCByZXF1aXJlZDogdHJ1ZSwgdmFsaWQ6IHRydWV9LFxuICAgICAgICBsYXN0X25hbWU6IHt2YWx1ZTogbnVsbCwgcmVxdWlyZWQ6IHRydWUsIHZhbGlkOiB0cnVlfSxcbiAgICAgICAgYWRyZXNzOiB7dmFsdWU6IG51bGwsIHJlcXVpcmVkOiB0cnVlLCB2YWxpZDogdHJ1ZX0sXG4gICAgICAgIG9yZGVyX251bWJlcjoge3ZhbHVlOiBudWxsLCByZXF1aXJlZDogdHJ1ZSwgdmFsaWQ6IHRydWV9LFxuICAgICAgICBjb21tZW50OiB7dmFsdWU6IG51bGwsIHJlcXVpcmVkOiBmYWxzZX1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHZhbGlkYXRlX2ZpZWxkKGZpZWxkLCB0eXBlKSB7XG4gICAgICB0aGlzLnNldFZhbGlkKGZpZWxkKTtcbiAgICAgIGxldCB2YWxpZGF0b3JzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZXM6IFsnTkFNRSddLFxuICAgICAgICAgIHJlZ2V4OiBuZXcgUmVnRXhwKC9eLnsxLDY1NTM1fSQvLCAnaScpXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlczogWydFTUFJTCddLFxuICAgICAgICAgIHJlZ2V4OiBuZXcgUmVnRXhwKC9eKChbXjw+KClbXFxdXFxcXC4sOzpcXHNAXCJdKyhcXC5bXjw+KClbXFxdXFxcXC4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKChcXFtbMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFxdKXwoKFthLXpBLVpcXC0wLTldK1xcLikrW2EtekEtWl17Mix9KSkkLywgJ2knKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZXM6IFsnTlVNQkVSJ10sXG4gICAgICAgICAgcmVnZXg6IG5ldyBSZWdFeHAoL15bMC05XXsxLDUwfShbLC5dWzAtOV17MSwyfSk/JC8sICdpJylcbiAgICAgICAgfVxuICAgICAgXVxuXG4gICAgICBsZXQgdmFsaWRhdG9yID0gXy5maW5kKHZhbGlkYXRvcnMsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlLnR5cGVzLmluY2x1ZGVzKHR5cGUpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChmaWVsZC5yZXF1aXJlZCAmJiBmaWVsZC52YWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5zZXROb3RWYWxpZChmaWVsZCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbGlkYXRvci5yZWdleC50ZXN0KGZpZWxkLnZhbHVlKSAhPT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnNldE5vdFZhbGlkKGZpZWxkKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICB2YWxpZGF0ZV9tYWlsKCkge1xuICAgICAgbGV0IGlzVmFsaWQgPSB0cnVlO1xuICAgICAgaXNWYWxpZCA9IGlzVmFsaWQgJiYgdGhpcy52YWxpZGF0ZV9maWVsZCh0aGlzLm1haWwuZmlyc3RfbmFtZSwgJ05BTUUnKTtcbiAgICAgIGlzVmFsaWQgPSBpc1ZhbGlkICYmIHRoaXMudmFsaWRhdGVfZmllbGQodGhpcy5tYWlsLmxhc3RfbmFtZSwgJ05BTUUnKTtcbiAgICAgIGlzVmFsaWQgPSBpc1ZhbGlkICYmIHRoaXMudmFsaWRhdGVfZmllbGQodGhpcy5tYWlsLmFkcmVzcywgJ0VNQUlMJyk7XG4gICAgICBpc1ZhbGlkID0gaXNWYWxpZCAmJiB0aGlzLnZhbGlkYXRlX2ZpZWxkKHRoaXMubWFpbC5vcmRlcl9udW1iZXIsICdOVU1CRVInKTtcbiAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgIH0sXG4gICAgc2VuZF9tYWlsKCkge1xuICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLnZhbGlkYXRlX21haWwoKSkge1xuICAgICAgICBheGlvcy5wb3N0KGAvYXBpL2ZhcS9tYWlsYCwge1xuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRhdGE6IHRoaXMubWFpbFxuICAgICAgICB9KS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICBpZiAocmVzLmRhdGEub2spIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2V0Tm90VmFsaWQoZmllbGQpIHtcbiAgICAgIGZpZWxkLnZhbGlkID0gZmFsc2U7XG4gICAgfSxcbiAgICBzZXRWYWxpZChmaWVsZCkge1xuICAgICAgZmllbGQudmFsaWQgPSB0cnVlO1xuICAgIH0sXG4gICAgaXNFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4kcm91dGVyLnJlcGxhY2UoJy80MDQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmYXEoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc3RvcmUuZ2V0dGVycy5GYXE7XG4gICAgfSxcbiAgICBzdXBwb3J0Q2FyZHMoKSB7XG4gICAgICBjb25zdCBjYXJkcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ2NhbmNlbGxhdGlvbicsXG4gICAgICAgICAgdGl0bGU6IHRoaXMudHJhbnMoJ2ZhcS5leHRyYS5xdWVzdGlvbnMucV8yJyksXG4gICAgICAgICAgYWN0aW9uOiB0aGlzLnRyYW5zKCdmYXEuZXh0cmEuY2FuY2VsbGF0aW9uJyksXG4gICAgICAgICAgaHJlZjogJyNyZXN0aXR1dGlvbicsXG4gICAgICAgICAgbW9kYWw6IHRydWUsXG4gICAgICAgICAgaWNvbjogJ25pIG5pLXdhbGxldC1pbidcbiAgICAgICAgfVxuICAgICAgXTtcblxuICAgICAgaWYgKHRoaXMuZmFxLnJlYm9va2luZ19hbGxvd2VkKSB7XG4gICAgICAgIGNhcmRzLnB1c2goe1xuICAgICAgICAgIGtleTogJ3JlYm9vaycsXG4gICAgICAgICAgdGl0bGU6IHRoaXMudHJhbnMoJ2ZhcS5leHRyYS5xdWVzdGlvbnMucV8xJyksXG4gICAgICAgICAgYWN0aW9uOiB0aGlzLnRyYW5zKCdmYXEuZXh0cmEucmVib29rJyksXG4gICAgICAgICAgaHJlZjogYC9yZWJvb2svJHt0aGlzLmZhcS5yZWJvb2tpbmdfc2VjcmV0fWAsXG4gICAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICAgIGV4dGVybmFsOiBmYWxzZSxcbiAgICAgICAgICBpY29uOiAnbmkgbmktY2FsZW5kYXItY2hlY2snXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjYXJkcy5wdXNoKHtcbiAgICAgICAga2V5OiAnY29udGFjdCcsXG4gICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zKCdmYXEuZXh0cmEucXVlc3Rpb25zLnFfMycpLFxuICAgICAgICBhY3Rpb246IHRoaXMudHJhbnMoJ2ZhcS5leHRyYS5jb250YWN0JyksXG4gICAgICAgIGhyZWY6ICcjY29udGFjdCcsXG4gICAgICAgIG1vZGFsOiB0cnVlLFxuICAgICAgICBpY29uOiAnbmkgbmktbWFpbCdcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY2FyZHM7XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIGNyZWF0ZWQoKSB7XG4gICAgYXdhaXQgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2xvYWRGYXEnKTtcbiAgICBpZiAodGhpcy5mYXEpIHtcbiAgICAgIHRoaXMucmVhZHkgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG48L3NjcmlwdD5cblxuPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiIHNjb3BlZD5cblxuLmNhcmQge1xuICBwb2ludGVyLWV2ZW50czogaW5pdGlhbDtcbn1cblxuLmZhcS1zZWN0aW9uLWNhcmQge1xuICBiYWNrZ3JvdW5kOiByZ2JhKHZhcigtLWJ1dHRvbi1yZ2IsIDI2LCAxODgsIDE1NiksIDAuMDgpO1xuICBib3JkZXItY29sb3I6IHJnYmEodmFyKC0tYnV0dG9uLXJnYiwgMjYsIDE4OCwgMTU2KSwgMC4zKTtcbiAgYm94LXNoYWRvdzogMCAxLjc1cmVtIDIuNXJlbSAtMS41cmVtIHJnYmEodmFyKC0tYnV0dG9uLXJnYiwgMjYsIDE4OCwgMTU2KSwgMC42NSk7XG59XG5cbi5mYXEtc2VjdGlvbi1jYXJkIC5jYXJkLWlubmVyIHtcbiAgcGFkZGluZzogMi41cmVtIDJyZW07XG59XG5cbi5mYXEtaGVybyAuY2FyZC1pbm5lciB7XG4gIHBhZGRpbmctdG9wOiAzcmVtO1xuICBwYWRkaW5nLWJvdHRvbTogM3JlbTtcbn1cblxuLmZhcS1iYWRnZSB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgcGFkZGluZzogMC4zNzVyZW0gMXJlbTtcbiAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gIGJhY2tncm91bmQ6IHJnYmEodmFyKC0tYnV0dG9uLXJnYiwgMjYsIDE4OCwgMTU2KSwgMC4xNSk7XG4gIGNvbG9yOiB2YXIoLS1idXR0b24sICMxYWJjOWMpO1xuICBmb250LXdlaWdodDogNzAwO1xuICBsZXR0ZXItc3BhY2luZzogMC4wOGVtO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xufVxuXG4uZmFxLWJhZGdlIHNwYW4ge1xuICBmb250LXNpemU6IDAuODc1cmVtO1xufVxuXG4uZmFxLWFjY29yZGlvbi1jYXJkIHtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbiAgYm9yZGVyLWNvbG9yOiByZ2JhKHZhcigtLXBhcmFncmFwaC1yZ2IsIDgyLCAxMDAsIDEzMiksIDAuMik7XG4gIGJveC1zaGFkb3c6IDAgMS41cmVtIDNyZW0gLTJyZW0gcmdiYSgxNywgMjQsIDM5LCAwLjI1KTtcbn1cblxuLmZhcS1hY2NvcmRpb24tY2FyZCAuY2FyZC1pbm5lciB7XG4gIHBhZGRpbmc6IDA7XG59XG5cbi5mYXEtc3VwcG9ydC1jYXJkIHtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbiAgYm9yZGVyLWNvbG9yOiByZ2JhKHZhcigtLXBhcmFncmFwaC1yZ2IsIDgyLCAxMDAsIDEzMiksIDAuMik7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGVhc2UsIGJveC1zaGFkb3cgMC4zcyBlYXNlO1xufVxuXG4uZmFxLXN1cHBvcnQtY2FyZDpob3ZlciB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNnB4KTtcbiAgYm94LXNoYWRvdzogMCAxLjc1cmVtIDIuNzVyZW0gLTEuNXJlbSByZ2JhKHZhcigtLWJ1dHRvbi1yZ2IsIDI2LCAxODgsIDE1NiksIDAuNSk7XG59XG5cbi5mYXEtc3VwcG9ydC1jYXJkIC5jYXJkLWlubmVyIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgcGFkZGluZzogMnJlbSAxLjc1cmVtO1xuICBnYXA6IDEuMjVyZW07XG59XG5cbi5mYXEtc3VwcG9ydC1pbGx1c3RyYXRpb24ge1xuICB3aWR0aDogODhweDtcbiAgaGVpZ2h0OiA4OHB4O1xuICBtYXJnaW46IDAgYXV0bztcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGJhY2tncm91bmQ6IHJnYmEodmFyKC0tYnV0dG9uLXJnYiwgMjYsIDE4OCwgMTU2KSwgMC4xMik7XG4gIGNvbG9yOiB2YXIoLS1idXR0b24sICMxYWJjOWMpO1xufVxuXG4uZmFxLXN1cHBvcnQtaWxsdXN0cmF0aW9uIC5pY29uIHtcbiAgZm9udC1zaXplOiAycmVtO1xuICBsaW5lLWhlaWdodDogMTtcbn1cblxuLmZhcS1zdXBwb3J0LWRlc2NyaXB0aW9uIHtcbiAgY29sb3I6IHZhcigtLXBhcmFncmFwaCwgIzUyNjQ4NCk7XG59XG5cbi5mYXEtc3VwcG9ydC1hY3Rpb24gLmJ0biB7XG4gIG1pbi13aWR0aDogMTQwcHg7XG59XG5cbi5idG4tY2xvc2Uge1xuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgaGVpZ2h0OiAycmVtO1xuICB3aWR0aDogMnJlbTtcbiAgcmlnaHQ6IC41cmVtO1xuICB0b3A6IC41cmVtO1xuICBwYWRkaW5nOiAuMjVlbSAuMjVlbTtcbiAgYm9yZGVyOiAwO1xuICBib3JkZXItcmFkaXVzOiA0MHB4O1xuICBmb250LXNpemU6IDEuMjVyZW07XG4gIGNvbG9yOiAjMDAwO1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg1MCUsIC01MCUpO1xuICB0cmFuc2l0aW9uOiAuM3MgZWFzZVxufVxuXG4uYnRuLWNsb3NlOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogIzAwMCAhaW1wb3J0YW50O1xuICBjb2xvcjogI2ZmZjtcbn1cblxuLmJ0bi1jbG9zZTphY3RpdmUsXG4uYnRuLWNsb3NlOmZvY3VzIHtcbiAgb3V0bGluZTogbm9uZTtcbn1cblxudWwge1xuICB0ZXh0LWFsaWduOiBpbml0aWFsO1xufVxuXG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8bG9hZGVyIHYtaWY9XCJsb2FkaW5nXCIgLz5cbiAgPGRpdiB2LWVsc2UgY2xhc3M9XCJuay1ibG9jayBuay1ibG9jay1jYWxlbmRhclwiPlxuICAgIDxkaXYgY2xhc3M9XCJuay1ibG9jay1oZWFkIG5rLWJsb2NrLWhlYWQtc21cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJuay1ibG9jay1oZWFkLWJldHdlZW4gYWxpZ24taXRlbXMtc3RhcnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5rLWJsb2NrLWhlYWQtY29udGVudFwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cIm5rLWJsb2NrLXRpdGxlIHBhZ2UtdGl0bGVcIj57eyB0cmFucygnY2FsZW5kYXIudGl0bGUnKSB8fCAnQ2FsZW5kYXInIH19PC9oMz5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICB2LWlmPVwic2hvd1RpbWVzbG90c1NvbGRPdXRXYXJuaW5nXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZyBhbGVydC1pY29uIG10LTMgbWItMFwiXG4gICAgICAgICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxlbSBjbGFzcz1cImljb24gbmkgbmktYWxlcnQtY2lyY2xlXCI+PC9lbT5cbiAgICAgICAgICAgIDxzcGFuPnt7IHRyYW5zKCdjYWxlbmRhci50aW1lc2xvdHNfc29sZF9vdXRfdG9kYXknKSB8fCAnVGltZXNsb3RzIGZvciB0b2RheSBhcmUgc29sZCBvdXQhJyB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJuay1ibG9ja1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib3JkZXJlZCBhZ2VuZGEtY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1pbm5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VuZGEtdG9vbGJhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW5kYS1uYXYtbGVmdFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImFnZW5kYS1idG5cIiBAY2xpY2s9XCJnb1ByZXZcIiA6YXJpYS1sYWJlbD1cInRyYW5zKCdjYWxlbmRhci5wcmV2aW91cycpIHx8ICdQcmV2aW91cyBwZXJpb2QnXCI+XG4gICAgICAgICAgICAgICAgPGVtIGNsYXNzPVwiaWNvbiBuaSBuaS1jaGV2cm9uLWxlZnRcIj48L2VtPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhZ2VuZGEtYnRuXCIgQGNsaWNrPVwiZ29OZXh0XCIgOmFyaWEtbGFiZWw9XCJ0cmFucygnY2FsZW5kYXIubmV4dCcpIHx8ICdOZXh0IHBlcmlvZCdcIj5cbiAgICAgICAgICAgICAgICA8ZW0gY2xhc3M9XCJpY29uIG5pIG5pLWNoZXZyb24tcmlnaHRcIj48L2VtPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhZ2VuZGEtYnRuIGFnZW5kYS1idG4tdG9kYXlcIiBAY2xpY2s9XCJnb1RvZGF5XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgdHJhbnMoJ2NhbGVuZGFyLnRvZGF5JykgfHwgJ1RvZGF5JyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGg0IGNsYXNzPVwiYWdlbmRhLXRpdGxlXCI+e3sgdmlzaWJsZVRpdGxlIH19PC9oND5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW5kYS1tb2RlLXN3aXRjaFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiA6Y2xhc3M9XCJbJ2FnZW5kYS1tb2RlLWJ0bicsIHsgYWN0aXZlOiB2aWV3TW9kZSA9PT0gJ21vbnRoJyB9XVwiIDphcmlhLXByZXNzZWQ9XCJ2aWV3TW9kZSA9PT0gJ21vbnRoJ1wiIEBjbGljaz1cInNldFZpZXdNb2RlKCdtb250aCcpXCI+XG4gICAgICAgICAgICAgICAge3sgdHJhbnMoJ2NhbGVuZGFyLm1vbnRoJykgfHwgJ01vbnRoJyB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgOmNsYXNzPVwiWydhZ2VuZGEtbW9kZS1idG4nLCB7IGFjdGl2ZTogdmlld01vZGUgPT09ICd3ZWVrJyB9XVwiIDphcmlhLXByZXNzZWQ9XCJ2aWV3TW9kZSA9PT0gJ3dlZWsnXCIgQGNsaWNrPVwic2V0Vmlld01vZGUoJ3dlZWsnKVwiPlxuICAgICAgICAgICAgICAgIHt7IHRyYW5zKCdjYWxlbmRhci53ZWVrJykgfHwgJ1dlZWsnIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiA6Y2xhc3M9XCJbJ2FnZW5kYS1tb2RlLWJ0bicsIHsgYWN0aXZlOiB2aWV3TW9kZSA9PT0gJ2RheScgfV1cIiA6YXJpYS1wcmVzc2VkPVwidmlld01vZGUgPT09ICdkYXknXCIgQGNsaWNrPVwic2V0Vmlld01vZGUoJ2RheScpXCI+XG4gICAgICAgICAgICAgICAge3sgdHJhbnMoJ2NhbGVuZGFyLmRheScpIHx8ICdEYXknIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IHYtaWY9XCJmZXRjaGluZ1wiIGNsYXNzPVwidGV4dC1jZW50ZXIgcHktNVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHRleHQtcHJpbWFyeVwiIHJvbGU9XCJzdGF0dXNcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+TG9hZGluZy4uLjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiB2LWVsc2U+XG4gICAgICAgICAgICA8ZGl2IHYtaWY9XCJ2aWV3TW9kZSA9PT0gJ21vbnRoJ1wiIGNsYXNzPVwiYWdlbmRhLW1vbnRoXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VuZGEtd2Vla2RheXNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IHYtZm9yPVwiKGxhYmVsLCBpZHgpIGluIHdlZWtkYXlMYWJlbHNcIiA6a2V5PVwiYHdkLSR7aWR4fWBcIiBjbGFzcz1cImFnZW5kYS13ZWVrZGF5LWNlbGxcIj57eyBsYWJlbCB9fTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW5kYS1tb250aC1ncmlkXCI+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgdi1mb3I9XCIoY2VsbCwgaW5kZXgpIGluIG1vbnRoRGF5c1wiXG4gICAgICAgICAgICAgICAgICA6a2V5PVwiY2VsbC5rZXlcIlxuICAgICAgICAgICAgICAgICAgOmNsYXNzPVwiWydhZ2VuZGEtbW9udGgtY2VsbCcsIHsgYWN0aXZlOiBjZWxsLmRhdGVLZXkgPT09IHNlbGVjdGVkRGF0ZUtleSwgdG9kYXk6IGNlbGwuaXNUb2RheSwgJ2hhcy1ldmVudHMnOiBjZWxsLmV2ZW50cy5sZW5ndGggPiAwIH1dXCJcbiAgICAgICAgICAgICAgICAgIDpzdHlsZT1cImluZGV4ID09PSAwID8geyBncmlkQ29sdW1uU3RhcnQ6IGNlbGwuY29sdW1uU3RhcnQgfSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgOmFyaWEtbGFiZWw9XCJjZWxsLmRhdGVLZXlcIlxuICAgICAgICAgICAgICAgICAgQGNsaWNrPVwic2VsZWN0RGF0ZShjZWxsLmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgIEBrZXlkb3duLmVudGVyPVwic2VsZWN0RGF0ZShjZWxsLmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgIEBrZXlkb3duLnNwYWNlLnByZXZlbnQ9XCJzZWxlY3REYXRlKGNlbGwuZGF0ZSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VuZGEtbW9udGgtZGF5LW51bWJlclwiPnt7IGNlbGwuZGF5TnVtYmVyIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbmRhLW1vbnRoLWl0ZW1zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB2LWZvcj1cImV2ZW50IGluIGNlbGwuZXZlbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICA6a2V5PVwiZXZlbnQua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFnZW5kYS1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICBAY2xpY2suc3RvcD1cImdvVG9Qcm9kdWN0KGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFnZW5kYS1pdGVtLXRpdGxlXCI+e3sgZXZlbnQucHJvZHVjdC50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZXZlbnQucHJpY2VMYWJlbFwiIGNsYXNzPVwiYWdlbmRhLWl0ZW0tcHJpY2VcIj57eyBldmVudC5wcmljZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IHYtZWxzZS1pZj1cInZpZXdNb2RlID09PSAnd2VlaydcIiBjbGFzcz1cImFnZW5kYS13ZWVrXCI+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICB2LWZvcj1cImRheSBpbiB3ZWVrRGF5c1wiXG4gICAgICAgICAgICAgICAgOmtleT1cImRheS5rZXlcIlxuICAgICAgICAgICAgICAgIDpjbGFzcz1cIlsnYWdlbmRhLWRheScsIHsgYWN0aXZlOiBkYXkua2V5ID09PSBzZWxlY3RlZERhdGVLZXksIHRvZGF5OiBkYXkuaXNUb2RheSwgJ2hhcy1ldmVudHMnOiBkYXkuZXZlbnRzLmxlbmd0aCA+IDAgfV1cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgOmFyaWEtbGFiZWw9XCJkYXkubGFiZWwgKyAnICcgKyBkYXkuZGF5TnVtYmVyXCJcbiAgICAgICAgICAgICAgICBAY2xpY2s9XCJzZWxlY3REYXRlKGRheS5kYXRlKVwiXG4gICAgICAgICAgICAgICAgQGtleWRvd24uZW50ZXI9XCJzZWxlY3REYXRlKGRheS5kYXRlKVwiXG4gICAgICAgICAgICAgICAgQGtleWRvd24uc3BhY2UucHJldmVudD1cInNlbGVjdERhdGUoZGF5LmRhdGUpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VuZGEtZGF5LWhlYWRcIj5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sgZGF5LmxhYmVsIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBkYXkuZGF5TnVtYmVyIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VuZGEtZGF5LWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdi1mb3I9XCJldmVudCBpbiBkYXkuZXZlbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgOmtleT1cImV2ZW50LmtleVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFnZW5kYS1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgQGNsaWNrLnN0b3A9XCJnb1RvUHJvZHVjdChldmVudClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFnZW5kYS1pdGVtLXRpdGxlXCI+e3sgZXZlbnQucHJvZHVjdC50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImV2ZW50LnByaWNlTGFiZWxcIiBjbGFzcz1cImFnZW5kYS1pdGVtLXByaWNlXCI+e3sgZXZlbnQucHJpY2VMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IHYtZWxzZSBjbGFzcz1cImFnZW5kYS1kYXktdmlld1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbmRhLWRheS12aWV3LWhlYWRcIj5cbiAgICAgICAgICAgICAgICA8aDU+e3sgZm9ybWF0dGVkU2VsZWN0ZWREYXRlIH19PC9oNT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBzZWxlY3RlZEV2ZW50cy5sZW5ndGggfX0ge3sgc2VsZWN0ZWRFdmVudHMubGVuZ3RoID09PSAxID8gKHRyYW5zKCdjYWxlbmRhci5ldmVudCcpIHx8ICdldmVudCcpIDogKHRyYW5zKCdjYWxlbmRhci5ldmVudHMnKSB8fCAnZXZlbnRzJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCJzZWxlY3RlZEV2ZW50cy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWxpZ2h0IGFsZXJ0LWljb24gbWItMFwiPlxuICAgICAgICAgICAgICAgIDxlbSBjbGFzcz1cImljb24gbmkgbmktY2FsZW5kYXItYm9va2luZ1wiPjwvZW0+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgdHJhbnMoJ2NhbGVuZGFyLmVtcHR5JykgfHwgJ05vIHByb2R1Y3RzIHNjaGVkdWxlZCBmb3IgdGhpcyBkYXkuJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgdi1lbHNlIGNsYXNzPVwiYWdlbmRhLWRheS1saXN0XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdi1mb3I9XCJldmVudCBpbiBzZWxlY3RlZEV2ZW50c1wiXG4gICAgICAgICAgICAgICAgICA6a2V5PVwiZXZlbnQua2V5XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZ2VuZGEtaXRlbSBhZ2VuZGEtZGF5LWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgQGNsaWNrPVwiZ29Ub1Byb2R1Y3QoZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFnZW5kYS1pdGVtLXRpdGxlXCI+e3sgZXZlbnQucHJvZHVjdC50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJldmVudC5wcmljZUxhYmVsXCIgY2xhc3M9XCJhZ2VuZGEtaXRlbS1wcmljZVwiPnt7IGV2ZW50LnByaWNlTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5cbmNvbnN0IERFRkFVTFRfUkFOR0VfREFZUyA9IDE4MDtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnU3RvcmVmcm9udENhbGVuZGFyJyxcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9hZGluZzogdHJ1ZSxcbiAgICAgIGZldGNoaW5nOiBmYWxzZSxcbiAgICAgIHNlbGVjdGVkRGF0ZTogbmV3IERhdGUoKSxcbiAgICAgIHZpZXdNb2RlOiAnd2VlaycsXG4gICAgICBldmVudHNNYXA6IHt9LFxuICAgICAgYWN0aXZlRXZlbnQ6IG51bGwsXG4gICAgICBoYXNUaW1lc2xvdFByb2R1Y3RzOiBmYWxzZSxcbiAgICAgIHRpbWVzbG90c1NvbGRPdXRUb2RheTogZmFsc2UsXG4gICAgfTtcbiAgfSxcbiAgY29tcHV0ZWQ6IHtcbiAgICBwcm9kdWN0cygpIHtcbiAgICAgIHJldHVybiB0aGlzLiRzdG9yZS5nZXR0ZXJzLlByb2R1Y3RzO1xuICAgIH0sXG4gICAgc2VsZWN0ZWREYXRlS2V5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF0ZUtleSh0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgfSxcbiAgICBzZWxlY3RlZEV2ZW50cygpIHtcbiAgICAgIHJldHVybiB0aGlzLmV2ZW50c01hcFt0aGlzLnNlbGVjdGVkRGF0ZUtleV0gfHwgW107XG4gICAgfSxcbiAgICBmb3JtYXR0ZWRTZWxlY3RlZERhdGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRlKHRoaXMuc2VsZWN0ZWREYXRlLCB0aGlzLmRlZmluaXRpb25zLmRhdGVfZm9ybWF0KTtcbiAgICB9LFxuICAgIHdlZWtkYXlMYWJlbHMoKSB7XG4gICAgICBjb25zdCBmYWxsYmFjayA9IFsnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheScsICdTdW5kYXknXTtcbiAgICAgIHJldHVybiBmYWxsYmFjay5tYXAoKGxhYmVsLCBpZHgpID0+IHRoaXMudHJhbnMoYGNhbGVuZGFyLndlZWtkYXkuJHtpZHggKyAxfWApIHx8IGxhYmVsKTtcbiAgICB9LFxuICAgIHdlZWtTdGFydERhdGUoKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgIGNvbnN0IGpzRGF5ID0gc2VsZWN0ZWQuZ2V0RGF5KCk7XG4gICAgICBjb25zdCBkaXN0YW5jZUZyb21Nb25kYXkgPSAoanNEYXkgKyA2KSAlIDc7XG4gICAgICBjb25zdCBtb25kYXkgPSBuZXcgRGF0ZShzZWxlY3RlZCk7XG4gICAgICBtb25kYXkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICBtb25kYXkuc2V0RGF0ZShzZWxlY3RlZC5nZXREYXRlKCkgLSBkaXN0YW5jZUZyb21Nb25kYXkpO1xuICAgICAgcmV0dXJuIG1vbmRheTtcbiAgICB9LFxuICAgIHdlZWtEYXlzKCkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IDcgfSkubWFwKChfLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy53ZWVrU3RhcnREYXRlKTtcbiAgICAgICAgZGF0ZS5zZXREYXRlKHRoaXMud2Vla1N0YXJ0RGF0ZS5nZXREYXRlKCkgKyBpbmRleCk7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZm9ybWF0RGF0ZUtleShkYXRlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgZGF0ZSxcbiAgICAgICAgICBkYXlOdW1iZXI6IGRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgIGxhYmVsOiB0aGlzLndlZWtkYXlMYWJlbHNbaW5kZXhdLFxuICAgICAgICAgIGV2ZW50czogdGhpcy5ldmVudHNNYXBba2V5XSB8fCBbXSxcbiAgICAgICAgICBpc1RvZGF5OiBrZXkgPT09IHRoaXMuZm9ybWF0RGF0ZUtleShuZXcgRGF0ZSgpKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgbW9udGhEYXlzKCkge1xuICAgICAgY29uc3QgeWVhciA9IHRoaXMuc2VsZWN0ZWREYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICBjb25zdCBtb250aCA9IHRoaXMuc2VsZWN0ZWREYXRlLmdldE1vbnRoKCk7XG4gICAgICBjb25zdCBmaXJzdE9mTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7XG4gICAgICBmaXJzdE9mTW9udGguc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICBjb25zdCBsYXN0T2ZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCk7XG4gICAgICBsYXN0T2ZNb250aC5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuXG4gICAgICBsZXQgc3RhcnREYXRlID0gbmV3IERhdGUoZmlyc3RPZk1vbnRoKTtcbiAgICAgIGNvbnN0IGlzQ3VycmVudE1vbnRoID0gdG9kYXkuZ2V0RnVsbFllYXIoKSA9PT0geWVhciAmJiB0b2RheS5nZXRNb250aCgpID09PSBtb250aDtcblxuICAgICAgaWYgKGlzQ3VycmVudE1vbnRoICYmIHRvZGF5ID4gc3RhcnREYXRlKSB7XG4gICAgICAgIHN0YXJ0RGF0ZSA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0RGF0ZSA+IGxhc3RPZk1vbnRoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2VsbHMgPSBbXTtcbiAgICAgIGxldCBjdXJzb3IgPSBuZXcgRGF0ZShzdGFydERhdGUpO1xuICAgICAgbGV0IGlzRmlyc3QgPSB0cnVlO1xuXG4gICAgICB3aGlsZSAoY3Vyc29yIDw9IGxhc3RPZk1vbnRoKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZm9ybWF0RGF0ZUtleShjdXJzb3IpO1xuICAgICAgICBjb25zdCBqc0RheSA9IGN1cnNvci5nZXREYXkoKTtcbiAgICAgICAgY29uc3QgY29sdW1uU3RhcnQgPSAoKGpzRGF5ICsgNikgJSA3KSArIDE7XG5cbiAgICAgICAgY2VsbHMucHVzaCh7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGRhdGVLZXk6IGtleSxcbiAgICAgICAgICBkYXRlOiBuZXcgRGF0ZShjdXJzb3IpLFxuICAgICAgICAgIGRheU51bWJlcjogY3Vyc29yLmdldERhdGUoKSxcbiAgICAgICAgICBjb2x1bW5TdGFydDogaXNGaXJzdCA/IGNvbHVtblN0YXJ0IDogbnVsbCxcbiAgICAgICAgICBldmVudHM6IHRoaXMuZXZlbnRzTWFwW2tleV0gfHwgW10sXG4gICAgICAgICAgaXNUb2RheToga2V5ID09PSB0aGlzLmZvcm1hdERhdGVLZXkodG9kYXkpLFxuICAgICAgICB9KTtcblxuICAgICAgICBjdXJzb3Iuc2V0RGF0ZShjdXJzb3IuZ2V0RGF0ZSgpICsgMSk7XG4gICAgICAgIGlzRmlyc3QgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNlbGxzO1xuICAgIH0sXG4gICAgdmlzaWJsZVRpdGxlKCkge1xuICAgICAgY29uc3QgbG9jYWxlID0gdGhpcy5kZWZpbml0aW9ucz8ubGFuZ3VhZ2UgfHwgJ2VuJztcbiAgICAgIGNvbnN0IG1vbnRoRm9ybWF0dGVyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCB7IG1vbnRoOiAnbG9uZycgfSk7XG5cbiAgICAgIGlmICh0aGlzLnZpZXdNb2RlID09PSAnZGF5Jykge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXR0ZWRTZWxlY3RlZERhdGU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnZpZXdNb2RlID09PSAnd2VlaycpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLndlZWtTdGFydERhdGU7XG4gICAgICAgIGNvbnN0IGVuZCA9IG5ldyBEYXRlKHN0YXJ0KTtcbiAgICAgICAgZW5kLnNldERhdGUoc3RhcnQuZ2V0RGF0ZSgpICsgNik7XG4gICAgICAgIGNvbnN0IHN0YXJ0TW9udGggPSBtb250aEZvcm1hdHRlci5mb3JtYXQoc3RhcnQpO1xuICAgICAgICBjb25zdCBlbmRNb250aCA9IG1vbnRoRm9ybWF0dGVyLmZvcm1hdChlbmQpO1xuXG4gICAgICAgIGlmIChzdGFydC5nZXRGdWxsWWVhcigpID09PSBlbmQuZ2V0RnVsbFllYXIoKSAmJiBzdGFydC5nZXRNb250aCgpID09PSBlbmQuZ2V0TW9udGgoKSkge1xuICAgICAgICAgIHJldHVybiBgJHtzdGFydC5nZXREYXRlKCl9IC0gJHtlbmQuZ2V0RGF0ZSgpfSAke2VuZE1vbnRofSAke2VuZC5nZXRGdWxsWWVhcigpfWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhcnQuZ2V0RnVsbFllYXIoKSA9PT0gZW5kLmdldEZ1bGxZZWFyKCkpIHtcbiAgICAgICAgICByZXR1cm4gYCR7c3RhcnQuZ2V0RGF0ZSgpfSAke3N0YXJ0TW9udGh9IC0gJHtlbmQuZ2V0RGF0ZSgpfSAke2VuZE1vbnRofSAke2VuZC5nZXRGdWxsWWVhcigpfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7c3RhcnQuZ2V0RGF0ZSgpfSAke3N0YXJ0TW9udGh9ICR7c3RhcnQuZ2V0RnVsbFllYXIoKX0gLSAke2VuZC5nZXREYXRlKCl9ICR7ZW5kTW9udGh9ICR7ZW5kLmdldEZ1bGxZZWFyKCl9YDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gbW9udGhGb3JtYXR0ZXIuZm9ybWF0KHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgIHJldHVybiBgJHtjdXJyZW50TW9udGh9ICR7dGhpcy5zZWxlY3RlZERhdGUuZ2V0RnVsbFllYXIoKX1gO1xuICAgIH0sXG4gICAgc2hvd1RpbWVzbG90c1NvbGRPdXRXYXJuaW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzVGltZXNsb3RQcm9kdWN0cyAmJiB0aGlzLnRpbWVzbG90c1NvbGRPdXRUb2RheTtcbiAgICB9LFxuICB9LFxuICBhc3luYyBtb3VudGVkKCkge1xuICAgIGlmICghdGhpcy4kc3RvcmUuc3RhdGUuU3RvcmUuUHJvZHVjdHNMb2FkZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdsb2FkUHJvZHVjdHMnKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5sb2FkRXZlbnRzKCk7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIH0sXG4gIG1ldGhvZHM6IHtcbiAgICBmb3JtYXREYXRlS2V5KGlucHV0KSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRlKGlucHV0LCAnWVlZWS1NTS1ERCcpO1xuICAgIH0sXG4gICAgYXN5bmMgbG9hZEV2ZW50cygpIHtcbiAgICAgIHRoaXMuZmV0Y2hpbmcgPSB0cnVlO1xuICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpO1xuICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUoKTtcbiAgICAgIGVuZC5zZXREYXRlKGVuZC5nZXREYXRlKCkgKyBERUZBVUxUX1JBTkdFX0RBWVMpO1xuXG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIGZpbHRlckZyb206IHRoaXMuZm9ybWF0RGF0ZUtleShzdGFydCksXG4gICAgICAgIGZpbHRlclVudGlsOiB0aGlzLmZvcm1hdERhdGVLZXkoZW5kKSxcbiAgICAgICAgb3JkZXJpbmdDb2w6ICdkYXRlJyxcbiAgICAgICAgb3JkZXJpbmdEaXI6ICdhc2MnLFxuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBheGlvcy5nZXQoJy9hcGkvY2FsZW5kYXIvcGxvdHMnLCB7IHBhcmFtcyB9KTtcbiAgICAgICAgY29uc3QgcGxvdHMgPSBkYXRhPy5yZXNwb25zZSB8fCBbXTtcbiAgICAgICAgY29uc3QgcHJvZHVjdEJ5SWQgPSB0aGlzLnByb2R1Y3RzLnJlZHVjZSgoYWNjLCBwcm9kdWN0KSA9PiB7XG4gICAgICAgICAgYWNjW3Byb2R1Y3QuaWRdID0gcHJvZHVjdDtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSk7XG5cbiAgICAgICAgY29uc3QgbWFwID0ge307XG4gICAgICAgIGNvbnN0IHRvZGF5S2V5ID0gdGhpcy5mb3JtYXREYXRlS2V5KG5ldyBEYXRlKCkpO1xuICAgICAgICBsZXQgaGFzVGltZXNsb3RQcm9kdWN0cyA9IGZhbHNlO1xuICAgICAgICBsZXQgc29sZE91dFRpbWVzbG90c1RvZGF5ID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHRvZGF5c1RpbWVzbG90c0J5UHJvZHVjdCA9IHt9O1xuXG4gICAgICAgIHBsb3RzLmZvckVhY2goKHBsb3QpID0+IHtcbiAgICAgICAgICBjb25zdCBwcm9kdWN0ID0gcHJvZHVjdEJ5SWRbcGxvdC5wcm9kdWN0SWRdO1xuICAgICAgICAgIGlmICghcHJvZHVjdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwcm9kdWN0Py5vcHRpb25zPy50aW1lc2xvdHMpIHtcbiAgICAgICAgICAgIGhhc1RpbWVzbG90UHJvZHVjdHMgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHBsb3QuZGF0ZSA9PT0gdG9kYXlLZXkgJiYgcGxvdC50aW1lPy5zdGFydCkge1xuICAgICAgICAgICAgICBpZiAoIXRvZGF5c1RpbWVzbG90c0J5UHJvZHVjdFtwcm9kdWN0LmlkXSkge1xuICAgICAgICAgICAgICAgIHRvZGF5c1RpbWVzbG90c0J5UHJvZHVjdFtwcm9kdWN0LmlkXSA9IFtdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRvZGF5c1RpbWVzbG90c0J5UHJvZHVjdFtwcm9kdWN0LmlkXS5wdXNoKHBsb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghcGxvdC5zZWxlY3RhYmxlIHx8IHBsb3QuYXZhaWxhYmlsaXR5Py5hbW91bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBkYXRlS2V5ID0gcGxvdC5kYXRlO1xuICAgICAgICAgIGlmICghbWFwW2RhdGVLZXldKSB7XG4gICAgICAgICAgICBtYXBbZGF0ZUtleV0gPSB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjbGVhbkRlc2NyaXB0aW9uID0gcHJvZHVjdC5kZXNjcmlwdGlvblxuICAgICAgICAgICAgPyBwcm9kdWN0LmRlc2NyaXB0aW9uLnJlcGxhY2UoLzxbXj5dKj4/L2dtLCAnJykudHJpbSgpXG4gICAgICAgICAgICA6ICcnO1xuICAgICAgICAgIGNvbnN0IHByZXZpZXdUZXh0ID0gY2xlYW5EZXNjcmlwdGlvbi5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IGAke2NsZWFuRGVzY3JpcHRpb24uc2xpY2UoMCwgMTQwKX0ke2NsZWFuRGVzY3JpcHRpb24ubGVuZ3RoID4gMTQwID8gJy4uLicgOiAnJ31gXG4gICAgICAgICAgICA6ICcnO1xuICAgICAgICAgIGNvbnN0IGV2ZW50S2V5ID0gYCR7ZGF0ZUtleX0tJHtwcm9kdWN0LmlkfWA7XG5cbiAgICAgICAgICBpZiAoIW1hcFtkYXRlS2V5XVtldmVudEtleV0pIHtcbiAgICAgICAgICAgIG1hcFtkYXRlS2V5XVtldmVudEtleV0gPSB7XG4gICAgICAgICAgICAgIGtleTogZXZlbnRLZXksXG4gICAgICAgICAgICAgIGRhdGVLZXksXG4gICAgICAgICAgICAgIHByb2R1Y3QsXG4gICAgICAgICAgICAgIHBsb3QsXG4gICAgICAgICAgICAgIGxvd2VzdFRvdGFsUHJpY2U6IHBsb3QubG93ZXN0VG90YWxQcmljZSA/PyBudWxsLFxuICAgICAgICAgICAgICBwcmljZUxhYmVsOiBwbG90Lmxvd2VzdFRvdGFsUHJpY2UgPyB0aGlzLmN1cnJlbmN5LmZvcm1hdChwbG90Lmxvd2VzdFRvdGFsUHJpY2UpIDogbnVsbCxcbiAgICAgICAgICAgICAgcHJldmlldzogcHJldmlld1RleHQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gbWFwW2RhdGVLZXldW2V2ZW50S2V5XTtcbiAgICAgICAgICBjb25zdCBuZXh0UHJpY2UgPSBwbG90Lmxvd2VzdFRvdGFsUHJpY2UgPz8gbnVsbDtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UHJpY2UgPSBleGlzdGluZy5sb3dlc3RUb3RhbFByaWNlID8/IG51bGw7XG5cbiAgICAgICAgICBpZiAobmV4dFByaWNlICE9PSBudWxsICYmIChjdXJyZW50UHJpY2UgPT09IG51bGwgfHwgbmV4dFByaWNlIDwgY3VycmVudFByaWNlKSkge1xuICAgICAgICAgICAgZXhpc3RpbmcubG93ZXN0VG90YWxQcmljZSA9IG5leHRQcmljZTtcbiAgICAgICAgICAgIGV4aXN0aW5nLnByaWNlTGFiZWwgPSB0aGlzLmN1cnJlbmN5LmZvcm1hdChuZXh0UHJpY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc29sZE91dFRpbWVzbG90c1RvZGF5ID0gT2JqZWN0LnZhbHVlcyh0b2RheXNUaW1lc2xvdHNCeVByb2R1Y3QpLnNvbWUoKHByb2R1Y3RQbG90cykgPT4gKFxuICAgICAgICAgIHByb2R1Y3RQbG90cy5sZW5ndGggPiAwICYmIHByb2R1Y3RQbG90cy5ldmVyeSgocGxvdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmlsaXR5QW1vdW50ID0gdHlwZW9mIHBsb3QuYXZhaWxhYmlsaXR5Py5hbW91bnQgPT09ICdudW1iZXInID8gcGxvdC5hdmFpbGFiaWxpdHkuYW1vdW50IDogMDtcbiAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0YWJsZSA9IHBsb3Quc2VsZWN0YWJsZSAhPT0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBtYXhPcmRlcnNSZWFjaGVkID0gcGxvdC5tYXhPcmRlcnNSZWFjaGVkID09PSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuICFpc1NlbGVjdGFibGUgfHwgbWF4T3JkZXJzUmVhY2hlZCB8fCBhdmFpbGFiaWxpdHlBbW91bnQgPD0gMDtcbiAgICAgICAgICB9KVxuICAgICAgICApKTtcblxuICAgICAgICB0aGlzLmhhc1RpbWVzbG90UHJvZHVjdHMgPSBoYXNUaW1lc2xvdFByb2R1Y3RzO1xuICAgICAgICB0aGlzLnRpbWVzbG90c1NvbGRPdXRUb2RheSA9IHNvbGRPdXRUaW1lc2xvdHNUb2RheTtcblxuICAgICAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIG1hcFtrZXldID0gT2JqZWN0LnZhbHVlcyhtYXBba2V5XSk7XG4gICAgICAgICAgbWFwW2tleV0uc29ydCgoYSwgYikgPT4gYS5wcm9kdWN0LnRpdGxlLmxvY2FsZUNvbXBhcmUoYi5wcm9kdWN0LnRpdGxlKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZXZlbnRzTWFwID0gbWFwO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRLZXkgPSB0aGlzLmZvcm1hdERhdGVLZXkodGhpcy5zZWxlY3RlZERhdGUpO1xuICAgICAgICBpZiAoIXRoaXMuZXZlbnRzTWFwW2N1cnJlbnRLZXldKSB7XG4gICAgICAgICAgY29uc3QgdXBjb21pbmdLZXkgPSBPYmplY3Qua2V5cyh0aGlzLmV2ZW50c01hcCkuc29ydCgpWzBdO1xuICAgICAgICAgIGlmICh1cGNvbWluZ0tleSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBuZXcgRGF0ZShgJHt1cGNvbWluZ0tleX1UMDA6MDA6MDBgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cGRhdGVkRXZlbnRzID0gdGhpcy5ldmVudHNNYXBbdGhpcy5mb3JtYXREYXRlS2V5KHRoaXMuc2VsZWN0ZWREYXRlKV07XG4gICAgICAgIHRoaXMuYWN0aXZlRXZlbnQgPSB1cGRhdGVkRXZlbnRzICYmIHVwZGF0ZWRFdmVudHMubGVuZ3RoID4gMCA/IHVwZGF0ZWRFdmVudHNbMF0gOiBudWxsO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgY2FsZW5kYXIgZXZlbnRzJywgZXJyb3IpO1xuICAgICAgICB0aGlzLmV2ZW50c01hcCA9IHt9O1xuICAgICAgICB0aGlzLmFjdGl2ZUV2ZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5oYXNUaW1lc2xvdFByb2R1Y3RzID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGltZXNsb3RzU29sZE91dFRvZGF5ID0gZmFsc2U7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmZldGNoaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZWxlY3REYXRlKGRhdGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmZvcm1hdERhdGVLZXkodGhpcy5zZWxlY3RlZERhdGUpO1xuICAgICAgY29uc3QgZXZlbnRzID0gdGhpcy5ldmVudHNNYXBba2V5XTtcbiAgICAgIHRoaXMuYWN0aXZlRXZlbnQgPSBldmVudHMgJiYgZXZlbnRzLmxlbmd0aCA+IDAgPyBldmVudHNbMF0gOiBudWxsO1xuICAgIH0sXG4gICAgc2V0Vmlld01vZGUobW9kZSkge1xuICAgICAgdGhpcy52aWV3TW9kZSA9IG1vZGU7XG4gICAgfSxcbiAgICBnb1ByZXYoKSB7XG4gICAgICBjb25zdCBuZXh0ID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGUpO1xuICAgICAgaWYgKHRoaXMudmlld01vZGUgPT09ICdtb250aCcpIHtcbiAgICAgICAgbmV4dC5zZXRNb250aChuZXh0LmdldE1vbnRoKCkgLSAxKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy52aWV3TW9kZSA9PT0gJ3dlZWsnKSB7XG4gICAgICAgIG5leHQuc2V0RGF0ZShuZXh0LmdldERhdGUoKSAtIDcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dC5zZXREYXRlKG5leHQuZ2V0RGF0ZSgpIC0gMSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdERhdGUobmV4dCk7XG4gICAgfSxcbiAgICBnb05leHQoKSB7XG4gICAgICBjb25zdCBuZXh0ID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGUpO1xuICAgICAgaWYgKHRoaXMudmlld01vZGUgPT09ICdtb250aCcpIHtcbiAgICAgICAgbmV4dC5zZXRNb250aChuZXh0LmdldE1vbnRoKCkgKyAxKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy52aWV3TW9kZSA9PT0gJ3dlZWsnKSB7XG4gICAgICAgIG5leHQuc2V0RGF0ZShuZXh0LmdldERhdGUoKSArIDcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dC5zZXREYXRlKG5leHQuZ2V0RGF0ZSgpICsgMSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdERhdGUobmV4dCk7XG4gICAgfSxcbiAgICBnb1RvZGF5KCkge1xuICAgICAgdGhpcy5zZWxlY3REYXRlKG5ldyBEYXRlKCkpO1xuICAgIH0sXG4gICAgZ29Ub1Byb2R1Y3QoZXZlbnQpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRGF0ZSA9IGV2ZW50Py5kYXRlS2V5IHx8IHRoaXMuc2VsZWN0ZWREYXRlS2V5O1xuICAgICAgdGhpcy4kcm91dGVyLnB1c2goYC9wcm9kdWN0LyR7ZXZlbnQucHJvZHVjdC5pZH0vJHtldmVudC5wcm9kdWN0LnNsdWd9P2RhdGU9JHtlbmNvZGVVUklDb21wb25lbnQoc2VsZWN0ZWREYXRlKX1gKTtcbiAgICB9LFxuICB9XG59O1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBzY29wZWQ+XG4ubmstYmxvY2stY2FsZW5kYXIge1xuICBwYWRkaW5nLWJvdHRvbTogMnJlbTtcbn1cblxuLmFnZW5kYS1jYXJkIHtcbiAgYmFja2dyb3VuZDogcmdiYSh2YXIoLS1iYWNrZ3JvdW5kLXJnYiwgMjQ1LCAyNDYsIDI1MCksIDAuNzIpO1xuICBib3JkZXItY29sb3I6IHJnYmEodmFyKC0tcGFyYWdyYXBoLXJnYiwgODIsIDEwMCwgMTMyKSwgMC4xNCk7XG4gIGJveC1zaGFkb3c6IDAgMS41cmVtIDNyZW0gLTJyZW0gcmdiYSh2YXIoLS1wYXJhZ3JhcGgtcmdiLCA4MiwgMTAwLCAxMzIpLCAwLjU1KTtcbn1cblxuLmFnZW5kYS10b29sYmFyIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKSBhdXRvIG1pbm1heCgwLCAxZnIpO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDFyZW07XG4gIG1hcmdpbi1ib3R0b206IDEuMjVyZW07XG59XG5cbi5hZ2VuZGEtbmF2LWxlZnQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGdhcDogMC40NXJlbTtcbn1cblxuLmFnZW5kYS1idG4sXG4uYWdlbmRhLW1vZGUtYnRuIHtcbiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSh2YXIoLS1idXR0b24tcmdiLCAyNiwgMTg4LCAxNTYpLCAwLjI4KTtcbiAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtdGl0bGUsIGluaGVyaXQpO1xuICBmb250LXdlaWdodDogNzAwO1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMThzIGVhc2UsIGJvcmRlci1jb2xvciAwLjE4cyBlYXNlLCBib3gtc2hhZG93IDAuMThzIGVhc2UsIGNvbG9yIDAuMThzIGVhc2U7XG59XG5cbi5hZ2VuZGEtYnRuIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYmFja2dyb3VuZDogcmdiYSh2YXIoLS1idXR0b24tcmdiLCAyNiwgMTg4LCAxNTYpLCAwLjEpO1xuICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgY29sb3I6IHZhcigtLWJ1dHRvbiwgIzFhYmM5Yyk7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBnYXA6IDAuMzVyZW07XG4gIG1pbi1oZWlnaHQ6IDIuMzVyZW07XG4gIHBhZGRpbmc6IDAuNDVyZW0gMC43NXJlbTtcbn1cblxuLmFnZW5kYS1idG46aG92ZXIsXG4uYWdlbmRhLW1vZGUtYnRuOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogcmdiYSh2YXIoLS1idXR0b24tcmdiLCAyNiwgMTg4LCAxNTYpLCAwLjE2KTtcbiAgYm94LXNoYWRvdzogMCAwLjc1cmVtIDEuNXJlbSAtMXJlbSByZ2JhKHZhcigtLWJ1dHRvbi1yZ2IsIDI2LCAxODgsIDE1NiksIDAuNzUpO1xufVxuXG4uYWdlbmRhLWJ0bi10b2RheSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWJ1dHRvbiwgIzFhYmM5Yyk7XG4gIGNvbG9yOiB2YXIoLS1idXR0b24tdGV4dCwgI2ZmZik7XG4gIG1hcmdpbi1sZWZ0OiAwLjE1cmVtO1xufVxuXG4uYWdlbmRhLWJ0bi10b2RheTpob3ZlciB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWJ1dHRvbiwgIzFhYmM5Yyk7XG4gIGNvbG9yOiB2YXIoLS1idXR0b24tdGV4dCwgI2ZmZik7XG59XG5cbi5hZ2VuZGEtdGl0bGUge1xuICBjb2xvcjogdmFyKC0tdGl0bGUsICMzNjRhNjMpICFpbXBvcnRhbnQ7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LXRpdGxlLCBpbmhlcml0KTtcbiAgZm9udC13ZWlnaHQ6IDgwMDtcbiAgbWFyZ2luOiAwO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xufVxuXG4uYWdlbmRhLW1vZGUtc3dpdGNoIHtcbiAgYmFja2dyb3VuZDogcmdiYSh2YXIoLS1idXR0b24tcmdiLCAyNiwgMTg4LCAxNTYpLCAwLjA4KTtcbiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSh2YXIoLS1idXR0b24tcmdiLCAyNiwgMTg4LCAxNTYpLCAwLjI4KTtcbiAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBqdXN0aWZ5LXNlbGY6IGVuZDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcGFkZGluZzogMC4ycmVtO1xufVxuXG4uYWdlbmRhLW1vZGUtYnRuIHtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICBjb2xvcjogdmFyKC0tYnV0dG9uLCAjMWFiYzljKTtcbiAgcGFkZGluZzogMC40NXJlbSAwLjg1cmVtO1xufVxuXG4uYWdlbmRhLW1vZGUtYnRuLmFjdGl2ZSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWJ1dHRvbiwgIzFhYmM5Yyk7XG4gIGJveC1zaGFkb3c6IDAgMC43NXJlbSAxLjVyZW0gLTFyZW0gcmdiYSh2YXIoLS1idXR0b24tcmdiLCAyNiwgMTg4LCAxNTYpLCAwLjg1KTtcbiAgY29sb3I6IHZhcigtLWJ1dHRvbi10ZXh0LCAjZmZmKTtcbn1cblxuLmFnZW5kYS13ZWVrZGF5cyxcbi5hZ2VuZGEtd2Vlayxcbi5hZ2VuZGEtbW9udGgtZ3JpZCB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDcsIG1pbm1heCgwLCAxZnIpKTtcbn1cblxuLmFnZW5kYS13ZWVrZGF5cyB7XG4gIGJhY2tncm91bmQ6IHJnYmEodmFyKC0tYnV0dG9uLXJnYiwgMjYsIDE4OCwgMTU2KSwgMC4wOCk7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEodmFyKC0tcGFyYWdyYXBoLXJnYiwgODIsIDEwMCwgMTMyKSwgMC4xNCk7XG4gIGJvcmRlci1ib3R0b206IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IDAuNzVyZW0gMC43NXJlbSAwIDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5hZ2VuZGEtd2Vla2RheS1jZWxsIHtcbiAgY29sb3I6IHZhcigtLXBhcmFncmFwaCwgIzUyNjQ4NCk7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LXRpdGxlLCBpbmhlcml0KTtcbiAgZm9udC13ZWlnaHQ6IDgwMDtcbiAgcGFkZGluZzogMC42NXJlbSAwLjM1cmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi5hZ2VuZGEtbW9udGgtZ3JpZCxcbi5hZ2VuZGEtd2VlayB7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEodmFyKC0tcGFyYWdyYXBoLXJnYiwgODIsIDEwMCwgMTMyKSwgMC4xNCk7XG4gIGJvcmRlci1yYWRpdXM6IDAgMCAwLjc1cmVtIDAuNzVyZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5hZ2VuZGEtd2VlayB7XG4gIGJvcmRlci1yYWRpdXM6IDAuNzVyZW07XG59XG5cbi5hZ2VuZGEtbW9udGgtY2VsbCxcbi5hZ2VuZGEtZGF5IHtcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg4KTtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEodmFyKC0tcGFyYWdyYXBoLXJnYiwgODIsIDEwMCwgMTMyKSwgMC4xMik7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHJnYmEodmFyKC0tcGFyYWdyYXBoLXJnYiwgODIsIDEwMCwgMTMyKSwgMC4xMik7XG4gIG1pbi1oZWlnaHQ6IDE3MHB4O1xufVxuXG4uYWdlbmRhLW1vbnRoLWNlbGw6bnRoLWNoaWxkKDduKSxcbi5hZ2VuZGEtZGF5Omxhc3QtY2hpbGQge1xuICBib3JkZXItcmlnaHQ6IG5vbmU7XG59XG5cbi5hZ2VuZGEtZGF5IHtcbiAgbWluLWhlaWdodDogNDIwcHg7XG59XG5cbi5hZ2VuZGEtbW9udGgtY2VsbC5hY3RpdmUsXG4uYWdlbmRhLWRheS5hY3RpdmUge1xuICBiYWNrZ3JvdW5kOiByZ2JhKHZhcigtLWJ1dHRvbi1yZ2IsIDI2LCAxODgsIDE1NiksIDAuMDgpO1xuICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAycHggcmdiYSh2YXIoLS1idXR0b24tcmdiLCAyNiwgMTg4LCAxNTYpLCAwLjQ1KTtcbn1cblxuLmFnZW5kYS1tb250aC1jZWxsLnRvZGF5IC5hZ2VuZGEtbW9udGgtZGF5LW51bWJlcixcbi5hZ2VuZGEtZGF5LnRvZGF5IC5hZ2VuZGEtZGF5LWhlYWQgc3BhbiB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWJ1dHRvbiwgIzFhYmM5Yyk7XG4gIGNvbG9yOiB2YXIoLS1idXR0b24tdGV4dCwgI2ZmZik7XG59XG5cbi5hZ2VuZGEtbW9udGgtZGF5LW51bWJlciB7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICBjb2xvcjogdmFyKC0tdGl0bGUsICMzNjRhNjMpO1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgZmxvYXQ6IHJpZ2h0O1xuICBmb250LXdlaWdodDogODAwO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgbWFyZ2luOiAwLjQ1cmVtIDAuNDVyZW0gMC4xNXJlbTtcbiAgbWluLWhlaWdodDogMS44cmVtO1xuICBtaW4td2lkdGg6IDEuOHJlbTtcbn1cblxuLmFnZW5kYS1tb250aC1pdGVtcyxcbi5hZ2VuZGEtZGF5LWJvZHkge1xuICBjbGVhcjogYm90aDtcbiAgcGFkZGluZzogMC40NXJlbTtcbn1cblxuLmFnZW5kYS1kYXktaGVhZCB7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKHZhcigtLXBhcmFncmFwaC1yZ2IsIDgyLCAxMDAsIDEzMiksIDAuMTIpO1xuICBjb2xvcjogdmFyKC0tcGFyYWdyYXBoLCAjNTI2NDg0KTtcbiAgZGlzcGxheTogZmxleDtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBwYWRkaW5nOiAwLjY1cmVtO1xufVxuXG4uYWdlbmRhLWRheS1oZWFkIHN0cm9uZyB7XG4gIGNvbG9yOiB2YXIoLS10aXRsZSwgIzM2NGE2Myk7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LXRpdGxlLCBpbmhlcml0KTtcbn1cblxuLmFnZW5kYS1kYXktaGVhZCBzcGFuIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBmb250LXdlaWdodDogODAwO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgbWluLWhlaWdodDogMS43NXJlbTtcbiAgbWluLXdpZHRoOiAxLjc1cmVtO1xufVxuXG4uYWdlbmRhLWl0ZW0ge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1idXR0b24sICMxYWJjOWMpO1xuICBib3JkZXI6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IDAuNDVyZW07XG4gIGJveC1zaGFkb3c6IDAgMC43NXJlbSAxLjRyZW0gLTEuMXJlbSByZ2JhKHZhcigtLWJ1dHRvbi1yZ2IsIDI2LCAxODgsIDE1NiksIDAuOSk7XG4gIGNvbG9yOiB2YXIoLS1idXR0b24tdGV4dCwgI2ZmZik7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgbWFyZ2luLWJvdHRvbTogMC4zNXJlbTtcbiAgcGFkZGluZzogMC40NXJlbSAwLjU1cmVtO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICB3aWR0aDogMTAwJTtcbn1cblxuLmFnZW5kYS1pdGVtOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogcmdiKHZhcigtLWJ1dHRvbi1yZ2IsIDI2LCAxODgsIDE1NikpO1xuICBjb2xvcjogdmFyKC0tYnV0dG9uLXRleHQsICNmZmYpO1xufVxuXG4uYWdlbmRhLWl0ZW0tdGl0bGUge1xuICBmb250LWZhbWlseTogdmFyKC0tZm9udC10aXRsZSwgaW5oZXJpdCk7XG4gIGZvbnQtc2l6ZTogMC43NnJlbTtcbiAgZm9udC13ZWlnaHQ6IDgwMDtcbiAgbGluZS1oZWlnaHQ6IDEuMjtcbn1cblxuLmFnZW5kYS1pdGVtLXByaWNlIHtcbiAgZm9udC1zaXplOiAwLjdyZW07XG4gIG9wYWNpdHk6IDAuOTtcbn1cblxuLmFnZW5kYS1kYXktdmlldy1oZWFkIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sb3I6IHZhcigtLXBhcmFncmFwaCwgIzUyNjQ4NCk7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTtcbn1cblxuLmFnZW5kYS1kYXktdmlldy1oZWFkIGg1IHtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbn1cblxuLmFnZW5kYS1kYXktbGlzdCB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdhcDogMC40cmVtO1xufVxuXG4uYWdlbmRhLWRheS1pdGVtIHtcbiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBtaW4taGVpZ2h0OiA2NHB4O1xuICBwYWRkaW5nOiAwLjdyZW0gMC44cmVtO1xufVxuXG4uYWdlbmRhLWRheS1pdGVtIC5hZ2VuZGEtaXRlbS10aXRsZSB7XG4gIGZvbnQtc2l6ZTogMC45NnJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjU7XG59XG5cbi5hZ2VuZGEtZGF5LWl0ZW0gLmFnZW5kYS1pdGVtLXByaWNlIHtcbiAgZm9udC1zaXplOiAwLjg2cmVtO1xufVxuXG5AbWVkaWEgKG1heC13aWR0aDogMTE5OS45OHB4KSB7XG4gIC5hZ2VuZGEtdG9vbGJhciB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7XG4gICAgZ2FwOiAwLjc1cmVtO1xuICB9XG5cbiAgLmFnZW5kYS10aXRsZSB7XG4gICAgb3JkZXI6IC0xO1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gIH1cblxuICAuYWdlbmRhLW1vZGUtc3dpdGNoIHtcbiAgICBqdXN0aWZ5LXNlbGY6IHN0YXJ0O1xuICB9XG5cbiAgLmFnZW5kYS13ZWVrZGF5cyB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gIC5hZ2VuZGEtd2VlayxcbiAgLmFnZW5kYS1tb250aC1ncmlkIHtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcbiAgICBib3JkZXItcmFkaXVzOiAwLjc1cmVtO1xuICB9XG5cbiAgLmFnZW5kYS1kYXksXG4gIC5hZ2VuZGEtbW9udGgtY2VsbCB7XG4gICAgYm9yZGVyLXJpZ2h0OiBub25lO1xuICAgIG1pbi1oZWlnaHQ6IDEyMHB4O1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8bG9hZGVyIHYtaWY9XCJjYXRlZ29yeSA9PT0gbnVsbFwiLz5cbiAgPGRpdiB2LWVsc2U+XG4gICAgPGgxIGNsYXNzPVwic3Itb25seVwiPnt7IGNhdGVnb3J5LnRpdGxlIH19PC9oMT5cbiAgICA8ZGl2IGNsYXNzPVwibmstYmxvY2staGVhZCBteC1hdXRvIHN0b3JlZnJvbnQtYmFja1wiPlxuICAgICAgPGRpdiBjbGFzcz1cIm5rLWJsb2NrLWhlYWQtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibmstYmxvY2staGVhZC1zdWJcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJhY2stdG9cIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIiBAY2xpY2s9XCJnb0JhY2tcIj5cbiAgICAgICAgICAgIDxlbSBjbGFzcz1cImljb24gbmkgbmktYXJyb3ctbGVmdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZW0+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhcmFncmFwaFwiIDphcmlhLWxhYmVsPVwidHJhbnMoJ3Byb2R1Y3Qub3JkZXIuYmFjaycpXCI+XG4gICAgICAgICAgICAgIHt7IHRyYW5zKCdwcm9kdWN0Lm9yZGVyLmJhY2snKSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzdG9yZWZyb250LWNhdGVnb3J5bGVzc1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0b3JlZnJvbnQtZ3JpZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmVmcm9udC1jb2x1bW5cIiB2LWZvcj1cImVudHJ5IGluIGRpc3BsYXlJdGVtc1wiIDppZD1cImVudHJ5SWQoZW50cnkpXCIgOmtleT1cImVudHJ5SWQoZW50cnkpXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib3ggb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1pbm5lciBwLTBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaW1hZ2VcIiB2LWlmPVwiZW50cnkuaXRlbS5pbWFnZVwiPlxuICAgICAgICAgICAgICAgIDxyb3V0ZXItbGluayA6dG89XCJpdGVtTGluayhlbnRyeSlcIiA6YXJpYS1sYWJlbD1cIml0ZW1BcmlhTGFiZWwoZW50cnkpXCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIDpzcmM9XCJjZG4gKyBlbnRyeS5pdGVtLmltYWdlXCIgOmFsdD1cIml0ZW1BbHQoZW50cnkpXCIvPlxuICAgICAgICAgICAgICAgIDwvcm91dGVyLWxpbms+XG4gICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImVudHJ5Lml0ZW0ubGFiZWxcIj57eyBlbnRyeS5pdGVtLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtNFwiPlxuICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cImg1XCI+e3sgZW50cnkuaXRlbS50aXRsZSB9fTwvaDI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3eXNpd3lnXCJcbiAgICAgICAgICAgICAgICAgICAgdi1pZj1cImVudHJ5Lml0ZW0uZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICB2LWh0bWw9XCJlbnRyeS5pdGVtLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgOmNsYXNzPVwiKGNvbGxhcHNlZFtlbnRyeUdyb3VwKGVudHJ5LnR5cGUpXVtlbnRyeS5pdGVtLmlkXSA/ICdjb2xsYXBzZWQnIDogJycpXCJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwid3lzaXd5Zy1yZWFkbW9yZVwiXG4gICAgICAgICAgICAgICAgICAgIDphcmlhLWxhYmVsPVwidHJhbnMoJ2luZGV4LnJlYWRtb3JlJykgKyAnICcgKyBlbnRyeS5pdGVtLnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgQGNsaWNrLnByZXZlbnQ9XCJjb2xsYXBzZShlbnRyeUdyb3VwKGVudHJ5LnR5cGUpLCBlbnRyeS5pdGVtLmlkKVwiXG4gICAgICAgICAgICAgICAgICAgIHYtaWY9XCJjb2xsYXBzZWRbZW50cnlHcm91cChlbnRyeS50eXBlKV1bZW50cnkuaXRlbS5pZF1cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZW0gY2xhc3M9XCJpY29uIG5pIG5pLWNoZXZyb25zLWRvd25cIj48L2VtPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyB0cmFucygnaW5kZXgucmVhZG1vcmUnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3eXNpd3lnLXJlYWRtb3JlXCJcbiAgICAgICAgICAgICAgICAgICAgOmFyaWEtbGFiZWw9XCJ0cmFucygnaW5kZXgucmVhZGxlc3MnKSArICcgJyArIGVudHJ5Lml0ZW0udGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICBAY2xpY2sucHJldmVudD1cImNvbGxhcHNlKGVudHJ5R3JvdXAoZW50cnkudHlwZSksIGVudHJ5Lml0ZW0uaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgdi1lbHNlLWlmPVwicmVhZE1vcmVOZWVkZWQoZW50cnkuaXRlbS5kZXNjcmlwdGlvbilcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZW0gY2xhc3M9XCJpY29uIG5pIG5pLWNoZXZyb25zLXVwXCI+PC9lbT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgdHJhbnMoJ2luZGV4LnJlYWRsZXNzJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxyb3V0ZXItbGluayA6dG89XCJpdGVtTGluayhlbnRyeSlcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIDphcmlhLWxhYmVsPVwiaXRlbUFyaWFMYWJlbChlbnRyeSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtQnV0dG9uVGV4dChlbnRyeSkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9yb3V0ZXItbGluaz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3BzOiBbJ2lkJ10sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNfbG9hZGVkOiBmYWxzZSxcbiAgICAgIGNvbGxhcHNlZDoge1xuICAgICAgICBwcm9kdWN0czoge30sXG4gICAgICAgIHN1YnNjcmlwdGlvbnM6IHt9LFxuICAgICAgICB2b3VjaGVyczoge30sXG4gICAgICAgIGNhdGVnb3JpZXM6IHt9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2xvYWRDYXRlZ29yeScsIHRoaXMuaWQpO1xuICB9LFxuXG4gIGJlZm9yZVJvdXRlVXBkYXRlKHRvLCBmcm9tLCBuZXh0KSB7XG4gICAgdGhpcy5pc19sb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNvbGxhcHNlZCA9IHtcbiAgICAgIHByb2R1Y3RzOiB7fSxcbiAgICAgIHN1YnNjcmlwdGlvbnM6IHt9LFxuICAgICAgdm91Y2hlcnM6IHt9LFxuICAgICAgY2F0ZWdvcmllczoge31cbiAgICB9O1xuICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdsb2FkQ2F0ZWdvcnknLCB0by5wYXJhbXMuaWQpO1xuICAgIG5leHQoKTtcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZW50cnlHcm91cCh0eXBlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYXRlZ29yeTogJ2NhdGVnb3JpZXMnLFxuICAgICAgICBwcm9kdWN0OiAncHJvZHVjdHMnLFxuICAgICAgICBzdWJzY3JpcHRpb246ICdzdWJzY3JpcHRpb25zJyxcbiAgICAgICAgdm91Y2hlcjogJ3ZvdWNoZXJzJ1xuICAgICAgfVt0eXBlXSB8fCAncHJvZHVjdHMnO1xuICAgIH0sXG4gICAgZW50cnlJZChlbnRyeSkge1xuICAgICAgcmV0dXJuIGAke2VudHJ5LnR5cGV9LSR7ZW50cnkuaXRlbS5pZH1gO1xuICAgIH0sXG4gICAgaXRlbUxpbmsoZW50cnkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNhdGVnb3J5OiBgL2NhdGVnb3J5LyR7ZW50cnkuaXRlbS5pZH0vJHtlbnRyeS5pdGVtLnNsdWd9YCxcbiAgICAgICAgcHJvZHVjdDogYC9wcm9kdWN0LyR7ZW50cnkuaXRlbS5pZH0vJHtlbnRyeS5pdGVtLnNsdWd9YCxcbiAgICAgICAgc3Vic2NyaXB0aW9uOiBgL3N1YnNjcmlwdGlvbi8ke2VudHJ5Lml0ZW0uaWR9LyR7ZW50cnkuaXRlbS5zbHVnfWAsXG4gICAgICAgIHZvdWNoZXI6IGAvdm91Y2hlci8ke2VudHJ5Lml0ZW0uaWR9LyR7ZW50cnkuaXRlbS5zbHVnfWBcbiAgICAgIH1bZW50cnkudHlwZV07XG4gICAgfSxcbiAgICBpdGVtQWx0KGVudHJ5KSB7XG4gICAgICByZXR1cm4gZW50cnkuaXRlbS50aXRsZTtcbiAgICB9LFxuICAgIGl0ZW1CdXR0b25UZXh0KGVudHJ5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYXRlZ29yeTogdGhpcy50cmFucygnaW5kZXguY2F0ZWdvcmllcy5zZWxlY3QnKSxcbiAgICAgICAgcHJvZHVjdDogdGhpcy50cmFucygnaW5kZXgucHJvZHVjdHMuc3VibWl0JyksXG4gICAgICAgIHN1YnNjcmlwdGlvbjogdGhpcy50cmFucygnaW5kZXguc3Vic2NyaXB0aW9ucy5zdWJtaXQnKSxcbiAgICAgICAgdm91Y2hlcjogdGhpcy50cmFucygnaW5kZXgudm91Y2hlcnMuc3VibWl0JylcbiAgICAgIH1bZW50cnkudHlwZV07XG4gICAgfSxcbiAgICBpdGVtQXJpYUxhYmVsKGVudHJ5KSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5pdGVtQnV0dG9uVGV4dChlbnRyeSl9ICR7ZW50cnkuaXRlbS50aXRsZX1gO1xuICAgIH0sXG4gICAgaW5pdENvbGxhcHNlZChlbnRyaWVzKSB7XG4gICAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgIHRoaXMuJHNldChcbiAgICAgICAgICB0aGlzLmNvbGxhcHNlZFt0aGlzLmVudHJ5R3JvdXAoZW50cnkudHlwZSldLFxuICAgICAgICAgIGVudHJ5Lml0ZW0uaWQsXG4gICAgICAgICAgdGhpcy5yZWFkTW9yZU5lZWRlZChlbnRyeS5pdGVtLmRlc2NyaXB0aW9uKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICByZWFkTW9yZU5lZWRlZChkZXNjcmlwdGlvbikge1xuICAgICAgaWYgKCFkZXNjcmlwdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd3eXNpd3lnJyk7XG4gICAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG4gICAgICBjb250YWluZXIuc3R5bGUub3ZlcmZsb3cgPSAndmlzaWJsZSc7XG4gICAgICBjb250YWluZXIuc3R5bGUud2hpdGVTcGFjZSA9ICdub3JtYWwnO1xuXG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gZGVzY3JpcHRpb247XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG5cbiAgICAgIGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCBtYXhIZWlnaHQgPSAxMDA7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTtcblxuICAgICAgcmV0dXJuIGhlaWdodCA+IG1heEhlaWdodDtcbiAgICB9LFxuICAgIGluaXQoKSB7XG4gICAgICBpZiAoISh0aGlzLmNhdGVnb3J5LnN0YXRlID09PSAnSU5WSVNJQkxFJyB8fCB0aGlzLmNhdGVnb3J5LnN0YXRlID09PSAnUFVCTElTSEVEJykpIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoJy8nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY2F0ZWdvcnkpIHtcbiAgICAgICAgdGhpcy5pbml0Q29sbGFwc2VkKHRoaXMuZGlzcGxheUl0ZW1zKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNvbGxhcHNlKHR5cGUsIGlkKSB7XG4gICAgICB0aGlzLiRzZXQodGhpcy5jb2xsYXBzZWRbdHlwZV0sIGlkLCAhdGhpcy5jb2xsYXBzZWRbdHlwZV1baWRdKTtcbiAgICB9LFxuICAgIGdvQmFjaygpIHtcbiAgICAgIGlmICh3aW5kb3cuaGlzdG9yeS5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRoaXMuJHJvdXRlci5iYWNrKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCgnLycpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGNhdGVnb3J5X2l0ZW1zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnMuQ2F0ZWdvcnlJdGVtcyh0aGlzLmlkKTtcbiAgICB9LFxuICAgIGZhbGxiYWNrSXRlbXMoKSB7XG4gICAgICBpZiAoIXRoaXMuY2F0ZWdvcnkpIHJldHVybiBbXTtcblxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4udGhpcy5jYXRlZ29yeS5jaGlsZHJlbi5tYXAoaXRlbSA9PiAoe3R5cGU6ICdjYXRlZ29yeScsIGl0ZW19KSksXG4gICAgICAgIC4uLnRoaXMuY2F0ZWdvcnkucHJvZHVjdHMubWFwKGl0ZW0gPT4gKHt0eXBlOiAncHJvZHVjdCcsIGl0ZW19KSksXG4gICAgICAgIC4uLnRoaXMuY2F0ZWdvcnkuc3Vic2NyaXB0aW9ucy5tYXAoaXRlbSA9PiAoe3R5cGU6ICdzdWJzY3JpcHRpb24nLCBpdGVtfSkpLFxuICAgICAgICAuLi50aGlzLmNhdGVnb3J5LnZvdWNoZXJzLm1hcChpdGVtID0+ICh7dHlwZTogJ3ZvdWNoZXInLCBpdGVtfSkpXG4gICAgICBdO1xuICAgIH0sXG4gICAgZGlzcGxheUl0ZW1zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2F0ZWdvcnlfaXRlbXMubGVuZ3RoID4gMCA/IHRoaXMuY2F0ZWdvcnlfaXRlbXMgOiB0aGlzLmZhbGxiYWNrSXRlbXM7XG4gICAgfSxcbiAgICBjYXRlZ29yeSgpIHtcbiAgICAgIGxldCBjYXQgPSB0aGlzLiRzdG9yZS5nZXR0ZXJzLkNhdGVnb3J5KHRoaXMuaWQpO1xuICAgICAgaWYgKGNhdCA9PSBudWxsIHx8ICFjYXQuZnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGlmICghdGhpcy5pc19sb2FkZWQpIHtcbiAgICAgICAgdGhpcy5pc19sb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNhdDtcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgdHlwZT1cInRleHQvY3NzXCIgc2NvcGVkPlxuXG5cbi5zdG9yZWZyb250LWJhY2sge1xuICBtYXJnaW4tYm90dG9tOiAxLjVyZW07XG59XG5cblxuQG1lZGlhIChtYXgtd2lkdGg6IDEwMDBweCkge1xuXG4gIC5zdG9yZWZyb250LWdyaWQge1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG5cbiAgLnN0b3JlZnJvbnQtZ3JpZCAuc3RvcmVmcm9udC1jb2x1bW4ge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1hcmdpbi1ib3R0b206IDE1cHg7XG4gIH1cbn1cblxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTAwMHB4KSB7XG5cbiAgLnN0b3JlZnJvbnQtZ3JpZCB7XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDUwJSA1MCU7XG4gICAgZ3JpZC1nYXA6IDE1cHg7XG4gICAgZ3JpZC1yb3ctZ2FwOiAxNXB4O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1hcmdpbi1ib3R0b206IDBweDtcbiAgfVxuXG4gIC5zdG9yZWZyb250LWdyaWQgLnN0b3JlZnJvbnQtY29sdW1uIHtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJyZWFrLWluc2lkZTogYXZvaWQ7XG4gICAgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkO1xuICB9XG59XG5cbi5jYXJkLWltYWdlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAyMDBweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmNhcmQtaW1hZ2UgaW1nIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMTAwJTtcbiAgdG9wOiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIC01MCUpO1xufVxuXG4uY2FyZC1pbWFnZSBzcGFuIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1idXR0b24pO1xuICBib3R0b206IDA7XG4gIHJpZ2h0OiAxLjVyZW07XG4gIGNvbG9yOiB2YXIoLS1idXR0b24tdGV4dCk7XG4gIHBhZGRpbmc6IDcuNXB4IDE1cHg7XG4gIGJvcmRlci1yYWRpdXM6IDVweCA1cHggMCAwO1xuICB6LWluZGV4OiAxO1xufVxuXG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1pbm5lciBjYXJkLWlubmVyLWxnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuay1ibG9jay1oZWFkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5rLWJsb2NrLWhlYWQtY29udGVudFwiPlxuICAgICAgICAgICAgPGg0IGNsYXNzPVwibmstYmxvY2stdGl0bGVcIj57eyB0cmFucygndm91Y2hlci1jaGVjay50aXRsZScpIH19PC9oND5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuay1ibG9jay1kZXNcIj5cbiAgICAgICAgICAgICAgPHA+e3sgdHJhbnMoJ3ZvdWNoZXItY2hlY2suZGVzY3JpcHRpb24nKSB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5rLWJsb2NrLWRlc1wiPlxuICAgICAgICAgICAgICA8Yj57eyBlcnJvciB9fTwvYj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tbGFiZWwtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7IHRyYW5zKCd2b3VjaGVyLWNoZWNrLmZvcm0uY29kZScpIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbC13cmFwXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdi1tb2RlbD1cImNvZGVcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1sZyBidG4tcHJpbWFyeSBidG4tYmxvY2tcIiBAY2xpY2s9XCJjaGVja1ZvdWNoZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgIDphcmlhLWxhYmVsPVwidHJhbnMoJ3ZvdWNoZXItY2hlY2suZm9ybS5zdWJtaXQnKVwiPnt7IHRyYW5zKCd2b3VjaGVyLWNoZWNrLmZvcm0uc3VibWl0JykgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBpZD1cInZvdWNoZXJcIiBjbGFzcz1cIm1vZGFsIGZhZGVcIiB0YWJpbmRleD1cIi0xXCIgcm9sZT1cImRpYWxvZ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1sZ1wiIHJvbGU9XCJkb2N1bWVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlIG0tMFwiPnt7IHRyYW5zKCd2b3VjaGVyLWNoZWNrLm1vZGFsLnRpdGxlJykgfX08L2g1PlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgICAgICAgICAgPHVsPlxuICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgPHA+e3sgdHJhbnMoJ3ZvdWNoZXItY2hlY2subW9kYWwuY29kZScpIH19e3sgY29kZSB9fTwvcD5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgIDxwPnt7IHRyYW5zKCd2b3VjaGVyLWNoZWNrLm1vZGFsLmNyZWRpdCcpIH19e3sgY3VycmVuY3kuZm9ybWF0KHZvdWNoZXIuY3JlZGl0KSB9fTwvcD5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgIDxwPnt7IHRyYW5zKCd2b3VjaGVyLWNoZWNrLm1vZGFsLmV4cGlyYXRpb24nKSB9fXt7IHZvdWNoZXIuZXhwaXJhdGlvbiA/IGRhdGUodm91Y2hlci5leHBpcmF0aW9uLCBkZWZpbml0aW9ucy5kYXRlX2Zvcm1hdCkgOiB0cmFucygndm91Y2hlci1jaGVjay5tb2RhbC5ub24tZXhwaXJpbmcnKSB9fTwvcD5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBwcm9wczogWydzZWNyZXQnXSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGNvZGU6IG51bGwsXG4gICAgICB2b3VjaGVyOiB7XG4gICAgICAgIGNyZWRpdDogMCxcbiAgICAgICAgZXhwaXJhdGlvbjogbnVsbFxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgY2hlY2tWb3VjaGVyKCkge1xuICAgICAgYXhpb3MuZ2V0KGAvYXBpL3ZvdWNoZXIvY2hlY2svJHt0aGlzLmNvZGV9YCkudGhlbihyZXMgPT4ge1xuICAgICAgICB0aGlzLnZvdWNoZXIgPSByZXMuZGF0YS5yZXNwb25zZTtcbiAgICAgICAgJCgnI3ZvdWNoZXInKS5tb2RhbCgnc2hvdycpO1xuICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgaWYgKGVyci5yZXNwb25zZS5kYXRhLmVycm9yID09PSAndm91Y2hlcl9ub3RfZm91bmQnKSB7XG4gICAgICAgICAgdGhpcy5lcnJvciA9ICdWb3VjaGVyIG5vdCBmb3VuZCc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIiBzY29wZWQ+XG5cbi5jYXJkIHtcbiAgcG9pbnRlci1ldmVudHM6IGluaXRpYWw7XG59XG5cbi5idG4tY2xvc2Uge1xuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgaGVpZ2h0OiAycmVtO1xuICB3aWR0aDogMnJlbTtcbiAgcmlnaHQ6IC41cmVtO1xuICB0b3A6IC41cmVtO1xuICBwYWRkaW5nOiAuMjVlbSAuMjVlbTtcbiAgYm9yZGVyOiAwO1xuICBib3JkZXItcmFkaXVzOiA0MHB4O1xuICBmb250LXNpemU6IDEuMjVyZW07XG4gIGNvbG9yOiAjMDAwO1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg1MCUsIC01MCUpO1xuICB0cmFuc2l0aW9uOiAuM3MgZWFzZVxufVxuXG4uYnRuLWNsb3NlOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogIzAwMCAhaW1wb3J0YW50O1xuICBjb2xvcjogI2ZmZjtcbn1cblxuLmJ0bi1jbG9zZTphY3RpdmUsXG4uYnRuLWNsb3NlOmZvY3VzIHtcbiAgb3V0bGluZTogbm9uZTtcbn1cblxudWwge1xuICB0ZXh0LWFsaWduOiBpbml0aWFsO1xufVxuXG48L3N0eWxlPiIsIjx0ZW1wbGF0ZT5cbiAgPGxvYWRlciB2LWlmPVwiIXJlYWR5XCIvPlxuICA8ZGl2IDpkYXRhLXN0ZXA9XCJzdGVwXCIgdi1lbHNlPlxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtN1wiPlxuICAgICAgICA8cmVzZXJ2YXRpb24tb3ZlcnZpZXcgdi1pZj1cInN0ZXAgPT09ICdvdmVydmlldydcIiB2LW9uOnN1Ym1pdD1cIm5leHRTdGVwXCIgOnJlc2VydmF0aW9uPVwicmVzZXJ2YXRpb25cIi8+XG4gICAgICAgIDxyZXNlcnZhdGlvbi1jaGVja291dCB2LWlmPVwic3RlcCA9PT0gJ2NoZWNrb3V0J1wiIDpyZXNlcnZhdGlvbj1cInJlc2VydmF0aW9uXCIvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIiB2LWZvcj1cIihyZXMsIGlkeCkgaW4gcmVzZXJ2YXRpb25zXCIgOmtleT1cImlkeFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1pbm5lclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgcGItM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImQtYmxvY2sgdGV4dC1oZWFkIGZvbnQtd2VpZ2h0LWJvbGRlciBmcy0xNnB4IG1iLTIgdGl0bGVcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnByb2R1Y3QudGl0bGVcbiAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwidy0xMDAgZm9udC13ZWlnaHQtbGlnaHQgZnMtMTRweFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsaSB2LWlmPVwicmVzLnByb2R1Y3QucGxvdCAmJiByZXMucHJvZHVjdC5wbG90LmRhdGUgIT0gbnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhbGlnbi1taWRkbGUgZnMtMThweCBwci0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxlbSBjbGFzcz1cImljb24gbmkgbmktY2FsZW5kYXItYm9va2luZ1wiPjwvZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWNhcnQtaXRlbT1cImRhdGVcIiBjbGFzcz1cInBhcmFncmFwaFwiIHN0eWxlPVwib3BhY2l0eTogMC43NTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcmVzLnByb2R1Y3QucGxvdC5kYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICA8bGkgdi1pZj1cInJlcy5wcm9kdWN0LnBsb3QgJiYgcmVzLnByb2R1Y3QucGxvdC50aW1lICE9IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWxpZ24tbWlkZGxlIGZzLTE4cHggcHItMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW0gY2xhc3M9XCJpY29uIG5pIG5pLWNsb2NrXCI+PC9lbT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtY2FydC1pdGVtPVwiZGF0ZVwiIGNsYXNzPVwicGFyYWdyYXBoXCIgc3R5bGU9XCJvcGFjaXR5OiAwLjc1O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByZXMucHJvZHVjdC5wbG90LnRpbWUuc3RhcnQgfX0gLSB7eyByZXMucHJvZHVjdC5wbG90LnRpbWUuZW5kIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgOnNyYz1cImNkbiArIHJlcy5wcm9kdWN0LmltYWdlXCIgY2xhc3M9XCJyb3VuZCBkLWhpZGUtbW9iaWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICB2LWlmPVwicmVzLnByb2R1Y3QuaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIDphbHQ9XCJyZXMucHJvZHVjdC50aXRsZVwiLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIHB0LTIgcGItMSBib3JkZXItdG9wXCIgdi1pZj1cInJlcy5wcm9kdWN0LnF1YW50aXR5ID4gMFwiPlxuICAgICAgICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm15LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1ncmF5IGJhZGdlLXBpbGwgbXItMVwiIHN0eWxlPVwid2lkdGg6IDI4cHg7XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5wcm9kdWN0LnF1YW50aXR5XG4gICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFyYWdyYXBoXCI+e3sgdHJhbnMoJ2NvbXBvbmVudHMuY2FydC5xdWFudGl0eScpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIHB0LTIgcGItMSBib3JkZXItdG9wXCIgdi1pZj1cInJlcy5wcm9kdWN0LmF1ZGllbmNlcy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgPHVsPlxuICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibXktMVwiIHYtZm9yPVwiYXVkaWVuY2UgaW4gcmVzLnByb2R1Y3QuYXVkaWVuY2VzXCIgOmtleT1cImF1ZGllbmNlLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICB2LWlmPVwiYXVkaWVuY2UucXVhbnRpdHkgPiAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtZ3JheSBiYWRnZS1waWxsIG1yLTFcIiBzdHlsZT1cIndpZHRoOiAyOHB4O1wiPnt7IGF1ZGllbmNlLnF1YW50aXR5IH19PC9zcGFuPiB7e1xuICAgICAgICAgICAgICAgICAgICAgIGF1ZGllbmNlLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbG9hdC1yaWdodFwiIHYtaWY9XCJyZXMucHJvZHVjdC50eXBlcy5wcmljZSA9PT0gJ0FVRElFTkNFJ1wiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeS5mb3JtYXQoYXVkaWVuY2UucHJpY2UgKiBhdWRpZW5jZS5xdWFudGl0eSlcbiAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbG9hdC1yaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHYtaWY9XCJyZXMucHJvZHVjdC50eXBlcy5wcmljZSA9PT0gJ0RZTkFNSUMnICYmIHJlcy5wcm9kdWN0LnBsb3RcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3kuZm9ybWF0KGNhbGNBdWRpZW5jZVByaWNlKHJlcywgYXVkaWVuY2UuaWQpICogYXVkaWVuY2UucXVhbnRpdHkpXG4gICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgcHQtMyBtdC0xIGJvcmRlci10b3BcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGZzLTE4cHhcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiB0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiPnt7IHRyYW5zKCdjb21wb25lbnRzLmNhcnQuaW5mby5wcmljZScpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgdGV4dC1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtd2VpZ2h0LWJvbGQgdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBjdXJyZW5jeS5mb3JtYXQocmVzZXJ2YXRpb25QcmljZXNbaWR4XS5wcm9kdWN0cykgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXJcIiBzdHlsZT1cImJhY2tncm91bmQ6cmdiYSh2YXIoLS1iYWNrZ3JvdW5kLXJnYiksIDAuNSk7XCIgdi1pZj1cImlkeCA9PT0gMCAmJiByZXMucHJvZHVjdC5kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjcHJvZHVjdF9pbmZvcm1hdGlvblwiIGNsYXNzPVwidGV4dC1jZW50ZXIgZC1ibG9ja1wiPlxuICAgICAgICAgICAgICAgIHt7IHRyYW5zKCdjb21wb25lbnRzLmNhcnQuaW5mby50aXRsZScpIH19XG4gICAgICAgICAgICAgICAgPGVtIGNsYXNzPVwiaWNvbiBuaSBuaS1jaGV2cm9uLXJpZ2h0XCI+PC9lbT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCIgdi1pZj1cInJlcy51cHNlbGxzICYmIE9iamVjdC5rZXlzKHJlcy51cHNlbGxzKS5sZW5ndGggPiAwXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWlubmVyXCI+XG5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1ibG9jayB0ZXh0LWhlYWQgZm9udC13ZWlnaHQtYm9sZGVyIGZzLTE2cHggbWItMiB0aXRsZVwiPnt7XG4gICAgICAgICAgICAgICAgICB0cmFucygnY29tcG9uZW50cy5jYXJ0LmluZm8udXBzZWxsJylcbiAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHVsPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm15LTFcIiB2LWZvcj1cInVwc2VsbCBpbiByZXMudXBzZWxsc1wiIDprZXk9XCJ1cHNlbGwuaWRcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtZ3JheSBiYWRnZS1waWxsIG1yLTFcIiBzdHlsZT1cIndpZHRoOiAyOHB4O1wiPnt7IHVwc2VsbC5xdWFudGl0eSB9fTwvc3Bhbj4ge3tcbiAgICAgICAgICAgICAgICAgICAgdXBzZWxsLnRpdGxlXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbG9hdC1yaWdodFwiPnt7IGN1cnJlbmN5LmZvcm1hdCh1cHNlbGwucHJpY2UgKiB1cHNlbGwucXVhbnRpdHkpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDwvdWw+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIG10LTMgcHQtMyBib3JkZXItdG9wXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBmcy0xOHB4XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgdGV4dC1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj57eyB0cmFucygnY29tcG9uZW50cy5jYXJ0LmluZm8ucHJpY2UnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IHRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LXdlaWdodC1ib2xkIHRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgY3VycmVuY3kuZm9ybWF0KHJlc2VydmF0aW9uUHJpY2VzW2lkeF0udXBzZWxscykgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaW5uZXJcIj5cblxuICAgICAgICAgICAgPGRpdiB2LWlmPVwic2hvd19kaXNjb3VudFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGZzLTE1cHggbWItM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiB0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj57eyB0cmFucygnY29tcG9uZW50cy5jYXJ0LmNvdXBvbi5zdWJ0b3RhbCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiB0ZXh0LXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtd2VpZ2h0LWJvbGQgdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgcHJpY2UoJ3N1YnRvdGFsJykgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZnMtMTVweCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IHRleHQtbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiPnt7IHRyYW5zKCdjb21wb25lbnRzLmNhcnQuY291cG9uLmRpc2NvdW50JykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IHRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC13ZWlnaHQtYm9sZCB0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAtIHt7IHByaWNlKCdkaXNjb3VudCcpIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cblxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGZzLTE4cHggbWItM1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgdGV4dC1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiPnt7IHRyYW5zKCdjb21wb25lbnRzLmNhcnQuaW5mby50b3RhbCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IHRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtd2VpZ2h0LWJvbGQgdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGN1cnJlbmN5LmZvcm1hdChwcmljZXMudG90YWwpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZnMtMThweCBtYi0zXCIgdi1pZj1cImRlcG9zaXRJbmZvLmVuYWJsZWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IHRleHQtbGVmdFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHRyYW5zKCdyZXNlcnZhdGlvbi5vdmVydmlldy5wYXltZW50LmRlcG9zaXQnKS5yZXBsYWNlKCd7cGVyY2VudGFnZX0nLCBkZXBvc2l0SW5mby5wZXJjZW50YWdlKSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiB0ZXh0LXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LXdlaWdodC1ib2xkIHRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBjdXJyZW5jeS5mb3JtYXQocGF5Tm93RGVwb3NpdCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiB2LWlmPVwiYXBwbGljYWJsZUFkZGl0aW9ucy5sZW5ndGggPiAwICYmICFleGNsdWRlX2FkZGl0aW9uc1wiPlxuICAgICAgICAgICAgICA8ZGl2IHYtZm9yPVwiYWRkaXRpb24gaW4gYXBwbGljYWJsZUFkZGl0aW9uc1wiIDprZXk9XCJhZGRpdGlvbi5pZFwiIGNsYXNzPVwicm93IGZzLTE4cHggbWItM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiB0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj57eyBhZGRpdGlvbi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiB0ZXh0LXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtd2VpZ2h0LWJvbGQgdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY3VycmVuY3kuZm9ybWF0KGFkZGl0aW9uLmFtb3VudCkgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZnMtMThweCBtYi0zXCIgdi1pZj1cImRlcG9zaXRJbmZvLmVuYWJsZWQgJiYgIWRlcG9zaXRMb2NrZWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IHRleHQtbGVmdFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj57eyB0cmFucygncmVzZXJ2YXRpb24ub3ZlcnZpZXcucGF5bWVudC5kdWVfbm93JykgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgdGV4dC1yaWdodFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC13ZWlnaHQtYm9sZCB0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgY3VycmVuY3kuZm9ybWF0KHBheU5vdykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiIHYtaWY9XCJjb3Vwb25cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8ZW0gY2xhc3M9XCJpY29uIG5pIG5pLWNoZWNrIHRleHQtc3VjY2Vzc1wiPjwvZW0+XG5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHRyYW5zKCdjb21wb25lbnRzLmNhcnQuY291cG9uLnRpdGxlJykgfX0ge3tcbiAgICAgICAgICAgICAgICAgICAgY291cG9uLmNvdXBvbi5jb2RlXG4gICAgICAgICAgICAgICAgICB9fSB7eyB0cmFucygnY29tcG9uZW50cy5jYXJ0LmNvdXBvbi51c2VkJykgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgQGNsaWNrPVwicmVtb3ZlQ291cG9uKClcIiA6YXJpYS1sYWJlbD1cInRyYW5zKCdjb21wb25lbnRzLmNhcnQuY291cG9uLnJlbW92ZScpXCI+XG4gICAgICAgICAgICAgICAgPGVtIGNsYXNzPVwiaWNvbiBuaSBuaS10cmFzaFwiPjwvZW0+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxsb2FkZXIgdi1pZj1cIiFyZWFkeVwiLz5cblxuICAgICAgICAgICAgPGRpdiB2LWVsc2U+XG4gICAgICAgICAgICAgIDxkaXYgdi1pZj1cImNhbkNoYW5nZVJlc2VydmF0aW9uXCIgY2xhc3M9XCJtYi0xXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tYmxvY2sgYnRuLWxnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBjbGljay5wcmV2ZW50PVwicmVib29rKClcIiA6YXJpYS1sYWJlbD1cInRyYW5zKCdjb21wb25lbnRzLmNhcnQuaW5mby5jaGFuZ2UnKVwiPlxuICAgICAgICAgICAgICAgICAgPGVtIGNsYXNzPVwiaWNvbiBuaSBuaS1wZW4gcHItMlwiPjwvZW0+XG4gICAgICAgICAgICAgICAgICB7eyB0cmFucygnY29tcG9uZW50cy5jYXJ0LmluZm8uY2hhbmdlJykgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgdi1pZj1cImNhbkNoZWNrb3V0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiB2LWlmPVwiaGFzTWlzc2luZ1JlcXVpcmVkRmllbGRzXCIgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICB7eyB0cmFucygncmVzZXJ2YXRpb24ub3ZlcnZpZXcuZWRpdC5zdWJ0aXRsZScpIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLWJsb2NrIGJ0bi1sZ1wiIDpkaXNhYmxlZD1cIiFyZWFkeSB8fCBoYXNNaXNzaW5nUmVxdWlyZWRGaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgQGNsaWNrLnByZXZlbnQ9XCJuZXh0U3RlcCgpXCIgOmFyaWEtbGFiZWw9XCJ0cmFucygnY29tcG9uZW50cy5jYXJ0LmluZm8udG9wYXknKVwiPlxuICAgICAgICAgICAgICAgICAgPGVtIGNsYXNzPVwiaWNvbiBuaSBuaS1jYyBwci0yXCI+PC9lbT5cbiAgICAgICAgICAgICAgICAgIHt7IHRyYW5zKCdjb21wb25lbnRzLmNhcnQuaW5mby50b3BheScpIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHYtZWxzZSBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm8gbWItMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJpc0ZpbmFsaXplZFwiPnt7IHRyYW5zKCdyZXNlcnZhdGlvbi5vdmVydmlldy5sb2NrZWQuZmluYWxpemVkJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gdi1lbHNlLWlmPVwiZGVwb3NpdExvY2tlZFwiPnt7IHRyYW5zKCdyZXNlcnZhdGlvbi5vdmVydmlldy5sb2NrZWQuZGVwb3NpdCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIHYtZWxzZT57eyB0cmFucygncmVzZXJ2YXRpb24ub3ZlcnZpZXcubG9ja2VkLm9yZ2FuaXNhdGlvbicpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIGhpZGVcIiBzdHlsZT1cImJhY2tncm91bmQ6cmdiYSh2YXIoLS1iYWNrZ3JvdW5kLXJnYiksIDAuNSk7XCJcbiAgICAgICAgICAgICAgIHYtaWY9XCJjb3Vwb24gPT09IG51bGxcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLXRhcmdldD1cIiNjb3Vwb25fcmVkZWVtXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBkLWJsb2NrXCI+XG4gICAgICAgICAgICAgIHt7IHRyYW5zKCdjb21wb25lbnRzLmNhcnQuY291cG9uLnJlZGVlbScpIH19XG4gICAgICAgICAgICAgIDxlbSBjbGFzcz1cImljb24gbmkgbmktY2hldnJvbi1yaWdodFwiPjwvZW0+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgaWQ9XCJwcm9kdWN0X2luZm9ybWF0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nXCIgcm9sZT1cImRvY3VtZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGUgbS0wXCI+e3sgcmVzZXJ2YXRpb24ucHJvZHVjdC50aXRsZSB9fTwvaDU+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cbiAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3lzaXd5Z1wiIHYtaWY9XCJyZXNlcnZhdGlvbi5wcm9kdWN0LmRlc2NyaXB0aW9uXCIgdi1odG1sPVwicmVzZXJ2YXRpb24ucHJvZHVjdC5kZXNjcmlwdGlvblwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQge2ZpZWxkQXBwbGllc1RvLCBpc0NoZWNrb3V0VmlzaWJsZX0gZnJvbSAnLi4vdXRpbHMvZm9ybUZpZWxkcyc7XG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3BzOiBbJ2lkJ10sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVhZHk6IGZhbHNlLFxuICAgICAgcHJvZHVjdDogbnVsbCxcbiAgICAgIHNob3dfZGlzY291bnQ6IGZhbHNlLFxuICAgICAgY291cG9uOiBudWxsLFxuICAgICAgZXhjbHVkZV9hZGRpdGlvbnM6IGZhbHNlLFxuICAgICAgcmVzZXJ2YXRpb25zOiBbXSxcbiAgICAgIHJlc2VydmF0aW9uUHJpY2VzOiBbXSxcbiAgICAgIGFwcGxpY2FibGVBZGRpdGlvbnM6IFtdLFxuICAgICAgZGVwb3NpdEluZm86IHtcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHBlcmNlbnRhZ2U6IG51bGwsXG4gICAgICB9LFxuICAgICAgcHJpY2VzOiB7XG4gICAgICAgIHByb2R1Y3RzOiAwLjAwLFxuICAgICAgICB1cHNlbGxzOiAwLjAwLFxuICAgICAgICBzdWJ0b3RhbDogMC4wMCxcbiAgICAgICAgZGlzY291bnQ6IDAuMDAsXG4gICAgICAgIHRvdGFsOiAwLjAwXG4gICAgICB9LFxuICAgICAgcGF5Tm93OiAwLjAwLFxuICAgICAgcGF5Tm93RGVwb3NpdDogMC4wMCxcbiAgICAgIHBheW1lbnQ6IHt9LFxuICAgICAgc3RlcDogJydcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLnN0ZXAgPSAnb3ZlcnZpZXcnO1xuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgY29uc3Qgd2F0Y2hlciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGxldCBpbml0aWFsaXplZCA9IHRoaXMuJHN0b3JlLmdldHRlcnMuR2xvYmFsKCdpbml0aWFsaXplZCcpO1xuICAgICAgaWYgKGluaXRpYWxpemVkKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwod2F0Y2hlcik7XG4gICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdsb2FkUmVzZXJ2YXRpb24nLCB0aGlzLiRhdHRycy5oYXNoKVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXJyLnJlc3BvbnNlPy5kYXRhO1xuICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHJlc3BvbnNlPy5lcnJvcjtcbiAgICAgICAgICAgICAgdGhpcy5lcnJvcl9tb2RhbChlcnJvciB8fCAnVW5leHBlY3RlZCBlcnJvcicpO1xuICAgICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgICB0aGlzLnN0YXJ0KCk7XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHN0YXJ0KCkge1xuICAgICAgaWYgKHRoaXMub3JnYW5pc2F0aW9uICYmIHRoaXMucmVzZXJ2YXRpb24pIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGluaXRpYWxpemUoKSB7XG4gICAgICB0aGlzLnJlc2VydmF0aW9ucyA9IFt0aGlzLnJlc2VydmF0aW9uLCAuLi4odGhpcy5yZXNlcnZhdGlvbi5hZGRpdGlvbmFsX3Jlc2VydmF0aW9ucyB8fCBbXSldO1xuICAgICAgdGhpcy5yZXNlcnZhdGlvblByaWNlcyA9IFtdO1xuICAgICAgdGhpcy5wcmljZXMgPSB7cHJvZHVjdHM6MC4wMCwgdXBzZWxsczowLjAwLCBzdWJ0b3RhbDowLjAwLCBkaXNjb3VudDogMC4wMCwgdG90YWw6MC4wMH07XG4gICAgICBjb25zdCBwcm9kdWN0SWRzID0gdGhpcy5nZXRSZXNlcnZhdGlvblByb2R1Y3RJZHMoKTtcbiAgICAgIHRoaXMuYXBwbGljYWJsZUFkZGl0aW9ucyA9IHRoaXMuZGV0ZXJtaW5lQXBwbGljYWJsZUFkZGl0aW9ucyhwcm9kdWN0SWRzKTtcbiAgICAgIHRoaXMuZXhjbHVkZV9hZGRpdGlvbnMgPSB0aGlzLmFwcGxpY2FibGVBZGRpdGlvbnMubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5yZXNlcnZhdGlvbnMuZm9yRWFjaCgocmVzLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBwcmljZSA9IHRoaXMuY2FsY3VsYXRlUHJpY2UocmVzKTtcbiAgICAgICAgdGhpcy5yZXNlcnZhdGlvblByaWNlc1tpbmRleF0gPSBwcmljZTtcbiAgICAgICAgdGhpcy5wcmljZXMucHJvZHVjdHMgKz0gcHJpY2UucHJvZHVjdHM7XG4gICAgICAgIHRoaXMucHJpY2VzLmRpc2NvdW50ICs9IHByaWNlLmRpc2NvdW50O1xuICAgICAgICB0aGlzLnByaWNlcy51cHNlbGxzICs9IHByaWNlLnVwc2VsbHM7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucHJpY2VzLnRvdGFsID0gdGhpcy5wcmljZXMucHJvZHVjdHMgKyB0aGlzLnByaWNlcy51cHNlbGxzIC0gdGhpcy5wcmljZXMuZGlzY291bnQ7XG4gICAgICBsZXQgdG90YWxBZGRpdGlvblByaWNlID0gMDtcblxuICAgICAgLy8gSWYgYmFzZSBwcmljZSBpcyB6ZXJvIG9yIG5lZ2F0aXZlLCBza2lwIGFkZGl0aW9uc1xuICAgICAgaWYgKHRoaXMucHJpY2VzLnByb2R1Y3RzICsgdGhpcy5wcmljZXMudXBzZWxscyAtIHRoaXMucHJpY2VzLmRpc2NvdW50ID4gMCkge1xuICAgICAgICB0aGlzLmFwcGxpY2FibGVBZGRpdGlvbnMuZm9yRWFjaChhZGRpdGlvbiA9PiB7XG4gICAgICAgICAgdG90YWxBZGRpdGlvblByaWNlICs9IHBhcnNlRmxvYXQoYWRkaXRpb24uYW1vdW50KTtcbiAgICAgICAgICB0aGlzLnByaWNlcy50b3RhbCArPSBwYXJzZUZsb2F0KGFkZGl0aW9uLmFtb3VudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5leGNsdWRlX2FkZGl0aW9ucyA9IHRydWU7XG4gICAgICAgIHRoaXMuYXBwbGljYWJsZUFkZGl0aW9ucyA9IFtdO1xuICAgICAgfVxuICAgICAgY29uc3QgbWFpblJlc2VydmF0aW9uID0gdGhpcy5yZXNlcnZhdGlvbj8ucmVzZXJ2YXRpb24gPz8gdGhpcy5yZXNlcnZhdGlvbiA/PyBudWxsO1xuICAgICAgY29uc3QgdG9wTGV2ZWxEZXBvc2l0RW5hYmxlZCA9IHRoaXMucmVzZXJ2YXRpb24/LmRlcG9zaXRfZW5hYmxlZCA/PyB0aGlzLnJlc2VydmF0aW9uPy5kZXBvc2l0RW5hYmxlZCA/PyBmYWxzZTtcbiAgICAgIGNvbnN0IHRvcExldmVsRGVwb3NpdFBlcmNlbnRhZ2UgPSB0aGlzLnJlc2VydmF0aW9uPy5kZXBvc2l0X3BlcmNlbnRhZ2UgPz8gdGhpcy5yZXNlcnZhdGlvbj8uZGVwb3NpdFBlcmNlbnRhZ2UgPz8gbnVsbDtcbiAgICAgIGNvbnN0IG9yZGVyRGVwb3NpdEVuYWJsZWQgPSBtYWluUmVzZXJ2YXRpb24/LmRlcG9zaXRFbmFibGVkID8/IG1haW5SZXNlcnZhdGlvbj8uZGVwb3NpdF9lbmFibGVkID8/IGZhbHNlO1xuICAgICAgY29uc3Qgb3JkZXJEZXBvc2l0UGVyY2VudGFnZSA9IG1haW5SZXNlcnZhdGlvbj8uZGVwb3NpdFBlcmNlbnRhZ2UgPz8gbWFpblJlc2VydmF0aW9uPy5kZXBvc2l0X3BlcmNlbnRhZ2UgPz8gbnVsbDtcblxuICAgICAgY29uc3QgZGVwb3NpdEVuYWJsZWQgPSB0b3BMZXZlbERlcG9zaXRFbmFibGVkIHx8IG9yZGVyRGVwb3NpdEVuYWJsZWQ7XG4gICAgICBjb25zdCBkZXBvc2l0UGVyY2VudGFnZSA9IHRvcExldmVsRGVwb3NpdFBlcmNlbnRhZ2UgPz8gb3JkZXJEZXBvc2l0UGVyY2VudGFnZTtcblxuICAgICAgdGhpcy5kZXBvc2l0SW5mbyA9IHtcbiAgICAgICAgZW5hYmxlZDogQm9vbGVhbihkZXBvc2l0RW5hYmxlZCAmJiBkZXBvc2l0UGVyY2VudGFnZSksXG4gICAgICAgIHBlcmNlbnRhZ2U6IGRlcG9zaXRQZXJjZW50YWdlXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMuZGVwb3NpdEluZm8uZW5hYmxlZCkge1xuICAgICAgICB0aGlzLnBheU5vdyA9IHRoaXMucm91bmRDdXJyZW5jeSgodGhpcy5wcmljZXMudG90YWwgLSB0b3RhbEFkZGl0aW9uUHJpY2UpICogKGRlcG9zaXRQZXJjZW50YWdlIC8gMTAwKSArIHRvdGFsQWRkaXRpb25QcmljZSk7XG4gICAgICAgIHRoaXMucGF5Tm93RGVwb3NpdCA9IHRoaXMucm91bmRDdXJyZW5jeSgodGhpcy5wcmljZXMudG90YWwgLSB0b3RhbEFkZGl0aW9uUHJpY2UpICogKGRlcG9zaXRQZXJjZW50YWdlIC8gMTAwKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBheU5vdyA9IHRoaXMucm91bmRDdXJyZW5jeSh0aGlzLnByaWNlcy50b3RhbCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgY2FsY3VsYXRlUHJpY2UocmVzKSB7XG4gICAgICBsZXQgcHJpY2UgPSB7XG4gICAgICAgIHByb2R1Y3RzOiAwLjAwLFxuICAgICAgICB1cHNlbGxzOiAwLjAwLFxuICAgICAgICBkaXNjb3VudDogMC4wMCxcbiAgICAgICAgdG90YWw6IDAuMDBcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgW2lkLCB1cHNlbGxdIG9mIE9iamVjdC5lbnRyaWVzKHJlcy51cHNlbGxzKSkge1xuICAgICAgICBwcmljZS51cHNlbGxzICs9IHVwc2VsbC5xdWFudGl0eSAqIHBhcnNlRmxvYXQodXBzZWxsLnByaWNlKTtcbiAgICAgIH1cblxuICAgICAgcHJpY2UuZGlzY291bnQgPSByZXMucHJvZHVjdC5kaXNjb3VudCA/IHJlcy5wcm9kdWN0LmRpc2NvdW50IDogMDtcbiAgICAgIGlmIChwcmljZS5kaXNjb3VudCA+IDAgKXtcbiAgICAgICAgdGhpcy5zaG93X2Rpc2NvdW50ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlcy5wcm9kdWN0LnF1YW50aXR5ICE9IDApIHtcbiAgICAgICAgbGV0IHByb2R1Y3RQcmljZSA9IHJlcy5wcm9kdWN0LnBsb3Q/LnByaWNlID8gcmVzLnByb2R1Y3QucGxvdC5wcmljZSA6IHJlcy5wcm9kdWN0LnByaWNlO1xuICAgICAgICBwcmljZS5wcm9kdWN0cyA9IHBhcnNlRmxvYXQocHJvZHVjdFByaWNlKSAqIHJlcy5wcm9kdWN0LnF1YW50aXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzLnByb2R1Y3QuYXVkaWVuY2VzLmZvckVhY2goYXVkaWVuY2UgPT4ge1xuICAgICAgICAgIGxldCBwcmljZVR5cGUgPSByZXMucHJvZHVjdC50eXBlcy5wcmljZTtcbiAgICAgICAgICBpZiAocHJpY2VUeXBlID09PSAnRFlOQU1JQycpIHtcbiAgICAgICAgICAgIHByaWNlLnByb2R1Y3RzICs9IGF1ZGllbmNlLnF1YW50aXR5ICogdGhpcy5jYWxjQXVkaWVuY2VQcmljZShyZXMsIGF1ZGllbmNlLmlkKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByaWNlVHlwZSA9PT0gJ0FVRElFTkNFJykge1xuICAgICAgICAgICAgcHJpY2UucHJvZHVjdHMgKz0gYXVkaWVuY2UucXVhbnRpdHkgKiBwYXJzZUZsb2F0KGF1ZGllbmNlLnByaWNlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByaWNlVHlwZSA9PT0gJ1BMT1QnIHx8IHByaWNlVHlwZSA9PT0gJ0RBWScgfHwgcHJpY2VUeXBlID09PSAnVElNRVNMT1QnKSB7XG4gICAgICAgICAgICBwcmljZS5wcm9kdWN0cyArPSBhdWRpZW5jZS5xdWFudGl0eSAqIHBhcnNlRmxvYXQocmVzLnByb2R1Y3QucGxvdC5wcmljZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByaWNlLnByb2R1Y3RzICs9IGF1ZGllbmNlLnF1YW50aXR5ICogcGFyc2VGbG9hdChyZXMucHJvZHVjdC5wcmljZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcHJpY2UudG90YWwgPSBwcmljZS5wcm9kdWN0cyArIHByaWNlLnVwc2VsbHMgLSBwcmljZS5kaXNjb3VudDtcbiAgICAgIHRoaXMuYXBwbGljYWJsZUFkZGl0aW9ucy5mb3JFYWNoKGFkZGl0aW9uID0+IHtcbiAgICAgICAgcHJpY2UudG90YWwgKz0gcGFyc2VGbG9hdChhZGRpdGlvbi5hbW91bnQpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcHJpY2U7XG4gICAgfSxcbiAgICByb3VuZEN1cnJlbmN5KHZhbHVlKSB7XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZCgodmFsdWUgKyBOdW1iZXIuRVBTSUxPTikgKiAxMDApIC8gMTAwO1xuICAgIH0sXG5cbiAgICBjYWxjQXVkaWVuY2VQcmljZShyZXMsIGF1ZGllbmNlSUQpIHtcbiAgICAgIGNvbnN0IHBsb3QgPSByZXMucHJvZHVjdC5wbG90O1xuICAgICAgaWYgKHBsb3QgJiYgcGxvdC5hdWRpZW5jZVByaWNlcykge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHBsb3QuYXVkaWVuY2VQcmljZXMuZmluZChhID0+IGEuYXVkaWVuY2UgPT09IGF1ZGllbmNlSUQpO1xuICAgICAgICByZXR1cm4gZm91bmQgPyBmb3VuZC5wcmljZSA6IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9LFxuXG4gICAgZGV0ZXJtaW5lQXBwbGljYWJsZUFkZGl0aW9ucyhwcm9kdWN0SWRzKSB7XG4gICAgICBjb25zdCBhZGRpdGlvbnMgPSB0aGlzLm9yZ2FuaXNhdGlvbj8uYWRkaXRpb25zIHx8IFtdO1xuICAgICAgcmV0dXJuIGFkZGl0aW9ucy5maWx0ZXIoKGFkZGl0aW9uKSA9PiBhZGRpdGlvbi50eXBlICE9PSAxICYmIHRoaXMuc2hvdWxkQXBwbHlBZGRpdGlvbihhZGRpdGlvbiwgcHJvZHVjdElkcykpO1xuICAgIH0sXG5cbiAgICBnZXRSZXNlcnZhdGlvblByb2R1Y3RJZHMoKSB7XG4gICAgICByZXR1cm4gKHRoaXMucmVzZXJ2YXRpb25zIHx8IFtdKVxuICAgICAgICAgIC5tYXAoKHJlcykgPT4gcmVzLnByb2R1Y3Q/LmlkKVxuICAgICAgICAgIC5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gbnVsbCAmJiBpZCAhPT0gdW5kZWZpbmVkKTtcbiAgICB9LFxuXG4gICAgc2hvdWxkQXBwbHlBZGRpdGlvbihhZGRpdGlvbiwgcHJvZHVjdElkcyA9IFtdKSB7XG4gICAgICBjb25zdCBleGNsdXNpb25zID0gKGFkZGl0aW9uLmV4Y2x1c2lvbnMgfHwgW10pXG4gICAgICAgICAgLm1hcCgoaWQpID0+IHBhcnNlSW50KGlkKSlcbiAgICAgICAgICAuZmlsdGVyKChpZCkgPT4gIU51bWJlci5pc05hTihpZCkpO1xuICAgICAgY29uc3QgaWRzID0gKHByb2R1Y3RJZHMgfHwgW10pXG4gICAgICAgICAgLm1hcCgoaWQpID0+IHBhcnNlSW50KGlkKSlcbiAgICAgICAgICAuZmlsdGVyKChpZCkgPT4gIU51bWJlci5pc05hTihpZCkpO1xuXG4gICAgICBpZiAoZXhjbHVzaW9ucy5sZW5ndGggPT09IDAgfHwgaWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlkcy5zb21lKChpZCkgPT4gIWV4Y2x1c2lvbnMuaW5jbHVkZXMoaWQpKTtcbiAgICB9LFxuXG4gICAgZmllbGRBcHBsaWVzVG9BbnlQcm9kdWN0KGZpZWxkLCBwcm9kdWN0SWRzID0gW10pIHtcbiAgICAgIHJldHVybiBpc0NoZWNrb3V0VmlzaWJsZShmaWVsZClcbiAgICAgICAgJiYgKHByb2R1Y3RJZHMgfHwgW10pLnNvbWUoKGlkKSA9PiBmaWVsZEFwcGxpZXNUbyhmaWVsZCwgJ3Byb2R1Y3QnLCBpZCkpO1xuICAgIH0sXG5cbiAgICBjb21wYW55RmllbGQodHlwZSkge1xuICAgICAgcmV0dXJuIFsnQ09NUEFOWScsICdBRERSRVNTJywgJ1ZBVF9JRCddLmluY2x1ZGVzKHR5cGUpO1xuICAgIH0sXG5cbiAgICBwcmljZSh0eXBlKSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ3N1YnRvdGFsJykge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW5jeS5mb3JtYXQodGhpcy5wcmljZXMucHJvZHVjdHMgKyB0aGlzLnByaWNlcy51cHNlbGxzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlID09PSAnZGlzY291bnQnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbmN5LmZvcm1hdCh0aGlzLnByaWNlcy5kaXNjb3VudCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW5jeS5mb3JtYXQoMCk7XG4gICAgfSxcblxuICAgIHJlYm9vaygpIHtcbiAgICAgIGNvbnN0IGVuY29kZWRFbWFpbCA9IGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLnJlc2VydmF0aW9uLnJlc2VydmF0aW9uLmN1c3RvbWVyLmVtYWlsKTtcbiAgICAgIHRoaXMuJHJvdXRlci5wdXNoKGAvcmVib29rLyR7dGhpcy5yZXNlcnZhdGlvbi5yZWJvb2tpbmdfc2VjcmV0fT9vcmRlcj0ke3RoaXMucmVzZXJ2YXRpb24ucmVzZXJ2YXRpb24uaWR9JmVtYWlsPSR7ZW5jb2RlZEVtYWlsfWApO1xuICAgIH0sXG5cbiAgICBuZXh0U3RlcCgpIHtcbiAgICAgIGlmICghdGhpcy5jYW5DaGVja291dCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmhhc01pc3NpbmdSZXF1aXJlZEZpZWxkcykge1xuICAgICAgICB0aGlzLnN0ZXAgPSAnb3ZlcnZpZXcnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLnN0ZXAgPSAnY2hlY2tvdXQnO1xuICAgIH0sXG5cbiAgICBlcnJvcl9tb2RhbChjb2RlKSB7XG4gICAgICBsZXQgZXJyb3JfbWVzc2FnZSA9IHRoaXMudHJhbnMoJ2Vycm9ycy4nICsgY29kZS50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgJCgnI3Jlc2VydmF0aW9uX2NhbmNlbGxlZCAjcmVzZXJ2YXRpb25fZXJyb3JfbWVzc2FnZScpLnRleHQoZXJyb3JfbWVzc2FnZSk7XG4gICAgICAkKCcjcmVzZXJ2YXRpb25fY2FuY2VsbGVkJykubW9kYWwoKTtcbiAgICB9LFxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbWlzc2luZ1JlcXVpcmVkRmllbGRzKCkge1xuICAgICAgY29uc3QgcmVzZXJ2YXRpb24gPSB0aGlzLnJlc2VydmF0aW9uPy5yZXNlcnZhdGlvbjtcbiAgICAgIGNvbnN0IGN1c3RvbWVyID0gcmVzZXJ2YXRpb24/LmN1c3RvbWVyO1xuXG4gICAgICBpZiAoIWN1c3RvbWVyKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3JnYW5pc2F0aW9uRmllbGRzID0gdGhpcy5vcmdhbmlzYXRpb24/LmZpZWxkcztcbiAgICAgIGlmICghb3JnYW5pc2F0aW9uRmllbGRzKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzZXJ2YXRpb25zID0gW3RoaXMucmVzZXJ2YXRpb24sIC4uLigodGhpcy5yZXNlcnZhdGlvbj8uYWRkaXRpb25hbF9yZXNlcnZhdGlvbnMgfHwgW10pKV1cbiAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5ICYmIGVudHJ5LnByb2R1Y3QpO1xuICAgICAgY29uc3QgcHJvZHVjdElkcyA9IHJlc2VydmF0aW9uc1xuICAgICAgICAubWFwKChlbnRyeSkgPT4gKGVudHJ5LnByb2R1Y3Q/LmlkICE9PSBudWxsICYmIGVudHJ5LnByb2R1Y3Q/LmlkICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZW50cnkucHJvZHVjdC5pZCkgOiBudWxsKSlcbiAgICAgICAgLmZpbHRlcigoaWQpID0+IGlkICE9PSBudWxsKTtcblxuICAgICAgY29uc3QgY3VzdG9tZXJGaWVsZHMgPSBBcnJheS5pc0FycmF5KGN1c3RvbWVyLmZpZWxkcykgPyBjdXN0b21lci5maWVsZHMgOiBbXTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHt9O1xuICAgICAgY3VzdG9tZXJGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLmlkKSB7XG4gICAgICAgICAgdmFsdWVzW2ZpZWxkLmlkXSA9IGZpZWxkLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgaXNDb21wYW55ID0gISEoXG4gICAgICAgIChjdXN0b21lci5jb21wYW55ICYmIFN0cmluZyhjdXN0b21lci5jb21wYW55KS50cmltKCkpXG4gICAgICAgIHx8IChjdXN0b21lci52YXRfaWQgJiYgU3RyaW5nKGN1c3RvbWVyLnZhdF9pZCkudHJpbSgpKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgbWlzc2luZyA9IFtdO1xuXG4gICAgICBjb25zdCBmaXJzdE5hbWUgPSBjdXN0b21lci5uYW1lPy5maXJzdCA/IFN0cmluZyhjdXN0b21lci5uYW1lLmZpcnN0KS50cmltKCkgOiAnJztcbiAgICAgIGNvbnN0IGxhc3ROYW1lID0gY3VzdG9tZXIubmFtZT8ubGFzdCA/IFN0cmluZyhjdXN0b21lci5uYW1lLmxhc3QpLnRyaW0oKSA6ICcnO1xuICAgICAgY29uc3QgZW1haWwgPSBjdXN0b21lci5lbWFpbCA/IFN0cmluZyhjdXN0b21lci5lbWFpbCkudHJpbSgpIDogJyc7XG5cbiAgICAgIGlmICghZmlyc3ROYW1lIHx8ICFsYXN0TmFtZSB8fCAhZW1haWwpIHtcbiAgICAgICAgbWlzc2luZy5wdXNoKCdERUZBVUxUJyk7XG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5lbnRyaWVzKG9yZ2FuaXNhdGlvbkZpZWxkcykuZm9yRWFjaCgoW2lkLCBmaWVsZF0pID0+IHtcbiAgICAgICAgaWYgKCFmaWVsZCB8fCBmaWVsZC5kZWZhdWx0ID09PSB0cnVlIHx8IGZpZWxkLnJlcXVpcmVkICE9PSB0cnVlIHx8IChmaWVsZC5vcmRlciAmJiBmaWVsZC5wZXJfdGlja2V0KSB8fCAhaXNDaGVja291dFZpc2libGUoZmllbGQpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmZpZWxkQXBwbGllc1RvQW55UHJvZHVjdChmaWVsZCwgcHJvZHVjdElkcykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzQ29tcGFueSAmJiB0aGlzLmNvbXBhbnlGaWVsZChmaWVsZC50eXBlKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2lkXTtcblxuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ0NIRUNLQk9YJykge1xuICAgICAgICAgIGNvbnN0IGNoZWNrZWQgPSB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gJzEnIHx8IHZhbHVlID09PSAxO1xuICAgICAgICAgIGlmICghY2hlY2tlZCkge1xuICAgICAgICAgICAgbWlzc2luZy5wdXNoKGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgU3RyaW5nKHZhbHVlKS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgbWlzc2luZy5wdXNoKGlkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBtaXNzaW5nO1xuICAgIH0sXG4gICAgaGFzTWlzc2luZ1JlcXVpcmVkRmllbGRzKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWlzc2luZ1JlcXVpcmVkRmllbGRzLmxlbmd0aCA+IDA7XG4gICAgfSxcbiAgICBvcmdhbmlzYXRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc3RvcmUuZ2V0dGVycy5PcmdhbmlzYXRpb247XG4gICAgfSxcbiAgICByZXNlcnZhdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLiRzdG9yZS5nZXR0ZXJzLlJlc2VydmF0aW9uO1xuICAgIH0sXG4gICAgaXNGaW5hbGl6ZWQoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnJlc2VydmF0aW9uPy5pc19maW5hbGl6ZWQ7XG4gICAgfSxcbiAgICBjYW5DaGFuZ2VSZXNlcnZhdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmFsbG93Q2hhbmdlc1NldHRpbmcgJiYgIXRoaXMuZGVwb3NpdExvY2tlZCAmJiAhdGhpcy5pc0ZpbmFsaXplZDtcbiAgICB9LFxuICAgIGNhbkNoZWNrb3V0KCkge1xuICAgICAgcmV0dXJuICF0aGlzLmRlcG9zaXRMb2NrZWQgJiYgIXRoaXMuaXNGaW5hbGl6ZWQ7XG4gICAgfSxcbiAgICBhbGxvd0NoYW5nZXNTZXR0aW5nKCkge1xuICAgICAgY29uc3QgYWxsb3dDaGFuZ2VzID0gdGhpcy5yZXNlcnZhdGlvbj8uYWxsb3dfY2hhbmdlcztcbiAgICAgIHJldHVybiBhbGxvd0NoYW5nZXMgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBhbGxvd0NoYW5nZXM7XG4gICAgfSxcbiAgICBkZXBvc2l0TG9ja2VkKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5yZXNlcnZhdGlvbj8uZGVwb3NpdF9sb2NrZWQ7XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgcmVzZXJ2YXRpb246IHtcbiAgICAgIGRlZXA6IHRydWUsXG4gICAgICBoYW5kbGVyKCkge1xuICAgICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbjwvc2NyaXB0PlxuXG48c3R5bGUgdHlwZT1cInRleHQvY3NzXCIgc2NvcGVkPlxuXG4uaGlkZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxsb2FkZXIgdi1pZj1cImxvYWRpbmdcIi8+XG4gIDxkaXYgdi1lbHNlPlxuICAgIDxkaXYgdi1pZj1cImRhdGVOb3RGb3VuZFwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIG1iLTNcIiByb2xlPVwiYWxlcnRcIj5cbiAgICAgIHt7IHRyYW5zKCdwcm9kdWN0LnR5cGVzLnRpbWVzbG90Lm5vdF9hdmFpbGFibGUnKSB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIG1iLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWlubmVyXCI+XG4gICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGUgbWItM1wiPnt7IHRyYW5zKCdwcm9kdWN0LnR5cGVzLmRheXMudGl0bGUnKSB9fTwvaDU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3eXNpd3lnIG1iLTNcIiB2LWlmPVwiZGF0ZVN1YnRpdGxlXCIgdi1odG1sPVwiZGF0ZVN1YnRpdGxlXCI+PC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIHYtaWY9XCJzaG93Tm9UaW1lc2xvdHNUb2RheVdhcm5pbmdcIlxuICAgICAgICAgICAgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nIHB5LTIgbWItM1wiXG4gICAgICAgICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgdHJhbnMoJ3Byb2R1Y3QudHlwZXMudGltZXNsb3Qubm9fdGltZXNsb3RzX3RvZGF5JykgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkYXRlcGlja2VyXG4gICAgICAgICAgICBtYXhpbXVtLXZpZXc9XCJkYXlcIlxuICAgICAgICAgICAgOnVzZS11dGM9XCJ0cnVlXCJcbiAgICAgICAgICAgIDpsYW5ndWFnZT1cImxhbmd1YWdlXCJcbiAgICAgICAgICAgIGNhbGVuZGFyLWNsYXNzPVwiZGF0ZXBpY2tlclwiXG4gICAgICAgICAgICBAc2VsZWN0ZWQ9XCJzZWxlY3RfZGF0ZVwiXG4gICAgICAgICAgICA6bW9uZGF5LWZpcnN0PVwidHJ1ZVwiXG4gICAgICAgICAgICA6aW5saW5lPVwidHJ1ZVwiXG4gICAgICAgICAgICA6dmFsdWU9XCJzZWxlY3RlZF9kYXRlXCJcbiAgICAgICAgICAgIDpkaXNhYmxlZC1kYXRlcz1cInsgY3VzdG9tUHJlZGljdG9yOiBmdW5jdGlvbihkYXRlKSB7IHJldHVybiAhYWxsb3dlZChkYXRlKTsgfSB9XCJcbiAgICAgICAgICAgIDpkYXktY2VsbC1jb250ZW50PVwiZGF5ID0+IGNlbGwoZGF5KVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxkaXYgdi1pZj1cInNlbGVjdGVkSG92ZXJUZXh0XCIgY2xhc3M9XCJwbG90LWJhbGxvb24gbXQtM1wiIHJvbGU9XCJzdGF0dXNcIj5cbiAgICAgICAgICA8c3BhbiB2LWZvcj1cIihwYXJ0LCBpbmRleCkgaW4gc2VsZWN0ZWRIb3ZlclRleHRQYXJ0c1wiIDprZXk9XCJpbmRleFwiPlxuICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICB2LWlmPVwicGFydC51cmxcIlxuICAgICAgICAgICAgICAgIDpocmVmPVwidXJsSHJlZihwYXJ0LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgID57eyBwYXJ0LnZhbHVlIH19PC9hPlxuICAgICAgICAgICAgPHRlbXBsYXRlIHYtZWxzZT57eyBwYXJ0LnZhbHVlIH19PC90ZW1wbGF0ZT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQgbWItMlwiIHYtaWY9XCJwcm9kdWN0Lm9wdGlvbnMudGltZXNsb3RzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1pbm5lclwiPlxuICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXRpdGxlIG1iLTNcIj57eyB0cmFucygncHJvZHVjdC50eXBlcy50aW1lc2xvdC5zZWxlY3RfdGltZXNsb3QnKSB9fTwvaDU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3eXNpd3lnIG1iLTNcIiB2LWlmPVwidGltZXNsb3RTdWJ0aXRsZVwiIHYtaHRtbD1cInRpbWVzbG90U3VidGl0bGVcIj48L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtbGlnaHQgYWxlcnQtaWNvblwiIHYtaWY9XCJ0aW1lcy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICA8ZW0gY2xhc3M9XCJpY29uIG5pIG5pLWFsZXJ0LWNpcmNsZVwiPjwvZW0+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYXJhZ3JhcGhcIj57eyB0cmFucygncHJvZHVjdC50eXBlcy50aW1lc2xvdC5zZWxlY3RfZGF0ZScpIH19PC9zcGFuPlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8dWwgaWQ9XCJzbG90c1wiIHYtZWxzZT5cbiAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgdi1mb3I9XCJ0aW1lIGluIHRpbWVzXCJcbiAgICAgICAgICAgICAgOmtleT1cInRpbWUuaWRcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJbcGxvdCA9PT0gdGltZS5pZCA/ICdzZWxlY3RlZCcgOiBmYWxzZSwgcHJvZHVjdC5zZXR0aW5ncy5zaG93X2F2YWlsYWJpbGl0eSAmJiAhdGltZS5jb2xvciA/IGdldFNsb3RBdmFpbGFiaWxpdHkodGltZS5pZCkgOiBmYWxzZV1cIlxuICAgICAgICAgICAgICA6ZGF0YS10b2dnbGU9XCIodGltZS5ob3ZlclRleHQgfHwgcHJvZHVjdC5zZXR0aW5ncy5zaG93X2F2YWlsYWJpbGl0eSA/ICd0b29sdGlwJyA6IGZhbHNlKVwiXG4gICAgICAgICAgICAgIDpkYXRhLXBsYWNlbWVudD1cIih0aW1lLmhvdmVyVGV4dCB8fCBwcm9kdWN0LnNldHRpbmdzLnNob3dfYXZhaWxhYmlsaXR5ID8gJ2JvdHRvbScgOiBmYWxzZSlcIlxuICAgICAgICAgICAgICA6ZGF0YS1wbG90LWlkPVwidGltZS5pZFwiXG4gICAgICAgICAgICAgIDp0aXRsZT1cInNsb3RUb29sdGlwKHRpbWUpXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2VsZWN0X3RpbWUodGltZS5pZClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgdi1pZj1cInRpbWUuYW1vdW50ID4gMFwiIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2tcIj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgIHYtaWY9XCJ0aW1lLmNvbG9yXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGxvdC1jb2xvci1pbmRpY2F0b3JcIlxuICAgICAgICAgICAgICAgICAgOnN0eWxlPVwieyBiYWNrZ3JvdW5kQ29sb3I6IHRpbWUuY29sb3IgfVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpbWVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHRpbWUuc3RhcnQgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwicHJvZHVjdC5zZXR0aW5ncy5zaG93X2VuZF90aW1lXCI+XG4gICAgICAgICAgICAgICAgICAtIHt7IHRpbWUuZW5kIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJpY2UgZnMtMTNweFwiXG4gICAgICAgICAgICAgICAgICB2LWlmPVwidGltZS5sb3dlc3RUb3RhbFByaWNlICE9PSBudWxsICYmIHRpbWUubG93ZXN0VG90YWxQcmljZSAhPT0gMCAmJiAhdW5pZm9ybVRpbWVQcmljZXNcIlxuICAgICAgICAgICAgICA+e3tcbiAgICAgICAgICAgICAgICAgIGN1cnJlbmN5LmZvcm1hdCh0aW1lLmxvd2VzdFRvdGFsUHJpY2UpXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG15LTVcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tbGdcIlxuICAgICAgICAgIDpkaXNhYmxlZD1cIiFjYW5Qcm9jZWVkXCJcbiAgICAgICAgICBAY2xpY2s9XCJoYW5kbGVQcm9jZWVkXCJcbiAgICAgICAgICA6YXJpYS1sYWJlbD1cInRyYW5zKCdwcm9kdWN0Lm9yZGVyLnByb2NlZWQnKVwiXG4gICAgICAgICAgZGF0YS1idXR0b249XCJjb250aW51ZVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRyYW5zKCdwcm9kdWN0Lm9yZGVyLnByb2NlZWQnKSB9fVxuICAgICAgICA8ZW0gY2xhc3M9XCJpY29uIG5pIG5pLWNoZXZyb24tcmlnaHQgcGwtMlwiPjwvZW0+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZGUsIGVuLCBlcywgZnIsIGl0LCBqYSwgbmwgfSBmcm9tICd2dWVqcy1kYXRlcGlja2VyL2Rpc3QvbG9jYWxlJztcbmltcG9ydCBzdG9yZSBmcm9tIFwiLi4vLi4vc3RvcmVcIjtcbmltcG9ydCBwcm9kdWN0IGZyb20gXCIuLi8uLi92aWV3cy9Qcm9kdWN0LnZ1ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG5cbiAgcHJvcHM6IFsncHJvZHVjdCddLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpbWVzOiBbXSxcbiAgICAgIHBsb3Q6IG51bGwsXG4gICAgICByZWFkeTogZmFsc2UsXG4gICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgbGFuZ3VhZ2U6IG51bGwsXG4gICAgICBwcmV2aW91c1Bsb3Q6IG51bGwsXG4gICAgICBzZWxlY3RlZF9kYXRlOiBudWxsLFxuICAgICAgcGxvdHM6IHRoaXMucHJvZHVjdC5wbG90cyxcbiAgICAgIGxhbmd1YWdlczogeydlbic6IGVuLCAnbmwnOiBubCwgJ2VzJzogZXMsICdkZSc6IGRlLCAnZnInOiBmciwgJ2l0JzogaXQsICdqYSc6IGphfSxcbiAgICAgIGRhdGVOb3RGb3VuZDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHNlbGVjdF9kYXRlKGlucHV0LCBmb3JtYXQgPSB0cnVlKSB7XG4gICAgICBsZXQgZGF0ZSA9IChmb3JtYXQgPyB0aGlzLmRhdGUoaW5wdXQsICdZWVlZLU1NLUREJykgOiBpbnB1dCk7XG4gICAgICB0aGlzLmRhdGVOb3RGb3VuZCA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5wcm9kdWN0Lm9wdGlvbnMudGltZXNsb3RzKSB7XG4gICAgICAgIGxldCBwbG90cyA9IF8ucGlja0J5KHRoaXMucGxvdHMsIGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgcmV0dXJuIG8uZGF0ZSA9PT0gZGF0ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudGltZXMgPSBbXTtcbiAgICAgICAgdGhpcy5wbG90ID0gbnVsbDtcbiAgICAgICAgT2JqZWN0LmtleXMocGxvdHMpLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICBsZXQgcGxvdCA9IHBsb3RzW2l0ZW1dO1xuXG4gICAgICAgICAgaWYgKCh0aGlzLnF1YW50aXR5IDw9IHBsb3QuYXZhaWxhYmlsaXR5LmFtb3VudCB8fCB0aGlzLnByb2R1Y3QudHlwZXMuY2FwYWNpdHkgPT09ICdOT05FJykgJiYgIXBsb3QubWF4T3JkZXJzUmVhY2hlZCkge1xuICAgICAgICAgICAgdGhpcy50aW1lcy5wdXNoKHtcbiAgICAgICAgICAgICAgaWQ6IHBsb3QuaWQsXG4gICAgICAgICAgICAgIHN0YXJ0OiBwbG90LnRpbWUuc3RhcnQsXG4gICAgICAgICAgICAgIGVuZDogcGxvdC50aW1lLmVuZCxcbiAgICAgICAgICAgICAgcHJpY2U6IHBsb3QucHJpY2UsXG4gICAgICAgICAgICAgIGxvd2VzdFRvdGFsUHJpY2U6IHBsb3QubG93ZXN0VG90YWxQcmljZSxcbiAgICAgICAgICAgICAgYW1vdW50OiAoXG4gICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3QudHlwZXMuY2FwYWNpdHkgIT09ICdOT05FJ1xuICAgICAgICAgICAgICAgICAgICAgID8gcGxvdC5hdmFpbGFiaWxpdHkuYW1vdW50XG4gICAgICAgICAgICAgICAgICAgICAgOiA5OTlcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgYXVkaWVuY2VQcmljZTogcGxvdC5hdWRpZW5jZVByaWNlc1xuICAgICAgICAgICAgICAsIGNvbG9yOiBwbG90LmNvbG9yXG4gICAgICAgICAgICAgICwgaG92ZXJUZXh0OiBwbG90LmhvdmVyVGV4dFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy50aW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICB0aGlzLnBsb3QgPSB0aGlzLnRpbWVzWzBdLmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgJCgnYm9keScpLnRvb2x0aXAoe1xuICAgICAgICAgIGh0bWw6IHRydWUsXG4gICAgICAgICAgc2VsZWN0b3I6ICdbZGF0YS10b2dnbGU9XCJ0b29sdGlwXCJdJ1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBwbG90ID0gXy5maW5kKHRoaXMucGxvdHMsIGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgcmV0dXJuIG8uZGF0ZSA9PT0gZGF0ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwbG90KSB7XG4gICAgICAgICAgdGhpcy5wbG90ID0gcGxvdC5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnBsb3QgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZGF0ZU5vdEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZVN0b3JlKCk7XG5cbiAgICAgIHRoaXMuJGVtaXQoJ3ByZXZpZXdfZGF0ZScsIGlucHV0KTtcbiAgICB9LFxuXG4gICAgc2VsZWN0X3RpbWUoaW5wdXQpIHtcbiAgICAgIGxldCBwbG90ID0gXy5maW5kKHRoaXMucGxvdHMsIGZ1bmN0aW9uIChvKSB7XG4gICAgICAgIHJldHVybiBvLmlkID09PSBpbnB1dDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wbG90ID0gcGxvdC5pZDtcbiAgICAgIHRoaXMudXBkYXRlU3RvcmUoKTtcbiAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+ICQoJ1tkYXRhLXBsb3QtaWQ9XCInICsgaW5wdXQgKyAnXCJdJykudG9vbHRpcCgnc2hvdycpKTtcbiAgICB9LFxuXG4gICAgYWxsb3dlZChpbnB1dCkge1xuICAgICAgbGV0IGRhdGUgPSB0aGlzLmRhdGUoaW5wdXQsICdZWVlZLU1NLUREJyk7XG4gICAgICBsZXQgYWxsb3dlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5wcm9kdWN0Lm9wdGlvbnMudGltZXNsb3RzKSB7XG4gICAgICAgIGxldCBwbG90cyA9IF8ucGlja0J5KHRoaXMucGxvdHMsIGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgcmV0dXJuIG8uZGF0ZSA9PT0gZGF0ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5rZXlzKHBsb3RzKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgIGxldCBwbG90ID0gcGxvdHNbaXRlbV07XG4gICAgICAgICAgaWYgKHBsb3QgJiYgIWFsbG93ZWQgJiYgKHRoaXMucXVhbnRpdHkgPD0gcGxvdC5hdmFpbGFiaWxpdHkuYW1vdW50IHx8IHRoaXMucHJvZHVjdC50eXBlcy5jYXBhY2l0eSA9PT0gJ05PTkUnKSkge1xuICAgICAgICAgICAgYWxsb3dlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBwbG90ID0gXy5maW5kKHRoaXMucGxvdHMsIGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgcmV0dXJuIG8uZGF0ZSA9PT0gZGF0ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwbG90ICYmICh0aGlzLnF1YW50aXR5IDw9IHBsb3QuYXZhaWxhYmlsaXR5LmFtb3VudCB8fCB0aGlzLnByb2R1Y3QudHlwZXMuY2FwYWNpdHkgPT09ICdOT05FJykpIHtcbiAgICAgICAgICBhbGxvd2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWxsb3dlZDtcbiAgICB9LFxuXG4gICAgY2VsbChpbnB1dCkge1xuICAgICAgY29uc3QgZGF5ID0gaW5wdXQuZGF0ZTtcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmRhdGUobmV3IERhdGUoaW5wdXQudGltZXN0YW1wKSwgJ1lZWVktTU0tREQnKTtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSB0aGlzLnBsb3RzXG4gICAgICAgICAgLmZpbHRlcihwID0+IHAuZGF0ZSA9PT0gZGF0ZSAmJiBwLmxvd2VzdFRvdGFsUHJpY2UgIT0gbnVsbCk7XG4gICAgICBjb25zdCBwbG90ID0gbWF0Y2hlcy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBtYXRjaGVzLnJlZHVjZSgobWluLCBwKSA9PiBwLmxvd2VzdFRvdGFsUHJpY2UgPCBtaW4ubG93ZXN0VG90YWxQcmljZSA/IHAgOiBtaW4pXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgbGV0IHByaWNlID0gbnVsbDtcbiAgICAgIGxldCBpbmRpY2F0b3IgPSAnPHNwYW4+PC9zcGFuPic7XG4gICAgICBjb25zdCBjb2xvcmVkUGxvdCA9IHRoaXMucGxvdHMuZmluZChwID0+IHAuZGF0ZSA9PT0gZGF0ZSAmJiB0aGlzLmlzVmFsaWRDb2xvcihwLmNvbG9yKSk7XG4gICAgICBjb25zdCBjb2xvckRvdCA9IGNvbG9yZWRQbG90XG4gICAgICAgID8gJzxpIGNsYXNzPVwicGxvdC1kYXRlLWNvbG9yXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOicgKyBjb2xvcmVkUGxvdC5jb2xvciArICdcIj48L2k+J1xuICAgICAgICA6ICcnO1xuXG4gICAgICBpZiAocGxvdCAmJiBwbG90Lmxvd2VzdFRvdGFsUHJpY2UgIT09IG51bGwpIHtcbiAgICAgICAgcHJpY2UgPSAnPHNtYWxsIGNsYXNzPVwiZGF5LXByaWNlXCI+JyArIHRoaXMuY3VycmVuY3kuZm9ybWF0KHBsb3QubG93ZXN0VG90YWxQcmljZSkgKyAnPC9zbWFsbD4nO1xuICAgICAgfVxuXG4gICAgICBpZiAocGxvdCAmJiB0aGlzLnByb2R1Y3Quc2V0dGluZ3Muc2hvd19hdmFpbGFiaWxpdHkgJiYgIXRoaXMucHJvZHVjdC5vcHRpb25zLnRpbWVzbG90cyAmJiBwbG90LmF2YWlsYWJpbGl0eS5hbW91bnQgPiAwKSB7XG4gICAgICAgIGlmIChwbG90LmF2YWlsYWJpbGl0eS5wZXJjZW50YWdlID4gMjApIHtcbiAgICAgICAgICBpbmRpY2F0b3IgPSAnPHNwYW4gY2xhc3M9XCJoaWdoXCI+PC9zcGFuPic7XG4gICAgICAgIH0gZWxzZSBpZiAocGxvdC5hdmFpbGFiaWxpdHkucGVyY2VudGFnZSA+IDApIHtcbiAgICAgICAgICBpbmRpY2F0b3IgPSAnPHNwYW4gY2xhc3M9XCJtZWRpdW1cIj48L3NwYW4+JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbmRpY2F0b3IgPSAnPHNwYW4gY2xhc3M9XCJsb3dcIj48L3NwYW4+JztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwicGxvdC1kYXRlLWNvbnRlbnRcIj4nICsgY29sb3JEb3QgKyAnPHNwYW4gY2xhc3M9XCJwbG90LWRhdGUtbGFiZWxcIj4nICsgKHByaWNlID8gZGF5ICsgcHJpY2UgOiBpbmRpY2F0b3IgKyBkYXkpICsgJzwvc3Bhbj48L3NwYW4+JztcbiAgICB9LFxuXG4gICAgdXBkYXRlU3RvcmUoKSB7XG4gICAgICBsZXQgb3JkZXIgPSB0aGlzLiRzdG9yZS5nZXR0ZXJzLlByb2R1Y3RPcmRlcjtcbiAgICAgIG9yZGVyLnByb2R1Y3QucGxvdCA9IHRoaXMucGxvdCA/IHRoaXMucGxvdCA6IG51bGw7XG5cbiAgICAgIGlmICh0aGlzLnBsb3QpIHtcbiAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ3VwZGF0ZVByb2R1Y3RPcmRlcicsIG9yZGVyKTtcbiAgICAgICAgdGhpcy4kZW1pdCgnY2FydF91cGRhdGUnKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgcHJvY2VlZCgpIHtcbiAgICAgIGlmICh0aGlzLnBsb3QpIHtcbiAgICAgICAgJCgnW2RhdGEtcGxvdC1pZD1cIicgKyB0aGlzLnBsb3QgKyAnXCJdJykudG9vbHRpcCgnaGlkZScpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy4kZW1pdCgnc3VibWl0Jyk7XG4gICAgfSxcblxuICAgIGhhbmRsZVByb2NlZWQoZXZlbnQpIHtcblxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmICh0aGlzLmNhblByb2NlZWQpIHRoaXMucHJvY2VlZCgpO1xuICAgIH0sXG4gICAgaXNWYWxpZENvbG9yKGNvbG9yKSB7XG4gICAgICByZXR1cm4gL14jWzAtOWEtZl17Nn0kL2kudGVzdChjb2xvciB8fCAnJyk7XG4gICAgfSxcblxuICAgIGdldFNsb3RBdmFpbGFiaWxpdHkoaWQpIHtcbiAgICAgIGxldCBwZXJjZW50YWdlID0gdGhpcy5wbG90cy5maWx0ZXIoYXJyID0+IGFyclsnaWQnXSA9PT0gaWQpWycwJ11bJ2F2YWlsYWJpbGl0eSddWydwZXJjZW50YWdlJ107XG5cbiAgICAgIGlmIChwZXJjZW50YWdlID09PSAwKSB7XG4gICAgICAgIHJldHVybiAnbG93JztcbiAgICAgIH0gZWxzZSBpZiAocGVyY2VudGFnZSA8IDIwKSB7XG4gICAgICAgIHJldHVybiAnbWVkaXVtJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdoaWdoJztcbiAgICB9LFxuICAgIHNsb3RUb29sdGlwKHRpbWUpIHtcbiAgICAgIGNvbnN0IGF2YWlsYWJpbGl0eSA9IHRoaXMucHJvZHVjdC5zZXR0aW5ncy5zaG93X2F2YWlsYWJpbGl0eVxuICAgICAgICA/IGAke3RpbWUuYW1vdW50fSAke3RoaXMudHJhbnMoJ3Byb2R1Y3QudHlwZXMudGltZXNsb3QuYXZhaWxhYmxlJyl9YFxuICAgICAgICA6ICcnO1xuICAgICAgcmV0dXJuIFt0aGlzLmxpbmtpZnlUZXh0KHRpbWUuaG92ZXJUZXh0KSwgYXZhaWxhYmlsaXR5XS5maWx0ZXIoQm9vbGVhbikuam9pbignIMK3ICcpIHx8IGZhbHNlO1xuICAgIH0sXG4gICAgbGlua2lmeVRleHQodGV4dCkge1xuICAgICAgaWYgKCF0ZXh0KSByZXR1cm4gJyc7XG5cbiAgICAgIGNvbnN0IGVzY2FwZWRUZXh0ID0gU3RyaW5nKHRleHQpXG4gICAgICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpXG4gICAgICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKVxuICAgICAgICAucmVwbGFjZSgvXCIvZywgJyZxdW90OycpXG4gICAgICAgIC5yZXBsYWNlKC8nL2csICcmIzAzOTsnKTtcblxuICAgICAgcmV0dXJuIGVzY2FwZWRUZXh0LnJlcGxhY2UoXG4gICAgICAgIHRoaXMudXJsUGF0dGVybigpLFxuICAgICAgICB1cmwgPT4gYDxhIGhyZWY9XCIke3RoaXMudXJsSHJlZih1cmwpfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj4ke3VybH08L2E+YFxuICAgICAgKTtcbiAgICB9LFxuICAgIGxpbmtpZnlQYXJ0cyh0ZXh0KSB7XG4gICAgICBpZiAoIXRleHQpIHJldHVybiBbXTtcblxuICAgICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICAgIGNvbnN0IHVybFBhdHRlcm4gPSB0aGlzLnVybFBhdHRlcm4oKTtcbiAgICAgIGxldCBtYXRjaDtcbiAgICAgIGxldCBsYXN0SW5kZXggPSAwO1xuXG4gICAgICB3aGlsZSAoKG1hdGNoID0gdXJsUGF0dGVybi5leGVjKHRleHQpKSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAobWF0Y2guaW5kZXggPiBsYXN0SW5kZXgpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKHsgdXJsOiBmYWxzZSwgdmFsdWU6IHRleHQuc2xpY2UobGFzdEluZGV4LCBtYXRjaC5pbmRleCkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJ0cy5wdXNoKHsgdXJsOiB0cnVlLCB2YWx1ZTogbWF0Y2hbMF0gfSk7XG4gICAgICAgIGxhc3RJbmRleCA9IHVybFBhdHRlcm4ubGFzdEluZGV4O1xuICAgICAgfVxuXG4gICAgICBpZiAobGFzdEluZGV4IDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgcGFydHMucHVzaCh7IHVybDogZmFsc2UsIHZhbHVlOiB0ZXh0LnNsaWNlKGxhc3RJbmRleCkgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJ0cztcbiAgICB9LFxuICAgIHVybFBhdHRlcm4oKSB7XG4gICAgICByZXR1cm4gL1xcYig/Omh0dHBzPzpcXC9cXC98d3d3XFwuKVteXFxzPF0rW15cXHM8Liw7OiE/KV18XFxiKD86W2EtejAtOS1dK1xcLikrW2Etel17Mix9KD86XFwvW15cXHM8Liw7OiE/KV0qKT8vZ2k7XG4gICAgfSxcbiAgICB1cmxIcmVmKHVybCkge1xuICAgICAgcmV0dXJuIC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QodXJsKSA/IHVybCA6IGBodHRwczovLyR7dXJsfWA7XG4gICAgfSxcbiAgfSxcblxuICBhc3luYyBjcmVhdGVkKCkge1xuICAgIGF3YWl0IHN0b3JlLmRpc3BhdGNoKCdsb2FkUGxvdHMnKVxuICAgIHRoaXMucGxvdHMgPSB0aGlzLnByb2R1Y3QucGxvdHM7XG4gICAgY29uc3QgcXVlcnlEYXRlID0gdGhpcy5xdWVyeSgnZGF0ZScpO1xuICAgIGNvbnN0IGhhc1ZhbGlkUXVlcnlEYXRlID0gISEocXVlcnlEYXRlICYmIG1vbWVudChxdWVyeURhdGUsICdZWVlZLU1NLUREJywgdHJ1ZSkuaXNWYWxpZCgpKTtcbiAgICBsZXQgcXVlcnlEYXRlQXBwbGllZCA9IGZhbHNlO1xuXG4gICAgbGV0IGxhbmd1YWdlID0gdGhpcy5kZWZpbml0aW9ucy5sYW5ndWFnZTtcbiAgICBzd2l0Y2ggKGxhbmd1YWdlKSB7XG4gICAgICBjYXNlICdlbic6XG4gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBlbjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdubCc6XG4gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBubDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlcyc6XG4gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBlcztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkZSc6XG4gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBkZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmcic6XG4gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBmcjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbGV0IHF1YW50aXR5ID0gdGhpcy5xdWFudGl0eTtcbiAgICBmb3IoY29uc3Qgb3JkZXIgb2YgdGhpcy5wcm9kdWN0Q2FydCl7XG4gICAgICBpZiAob3JkZXIucHJvZHVjdEluZm8ub3B0aW9ucy5hdWRpZW5jZXMpe1xuICAgICAgICBmb3IgKGxldCBhdWRpZW5jZSBvZiBvcmRlci5hdWRpZW5jZXMpe1xuICAgICAgICAgIHF1YW50aXR5ICs9IGF1ZGllbmNlLnF1YW50aXR5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG5cbiAgICBpZiAoIXRoaXMucmVib29raW5nICYmICF0aGlzLm9yZGVyLnByb2R1Y3QucGxvdCAmJiB0aGlzLnByb2R1Y3RDYXJ0Lmxlbmd0aCA+IDAgJiYgdGhpcy5wcm9kdWN0Q2FydFswXT8ucHJvZHVjdC5wbG90KXtcbiAgICAgIGlmICh0aGlzLnByb2R1Y3RDYXJ0WzBdPy5wbG90SW5mby5hdmFpbGFiaWxpdHkuYW1vdW50ID49IHF1YW50aXR5KXtcblxuICAgICAgICB0aGlzLm9yZGVyLnByb2R1Y3QucGxvdCA9IHRoaXMucHJvZHVjdENhcnRbMF0/LnByb2R1Y3QucGxvdFxuICAgICAgfVxuXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm9yZGVyLnByb2R1Y3QucGxvdCAmJiBoYXNWYWxpZFF1ZXJ5RGF0ZSkge1xuICAgICAgY29uc3QgcHJlZmVycmVkRGF0ZSA9IHF1ZXJ5RGF0ZTtcbiAgICAgIGNvbnN0IGRhdGVQbG90cyA9IHRoaXMucGxvdHMuZmlsdGVyKHBsb3QgPT4gcGxvdC5kYXRlID09PSBwcmVmZXJyZWREYXRlKTtcbiAgICAgIGNvbnN0IGhhc1NlbGVjdGFibGVPbkRhdGUgPSBkYXRlUGxvdHMuc29tZShwbG90ID0+XG4gICAgICAgICh0aGlzLnByb2R1Y3QudHlwZXMuY2FwYWNpdHkgPT09ICdOT05FJyB8fCBxdWFudGl0eSA8PSBwbG90LmF2YWlsYWJpbGl0eS5hbW91bnQpXG4gICAgICAgICYmICFwbG90Lm1heE9yZGVyc1JlYWNoZWRcbiAgICAgICk7XG5cbiAgICAgIGlmIChkYXRlUGxvdHMubGVuZ3RoID4gMCAmJiBoYXNTZWxlY3RhYmxlT25EYXRlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRfZGF0ZSA9IHByZWZlcnJlZERhdGU7XG4gICAgICAgIHRoaXMuc2VsZWN0X2RhdGUocHJlZmVycmVkRGF0ZSwgZmFsc2UpO1xuICAgICAgICBxdWVyeURhdGVBcHBsaWVkID0gdHJ1ZTtcblxuICAgICAgICAvLyBLZWVwIHRpbWVzbG90IHVuc2VsZWN0ZWQgd2hlbiBjb21pbmcgZnJvbSBjYWxlbmRhciBkYXRlIHByZWZpbGwuXG4gICAgICAgIGlmICh0aGlzLnByb2R1Y3Qub3B0aW9ucy50aW1lc2xvdHMpIHtcbiAgICAgICAgICB0aGlzLnBsb3QgPSBudWxsO1xuICAgICAgICAgIHRoaXMudXBkYXRlU3RvcmUoKTtcbiAgICAgICAgICB0aGlzLiRlbWl0KCdwcmV2aWV3X3RpbWUnLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5vcmRlci5wcm9kdWN0LnBsb3QgJiYgIXF1ZXJ5RGF0ZUFwcGxpZWQpIHtcbiAgICAgIGNvbnN0IG5leHRQbG90ID0gdGhpcy5wbG90cy5maW5kKHBsb3QgPT4gcGxvdC5zZWxlY3RhYmxlICYmICFwbG90Lm1heE9yZGVyc1JlYWNoZWQgJiYgKHF1YW50aXR5IDw9IHBsb3QuYXZhaWxhYmlsaXR5LmFtb3VudCB8fCB0aGlzLnByb2R1Y3QudHlwZXMuY2FwYWNpdHkgPT09ICdOT05FJykpO1xuXG4gICAgICBpZiAobmV4dFBsb3QgJiYgbmV4dFBsb3QuZGF0ZSAhPT0gbW9tZW50KCkuZm9ybWF0KCdZWVlZLU1NLUREJykpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZF9kYXRlID0gbmV4dFBsb3QuZGF0ZTtcbiAgICAgICAgdGhpcy5zZWxlY3RfZGF0ZShuZXh0UGxvdC5kYXRlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9kdWN0Lm9wdGlvbnMudGltZXNsb3RzKSB7XG4gICAgICB0aGlzLnBsb3RzID0gXy5zb3J0QnkodGhpcy5wbG90cywgZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgcmV0dXJuIG8udGltZS5zdGFydFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3JkZXIucHJvZHVjdC5wbG90KSB7XG4gICAgICB0aGlzLnBsb3QgPSB0aGlzLm9yZGVyLnByb2R1Y3QucGxvdDtcbiAgICAgIGxldCBwbG90ID0gdGhpcy5wcm9kdWN0LnBsb3RzLmZpbmQocGxvdCA9PiBwbG90LmlkID09PSB0aGlzLnBsb3QpXG5cbiAgICAgIGlmICghcGxvdCkge1xuICAgICAgICBwbG90ID0gdGhpcy5wcm9kdWN0LnBsb3RzLmZpbmQocGxvdCA9PiBwbG90LmRhdGUgPT09IHRoaXMucHJvZHVjdENhcnRbMF0/LnBsb3RJbmZvLmRhdGUpXG4gICAgICB9XG5cbiAgICAgIGlmICghcGxvdCkge1xuICAgICAgICB0aGlzLmRhdGVOb3RGb3VuZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBsb3QgPSBwbG90LmlkO1xuICAgICAgICB0aGlzLnNlbGVjdGVkX2RhdGUgPSB0aGlzLnByb2R1Y3QucGxvdHMuZmluZChwbG90ID0+IHBsb3QuaWQgPT09IHRoaXMucGxvdCkuZGF0ZTtcbiAgICAgICAgdGhpcy4kZW1pdCgncHJldmlld19kYXRlJywgdGhpcy5zZWxlY3RlZF9kYXRlKTtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkX2RhdGUgPSBwbG90LmRhdGU7XG4gICAgICAgIHRoaXMuc2VsZWN0X2RhdGUocGxvdC5kYXRlKVxuXG4gICAgICAgIGlmIChwbG90LnRpbWUuc3RhcnQgJiYgcGxvdC50aW1lLmVuZCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0X3RpbWUocGxvdC5pZClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5yZWJvb2tpbmc/LnBsb3QpIHtcbiAgICAgIHRoaXMucGxvdCA9IHRoaXMucmVib29raW5nLnBsb3Q7XG4gICAgfVxuXG4gICAgY29uc3QgYXV0b1NraXBTaW5nbGVUaW1lc2xvdCA9ICF0aGlzLnByb2R1Y3Qub3B0aW9ucy50aW1lc2xvdHNcbiAgICAgIHx8ICF3aW5kb3cuU3RvcmVmcm9udFxuICAgICAgfHwgdHlwZW9mIHdpbmRvdy5TdG9yZWZyb250LmdldCAhPT0gJ2Z1bmN0aW9uJ1xuICAgICAgfHwgd2luZG93LlN0b3JlZnJvbnQuZ2V0KCdBVVRPX1NLSVBfU0lOR0xFX1RJTUVTTE9UJykgIT09IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMucGxvdHMubGVuZ3RoID09PSAxICYmIGF1dG9Ta2lwU2luZ2xlVGltZXNsb3QgJiYgIShoYXNWYWxpZFF1ZXJ5RGF0ZSAmJiB0aGlzLnByb2R1Y3Qub3B0aW9ucy50aW1lc2xvdHMpKSB7XG4gICAgICBjb25zdCBwbG90ID0gdGhpcy5wbG90c1swXTtcbiAgICAgIHRoaXMuc2VsZWN0X2RhdGUocGxvdC5kYXRlLCBmYWxzZSk7XG5cbiAgICAgIGlmICh0aGlzLnByb2R1Y3Qub3B0aW9ucy50aW1lc2xvdHMpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RfdGltZShwbG90LmlkKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLnByb2NlZWQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGRhdGVTdWJ0aXRsZSgpIHtcbiAgICAgIGlmICghdGhpcy5wcm9kdWN0IHx8IHR5cGVvZiB0aGlzLnByb2R1Y3QgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5wcm9kdWN0LnN1YnRpdGxlcz8uZGF0ZVxuICAgICAgICB8fCB0aGlzLnByb2R1Y3Quc3VidGl0bGU/LmRhdGVcbiAgICAgICAgfHwgdGhpcy5wcm9kdWN0LmRhdGVfc3VidGl0bGVcbiAgICAgICAgfHwgbnVsbDtcbiAgICB9LFxuICAgIHRpbWVzbG90U3VidGl0bGUoKSB7XG4gICAgICBpZiAoIXRoaXMucHJvZHVjdCB8fCB0eXBlb2YgdGhpcy5wcm9kdWN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucHJvZHVjdC5zdWJ0aXRsZXM/LnRpbWVzbG90XG4gICAgICAgIHx8IHRoaXMucHJvZHVjdC5zdWJ0aXRsZT8udGltZXNsb3RcbiAgICAgICAgfHwgdGhpcy5wcm9kdWN0LnRpbWVzbG90X3N1YnRpdGxlXG4gICAgICAgIHx8IG51bGw7XG4gICAgfSxcbiAgICB1bmlmb3JtVGltZVByaWNlcygpIHtcbiAgICAgIGlmICh0aGlzLnRpbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBjb25zdCBwcmljZXMgPSB0aGlzLnRpbWVzXG4gICAgICAgICAgLm1hcCh0ID0+IHQubG93ZXN0VG90YWxQcmljZSlcbiAgICAgICAgICAuZmlsdGVyKHAgPT4gcCAhPT0gbnVsbCk7XG5cbiAgICAgIHJldHVybiBwcmljZXMubGVuZ3RoID4gMFxuICAgICAgICAgICYmIHByaWNlcy5ldmVyeShwID0+IHAgPT09IHByaWNlc1swXSk7XG4gICAgfSxcbiAgICBvcmRlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLiRzdG9yZS5nZXR0ZXJzLlByb2R1Y3RPcmRlcjtcbiAgICB9LFxuICAgIHF1YW50aXR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnMuUHJvZHVjdE9yZGVyUXVhbnRpdHk7XG4gICAgfSxcbiAgICByZWJvb2tpbmcoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc3RvcmUuZ2V0dGVycy5SZWJvb2tpbmc7XG4gICAgfSxcbiAgICBwcm9kdWN0Q2FydCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRzdG9yZS5nZXR0ZXJzLlByb2R1Y3RDYXJ0O1xuICAgIH0sXG4gICAgc2hvd05vVGltZXNsb3RzVG9kYXlXYXJuaW5nKCkge1xuICAgICAgaWYgKCF0aGlzLnByb2R1Y3Q/Lm9wdGlvbnM/LnRpbWVzbG90cyB8fCAhQXJyYXkuaXNBcnJheSh0aGlzLnBsb3RzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvZGF5S2V5ID0gdGhpcy5kYXRlKG5ldyBEYXRlKCksICdZWVlZLU1NLUREJyk7XG4gICAgICBjb25zdCB0b2RheXNUaW1lc2xvdHMgPSB0aGlzLnBsb3RzLmZpbHRlcihwbG90ID0+IHBsb3QuZGF0ZSA9PT0gdG9kYXlLZXkgJiYgcGxvdC50aW1lPy5zdGFydCk7XG4gICAgICBjb25zdCBoYXNVbmxpbWl0ZWRDYXBhY2l0eSA9IHRoaXMucHJvZHVjdC50eXBlcz8uY2FwYWNpdHkgPT09ICdOT05FJztcblxuICAgICAgaWYgKHRvZGF5c1RpbWVzbG90cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdG9kYXlzVGltZXNsb3RzLmV2ZXJ5KHBsb3QgPT4ge1xuICAgICAgICBjb25zdCBhdmFpbGFiaWxpdHlBbW91bnQgPSB0eXBlb2YgcGxvdD8uYXZhaWxhYmlsaXR5Py5hbW91bnQgPT09ICdudW1iZXInID8gcGxvdC5hdmFpbGFiaWxpdHkuYW1vdW50IDogMDtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RhYmxlID0gcGxvdC5zZWxlY3RhYmxlICE9PSBmYWxzZTtcbiAgICAgICAgY29uc3QgbWF4T3JkZXJzUmVhY2hlZCA9IHBsb3QubWF4T3JkZXJzUmVhY2hlZCA9PT0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gIWlzU2VsZWN0YWJsZSB8fCBtYXhPcmRlcnNSZWFjaGVkIHx8ICghaGFzVW5saW1pdGVkQ2FwYWNpdHkgJiYgYXZhaWxhYmlsaXR5QW1vdW50IDw9IDApO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBjYW5Qcm9jZWVkKCkge1xuICAgICAgaWYgKCF0aGlzLnJlYWR5IHx8ICF0aGlzLnBsb3QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wcm9kdWN0LnR5cGVzLmNhcGFjaXR5ID09PSAnTk9ORScpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBsb3QgPSB0aGlzLiRzdG9yZS5nZXR0ZXJzLlBsb3RCeUlkKHtcbiAgICAgICAgcHJvZHVjdElkOiB0aGlzLnByb2R1Y3QuaWQsXG4gICAgICAgIHBsb3RJZDogdGhpcy5wbG90LFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcGxvdCB8fCBwbG90Lm1heE9yZGVyc1JlYWNoZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdmFpbGFibGUgPSAocGxvdC5hdmFpbGFiaWxpdHkgJiYgdHlwZW9mIHBsb3QuYXZhaWxhYmlsaXR5LmFtb3VudCA9PT0gJ251bWJlcicpXG4gICAgICAgID8gcGxvdC5hdmFpbGFiaWxpdHkuYW1vdW50XG4gICAgICAgIDogMDtcblxuICAgICAgcmV0dXJuIHRoaXMucXVhbnRpdHkgPD0gYXZhaWxhYmxlO1xuICAgIH0sXG4gICAgc2VsZWN0ZWRIb3ZlclRleHQoKSB7XG4gICAgICBpZiAoIXRoaXMucGxvdCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIHJldHVybiB0aGlzLnBsb3RzLmZpbmQocGxvdCA9PiBwbG90LmlkID09PSB0aGlzLnBsb3QpPy5ob3ZlclRleHQgfHwgbnVsbDtcbiAgICB9LFxuICAgIHNlbGVjdGVkSG92ZXJUZXh0UGFydHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5saW5raWZ5UGFydHModGhpcy5zZWxlY3RlZEhvdmVyVGV4dCk7XG4gICAgfSxcbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHBsb3Q6IHtcbiAgICAgIGhhbmRsZXIodmFsdWUpIHtcbiAgICAgICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLnByb2R1Y3Qub3B0aW9ucy50aW1lc2xvdHMpIHtcbiAgICAgICAgICBsZXQgcGxvdCA9IHRoaXMuJHN0b3JlLmdldHRlcnMuUGxvdEJ5SWQoe3Byb2R1Y3RJZDogdGhpcy5wcm9kdWN0LmlkLCBwbG90SWQ6IHRoaXMucGxvdH0pO1xuXG5cbiAgICAgICAgICBpZiAocGxvdCAhPT0gbnVsbCAmJiBwbG90ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZtLiRTdG9yZWZyb250QVBJLmhhbmRsZSgnUExPVF9VUERBVEVEJywge3Bsb3QsIHByb2R1Y3Q6IHRoaXMucHJvZHVjdC5pZH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5wcmV2aW91c1Bsb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgdm0uJFN0b3JlZnJvbnRBUEkuaGFuZGxlKCdQTE9UX1VQREFURUQnLCB7XG4gICAgICAgICAgICAgIHBsb3Q6IHRoaXMuJHN0b3JlLmdldHRlcnMuUGxvdEJ5SWQoe1xuICAgICAgICAgICAgICAgIHByb2R1Y3RJZDogdGhpcy5wcm9kdWN0LmlkLFxuICAgICAgICAgICAgICAgIHBsb3RJZDogdGhpcy5wbG90XG4gICAgICAgICAgICAgIH0pLCBwcm9kdWN0OiB0aGlzLnByb2R1Y3QuaWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMucmVhZHkgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHRoaXMucHJvZHVjdC5vcHRpb25zLnRpbWVzbG90cykge1xuXG4gICAgICAgICAgICBsZXQgdGltZSA9IHRoaXMuJHN0b3JlLmdldHRlcnMuUGxvdEJ5SWQoe1xuICAgICAgICAgICAgICBwcm9kdWN0SWQ6IHRoaXMucHJvZHVjdC5pZCxcbiAgICAgICAgICAgICAgcGxvdElkOiB0aGlzLnBsb3RcbiAgICAgICAgICAgIH0pPy50aW1lO1xuICAgICAgICAgICAgaWYgKHRpbWUpe1xuICAgICAgICAgICAgICB0aGlzLiRlbWl0KCdwcmV2aWV3X3RpbWUnLCB0aW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy4kZW1pdCgncHJldmlld190aW1lJywgbnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByZXZpb3VzUGxvdCA9IHZhbHVlO1xuICAgICAgfSxcbiAgICAgIGRlZXA6IHRydWVcbiAgICB9LFxuICB9LFxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj5cbi5kYXRlcGlja2VyIC5kYXkgLnBsb3QtZGF0ZS1jb2xvciB7XG4gIGZsZXg6IDAgMCBhdXRvO1xuICB3aWR0aDogMC41cmVtO1xuICBoZWlnaHQ6IDAuNXJlbTtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xufVxuXG4uZGF0ZXBpY2tlciAuZGF5IC5wbG90LWRhdGUtY29udGVudCB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgZ2FwOiAwLjI1cmVtO1xufVxuXG4uZGF0ZXBpY2tlciAuZGF5IC5wbG90LWRhdGUtY29sb3Ige1xuICBtYXJnaW4tdG9wOiAwLjM1cmVtO1xufVxuXG4uZGF0ZXBpY2tlciAuZGF5IC5wbG90LWRhdGUtbGFiZWwge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5kYXRlcGlja2VyIC5kYXkgc21hbGwuZGF5LXByaWNlIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICBmb250LXNpemU6IGNsYW1wKDAuNXJlbSwgMS41dncsIDAuOHJlbSk7XG59XG5cbi5kYXRlcGlja2VyIHtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcbiAgcGFkZGluZzogMDtcbiAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gIGNvbG9yOiB2YXIoLS1wYXJhZ3JhcGgpICFpbXBvcnRhbnQ7XG59XG5cbi5kYXRlcGlja2VyIC5kYXkge1xuICBmb250LXdlaWdodDogNzAwO1xuICBmb250LXNpemU6IDE1cHg7XG4gIGxpbmUtaGVpZ2h0OiAxOHB4ICFpbXBvcnRhbnQ7XG4gIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xuICBwYWRkaW5nOiAxMi41cHggNXB4ICFpbXBvcnRhbnQ7XG59XG5cbi5kYXRlcGlja2VyIHNwYW4uaGlnaCxcbi5kYXRlcGlja2VyIHNwYW4ubWVkaXVtLFxuLmRhdGVwaWNrZXIgc3Bhbi5sb3csXG4jc2xvdHMgbGkuaGlnaDo6YmVmb3JlLFxuI3Nsb3RzIGxpLm1lZGl1bTo6YmVmb3JlIHtcbiAgY29udGVudDogJyc7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICB3aWR0aDogMTBweDtcbiAgaGVpZ2h0OiAxMHB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIG1hcmdpbi1yaWdodDogNXB4O1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5kYXRlcGlja2VyIHNwYW4uaGlnaCB7XG4gIGJhY2tncm91bmQ6IHJnYih2YXIoLS1hdmFpbGFiaWxpdHktaGlnaCkpO1xufVxuXG4uZGF0ZXBpY2tlciBzcGFuLm1lZGl1bSB7XG4gIGJhY2tncm91bmQ6IHJnYih2YXIoLS1hdmFpbGFiaWxpdHktbWVkaXVtKSk7XG59XG5cbi5kYXRlcGlja2VyIHNwYW4ubG93IHtcbiAgYmFja2dyb3VuZDogcmdiKHZhcigtLWF2YWlsYWJpbGl0eS1sb3cpKTtcbn1cblxuLmRhdGVwaWNrZXIgLmRheS5ibGFuazpob3ZlciB7XG4gIGNvbG9yOiAjZGRkO1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi5kYXRlcGlja2VyIC5kYXkuc2VsZWN0ZWQge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1idXR0b24pICFpbXBvcnRhbnQ7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgY29sb3I6ICNmZmY7XG4gIHRyYW5zaXRpb246IDAuM3M7XG59XG5cbi5kYXRlcGlja2VyIC5kYXkudG9kYXkge1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuICBjb2xvcjogdmFyKC0taHlwZXJsaW5rKSAhaW1wb3J0YW50O1xufVxuXG4uZGF0ZXBpY2tlciAuZGF5LnRvZGF5LnNlbGVjdGVkIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tYnV0dG9uKSAhaW1wb3J0YW50O1xuICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50O1xufVxuXG4uZGF0ZXBpY2tlciAuZGF5LmFjdGl2ZSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWJ1dHRvbikgIWltcG9ydGFudDtcbn1cblxuLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuZGlzYWJsZWQsXG4uZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5kaXNhYmxlZDpob3ZlciB7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBjb2xvcjogI2RiZGZlYTtcbiAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG4uZGF0ZXBpY2tlciAuZGF5Om5vdCguZGlzYWJsZWQpOm5vdCguYWN0aXZlKTpub3QoLnNlbGVjdGVkKTpub3QoLmJsYW5rKTpob3ZlciB7XG4gIGJhY2tncm91bmQ6IHJnYmEodmFyKC0tYnV0dG9uLXJnYiksIDAuNikgIWltcG9ydGFudDtcbiAgY29sb3I6IHZhcigtLWh5cGVybGluaykgIWltcG9ydGFudDtcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xuICB0cmFuc2l0aW9uOiAwLjNzO1xufVxuXG4uZGF0ZXBpY2tlciAuZGF5IHNtYWxsIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGZvbnQtc2l6ZTogMTJweDtcbn1cblxuLmRhdGVwaWNrZXIgLmRheS5uZXcsXG4uZGF0ZXBpY2tlciAuZGF5Lm9sZCB7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cblxuYSxcbmE6aG92ZXIge1xuICBjb2xvcjogdmFyKC0taHlwZXJsaW5rKTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuI3Nsb3RzIHtcbiAgbWFyZ2luOiAtMTBweDtcbn1cblxuI3Nsb3RzIGxpIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBiYWNrZ3JvdW5kOiByZ2JhKHZhcigtLWJ1dHRvbi1yZ2IpLCAwLjYpO1xuICBjb2xvcjogdmFyKC0tYnV0dG9uLXRleHQpO1xuICBwYWRkaW5nOiA1cHggMTBweDtcbiAgbWluLXdpZHRoOiAxNTBweDtcbiAgbWFyZ2luOiAxMHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBvcGFjaXR5OiAwLjY7XG59XG5cbiNzbG90cyBsaS5zZWxlY3RlZCB7XG4gIG9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQ6IHJnYih2YXIoLS1idXR0b24tcmdiKSk7XG59XG5cbiNzbG90cyBsaS5oaWdoOjpiZWZvcmUge1xuICBiYWNrZ3JvdW5kOiByZ2IodmFyKC0tYXZhaWxhYmlsaXR5LWhpZ2gpKTtcbn1cblxuI3Nsb3RzIGxpLm1lZGl1bTo6YmVmb3JlIHtcbiAgYmFja2dyb3VuZDogcmdiKHZhcigtLWF2YWlsYWJpbGl0eS1tZWRpdW0pKTtcbn1cblxuI3Nsb3RzIGxpIC50aW1lIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuI3Nsb3RzIGxpIC5kLWlubGluZS1ibG9jayB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMC4zNXJlbTtcbn1cbi5wbG90LWNvbG9yLWluZGljYXRvciB7XG4gIGZsZXg6IDAgMCBhdXRvO1xuICB3aWR0aDogMC42NXJlbTtcbiAgaGVpZ2h0OiAwLjY1cmVtO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi5wbG90LWJhbGxvb24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBwYWRkaW5nOiA4cHggMTJweDtcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXJhZ3JhcGgpO1xuICBjb2xvcjogdmFyKC0tYmFja2dyb3VuZCwgI2ZmZik7XG4gIHdoaXRlLXNwYWNlOiBwcmUtbGluZTtcbn1cblxuLnBsb3QtYmFsbG9vbjo6YmVmb3JlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC02cHg7XG4gIGxlZnQ6IDE4cHg7XG4gIHdpZHRoOiAxMnB4O1xuICBoZWlnaHQ6IDEycHg7XG4gIGNvbnRlbnQ6ICcnO1xuICBiYWNrZ3JvdW5kOiBpbmhlcml0O1xuICB0cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA1NzVweCkge1xuICAjc2xvdHMgbGkge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBhZGRpbmc6IDE1cHggMDtcbiAgICBtYXJnaW46IDE1cHggMTBweDtcbiAgfVxufVxuXG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIG1iLTJcIiB2LWlmPVwiYXZhaWxhYmxlX3N1YnNjcmlwdGlvbnMoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaW5uZXJcIj5cbiAgICAgICAgPGg1IGNsYXNzPVwiY2FyZC10aXRsZVwiPnt7IHRyYW5zKCdwcm9kdWN0LnN0ZXBzLnN1YnNjcmlwdGlvbi50aXRsZScpIH19PC9oNT5cbiAgICAgICAgPGg2IGNsYXNzPVwiY2FyZC1zdWJ0aXRsZSBtYi0yIGZmLWJhc2VcIj57eyB0cmFucygncHJvZHVjdC5zdGVwcy5zdWJzY3JpcHRpb24uc3VidGl0bGUnKSB9fTwvaDY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJweS00IG10LTQgYm9yZGVyLXRvcFwiPlxuICAgICAgICAgIDx1bCBjbGFzcz1cInctMTAwXCI+XG4gICAgICAgICAgICA8bGkgdi1mb3I9XCIoc3Vic2NyaXB0aW9uLCBpbmRleCkgaW4gYXZhaWxhYmxlX3N1YnNjcmlwdGlvbnMoKVwiIDprZXk9XCJzdWJzY3JpcHRpb24uaWRcIiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jb250cm9sIGN1c3RvbS1yYWRpb1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiA6aWQ9XCInc3Vic2NyaXB0aW9uJyArIHN1YnNjcmlwdGlvbi5pZFwiIG5hbWU9XCJzdWJzY3JpcHRpb25cIiA6dmFsdWU9XCJzdWJzY3JpcHRpb24uaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1jb250cm9sLWlucHV0XCIgQGNoYW5nZT1cInN1YnNjcmlwdGlvbl9jbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgOmFyaWEtbGFiZWw9XCJ0cmFucygnaW5kZXguY2F0ZWdvcmllcy5zZWxlY3QnKSArICcgJyArIHN1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb24udGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICA6Y2hlY2tlZD1cImluZGV4ID09IDBcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgOmZvcj1cIidzdWJzY3JpcHRpb24nICsgc3Vic2NyaXB0aW9uLmlkXCIgY2xhc3M9XCJjdXN0b20tY29udHJvbC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAge3sgc3Vic2NyaXB0aW9uLnN1YnNjcmlwdGlvbi50aXRsZSB9fVxuICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiZC1ibG9jayBmcy0xMnB4IGxpc3QtaW5saW5lIG10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpIHYtaWY9XCJzdWJzY3JpcHRpb24uc3Vic2NyaXB0aW9uLnJlZGVtcHRpb25zICE9PSAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IHRyYW5zKCdwcm9kdWN0LnN0ZXBzLnN1YnNjcmlwdGlvbi5hdmFpbGFibGUnKSB9fToge3sgc3Vic2NyaXB0aW9uLmF2YWlsYWJsZV9yZWRlbXB0aW9ucyB9fVxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8bGkgdi1lbHNlPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IHRyYW5zKCdwcm9kdWN0LnN0ZXBzLnN1YnNjcmlwdGlvbi5hdmFpbGFibGUnKSB9fTogJmluZmluO1xuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8bGkgdi1pZj1cInN1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb24uZXhwaXJhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IHRyYW5zKCdwcm9kdWN0LnN0ZXBzLnN1YnNjcmlwdGlvbi5leHBpcmF0aW9uJykgfX06IHt7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlKHN1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb24uZXhwaXJhdGlvbi5kYXRlLCBkZWZpbml0aW9ucy5kYXRlX2Zvcm1hdClcbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tY29udHJvbCBjdXN0b20tcmFkaW9cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgaWQ9XCJzdWJzY3JpcHRpb25fbm9uZVwiIG5hbWU9XCJzdWJzY3JpcHRpb25cIiB2YWx1ZT1cIk5PTkVcIiBjbGFzcz1cImN1c3RvbS1jb250cm9sLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgQGNoYW5nZT1cInN1YnNjcmlwdGlvbl9jbGljaygkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN1YnNjcmlwdGlvbl9ub25lXCIgY2xhc3M9XCJjdXN0b20tY29udHJvbC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJhbnMoJ3Byb2R1Y3Quc3RlcHMuc3Vic2NyaXB0aW9uLm5vX3N1YnNjcmlwdGlvbicpIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQgbWItMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaW5uZXJcIj5cbiAgICAgICAgPGg1IGNsYXNzPVwiY2FyZC10aXRsZVwiPnt7IHRyYW5zKCdwcm9kdWN0LnN0ZXBzLmNoZWNrb3V0LnRpdGxlJykgfX08L2g1PlxuICAgICAgICA8aDYgY2xhc3M9XCJjYXJkLXN1YnRpdGxlIG1iLTIgZmYtYmFzZVwiPnt7IHRyYW5zKCdwcm9kdWN0LnN0ZXBzLmNoZWNrb3V0LnN1YnRpdGxlJykgfX08L2g2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwid3lzaXd5ZyBtYi0yXCIgdi1pZj1cImNoZWNrb3V0U3VidGl0bGVcIiB2LWh0bWw9XCJjaGVja291dFN1YnRpdGxlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtdC00IGJvcmRlci10b3BcIj5cbiAgICAgICAgICA8Zm9ybSB2LWlmPVwiZmllbGRzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiIHYtc2hvdz1cIm9yZ2FuaXNhdGlvbi5hbGxvd19idXNpbmVzc1wiPlxuICAgICAgICAgICAgICA8ZmllbGRzZXQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jb250cm9sIGN1c3RvbS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wtaW5wdXRcIiBpZD1cImN1c3RvbWVyX2NvbXBhbnlcIiB2LW1vZGVsPVwiaXNfY29tcGFueVwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wtbGFiZWxcIiBmb3I9XCJjdXN0b21lcl9jb21wYW55XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHRyYW5zKCdwcm9kdWN0LnN0ZXBzLmNoZWNrb3V0LmNvbXBhbnlfb3B0aW9uJykgfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxjb21wb25lbnQgdi1mb3I9XCIoZmllbGQsIGluZGV4KSBpbiBvcmdhbmlzYXRpb24uZmllbGRzXCIgOmlzPVwiJ2RpdidcIiA6a2V5PVwiYCR7aW5kZXh9LSR7Y3VycmVudExhbmd1YWdlfWBcIj5cbiAgICAgICAgICAgICAgPGRpdiB2LWlmPVwiIShmaWVsZC5vcmRlciAmJiBmaWVsZC5wZXJfdGlja2V0KSAmJiBpc1ZhbGlkRmllbGQoZmllbGQsIGAke3Byb2R1Y3QuaWR9YCkgJiYgc2hvdWxkRGlzcGxheUZpZWxkKGZpZWxkKVwiIGNsYXNzPVwibXQtM1wiPlxuICAgICAgICAgICAgICAgIDxmaWVsZHNldCB2LWlmPVwiZmllbGQudHlwZSA9PT0gJ0NIRUNLQk9YJ1wiIDpkYXRhLWZpZWxkLXR5cGU9XCJmaWVsZC50eXBlLnRvTG93ZXJDYXNlKClcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tY29udHJvbCBjdXN0b20tY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wtaW5wdXRcIiA6bmFtZT1cImBjdXN0b21lclske2luZGV4fV1gXCIgOmlkPVwiYGN1c3RvbWVyLWZpZWxkLSR7aW5kZXh9YFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB2LW1vZGVsPVwiZmllbGRzW2luZGV4XVwiIDpyZXF1aXJlZD1cImZpZWxkLnJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImN1c3RvbS1jb250cm9sLWxhYmVsXCIgOmZvcj1cImBjdXN0b21lci1maWVsZC0ke2luZGV4fWBcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5uYW1lIH19PHNwYW4gdi1pZj1cImZpZWxkLnJlcXVpcmVkXCIgY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgICAgIDxmaWVsZHNldCB2LWVsc2UtaWY9XCJmaWVsZC50eXBlID09PSAnRFJPUERPV04nXCIgOmRhdGEtZmllbGQtdHlwZT1cImZpZWxkLnR5cGUudG9Mb3dlckNhc2UoKVwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicGFyYWdyYXBoXCIgOmZvcj1cImBjdXN0b21lci1maWVsZC0ke2luZGV4fWBcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubmFtZSB9fTxzcGFuIHYtaWY9XCJmaWVsZC5yZXF1aXJlZFwiIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250cm9sLXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiA6bmFtZT1cImBjdXN0b21lclske2luZGV4fV1gXCIgOmlkPVwiYGN1c3RvbWVyLWZpZWxkLSR7aW5kZXh9YFwiIHYtbW9kZWw9XCJmaWVsZHNbaW5kZXhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpyZXF1aXJlZD1cImZpZWxkLnJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIgc2VsZWN0ZWQgZGlzYWJsZWQ+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucygncHJvZHVjdC5zdGVwcy5jaGVja291dC5kcm9wZG93bi5wbGFjZWhvbGRlcicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCIob3B0aW9uLCBvcHRpb25faW5kZXgpIGluIGZpZWxkLm9wdGlvbnNcIiA6a2V5PVwib3B0aW9uX2luZGV4XCIgOnZhbHVlPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRyb3Bkb3duT3B0aW9uTGFiZWwoZmllbGQsIG9wdGlvbiwgb3B0aW9uX2luZGV4KSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICAgICAgICA8ZmllbGRzZXQgdi1lbHNlLWlmPVwiZmllbGQudHlwZSA9PT0gJ1BIT05FJ1wiIDpkYXRhLWZpZWxkLXR5cGU9XCJmaWVsZC50eXBlLnRvTG93ZXJDYXNlKClcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInBhcmFncmFwaFwiIDpmb3I9XCJgY3VzdG9tZXItZmllbGQtJHtpbmRleH1gXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLm5hbWUgfX08c3BhbiB2LWlmPVwiZmllbGQucmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8dnVlLXRlbC1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHYtbW9kZWw9XCJmaWVsZHNbaW5kZXhdXCJcbiAgICAgICAgICAgICAgICAgICAgICA6ZGlzYWJsZWQ9XCJsb2NrZWRfZmllbGRzLmluY2x1ZGVzKGluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgOmlucHV0T3B0aW9ucz1cIntcbiAgICAgICAgICAgICAgICAgICAgICBpZDogYGN1c3RvbWVyLWZpZWxkLSR7aW5kZXh9YCxcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBgY3VzdG9tZXJbJHtpbmRleH1dYCxcbiAgICAgICAgICAgICAgICAgICAgICBzaG93RGlhbENvZGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICcnXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgIDpkZWZhdWx0Q291bnRyeT1cInRlbERlZmF1bHRDb3VudHJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICA6cmVxdWlyZWQ9XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LXNsb3Q6YXJyb3ctaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8L3Z1ZS10ZWwtaW5wdXQ+XG4gICAgICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICAgICAgICA8ZmllbGRzZXQgdi1lbHNlLWlmPVwiZmllbGQudHlwZSA9PT0gJ0NPVU5UUlknXCIgOmRhdGEtZmllbGQtdHlwZT1cImZpZWxkLnR5cGUudG9Mb3dlckNhc2UoKVwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicGFyYWdyYXBoXCIgOmZvcj1cImBjdXN0b21lci1maWVsZC0ke2luZGV4fWBcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubmFtZSB9fTxzcGFuIHYtaWY9XCJmaWVsZC5yZXF1aXJlZFwiIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICA8Q291bnRyeVNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgIHYtbW9kZWw9XCJmaWVsZHNbaW5kZXhdXCJcbiAgICAgICAgICAgICAgICAgICAgICA6ZGlzYWJsZWQ9XCJsb2NrZWRfZmllbGRzLmluY2x1ZGVzKGluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgOnBsYWNlaG9sZGVyPVwidHJhbnMoJ3Byb2R1Y3Quc3RlcHMuY2hlY2tvdXQuZHJvcGRvd24ucGxhY2Vob2xkZXInKVwiXG4gICAgICAgICAgICAgICAgICAgICAgOmlucHV0LWlkPVwiYGN1c3RvbWVyLWZpZWxkLSR7aW5kZXh9YFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgICAgIDxmaWVsZHNldCB2LWVsc2UgOmNsYXNzPVwieydib3JkZXItYm90dG9tIHBiLTQnOiBmaWVsZC50eXBlID09PSAnVkFUX0lEJ31cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA6ZGF0YS1maWVsZC10eXBlPVwiZmllbGQudHlwZS50b0xvd2VyQ2FzZSgpXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJwYXJhZ3JhcGhcIiA6Zm9yPVwiYGN1c3RvbWVyLWZpZWxkLSR7aW5kZXh9YFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5uYW1lIH19PHNwYW4gdi1pZj1cImZpZWxkLnJlcXVpcmVkXCIgY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IDppZD1cImBjdXN0b21lci1maWVsZC0ke2luZGV4fWBcIiA6bmFtZT1cImBjdXN0b21lclske2luZGV4fV1gXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB2LW1vZGVsPVwiZmllbGRzW2luZGV4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlPVwiaW5wdXQoZmllbGQudHlwZSlcIiA6cmVxdWlyZWQ9XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDpwbGFjZWhvbGRlcj1cImZpZWxkLmhlbHBfdGV4dCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgOmRpc2FibGVkPVwibG9ja2VkX2ZpZWxkcy5pbmNsdWRlcyhpbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIEBibHVyPVwibWFya1RvdWNoZWQoYGN1c3RvbWVyWyR7aW5kZXh9XWApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICA6YXJpYS1pbnZhbGlkPVwiaXNJbnZhbGlkKGBjdXN0b21lclske2luZGV4fV1gKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgOmFyaWEtZGVzY3JpYmVkYnk9XCJpc0ludmFsaWQoYGN1c3RvbWVyWyR7aW5kZXh9XWApID8gYGN1c3RvbWVyLWVycm9yLSR7aW5kZXh9YCA6IG51bGxcIi8+XG4gICAgICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICAgICAgICA8cCB2LWlmPVwiZmllbGQuaGVscF90ZXh0XCIgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG10LTFcIj57eyBmaWVsZC5oZWxwX3RleHQgfX08L3A+XG4gICAgICAgICAgICAgICAgPHAgdi1pZj1cImlzSW52YWxpZChgY3VzdG9tZXJbJHtpbmRleH1dYClcIiA6aWQ9XCJgY3VzdG9tZXItZXJyb3ItJHtpbmRleH1gXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlciBtdC0xXCIgcm9sZT1cImFsZXJ0XCI+XG4gICAgICAgICAgICAgICAgICB7eyB2YWxpZGF0aW9uTWVzc2FnZShgY3VzdG9tZXJbJHtpbmRleH1dYCkgfX1cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtZ3JheSBmb250LWl0YWxpY1wiPlxuICAgICAgICAgICAgICA8c3Bhbj4qPC9zcGFuPiA9IHt7IHRyYW5zKCdwcm9kdWN0LnN0ZXBzLmNoZWNrb3V0LnJlcXVpcmVkJykgfX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHYtZm9yPVwiZ3JvdXAgaW4gdGlja2V0RmllbGRHcm91cHNcIiA6a2V5PVwiYHRpY2tldC0ke2dyb3VwLnRpY2tldC5rZXl9YFwiIGNsYXNzPVwiY2FyZCBtYi0yXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1pbm5lciB0aWNrZXQtZmllbGQtZ3JvdXBcIj5cbiAgICAgICAgPGg1IGNsYXNzPVwiY2FyZC10aXRsZSBtYi0yXCI+XG4gICAgICAgICAge3sgZ3JvdXAudGlja2V0LnRpdGxlIH19IOKAlCB7eyB0cmFucygncHJvZHVjdC5zdGVwcy5jaGVja291dC5wYXJ0aWNpcGFudCcpIH19IHt7IGdyb3VwLnRpY2tldC5udW1iZXIgfX08dGVtcGxhdGUgdi1pZj1cImdyb3VwLnRpY2tldC5hdWRpZW5jZV9uYW1lXCI+ICh7eyBncm91cC50aWNrZXQuYXVkaWVuY2VfbmFtZSB9fSk8L3RlbXBsYXRlPlxuICAgICAgICA8L2g1PlxuICAgICAgICA8cCB2LWlmPVwiZ3JvdXAudGlja2V0LnNjaGVkdWxlXCIgY2xhc3M9XCJ0ZXh0LXByaW1hcnkgbWItM1wiPnt7IGdyb3VwLnRpY2tldC5zY2hlZHVsZSB9fTwvcD5cblxuICAgICAgICA8ZGl2IHYtZm9yPVwiZmllbGQgaW4gZ3JvdXAuZmllbGRzXCIgdi1pZj1cInRpY2tldEZpZWxkVmFsdWVzW2ZpZWxkLmlkXVwiXG4gICAgICAgICAgICAgOmtleT1cImAke2ZpZWxkLmlkfS0ke2dyb3VwLnRpY2tldC5rZXl9YFwiIGNsYXNzPVwibXQtM1wiPlxuICAgICAgICAgIDxmaWVsZHNldCB2LWlmPVwiZmllbGQudHlwZSA9PT0gJ0NIRUNLQk9YJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jb250cm9sIGN1c3RvbS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjdXN0b20tY29udHJvbC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICA6aWQ9XCJgdGlja2V0LWZpZWxkLSR7ZmllbGQuaWR9LSR7Z3JvdXAudGlja2V0LmtleX1gXCJcbiAgICAgICAgICAgICAgICAgICAgIHYtbW9kZWw9XCJ0aWNrZXRGaWVsZFZhbHVlc1tmaWVsZC5pZF1bZ3JvdXAudGlja2V0LmtleV1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wtbGFiZWxcIiA6Zm9yPVwiYHRpY2tldC1maWVsZC0ke2ZpZWxkLmlkfS0ke2dyb3VwLnRpY2tldC5rZXl9YFwiPlxuICAgICAgICAgICAgICAgIHt7IGZpZWxkLm5hbWUgfX08c3BhbiB2LWlmPVwiZmllbGQucmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgPGZpZWxkc2V0IHYtZWxzZS1pZj1cImZpZWxkLnR5cGUgPT09ICdEUk9QRE9XTidcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInBhcmFncmFwaFwiIDpmb3I9XCJgdGlja2V0LWZpZWxkLSR7ZmllbGQuaWR9LSR7Z3JvdXAudGlja2V0LmtleX1gXCI+XG4gICAgICAgICAgICAgIHt7IGZpZWxkLm5hbWUgfX08c3BhbiB2LWlmPVwiZmllbGQucmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgOmlkPVwiYHRpY2tldC1maWVsZC0ke2ZpZWxkLmlkfS0ke2dyb3VwLnRpY2tldC5rZXl9YFwiXG4gICAgICAgICAgICAgICAgICAgIHYtbW9kZWw9XCJ0aWNrZXRGaWVsZFZhbHVlc1tmaWVsZC5pZF1bZ3JvdXAudGlja2V0LmtleV1cIiA6cmVxdWlyZWQ9XCJmaWVsZC5yZXF1aXJlZFwiPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIgZGlzYWJsZWQ+e3sgdHJhbnMoJ3Byb2R1Y3Quc3RlcHMuY2hlY2tvdXQuZHJvcGRvd24ucGxhY2Vob2xkZXInKSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwiKG9wdGlvbiwgb3B0aW9uSW5kZXgpIGluIGZpZWxkLm9wdGlvbnNcIiA6a2V5PVwib3B0aW9uSW5kZXhcIiA6dmFsdWU9XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICB7eyBkcm9wZG93bk9wdGlvbkxhYmVsKGZpZWxkLCBvcHRpb24sIG9wdGlvbkluZGV4KSB9fVxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgPGZpZWxkc2V0IHYtZWxzZT5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInBhcmFncmFwaFwiIDpmb3I9XCJgdGlja2V0LWZpZWxkLSR7ZmllbGQuaWR9LSR7Z3JvdXAudGlja2V0LmtleX1gXCI+XG4gICAgICAgICAgICAgIHt7IGZpZWxkLm5hbWUgfX08c3BhbiB2LWlmPVwiZmllbGQucmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiA6aWQ9XCJgdGlja2V0LWZpZWxkLSR7ZmllbGQuaWR9LSR7Z3JvdXAudGlja2V0LmtleX1gXCJcbiAgICAgICAgICAgICAgICAgICA6dHlwZT1cImlucHV0KGZpZWxkLnR5cGUpXCIgOnJlcXVpcmVkPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgIDpwbGFjZWhvbGRlcj1cImZpZWxkLmhlbHBfdGV4dCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgdi1tb2RlbD1cInRpY2tldEZpZWxkVmFsdWVzW2ZpZWxkLmlkXVtncm91cC50aWNrZXQua2V5XVwiPlxuICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgPHAgdi1pZj1cImZpZWxkLmhlbHBfdGV4dFwiIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtdC0xXCI+e3sgZmllbGQuaGVscF90ZXh0IH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5cbmltcG9ydCB7Y2hlY2tvdXREZWZhdWx0VmFsdWUsIGZpZWxkQXBwbGllc1RvLCBpc0NoZWNrb3V0VmlzaWJsZX0gZnJvbSAnLi4vLi4vdXRpbHMvZm9ybUZpZWxkcyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcblxuICBwcm9wczogWydwcm9kdWN0J10sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VzdG9tZXI6IHtcbiAgICAgICAgY29tcGFueTogJycsXG4gICAgICAgIGZpcnN0X25hbWU6ICcnLFxuICAgICAgICBsYXN0X25hbWU6ICcnLFxuICAgICAgICBlbWFpbDogJycsXG4gICAgICAgIGFkZHJlc3M6ICcnLFxuICAgICAgICB6aXBjb2RlOiAnJyxcbiAgICAgICAgY2l0eTogJycsXG4gICAgICAgIHZhdF9pZDogJydcbiAgICAgIH0sXG4gICAgICBmaWVsZHM6IG51bGwsXG4gICAgICBsb2NrZWRfZmllbGRzOiBbXSxcbiAgICAgIGlzX2NvbXBhbnk6IGZhbHNlLFxuICAgICAgb3JkZXJGaWVsZHM6IHt9LFxuICAgICAgdGlja2V0RmllbGRWYWx1ZXM6IHt9LFxuICAgICAgaW52YWxpZEZpZWxkczoge30sXG4gICAgICB0b3VjaGVkRmllbGRzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG1hcmtUb3VjaGVkKG5hbWUpIHtcbiAgICAgIHRoaXMuJHNldCh0aGlzLnRvdWNoZWRGaWVsZHMsIG5hbWUsIHRydWUpO1xuICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgIH0sXG4gICAgdXBkYXRlQ2hlY2tvdXRSZWFkaW5lc3ModmFsaWQpIHtcbiAgICAgIGlmICh2YWxpZCkge1xuICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnYWRkT3JVcGRhdGVPcmRlckZpZWxkJywge1xuICAgICAgICAgIGtleTogJ2N1c3RvbWVyJyxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5jdXN0b21lcixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCd1cGRhdGVPcmRlckZpZWxkcycsIHRoaXMub3JkZXJGaWVsZHMgfHwge30pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLiRlbWl0KCh2YWxpZCA/ICdjdXN0b21lcl9yZWFkeScgOiAnY3VzdG9tZXJfY2FuY2VsJykpO1xuICAgIH0sXG4gICAgdmFsaWRhdGUoKSB7XG4gICAgICBsZXQgdmFsaWRhdG9ycyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGVzOiBbJ1RFWFQnLCAnRklSU1RfTkFNRScsICdMQVNUX05BTUUnLCAnQ09NUEFOWScsICdBRERSRVNTJywgJ1ZBVF9JRCcsICdaSVBDT0RFJywgJ0NJVFknLCAnQ09VTlRSWSddLFxuICAgICAgICAgIHJlZ2V4OiBuZXcgUmVnRXhwKC9eLnsxLDY1NTM1fSQvLCAnaScpXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlczogWydFTUFJTCcsICdFTUFJTF9DT05GSVJNJ10sXG4gICAgICAgICAgcmVnZXg6IG5ldyBSZWdFeHAoL14oKFtePD4oKVtcXF1cXFxcLiw7Olxcc0BcIl0rKFxcLltePD4oKVtcXF1cXFxcLiw7Olxcc0BcIl0rKSopfChcIi4rXCIpKUAoKFxcW1swLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXF0pfCgoW2EtekEtWlxcLTAtOV0rXFwuKStbYS16QS1aXXsyLH0pKSQvLCAnaScpXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlczogWydOVU1CRVInXSxcbiAgICAgICAgICByZWdleDogbmV3IFJlZ0V4cCgvXlswLTldezEsNTB9KFssLl1bMC05XXsxLDJ9KT8kLywgJ2knKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZXM6IFsnUEhPTkUnXSxcbiAgICAgICAgICByZWdleDogbmV3IFJlZ0V4cCgvXig/PSg/OlxcRCpcXGQpezEwLDE1fVxcRCokKVxcKz9bMC05XXsxLDN9W1xccy1dPyg/OlxcKDA/WzAtOV17MSw1fVxcKXxbMC05XXsxLDV9KVstXFxzXT9bMC05XVtcXGRcXHMtXXs1LDd9XFxzPyg/OnhbXFxkLV17MCw0fSk/JC8pXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlczogWydEQVRFJ10sXG4gICAgICAgICAgcmVnZXg6IG5ldyBSZWdFeHAoL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLCAnaScpXG4gICAgICAgIH1cbiAgICAgIF07XG5cbiAgICAgIGxldCBlbWFpbHMgPSBbXTtcbiAgICAgIGxldCBvcmRlckZpZWxkcyA9IHt9O1xuXG4gICAgICBmb3IgKGNvbnN0IFtpZCwgZmllbGRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMub3JnYW5pc2F0aW9uLmZpZWxkcykpIHtcblxuICAgICAgICBpZiAoKGZpZWxkLm9yZGVyICYmIGZpZWxkLnBlcl90aWNrZXQpIHx8ICF0aGlzLmlzVmFsaWRGaWVsZChmaWVsZCwgYCR7dGhpcy5wcm9kdWN0LmlkfWApIHx8ICF0aGlzLnNob3VsZERpc3BsYXlGaWVsZChmaWVsZCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuZmllbGRzW2lkXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAvLyBub3JtYWxpemUgZW1wdHkgb3B0aW9uYWwgZmllbGRzIHRvIGVtcHR5IHN0cmluZ3NcbiAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdQSE9ORScgJiYgIWZpZWxkLnJlcXVpcmVkICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjb25zdCBkaWdpdHMgPSB2YWx1ZS5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgICAgICAgIGlmIChkaWdpdHMubGVuZ3RoIDw9IDQpIHtcbiAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cblxuICAgICAgICB0aGlzLnNldFZhbGlkKCdjdXN0b21lclsnICsgaWQgKyAnXScpO1xuXG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnQ0hFQ0tCT1gnKSB7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Tm90VmFsaWQoJ2N1c3RvbWVyWycgKyBpZCArICddJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZpZWxkLnJlcXVpcmVkICYmIHZhbHVlICE9PSB0cnVlICYmIHRoaXMuaXNWYWxpZEZpZWxkKGZpZWxkLCBgJHt0aGlzLnByb2R1Y3QuaWR9YCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Tm90VmFsaWQoJ2N1c3RvbWVyWycgKyBpZCArICddJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ0RST1BET1dOJykge1xuXG4gICAgICAgICAgaWYgKGZpZWxkLnJlcXVpcmVkICYmIHZhbHVlLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmlzVmFsaWRGaWVsZChmaWVsZCwgYCR7dGhpcy5wcm9kdWN0LmlkfWApKSB7XG4gICAgICAgICAgICB0aGlzLnNldE5vdFZhbGlkKCdjdXN0b21lclsnICsgaWQgKyAnXScpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgICAgIGlmICghZmllbGQub3B0aW9ucy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXROb3RWYWxpZCgnY3VzdG9tZXJbJyArIGlkICsgJ10nKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkRGlzcGxheUZpZWxkKGZpZWxkKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHZhbGlkYXRvciA9IF8uZmluZCh2YWxpZGF0b3JzLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGUudHlwZXMuaW5jbHVkZXMoZmllbGQudHlwZSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5zZXROb3RWYWxpZCgnY3VzdG9tZXJbJyArIGlkICsgJ10nKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZmllbGQucmVxdWlyZWQgJiYgdmFsdWUubGVuZ3RoID09PSAwICYmIHRoaXMuaXNWYWxpZEZpZWxkKGZpZWxkLCBgJHt0aGlzLnByb2R1Y3QuaWR9YCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Tm90VmFsaWQoJ2N1c3RvbWVyWycgKyBpZCArICddJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcblxuICAgICAgICAgICAgaWYgKHZhbGlkYXRvci5yZWdleC50ZXN0KHZhbHVlKSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICB0aGlzLnNldE5vdFZhbGlkKCdjdXN0b21lclsnICsgaWQgKyAnXScpO1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnRU1BSUxfQ09ORklSTScpIHtcbiAgICAgICAgICAgICAgZW1haWxzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGQuZGVmYXVsdCkge1xuXG4gICAgICAgICAgdGhpcy5jdXN0b21lcltmaWVsZC50eXBlLnRvTG93ZXJDYXNlKCldID0gdmFsdWU7XG5cbiAgICAgICAgICBjb25zdCBzaG91bGRQZXJzaXN0RGVmYXVsdEZpZWxkID0gWydDT01QQU5ZJywgJ0FERFJFU1MnLCAnWklQQ09ERScsICdDSVRZJywgJ1ZBVF9JRCddLmluY2x1ZGVzKGZpZWxkLnR5cGUpO1xuXG4gICAgICAgICAgaWYgKHNob3VsZFBlcnNpc3REZWZhdWx0RmllbGQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jdXN0b21lci5oYXNPd25Qcm9wZXJ0eSgnZmllbGRzJykpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21lci5maWVsZHMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VzdG9tZXIuZmllbGRzW2lkXSA9IHZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY3VzdG9tZXIuZmllbGRzW2lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ0VNQUlMJykge1xuICAgICAgICAgICAgZW1haWxzLnB1c2godmFsdWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgaWYgKGZpZWxkLm9yZGVyKSB7XG4gICAgICAgICAgICBpZiAoZmllbGQudHlwZSAhPT0gJ0NIRUNLQk9YJykge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBvcmRlckZpZWxkc1tpZF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgb3JkZXJGaWVsZHNbaWRdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvcmRlckZpZWxkc1tpZF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmN1c3RvbWVyLmhhc093blByb3BlcnR5KCdmaWVsZHMnKSkge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbWVyLmZpZWxkcyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmllbGQudHlwZSAhPT0gJ0NIRUNLQk9YJykge1xuICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXN0b21lci5maWVsZHNbaWRdID0gdmFsdWU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY3VzdG9tZXIuZmllbGRzW2lkXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21lci5maWVsZHNbaWRdID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgfVxuXG4gICAgICB0aGlzLm9yZGVyRmllbGRzID0gb3JkZXJGaWVsZHM7XG5cbiAgICAgIGlmIChlbWFpbHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBmaXJzdCA9IGVtYWlsc1swXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIWVtYWlscy5ldmVyeSgoY3VyKSA9PiBjdXIudG9Mb3dlckNhc2UoKSA9PT0gZmlyc3QpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy52YWxpZGF0ZVRpY2tldEZpZWxkcygpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBpbnB1dCh0eXBlKSB7XG4gICAgICBsZXQgdHlwZXMgPSB7XG4gICAgICAgICdGSVJTVF9OQU1FJzogJ3RleHQnLFxuICAgICAgICAnTEFTVF9OQU1FJzogJ3RleHQnLFxuICAgICAgICAnVEVYVCc6ICd0ZXh0JyxcbiAgICAgICAgJ0VNQUlMJzogJ2VtYWlsJyxcbiAgICAgICAgJ0VNQUlMX0NPTkZJUk0nOiAnZW1haWwnLFxuICAgICAgICAnTlVNQkVSJzogJ251bWJlcicsXG4gICAgICAgICdQSE9ORSc6ICd0ZWwnLFxuICAgICAgICAnREFURSc6ICdkYXRlJyxcbiAgICAgICAgJ1pJUENPREUnOiAndGV4dCcsXG4gICAgICAgICdDT01QQU5ZJzogJ3RleHQnLFxuICAgICAgICAnQUREUkVTUyc6ICd0ZXh0JyxcbiAgICAgICAgJ1ZBVF9JRCc6ICd0ZXh0JyxcbiAgICAgICAgJ0NJVFknOiAndGV4dCcsXG4gICAgICAgICdDT1VOVFJZJzogJ3RleHQnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHR5cGVzW3R5cGVdO1xuICAgIH0sXG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHRoaXMuY3VzdG9tZXJba2V5XSA9IHZhbHVlO1xuICAgIH0sXG4gICAgZHJvcGRvd25PcHRpb25MYWJlbChmaWVsZCwgb3B0aW9uLCBpbmRleCkge1xuICAgICAgcmV0dXJuIGZpZWxkLm9wdGlvbl9sYWJlbHM/LltpbmRleF0gfHwgb3B0aW9uO1xuICAgIH0sXG4gICAgc3Vic2NyaXB0aW9uX2NsaWNrKGV2ZW50KSB7XG4gICAgICB0aGlzLnJlZGVlbV9zdWJzY3JpcHRpb24oZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9LFxuICAgIHJlZGVlbV9zdWJzY3JpcHRpb24odmFsdWUpIHtcbiAgICAgIGxldCBvcmRlciA9IHRoaXMuJHN0b3JlLmdldHRlcnMuUHJvZHVjdE9yZGVyO1xuXG4gICAgICBpZiAodmFsdWUgIT09ICdOT05FJykge1xuICAgICAgICBsZXQgc3Vic2NyaXB0aW9uX2lkID0gcGFyc2VJbnQodmFsdWUpO1xuICAgICAgICBsZXQgc3Vic2NyaXB0aW9uID0gXy5maW5kKHRoaXMuY2xpZW50LnN1YnNjcmlwdGlvbnMsIGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgcmV0dXJuIG8uaWQgPT09IHN1YnNjcmlwdGlvbl9pZDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBzdWJzY3JpcHRpb24gPT0gJ29iamVjdCcgJiYgc3Vic2NyaXB0aW9uICE9IG51bGwpIHtcbiAgICAgICAgICB2bS4kU3RvcmVmcm9udEFQSS5oYW5kbGUoJ1NVQlNDUklQVElPTl9BUFBMSUVEJywge3N1YnNjcmlwdGlvbjogc3Vic2NyaXB0aW9uLCBwcm9kdWN0OiB0aGlzLnByb2R1Y3QuaWR9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9yZGVyLnN1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbi50b2tlbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBvcmRlci5zdWJzY3JpcHRpb247XG4gICAgICB9XG4gICAgICBjb25zdCBmcmVzaE9yZGVyID0gey4uLm9yZGVyfVxuXG4gICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgndXBkYXRlUHJvZHVjdE9yZGVyJywgZnJlc2hPcmRlcilcbiAgICAgIHRoaXMuJGVtaXQoJ2NhcnRfdXBkYXRlJyk7XG4gICAgfSxcbiAgICBjb3VudHJ5TmFtZVRyYW5zbGF0aW9uKCkge1xuICAgICAgLy8gMSkgV2VnbG90IGxhbmd1YWdlIChydW50aW1lIHN0b3JlZnJvbnQgbGFuZ3VhZ2UpXG4gICAgICBpZiAodHlwZW9mIFdlZ2xvdCAhPT0gJ3VuZGVmaW5lZCcgJiYgV2VnbG90LmdldEN1cnJlbnRMYW5nKSB7XG4gICAgICAgIGNvbnN0IHdlZ2xvdExhbmcgPSBXZWdsb3QuZ2V0Q3VycmVudExhbmcoKTtcbiAgICAgICAgaWYgKHdlZ2xvdExhbmcpIHtcbiAgICAgICAgICByZXR1cm4gd2VnbG90TGFuZy50b1N0cmluZygpLnNwbGl0KCctJylbMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAyKSBWdWV4IEdsb2JhbHMgbGFuZ3VhZ2UgKHNldCBpbiBpbml0U3RvcmUpXG4gICAgICBjb25zdCBnbG9iYWxzTGFuZyA9IHRoaXMuJHN0b3JlLnN0YXRlLkdsb2JhbHMgJiYgdGhpcy4kc3RvcmUuc3RhdGUuR2xvYmFscy5sYW5ndWFnZTtcbiAgICAgIGlmIChnbG9iYWxzTGFuZykge1xuICAgICAgICByZXR1cm4gZ2xvYmFsc0xhbmcudG9TdHJpbmcoKS5zcGxpdCgnLScpWzBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDMpIEJhY2tlbmQgZGVmaW5pdGlvbnMgbGFuZ3VhZ2UgKG9yZ2FuaXNhdGlvbiBkZWZhdWx0KVxuICAgICAgaWYgKHR5cGVvZiBkZWZpbml0aW9ucyAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVmaW5pdGlvbnMubGFuZ3VhZ2UpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb25zLmxhbmd1YWdlLnRvU3RyaW5nKCkuc3BsaXQoJy0nKVswXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJyc7XG4gICAgfSxcbiAgICBhdmFpbGFibGVfc3Vic2NyaXB0aW9ucygpIHtcbiAgICAgIGxldCBvcmRlciA9IHRoaXMuJHN0b3JlLmdldHRlcnMuUHJvZHVjdE9yZGVyO1xuICAgICAgbGV0IHF1YW50aXR5ID0gdGhpcy4kc3RvcmUuZ2V0dGVycy5wcm9kdWN0Q2FydFF1YW50aXR5O1xuXG4gICAgICBpZiAodGhpcy5jbGllbnQpIHtcbiAgICAgICAgbGV0IHN1YnNjcmlwdGlvbnMgPSBbXTtcblxuICAgICAgICB0aGlzLmNsaWVudC5zdWJzY3JpcHRpb25zLmZvckVhY2goZW50cnkgPT4ge1xuICAgICAgICAgIGlmICgoZW50cnkuc3Vic2NyaXB0aW9uLnByb2R1Y3RzLmluY2x1ZGVzKHRoaXMucHJvZHVjdC5pZCkpICYmIChxdWFudGl0eSA8PSBlbnRyeS5hdmFpbGFibGVfcmVkZW1wdGlvbnMgfHwgZW50cnkuc3Vic2NyaXB0aW9uLnJlZGVtcHRpb25zID09PSAtMSkgJiYgISgoZW50cnkuc3Vic2NyaXB0aW9uLnJlZGVtcHRpb25zID09PSAtMSkgJiYgKHF1YW50aXR5ID4gMSkpICYmIGVudHJ5LnRva2VuICE9PSBudWxsICYmIGVudHJ5LnR5cGUgPT09ICdPTkxJTkUnKSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiBzdWJzY3JpcHRpb25zO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBzaG91bGREaXNwbGF5RmllbGQoZmllbGQpIHtcbiAgICAgIGlmICghaXNDaGVja291dFZpc2libGUoZmllbGQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5vcmdhbmlzYXRpb24gfHwgIXRoaXMub3JnYW5pc2F0aW9uLmFsbG93X2J1c2luZXNzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmllbGQuYnVzaW5lc3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNfY29tcGFueTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNfY29tcGFueSAmJiB0aGlzLmJ1c2luZXNzRmllbGRUeXBlcy5pbmNsdWRlcyhmaWVsZC50eXBlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaXNCdXNpbmVzc1JlbGF0ZWQoZmllbGQpIHtcbiAgICAgIGlmICghdGhpcy5vcmdhbmlzYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmllbGQuYnVzaW5lc3MpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmJ1c2luZXNzRmllbGRUeXBlcy5pbmNsdWRlcyhmaWVsZC50eXBlKTtcbiAgICB9LFxuICAgIHNldE5vdFZhbGlkKG5hbWUpIHtcbiAgICAgIGlmICghdGhpcy50b3VjaGVkRmllbGRzW25hbWVdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuJHNldCh0aGlzLmludmFsaWRGaWVsZHMsIG5hbWUsIHRydWUpO1xuICAgICAgY29uc3QgY29udHJvbCA9ICQoJ1tuYW1lPVwiJyArIG5hbWUgKyAnXCJdJyk7XG4gICAgICBjb250cm9sLmFkZENsYXNzKCdib3JkZXItZGFuZ2VyJykuYXR0cignYXJpYS1pbnZhbGlkJywgJ3RydWUnKTtcbiAgICAgIGNvbnN0IGNvbnRyb2xJZCA9IGNvbnRyb2wuYXR0cignaWQnKTtcbiAgICAgIGlmIChjb250cm9sSWQpIHtcbiAgICAgICAgY29uc3QgZXJyb3JJZCA9IGNvbnRyb2xJZC5yZXBsYWNlKCdjdXN0b21lci1maWVsZC0nLCAnY3VzdG9tZXItZXJyb3ItJyk7XG4gICAgICAgIGNvbnRyb2wuYXR0cignYXJpYS1kZXNjcmliZWRieScsIGVycm9ySWQpO1xuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbGl2ZUNvbnRyb2wgPSAkKCcjJyArIGNvbnRyb2xJZCk7XG4gICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gdGhpcy52YWxpZGF0aW9uTWVzc2FnZShuYW1lKTtcbiAgICAgICAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVycm9ySWQpKSB7XG4gICAgICAgICAgICAkKCc8cD4nLCB7IGlkOiBlcnJvcklkLCBjbGFzczogJ3RleHQtZGFuZ2VyIG10LTEnLCByb2xlOiAnYWxlcnQnIH0pXG4gICAgICAgICAgICAgIC50ZXh0KGVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgICAgLmluc2VydEFmdGVyKGxpdmVDb250cm9sLmNsb3Nlc3QoJ2ZpZWxkc2V0JykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZXRWYWxpZChuYW1lKSB7XG4gICAgICB0aGlzLiRzZXQodGhpcy5pbnZhbGlkRmllbGRzLCBuYW1lLCBmYWxzZSk7XG4gICAgICBjb25zdCBjb250cm9sID0gJCgnW25hbWU9XCInICsgbmFtZSArICdcIl0nKTtcbiAgICAgIGNvbnRyb2wucmVtb3ZlQ2xhc3MoJ2JvcmRlci1kYW5nZXInKS5hdHRyKCdhcmlhLWludmFsaWQnLCAnZmFsc2UnKTtcbiAgICAgIGNvbnN0IGNvbnRyb2xJZCA9IGNvbnRyb2wuYXR0cignaWQnKTtcbiAgICAgIGlmIChjb250cm9sSWQpIHtcbiAgICAgICAgJCgnIycgKyBjb250cm9sSWQucmVwbGFjZSgnY3VzdG9tZXItZmllbGQtJywgJ2N1c3RvbWVyLWVycm9yLScpKS5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGlzSW52YWxpZChuYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkRmllbGRzW25hbWVdID09PSB0cnVlO1xuICAgIH0sXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2UobmFtZSkge1xuICAgICAgY29uc3QgaWQgPSBuYW1lLnJlcGxhY2UoL15jdXN0b21lclxcWy8sICcnKS5yZXBsYWNlKC9cXF0kLywgJycpO1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLm9yZ2FuaXNhdGlvbiAmJiB0aGlzLm9yZ2FuaXNhdGlvbi5maWVsZHMgPyB0aGlzLm9yZ2FuaXNhdGlvbi5maWVsZHNbaWRdIDogbnVsbDtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maWVsZHMgJiYgdHlwZW9mIHRoaXMuZmllbGRzW2lkXSAhPT0gJ3VuZGVmaW5lZCcgPyB0aGlzLmZpZWxkc1tpZF0gOiAnJztcbiAgICAgIGxldCBrZXkgPSAnYWNjZXNzaWJpbGl0eS5pbnZhbGlkX3ZhbHVlJztcbiAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5yZXF1aXJlZCAmJiAoIXZhbHVlIHx8ICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKSA9PT0gJycpKSkge1xuICAgICAgICBrZXkgPSAnYWNjZXNzaWJpbGl0eS5yZXF1aXJlZF9maWVsZCc7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkKSB7XG4gICAgICAgIGtleSA9IHtcbiAgICAgICAgICBFTUFJTDogJ2FjY2Vzc2liaWxpdHkuaW52YWxpZF9lbWFpbCcsIEVNQUlMX0NPTkZJUk06ICdhY2Nlc3NpYmlsaXR5LmludmFsaWRfZW1haWwnLFxuICAgICAgICAgIFBIT05FOiAnYWNjZXNzaWJpbGl0eS5pbnZhbGlkX3Bob25lJywgTlVNQkVSOiAnYWNjZXNzaWJpbGl0eS5pbnZhbGlkX251bWJlcicsXG4gICAgICAgICAgREFURTogJ2FjY2Vzc2liaWxpdHkuaW52YWxpZF9kYXRlJywgRFJPUERPV046ICdhY2Nlc3NpYmlsaXR5LmludmFsaWRfc2VsZWN0aW9uJyxcbiAgICAgICAgICBDSEVDS0JPWDogJ2FjY2Vzc2liaWxpdHkuaW52YWxpZF9zZWxlY3Rpb24nXG4gICAgICAgIH1bZmllbGQudHlwZV0gfHwga2V5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudHJhbnMoa2V5KTtcbiAgICB9LFxuICAgIGFwcGxpY2FibGVUaWNrZXRzKGZpZWxkKSB7XG4gICAgICByZXR1cm4gdGhpcy50aWNrZXREZXNjcmlwdG9ycy5maWx0ZXIodGlja2V0ID0+IGZpZWxkQXBwbGllc1RvKGZpZWxkLCAncHJvZHVjdCcsIHRpY2tldC5wcm9kdWN0X2lkKSk7XG4gICAgfSxcbiAgICB0aWNrZXRTY2hlZHVsZShwbG90LCBwcm9kdWN0KSB7XG4gICAgICBpZiAoIXBsb3QpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgICAgaWYgKHBsb3QuZGF0ZSkge1xuICAgICAgICBwYXJ0cy5wdXNoKHRoaXMuZGF0ZShwbG90LmRhdGUsIHRoaXMuZGVmaW5pdGlvbnMuZGF0ZV9mb3JtYXQpKTtcbiAgICAgIH1cbiAgICAgIGlmIChwbG90LnRpbWUgJiYgcGxvdC50aW1lLnN0YXJ0KSB7XG4gICAgICAgIGNvbnN0IHNob3dFbmRUaW1lID0gcHJvZHVjdD8uc2V0dGluZ3M/LnNob3dfZW5kX3RpbWUgJiYgcGxvdC50aW1lLmVuZDtcbiAgICAgICAgcGFydHMucHVzaChzaG93RW5kVGltZSA/IGAke3Bsb3QudGltZS5zdGFydH0g4oCTICR7cGxvdC50aW1lLmVuZH1gIDogcGxvdC50aW1lLnN0YXJ0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJywgJyk7XG4gICAgfSxcbiAgICBpbml0aWFsaXplVGlja2V0RmllbGRzKCkge1xuICAgICAgdGhpcy5wZXJUaWNrZXRGaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgIGlmICghdGhpcy50aWNrZXRGaWVsZFZhbHVlc1tmaWVsZC5pZF0pIHtcbiAgICAgICAgICB0aGlzLiRzZXQodGhpcy50aWNrZXRGaWVsZFZhbHVlcywgZmllbGQuaWQsIHt9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGxpY2FibGVUaWNrZXRzKGZpZWxkKS5mb3JFYWNoKHRpY2tldCA9PiB7XG4gICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy50aWNrZXRGaWVsZFZhbHVlc1tmaWVsZC5pZF0sIHRpY2tldC5rZXkpKSB7XG4gICAgICAgICAgICB0aGlzLiRzZXQodGhpcy50aWNrZXRGaWVsZFZhbHVlc1tmaWVsZC5pZF0sIHRpY2tldC5rZXksIGNoZWNrb3V0RGVmYXVsdFZhbHVlKGZpZWxkKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgdmFsaWRhdGVUaWNrZXRGaWVsZHMoKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMucGVyVGlja2V0RmllbGRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGlja2V0IG9mIHRoaXMuYXBwbGljYWJsZVRpY2tldHMoZmllbGQpKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnRpY2tldEZpZWxkVmFsdWVzW2ZpZWxkLmlkXT8uW3RpY2tldC5rZXldO1xuICAgICAgICAgIGNvbnN0IGVtcHR5ID0gdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB2YWx1ZSA9PT0gJyc7XG4gICAgICAgICAgaWYgKGVtcHR5KSB7XG4gICAgICAgICAgICBpZiAoZmllbGQucmVxdWlyZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ0NIRUNLQk9YJyAmJiBmaWVsZC5yZXF1aXJlZCAmJiB2YWx1ZSAhPT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnRFJPUERPV04nICYmICEoZmllbGQub3B0aW9ucyB8fCBbXSkuaW5jbHVkZXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgaWYgKChmaWVsZC50eXBlID09PSAnRU1BSUwnIHx8IGZpZWxkLnR5cGUgPT09ICdFTUFJTF9DT05GSVJNJykgJiYgIS9eXFxTK0BcXFMrXFwuXFxTKyQvLnRlc3QodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdEQVRFJyAmJiAhL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLnRlc3QodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdOVU1CRVInICYmICEvXlswLTldezEsNTB9KFssLl1bMC05XXsxLDJ9KT8kLy50ZXN0KHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIHRpY2tldEZpZWxkc1BheWxvYWQoKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0ge307XG4gICAgICB0aGlzLnBlclRpY2tldEZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgcGF5bG9hZFtmaWVsZC5pZF0gPSB0aGlzLmFwcGxpY2FibGVUaWNrZXRzKGZpZWxkKS5tYXAodGlja2V0ID0+ICh7XG4gICAgICAgICAgcHJvZHVjdF9pZDogdGlja2V0LnByb2R1Y3RfaWQsXG4gICAgICAgICAgYXVkaWVuY2VfaWQ6IHRpY2tldC5hdWRpZW5jZV9pZCxcbiAgICAgICAgICBwb3NpdGlvbjogdGlja2V0LnBvc2l0aW9uLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLnRpY2tldEZpZWxkVmFsdWVzW2ZpZWxkLmlkXT8uW3RpY2tldC5rZXldLFxuICAgICAgICB9KSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH0sXG4gICAgaXNWYWxpZEZpZWxkKGZpZWxkLCBwcm9kdWN0SWQpIHtcbiAgICAgIGZvciAobGV0IG9yZGVyIG9mIHRoaXMucHJvZHVjdENhcnQpIHtcbiAgICAgICAgaWYgKGZpZWxkQXBwbGllc1RvKGZpZWxkLCAncHJvZHVjdCcsIG9yZGVyLnByb2R1Y3QuaWQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpZWxkQXBwbGllc1RvKGZpZWxkLCAncHJvZHVjdCcsIHByb2R1Y3RJZCk7XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgbGV0IGZpZWxkcyA9IHt9O1xuICAgIGxldCB2YWx1ZSA9IG51bGw7XG5cbiAgICBsZXQgcHJlZmlsbCA9ICcnO1xuXG4gICAgZm9yIChjb25zdCBbaWQsIGZpZWxkXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm9yZ2FuaXNhdGlvbi5maWVsZHMpKSB7XG5cbiAgICAgIGNvbnN0IGxvY2thYmxlVHlwZXMgPSBbJ0ZJUlNUX05BTUUnLCAnTEFTVF9OQU1FJywgJ0VNQUlMJ107XG5cbiAgICAgIGlmIChmaWVsZC50eXBlICE9PSAnQ0hFQ0tCT1gnKSB7XG5cbiAgICAgICAgaWYgKHRoaXMuY2xpZW50KSB7XG5cbiAgICAgICAgICBpZiAoZmllbGQuZGVmYXVsdCA9PT0gdHJ1ZSkge1xuXG4gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ0ZJUlNUX05BTUUnKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jbGllbnQubmFtZS5maXJzdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ0xBU1RfTkFNRScpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmNsaWVudC5uYW1lLmxhc3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdFTUFJTCcpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmNsaWVudC5lbWFpbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ0NPTVBBTlknKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jbGllbnQuY29tcGFueTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ0FERFJFU1MnKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jbGllbnQuYWRkcmVzcyB8fCAnJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ1pJUENPREUnKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jbGllbnQuemlwY29kZSB8fCAnJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ0NJVFknKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jbGllbnQuY2l0eSB8fCAnJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ1ZBVF9JRCcpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmNsaWVudC52YXRfaWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobG9ja2FibGVUeXBlcy5pbmNsdWRlcyhmaWVsZC50eXBlKSkge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMucmVib29raW5nIHx8IGZpZWxkLnR5cGUgPT09ICdFTUFJTCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2tlZF9maWVsZHMucHVzaChpZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgIHByZWZpbGwgPSBfLmZpbmQodGhpcy5jbGllbnQuZmllbGRzLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZS5pZCA9PT0gaWQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHByZWZpbGwpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBwcmVmaWxsLnZhbHVlO1xuICAgICAgICAgICAgICBpZiAoIXRoaXMucmVib29raW5nICYmIGxvY2thYmxlVHlwZXMuaW5jbHVkZXMoZmllbGQudHlwZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2tlZF9maWVsZHMucHVzaChpZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJFTUFJTF9DT05GSVJNXCIpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmNsaWVudC5lbWFpbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gY2hlY2tvdXREZWZhdWx0VmFsdWUoZmllbGQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSAmJiBmaWVsZC5kZWZhdWx0X3ZhbHVlICE9PSBudWxsICYmIHR5cGVvZiBmaWVsZC5kZWZhdWx0X3ZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YWx1ZSA9IGNoZWNrb3V0RGVmYXVsdFZhbHVlKGZpZWxkKTtcbiAgICAgIH1cblxuICAgICAgZmllbGRzW2lkXSA9IHZhbHVlO1xuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2xpZW50KSB7XG5cbiAgICAgIHRoaXMuY3VzdG9tZXIudG9rZW4gPSB0aGlzLmNsaWVudC50b2tlbjtcblxuICAgICAgaWYgKHRoaXMuY2xpZW50LmNvbXBhbnkpIHtcbiAgICAgICAgdGhpcy5pc19jb21wYW55ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIHRoaXMuJGVtaXQoJ2NhcnRfdXBkYXRlJyk7XG4gICAgdGhpcy4kZW1pdCgnYXV0b19jb3Vwb25fcmVmcmVzaCcpO1xuICAgIHRoaXMuZmllbGRzID0gZmllbGRzO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVRpY2tldEZpZWxkcygpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5hdmFpbGFibGVfc3Vic2NyaXB0aW9ucygpKSB7XG4gICAgICAgIHRoaXMucmVkZWVtX3N1YnNjcmlwdGlvbih0aGlzLmF2YWlsYWJsZV9zdWJzY3JpcHRpb25zKClbMF0uaWQpO1xuICAgICAgfVxuICAgIH0sIDEwMCk7XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIGhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hlY2tvdXRSZWFkaW5lc3ModGhpcy52YWxpZGF0ZSgpKTtcbiAgICAgIH0sXG4gICAgICBkZWVwOiB0cnVlXG4gICAgfSxcbiAgICB0aWNrZXRGaWVsZFZhbHVlczoge1xuICAgICAgaGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ3VwZGF0ZVRpY2tldEZpZWxkcycsIHRoaXMudGlja2V0RmllbGRzUGF5bG9hZCgpKTtcbiAgICAgICAgdGhpcy51cGRhdGVDaGVja291dFJlYWRpbmVzcyh0aGlzLnZhbGlkYXRlKCkpO1xuICAgICAgfSxcbiAgICAgIGRlZXA6IHRydWVcbiAgICB9LFxuICAgIHRpY2tldERlc2NyaXB0b3JzOiB7XG4gICAgICBoYW5kbGVyKCkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVUaWNrZXRGaWVsZHMoKTtcbiAgICAgIH0sXG4gICAgICBkZWVwOiB0cnVlXG4gICAgfSxcbiAgICBpc19jb21wYW55OiB7XG4gICAgICBoYW5kbGVyKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICB0aGlzLmN1c3RvbWVyLmNvbXBhbnkgPSAnJztcbiAgICAgICAgICB0aGlzLmN1c3RvbWVyLnZhdF9pZCA9ICcnO1xuICAgICAgICAgIHRoaXMuY3VzdG9tZXIuYWRkcmVzcyA9ICcnO1xuICAgICAgICAgIHRoaXMuY3VzdG9tZXIuemlwY29kZSA9ICcnO1xuICAgICAgICAgIHRoaXMuY3VzdG9tZXIuY2l0eSA9ICcnO1xuXG4gICAgICAgICAgaWYgKHRoaXMuZmllbGRzICYmIHRoaXMub3JnYW5pc2F0aW9uICYmIHRoaXMub3JnYW5pc2F0aW9uLmZpZWxkcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaWQsIGZpZWxkXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm9yZ2FuaXNhdGlvbi5maWVsZHMpKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmlzQnVzaW5lc3NSZWxhdGVkKGZpZWxkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLmZpZWxkcywgaWQsICcnKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbWVyLmZpZWxkcyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jdXN0b21lci5maWVsZHMsIGlkKSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy4kZGVsZXRlKHRoaXMuY3VzdG9tZXIuZmllbGRzLCBpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVlcDogdHJ1ZVxuICAgIH0sXG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjaGVja291dFN1YnRpdGxlKCkge1xuICAgICAgaWYgKCF0aGlzLnByb2R1Y3QgfHwgdHlwZW9mIHRoaXMucHJvZHVjdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnByb2R1Y3Quc3VidGl0bGVzPy5jaGVja291dFxuICAgICAgICB8fCB0aGlzLnByb2R1Y3Quc3VidGl0bGU/LmNoZWNrb3V0XG4gICAgICAgIHx8IHRoaXMucHJvZHVjdC5jaGVja291dF9zdWJ0aXRsZVxuICAgICAgICB8fCBudWxsO1xuICAgIH0sXG4gICAgY2xpZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnMuQ2xpZW50O1xuICAgIH0sXG4gICAgcmVib29raW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnMuUmVib29raW5nO1xuICAgIH0sXG4gICAgb3JnYW5pc2F0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnMuT3JnYW5pc2F0aW9uO1xuICAgIH0sXG4gICAgYnVzaW5lc3NGaWVsZHMoKSB7XG4gICAgICBpZiAodGhpcy5vcmdhbmlzYXRpb24gJiYgdGhpcy5vcmdhbmlzYXRpb24uYnVzaW5lc3NfZmllbGRzKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMub3JnYW5pc2F0aW9uLmJ1c2luZXNzX2ZpZWxkcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9LFxuICAgIGJ1c2luZXNzRmllbGRUeXBlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1c2luZXNzRmllbGRzLmZpbHRlcihmaWVsZCA9PiBmaWVsZC5pbnZvaWNlKS5tYXAoZmllbGQgPT4gZmllbGQudHlwZSk7XG4gICAgfSxcbiAgICBwcm9kdWN0Q2FydCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRzdG9yZS5nZXR0ZXJzLlByb2R1Y3RDYXJ0O1xuICAgIH0sXG4gICAgcGVyVGlja2V0RmllbGRzKCkge1xuICAgICAgaWYgKCF0aGlzLm9yZ2FuaXNhdGlvbiB8fCAhdGhpcy5vcmdhbmlzYXRpb24uZmllbGRzKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLm9yZ2FuaXNhdGlvbi5maWVsZHMpXG4gICAgICAgIC5tYXAoKFtpZCwgZmllbGRdKSA9PiAoe2lkLCAuLi5maWVsZH0pKVxuICAgICAgICAuZmlsdGVyKGZpZWxkID0+IGZpZWxkLm9yZGVyICYmIGZpZWxkLnBlcl90aWNrZXQgJiYgaXNDaGVja291dFZpc2libGUoZmllbGQpKTtcbiAgICB9LFxuICAgIHRpY2tldEZpZWxkR3JvdXBzKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGlja2V0RGVzY3JpcHRvcnMubWFwKHRpY2tldCA9PiAoe1xuICAgICAgICB0aWNrZXQsXG4gICAgICAgIGZpZWxkczogdGhpcy5wZXJUaWNrZXRGaWVsZHMuZmlsdGVyKGZpZWxkID0+IGZpZWxkQXBwbGllc1RvKGZpZWxkLCAncHJvZHVjdCcsIHRpY2tldC5wcm9kdWN0X2lkKSksXG4gICAgICB9KSkuZmlsdGVyKGdyb3VwID0+IGdyb3VwLmZpZWxkcy5sZW5ndGggPiAwKTtcbiAgICB9LFxuICAgIHRpY2tldERlc2NyaXB0b3JzKCkge1xuICAgICAgY29uc3Qgb3JkZXJzID0gW3RoaXMuJHN0b3JlLmdldHRlcnMuUHJvZHVjdE9yZGVyLCAuLi4odGhpcy5wcm9kdWN0Q2FydCB8fCBbXSldLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gW107XG4gICAgICBjb25zdCBwb3NpdGlvbnMgPSB7fTtcbiAgICAgIGNvbnN0IHByb2R1Y3RQb3NpdGlvbnMgPSB7fTtcblxuICAgICAgb3JkZXJzLmZvckVhY2gob3JkZXIgPT4ge1xuICAgICAgICBjb25zdCBwcm9kdWN0ID0gb3JkZXIucHJvZHVjdCB8fCB7fTtcbiAgICAgICAgY29uc3QgcHJvZHVjdElkID0gTnVtYmVyKHByb2R1Y3QuaWQpO1xuICAgICAgICBpZiAoIXByb2R1Y3RJZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBwcm9kdWN0SW5mbyA9IG9yZGVyLnByb2R1Y3RJbmZvIHx8IChOdW1iZXIodGhpcy5wcm9kdWN0LmlkKSA9PT0gcHJvZHVjdElkID8gdGhpcy5wcm9kdWN0IDoge30pO1xuICAgICAgICBjb25zdCB0aXRsZSA9IHByb2R1Y3RJbmZvLnRpdGxlIHx8IHByb2R1Y3QudGl0bGUgfHwgYCMke3Byb2R1Y3RJZH1gO1xuICAgICAgICBjb25zdCBwbG90ID0gb3JkZXIucGxvdEluZm8gfHwgKEFycmF5LmlzQXJyYXkocHJvZHVjdEluZm8ucGxvdHMpXG4gICAgICAgICAgPyBwcm9kdWN0SW5mby5wbG90cy5maW5kKGl0ZW0gPT4gTnVtYmVyKGl0ZW0uaWQpID09PSBOdW1iZXIocHJvZHVjdC5wbG90KSlcbiAgICAgICAgICA6IG51bGwpO1xuICAgICAgICBjb25zdCBzY2hlZHVsZSA9IHRoaXMudGlja2V0U2NoZWR1bGUocGxvdCwgcHJvZHVjdEluZm8pO1xuICAgICAgICBjb25zdCBhdWRpZW5jZXMgPSAob3JkZXIuYXVkaWVuY2VzIHx8IFtdKS5maWx0ZXIoYXVkaWVuY2UgPT4gTnVtYmVyKGF1ZGllbmNlLnF1YW50aXR5KSA+IDApO1xuICAgICAgICBjb25zdCBncm91cHMgPSBhdWRpZW5jZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gYXVkaWVuY2VzLm1hcChhdWRpZW5jZSA9PiAoe2F1ZGllbmNlLCBxdWFudGl0eTogTnVtYmVyKGF1ZGllbmNlLnF1YW50aXR5KX0pKVxuICAgICAgICAgIDogW3thdWRpZW5jZTogbnVsbCwgcXVhbnRpdHk6IE51bWJlcihwcm9kdWN0LnF1YW50aXR5IHx8IG9yZGVyLnF1YW50aXR5IHx8IDApfV07XG5cbiAgICAgICAgZ3JvdXBzLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICAgIGNvbnN0IGF1ZGllbmNlSWQgPSBncm91cC5hdWRpZW5jZSA/IE51bWJlcihncm91cC5hdWRpZW5jZS5pZCkgOiBudWxsO1xuICAgICAgICAgIGNvbnN0IGF1ZGllbmNlSW5mbyA9IGF1ZGllbmNlSWQgPT09IG51bGxcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiAocHJvZHVjdEluZm8uYXVkaWVuY2VzIHx8IFtdKS5maW5kKGF1ZGllbmNlID0+IE51bWJlcihhdWRpZW5jZS5pZCkgPT09IGF1ZGllbmNlSWQpO1xuICAgICAgICAgIGNvbnN0IGNvdW50ZXJLZXkgPSBgJHtwcm9kdWN0SWR9OiR7YXVkaWVuY2VJZCA9PT0gbnVsbCA/ICdub25lJyA6IGF1ZGllbmNlSWR9YDtcbiAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZ3JvdXAucXVhbnRpdHk7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcG9zaXRpb25zW2NvdW50ZXJLZXldIHx8IDA7XG4gICAgICAgICAgICBwb3NpdGlvbnNbY291bnRlcktleV0gPSBwb3NpdGlvbiArIDE7XG4gICAgICAgICAgICBjb25zdCBudW1iZXIgPSAocHJvZHVjdFBvc2l0aW9uc1twcm9kdWN0SWRdIHx8IDApICsgMTtcbiAgICAgICAgICAgIHByb2R1Y3RQb3NpdGlvbnNbcHJvZHVjdElkXSA9IG51bWJlcjtcbiAgICAgICAgICAgIGRlc2NyaXB0b3JzLnB1c2goe1xuICAgICAgICAgICAgICBrZXk6IGAke2NvdW50ZXJLZXl9OiR7cG9zaXRpb259YCxcbiAgICAgICAgICAgICAgcHJvZHVjdF9pZDogcHJvZHVjdElkLFxuICAgICAgICAgICAgICBhdWRpZW5jZV9pZDogYXVkaWVuY2VJZCxcbiAgICAgICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgICAgIG51bWJlcixcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIHNjaGVkdWxlLFxuICAgICAgICAgICAgICBhdWRpZW5jZV9uYW1lOiBhdWRpZW5jZUluZm8/Lm5hbWUgfHwgZ3JvdXAuYXVkaWVuY2U/Lm5hbWUgfHwgJycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBkZXNjcmlwdG9ycztcbiAgICB9LFxuICAgIGN1cnJlbnRMYW5ndWFnZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRzdG9yZS5nZXR0ZXJzLkdsb2JhbCgnbGFuZ3VhZ2UnKSB8fCAnJztcbiAgICB9LFxuXG4gICAgdGVsRGVmYXVsdENvdW50cnkoKSB7XG4gICAgICBjb25zdCBsYW5nID0gdGhpcy4kc3RvcmUuc3RhdGUuR2xvYmFscyAmJiB0aGlzLiRzdG9yZS5zdGF0ZS5HbG9iYWxzLmxhbmd1YWdlO1xuICAgICAgaWYgKGxhbmcpIHtcbiAgICAgICAgcmV0dXJuIGxhbmcudG9Mb3dlckNhc2UoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvY2FsZSA9IG5hdmlnYXRvci5sYW5ndWFnZSB8fCBuYXZpZ2F0b3IudXNlckxhbmd1YWdlIHx8ICcnO1xuICAgICAgY29uc3QgcGFydHMgPSBsb2NhbGUuc3BsaXQoJy0nKTtcbiAgICAgIHJldHVybiAocGFydHNbMV0gfHwgcGFydHNbMF0gfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIHNjb3BlZD5cbi52dWUtdGVsLWlucHV0IHtcbiAgaGVpZ2h0OiBjYWxjKDIuMTI1cmVtICsgMnB4KTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RiZGZlYTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuXG4udnVlLXRlbC1pbnB1dCAudnRpX19kcm9wZG93biB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDAgMC41cmVtO1xufVxuXG4udnVlLXRlbC1pbnB1dCAudnRpX19pbnB1dCB7XG4gIGhlaWdodDogMTAwJTtcbiAgcGFkZGluZzogMC40Mzc1cmVtIDFyZW07XG4gIGJvcmRlcjogMDtcbn1cblxuZmllbGRzZXRbZGF0YS1maWVsZC10eXBlPVwiY291bnRyeVwiXSAudi1zZWxlY3Qge1xuICB3aWR0aDogMTAwJTtcbn1cblxuZmllbGRzZXRbZGF0YS1maWVsZC10eXBlPVwiY291bnRyeVwiXSAudnNfX2Ryb3Bkb3duLXRvZ2dsZSB7XG4gIGhlaWdodDogY2FsYygyLjEyNXJlbSArIDJweCk7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkYmRmZWE7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgcGFkZGluZzogMCAwLjVyZW07XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbmZpZWxkc2V0W2RhdGEtZmllbGQtdHlwZT1cImNvdW50cnlcIl0gLnZzX19zZWxlY3RlZCxcbmZpZWxkc2V0W2RhdGEtZmllbGQtdHlwZT1cImNvdW50cnlcIl0gLnZzX19zZWFyY2gge1xuICBtYXJnaW4tdG9wOiAwO1xufVxuXG5maWVsZHNldFtkYXRhLWZpZWxkLXR5cGU9XCJjb3VudHJ5XCJdIC52c19fc2VhcmNoIHtcbiAgcGFkZGluZzogMDtcbn1cblxuZmllbGRzZXRbZGF0YS1maWVsZC10eXBlPVwiY291bnRyeVwiXSA+Pj4gLnZzX19vcGVuLWluZGljYXRvciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG48L3N0eWxlPlxuIiwiIDx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImNhcmQgbWItMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWlubmVyXCI+XG4gICAgICA8aDUgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3sgdHJhbnMoJ3Byb2R1Y3Quc3RlcHMuY2hlY2tvdXQudGl0bGUnKSB9fTwvaDU+XG4gICAgICA8aDYgY2xhc3M9XCJjYXJkLXN1YnRpdGxlIG1iLTIgZmYtYmFzZVwiPnt7IHRyYW5zKCdwcm9kdWN0LnN0ZXBzLmNoZWNrb3V0LnN1YnRpdGxlJykgfX08L2g2PlxuICAgICAgPGRpdiBjbGFzcz1cIm10LTQgYm9yZGVyLXRvcFwiPlxuICAgICAgICA8Zm9ybSB2LWlmPVwiZmllbGRzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIiB2LXNob3c9XCJvcmdhbmlzYXRpb24uYWxsb3dfYnVzaW5lc3NcIj5cbiAgICAgICAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jb250cm9sIGN1c3RvbS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImN1c3RvbS1jb250cm9sLWlucHV0XCIgaWQ9XCJjdXN0b21lcl9jb21wYW55XCIgdi1tb2RlbD1cImlzX2NvbXBhbnlcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjdXN0b20tY29udHJvbC1sYWJlbFwiIGZvcj1cImN1c3RvbWVyX2NvbXBhbnlcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHRyYW5zKCdwcm9kdWN0LnN0ZXBzLmNoZWNrb3V0LmNvbXBhbnlfb3B0aW9uJykgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGNvbXBvbmVudCB2LWZvcj1cIihmaWVsZCwgaW5kZXgpIGluIG9yZ2FuaXNhdGlvbi5maWVsZHNcIiA6aXM9XCInZGl2J1wiIDprZXk9XCJgJHtpbmRleH0tJHtjdXJyZW50TGFuZ3VhZ2V9YFwiPlxuICAgICAgICAgICAgPGRpdiB2LWlmPVwiIShmaWVsZC5vcmRlciAmJiBmaWVsZC5wZXJfdGlja2V0KSAmJiBpc1ZhbGlkRmllbGQoZmllbGQsIGAke3N1YnNjcmlwdGlvbi5pZH1gKSAmJiBzaG91bGREaXNwbGF5RmllbGQoZmllbGQpXCIgY2xhc3M9XCJtdC0zXCI+XG4gICAgICAgICAgICAgIDxmaWVsZHNldCB2LWlmPVwiZmllbGQudHlwZSA9PT0gJ0NIRUNLQk9YJ1wiIDpkYXRhLWZpZWxkLXR5cGU9XCJmaWVsZC50eXBlLnRvTG93ZXJDYXNlKClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wgY3VzdG9tLWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjdXN0b20tY29udHJvbC1pbnB1dFwiIDpuYW1lPVwiYGN1c3RvbWVyWyR7aW5kZXh9XWBcIiA6aWQ9XCJgY3VzdG9tZXItZmllbGQtJHtpbmRleH1gXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICB2LW1vZGVsPVwiZmllbGRzW2luZGV4XVwiIDpyZXF1aXJlZD1cImZpZWxkLnJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjdXN0b20tY29udHJvbC1sYWJlbFwiIDpmb3I9XCJgY3VzdG9tZXItZmllbGQtJHtpbmRleH1gXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLm5hbWUgfX08c3BhbiB2LWlmPVwiZmllbGQucmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICAgIDxmaWVsZHNldCB2LWVsc2UtaWY9XCJmaWVsZC50eXBlID09PSAnRFJPUERPV04nXCIgOmRhdGEtZmllbGQtdHlwZT1cImZpZWxkLnR5cGUudG9Mb3dlckNhc2UoKVwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInBhcmFncmFwaFwiIDpmb3I9XCJgY3VzdG9tZXItZmllbGQtJHtpbmRleH1gXCI+XG4gICAgICAgICAgICAgICAgICB7eyBmaWVsZC5uYW1lIH19PHNwYW4gdi1pZj1cImZpZWxkLnJlcXVpcmVkXCIgY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250cm9sLXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wtc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiA6bmFtZT1cImBjdXN0b21lclske2luZGV4fV1gXCIgOmlkPVwiYGN1c3RvbWVyLWZpZWxkLSR7aW5kZXh9YFwiIHYtbW9kZWw9XCJmaWVsZHNbaW5kZXhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6cmVxdWlyZWQ9XCJmaWVsZC5yZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiBzZWxlY3RlZCBkaXNhYmxlZD57eyB0cmFucygncHJvZHVjdC5zdGVwcy5jaGVja291dC5kcm9wZG93bi5wbGFjZWhvbGRlcicpIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cIihvcHRpb24sIG9wdGlvbl9pbmRleCkgaW4gZHJvcGRvd25PcHRpb25zKGZpZWxkKVwiIDprZXk9XCJvcHRpb25faW5kZXhcIiA6dmFsdWU9XCJvcHRpb25cIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bk9wdGlvbkxhYmVsKGZpZWxkLCBvcHRpb24sIG9wdGlvbl9pbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICAgIDxmaWVsZHNldCB2LWVsc2UtaWY9XCJmaWVsZC50eXBlID09PSAnUEhPTkUnXCIgOmRhdGEtZmllbGQtdHlwZT1cImZpZWxkLnR5cGUudG9Mb3dlckNhc2UoKVwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInBhcmFncmFwaFwiIDpmb3I9XCJgY3VzdG9tZXItZmllbGQtJHtpbmRleH1gXCI+XG4gICAgICAgICAgICAgICAgICB7eyBmaWVsZC5uYW1lIH19PHNwYW4gdi1pZj1cImZpZWxkLnJlcXVpcmVkXCIgY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8dnVlLXRlbC1pbnB1dFxuICAgICAgICAgICAgICAgICAgICB2LW1vZGVsPVwiZmllbGRzW2luZGV4XVwiXG4gICAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImxvY2tlZF9maWVsZHMuaW5jbHVkZXMoaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgOmlucHV0T3B0aW9ucz1cIntcbiAgICAgICAgICAgICAgICAgICAgICBpZDogYGN1c3RvbWVyLWZpZWxkLSR7aW5kZXh9YCxcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBgY3VzdG9tZXJbJHtpbmRleH1dYCxcbiAgICAgICAgICAgICAgICAgICAgICBzaG93RGlhbENvZGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICcnXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICA6ZGVmYXVsdENvdW50cnk9XCJ0ZWxEZWZhdWx0Q291bnRyeVwiXG4gICAgICAgICAgICAgICAgICAgIDpyZXF1aXJlZD1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1zbG90OmFycm93LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC92dWUtdGVsLWlucHV0PlxuICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgICA8ZmllbGRzZXQgdi1lbHNlLWlmPVwiZmllbGQudHlwZSA9PT0gJ0NPVU5UUlknXCIgOmRhdGEtZmllbGQtdHlwZT1cImZpZWxkLnR5cGUudG9Mb3dlckNhc2UoKVwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInBhcmFncmFwaFwiIDpmb3I9XCJgY3VzdG9tZXItZmllbGQtJHtpbmRleH1gXCI+XG4gICAgICAgICAgICAgICAgICB7eyBmaWVsZC5uYW1lIH19PHNwYW4gdi1pZj1cImZpZWxkLnJlcXVpcmVkXCIgY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250cm9sLXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgIDxDb3VudHJ5U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIHYtbW9kZWw9XCJmaWVsZHNbaW5kZXhdXCJcbiAgICAgICAgICAgICAgICAgICAgOmRpc2FibGVkPVwibG9ja2VkX2ZpZWxkcy5pbmNsdWRlcyhpbmRleClcIlxuICAgICAgICAgICAgICAgICAgICA6cGxhY2Vob2xkZXI9XCJ0cmFucygncHJvZHVjdC5zdGVwcy5jaGVja291dC5kcm9wZG93bi5wbGFjZWhvbGRlcicpXCJcbiAgICAgICAgICAgICAgICAgICAgOmlucHV0LWlkPVwiYGN1c3RvbWVyLWZpZWxkLSR7aW5kZXh9YFwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgICA8ZmllbGRzZXQgdi1lbHNlIDpjbGFzcz1cInsnYm9yZGVyLWJvdHRvbSBwYi00JzogZmllbGQudHlwZSA9PT0gJ1ZBVF9JRCd9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDpkYXRhLWZpZWxkLXR5cGU9XCJmaWVsZC50eXBlLnRvTG93ZXJDYXNlKClcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJwYXJhZ3JhcGhcIiA6Zm9yPVwiYGN1c3RvbWVyLWZpZWxkLSR7aW5kZXh9YFwiPlxuICAgICAgICAgICAgICAgICAge3sgZmllbGQubmFtZSB9fTxzcGFuIHYtaWY9XCJmaWVsZC5yZXF1aXJlZFwiIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IDppZD1cImBjdXN0b21lci1maWVsZC0ke2luZGV4fWBcIiA6bmFtZT1cImBjdXN0b21lclske2luZGV4fV1gXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB2LW1vZGVsPVwiZmllbGRzW2luZGV4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgIDp0eXBlPVwiaW5wdXQoZmllbGQudHlwZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICA6cmVxdWlyZWQ9XCJmaWVsZC5yZXF1aXJlZFwiIDpkaXNhYmxlZD1cImxvY2tlZF9maWVsZHMuaW5jbHVkZXMoaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgOnBsYWNlaG9sZGVyPVwiZmllbGQuaGVscF90ZXh0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgQGJsdXI9XCJtYXJrVG91Y2hlZChgY3VzdG9tZXJbJHtpbmRleH1dYClcIlxuICAgICAgICAgICAgICAgICAgICAgICA6YXJpYS1pbnZhbGlkPVwiaXNJbnZhbGlkKGBjdXN0b21lclske2luZGV4fV1gKVwiXG4gICAgICAgICAgICAgICAgICAgICAgIDphcmlhLWRlc2NyaWJlZGJ5PVwiaXNJbnZhbGlkKGBjdXN0b21lclske2luZGV4fV1gKSA/IGBjdXN0b21lci1lcnJvci0ke2luZGV4fWAgOiBudWxsXCIvPlxuICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgICA8cCB2LWlmPVwiZmllbGQuaGVscF90ZXh0XCIgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG10LTFcIj57eyBmaWVsZC5oZWxwX3RleHQgfX08L3A+XG4gICAgICAgICAgICAgIDxwIHYtaWY9XCJpc0ludmFsaWQoYGN1c3RvbWVyWyR7aW5kZXh9XWApXCIgOmlkPVwiYGN1c3RvbWVyLWVycm9yLSR7aW5kZXh9YFwiIGNsYXNzPVwidGV4dC1kYW5nZXIgbXQtMVwiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgICAgIHt7IHZhbGlkYXRpb25NZXNzYWdlKGBjdXN0b21lclske2luZGV4fV1gKSB9fVxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICA8ZGl2IHYtaWY9XCIhY2xpZW50XCIgY2xhc3M9XCJtdC00IHB0LTMgYm9yZGVyLXRvcFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgICA8ZmllbGRzZXQ+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJwYXJhZ3JhcGhcIiBmb3I9XCJwYXNzd29yZFwiPnt7IHRyYW5zKCdwcm9kdWN0LnN0ZXBzLmNoZWNrb3V0LnBhc3N3b3JkJykgfX0gPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwicGFzc3dvcmRcIiB0eXBlPVwicGFzc3dvcmRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJwYXNzd29yZFwiIHJlcXVpcmVkIHYtbW9kZWw9XCJwYXNzd29yZHMub25lXCIvPlxuICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgICA8ZmllbGRzZXQ+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJwYXJhZ3JhcGhcIiBmb3I9XCJwYXNzd29yZF9jb25maXJtXCI+e3sgdHJhbnMoJ3Byb2R1Y3Quc3RlcHMuY2hlY2tvdXQucGFzc3dvcmRfY29uZmlybScpIH19IDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cInBhc3N3b3JkX2NvbmZpcm1cIiB0eXBlPVwicGFzc3dvcmRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJwYXNzd29yZF9jb25maXJtXCIgcmVxdWlyZWQgdi1tb2RlbD1cInBhc3N3b3Jkcy50d29cIi8+XG4gICAgICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1ncmF5IGZvbnQtaXRhbGljXCI+XG4gICAgICAgICAgICA8c3Bhbj4qPC9zcGFuPiA9IHt7IHRyYW5zKCdwcm9kdWN0LnN0ZXBzLmNoZWNrb3V0LnJlcXVpcmVkJykgfX1cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cblxuaW1wb3J0IHtjaGVja291dERlZmF1bHRWYWx1ZSwgZmllbGRBcHBsaWVzVG8sIGlzQ2hlY2tvdXRWaXNpYmxlfSBmcm9tICcuLi8uLi91dGlscy9mb3JtRmllbGRzJztcbmV4cG9ydCBkZWZhdWx0IHtcblxuICBwcm9wczogWydzdWJzY3JpcHRpb24nXSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXN0b21lcjoge1xuICAgICAgICBjb21wYW55OiAnJyxcbiAgICAgICAgZmlyc3RfbmFtZTogJycsXG4gICAgICAgIGxhc3RfbmFtZTogJycsXG4gICAgICAgIGVtYWlsOiAnJyxcbiAgICAgICAgYWRkcmVzczogJycsXG4gICAgICAgIHppcGNvZGU6ICcnLFxuICAgICAgICBjaXR5OiAnJyxcbiAgICAgICAgdmF0X2lkOiAnJ1xuICAgICAgfSxcbiAgICAgIHBhc3N3b3Jkczoge1xuICAgICAgICBvbmU6ICcnLFxuICAgICAgICB0d286ICcnXG4gICAgICB9LFxuICAgICAgZmllbGRzOiBudWxsLFxuICAgICAgaW52YWxpZEZpZWxkczoge30sXG4gICAgICB0b3VjaGVkRmllbGRzOiB7fSxcbiAgICAgIGxvY2tlZF9maWVsZHM6IFtdLFxuICAgICAgaXNfY29tcGFueTogZmFsc2UsXG4gICAgICB2YWxpZDoge1xuICAgICAgICBjdXN0b21lcjogZmFsc2UsXG4gICAgICAgIHBhc3N3b3JkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIHRlbElucHV0T3B0aW9uczoge1xuICAgICAgICBzaG93RGlhbENvZGU6IHRydWUsXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnJyxcbiAgICAgICAgc3R5bGVDbGFzc2VzOiBbJ2Zvcm0tY29udHJvbCcsICd3LTEwMCcsICdib3JkZXItMCddXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBtYXJrVG91Y2hlZChuYW1lKSB7XG4gICAgICB0aGlzLiRzZXQodGhpcy50b3VjaGVkRmllbGRzLCBuYW1lLCB0cnVlKTtcbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICB9LFxuICAgIHZhbGlkYXRlKCkge1xuICAgICAgbGV0IHZhbGlkYXRvcnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlczogWydURVhUJywgJ0ZJUlNUX05BTUUnLCAnTEFTVF9OQU1FJywgJ0NPTVBBTlknLCAnQUREUkVTUycsICdWQVRfSUQnLCAnWklQQ09ERScsICdDSVRZJywgJ0NPVU5UUlknXSxcbiAgICAgICAgICByZWdleDogbmV3IFJlZ0V4cCgvXi57MSw2NTUzNX0kLywgJ2knKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZXM6IFsnRU1BSUwnLCAnRU1BSUxfQ09ORklSTSddLFxuICAgICAgICAgIHJlZ2V4OiBuZXcgUmVnRXhwKC9eKChbXjw+KClbXFxdXFxcXC4sOzpcXHNAXCJdKyhcXC5bXjw+KClbXFxdXFxcXC4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKChcXFtbMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFxdKXwoKFthLXpBLVpcXC0wLTldK1xcLikrW2EtekEtWl17Mix9KSkkLywgJ2knKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZXM6IFsnTlVNQkVSJ10sXG4gICAgICAgICAgcmVnZXg6IG5ldyBSZWdFeHAoL15bMC05XXsxLDUwfShbLC5dWzAtOV17MSwyfSk/JC8sICdpJylcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGVzOiBbJ1BIT05FJ10sXG4gICAgICAgICAgcmVnZXg6IG5ldyBSZWdFeHAoL14oPz0oPzpcXEQqXFxkKXsxMCwxNX1cXEQqJClcXCs/WzAtOV17MSwzfVtcXHMtXT8oPzpcXCgwP1swLTldezEsNX1cXCl8WzAtOV17MSw1fSlbLVxcc10/WzAtOV1bXFxkXFxzLV17NSw3fVxccz8oPzp4W1xcZC1dezAsNH0pPyQvKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZXM6IFsnREFURSddLFxuICAgICAgICAgIHJlZ2V4OiBuZXcgUmVnRXhwKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLywgJ2knKVxuICAgICAgICB9XG4gICAgICBdO1xuXG4gICAgICBsZXQgZW1haWxzID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgW2lkLCBmaWVsZF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5vcmdhbmlzYXRpb24uZmllbGRzKSkge1xuXG4gICAgICAgIGlmICgoZmllbGQub3JkZXIgJiYgZmllbGQucGVyX3RpY2tldCkgfHwgIXRoaXMuaXNWYWxpZEZpZWxkKGZpZWxkLCBgJHt0aGlzLnN1YnNjcmlwdGlvbi5pZH1gKSB8fCAhdGhpcy5zaG91bGREaXNwbGF5RmllbGQoZmllbGQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmZpZWxkc1tpZF07XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkRmllbGQoZmllbGQsIGAke3RoaXMuc3Vic2NyaXB0aW9uLmlkfWApKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ1BIT05FJyAmJiAhZmllbGQucmVxdWlyZWQgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGNvbnN0IGRpZ2l0cyA9IHZhbHVlLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG4gICAgICAgICAgaWYgKGRpZ2l0cy5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFZhbGlkKCdjdXN0b21lclsnICsgaWQgKyAnXScpO1xuXG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnQ0hFQ0tCT1gnKSB7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Tm90VmFsaWQoJ2N1c3RvbWVyWycgKyBpZCArICddJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZpZWxkLnJlcXVpcmVkICYmIHZhbHVlICE9PSB0cnVlICYmIHRoaXMuaXNWYWxpZEZpZWxkKGZpZWxkLCBgJHt0aGlzLnN1YnNjcmlwdGlvbi5pZH1gKSkge1xuICAgICAgICAgICAgdGhpcy5zZXROb3RWYWxpZCgnY3VzdG9tZXJbJyArIGlkICsgJ10nKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnRFJPUERPV04nKSB7XG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZHJvcGRvd25PcHRpb25zKGZpZWxkKTtcblxuICAgICAgICAgIGlmIChmaWVsZC5yZXF1aXJlZCAmJiB2YWx1ZS5sZW5ndGggPT09IDAgJiYgdGhpcy5pc1ZhbGlkRmllbGQoZmllbGQsIGAke3RoaXMuc3Vic2NyaXB0aW9uLmlkfWApKSB7XG4gICAgICAgICAgICB0aGlzLnNldE5vdFZhbGlkKCdjdXN0b21lclsnICsgaWQgKyAnXScpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXROb3RWYWxpZCgnY3VzdG9tZXJbJyArIGlkICsgJ10nKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkRGlzcGxheUZpZWxkKGZpZWxkKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHZhbGlkYXRvciA9IF8uZmluZCh2YWxpZGF0b3JzLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGUudHlwZXMuaW5jbHVkZXMoZmllbGQudHlwZSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5zZXROb3RWYWxpZCgnY3VzdG9tZXJbJyArIGlkICsgJ10nKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZmllbGQucmVxdWlyZWQgJiYgdmFsdWUubGVuZ3RoID09PSAwICYmIHRoaXMuaXNWYWxpZEZpZWxkKGZpZWxkLCBgJHt0aGlzLnN1YnNjcmlwdGlvbi5pZH1gKSkge1xuICAgICAgICAgICAgdGhpcy5zZXROb3RWYWxpZCgnY3VzdG9tZXJbJyArIGlkICsgJ10nKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xuXG4gICAgICAgICAgICBpZiAodmFsaWRhdG9yLnJlZ2V4LnRlc3QodmFsdWUpICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0Tm90VmFsaWQoJ2N1c3RvbWVyWycgKyBpZCArICddJyk7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdFTUFJTF9DT05GSVJNJykge1xuICAgICAgICAgICAgICBlbWFpbHMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgIGlmICghZW1haWxzLmV2ZXJ5KChjdXIpID0+IGN1ci50b0xvd2VyQ2FzZSgpID09PSBlbWFpbHNbMF0udG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldE5vdFZhbGlkKCdjdXN0b21lclsnICsgaWQgKyAnXScpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGQuZGVmYXVsdCkge1xuXG4gICAgICAgICAgdGhpcy5jdXN0b21lcltmaWVsZC50eXBlLnRvTG93ZXJDYXNlKCldID0gdmFsdWU7XG5cbiAgICAgICAgICBjb25zdCBzaG91bGRQZXJzaXN0RGVmYXVsdEZpZWxkID0gWydDT01QQU5ZJywgJ0FERFJFU1MnLCAnWklQQ09ERScsICdDSVRZJywgJ1ZBVF9JRCddLmluY2x1ZGVzKGZpZWxkLnR5cGUpO1xuXG4gICAgICAgICAgaWYgKHNob3VsZFBlcnNpc3REZWZhdWx0RmllbGQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jdXN0b21lci5oYXNPd25Qcm9wZXJ0eSgnZmllbGRzJykpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21lci5maWVsZHMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VzdG9tZXIuZmllbGRzW2lkXSA9IHZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY3VzdG9tZXIuZmllbGRzW2lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ0VNQUlMJykge1xuICAgICAgICAgICAgZW1haWxzLnB1c2godmFsdWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgaWYgKCF0aGlzLmN1c3RvbWVyLmhhc093blByb3BlcnR5KCdmaWVsZHMnKSkge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21lci5maWVsZHMgPSB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZmllbGQudHlwZSAhPT0gJ0NIRUNLQk9YJykge1xuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbWVyLmZpZWxkc1tpZF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmN1c3RvbWVyLmZpZWxkc1tpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tZXIuZmllbGRzW2lkXSA9IHZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICB2YWxpZGF0ZV9wYXNzd29yZCgpIHtcbiAgICAgIGlmICghdGhpcy5jbGllbnQpIHtcbiAgICAgICAgY29uc3QgcGFzc3dvcmRPbmUgPSB0eXBlb2YgdGhpcy5wYXNzd29yZHM/Lm9uZSA9PT0gJ3N0cmluZycgPyB0aGlzLnBhc3N3b3Jkcy5vbmUgOiAnJztcbiAgICAgICAgY29uc3QgcGFzc3dvcmRUd28gPSB0eXBlb2YgdGhpcy5wYXNzd29yZHM/LnR3byA9PT0gJ3N0cmluZycgPyB0aGlzLnBhc3N3b3Jkcy50d28gOiAnJztcblxuICAgICAgICB0aGlzLnNldFZhbGlkKCdwYXNzd29yZF9jb25maXJtJyk7XG4gICAgICAgIHRoaXMuc2V0VmFsaWQoJ3Bhc3N3b3JkJyk7XG5cbiAgICAgICAgaWYgKHBhc3N3b3JkT25lLmxlbmd0aCA8IDYpIHtcbiAgICAgICAgICB0aGlzLnNldE5vdFZhbGlkKCdwYXNzd29yZCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzd29yZE9uZSAhPT0gcGFzc3dvcmRUd28pIHtcbiAgICAgICAgICB0aGlzLnNldE5vdFZhbGlkKCdwYXNzd29yZF9jb25maXJtJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3VzdG9tZXIucGFzc3dvcmQgPSB0eXBlb2YgdGhpcy5wYXNzd29yZHM/Lm9uZSA9PT0gJ3N0cmluZycgPyB0aGlzLnBhc3N3b3Jkcy5vbmUgOiAnJztcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBkcm9wZG93bk9wdGlvbnMoZmllbGQpIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGZpZWxkPy5vcHRpb25zKSA/IGZpZWxkLm9wdGlvbnMgOiBbXTtcbiAgICB9LFxuICAgIGRyb3Bkb3duT3B0aW9uTGFiZWwoZmllbGQsIG9wdGlvbiwgaW5kZXgpIHtcbiAgICAgIHJldHVybiBmaWVsZC5vcHRpb25fbGFiZWxzPy5baW5kZXhdIHx8IG9wdGlvbjtcbiAgICB9LFxuICAgIHByb2NlZWQoKSB7XG4gICAgICBsZXQgdmFsaWQgPSAodGhpcy52YWxpZC5jdXN0b21lciA9PT0gdHJ1ZSAmJiB0aGlzLnZhbGlkLnBhc3N3b3JkID09PSB0cnVlKTtcblxuICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgIGxldCBvcmRlciA9IHRoaXMuJHN0b3JlLmdldHRlcnMuU3Vic2NyaXB0aW9uT3JkZXI7XG4gICAgICAgIG9yZGVyLmN1c3RvbWVyID0gdGhpcy5jdXN0b21lcjtcblxuICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgndXBkYXRlU3Vic2NyaXB0aW9uT3JkZXInLCBvcmRlcik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuJGVtaXQoKHZhbGlkID8gJ2N1c3RvbWVyX3JlYWR5JyA6ICdjdXN0b21lcl9jYW5jZWwnKSk7XG4gICAgfSxcbiAgICBpbnB1dCh0eXBlKSB7XG4gICAgICBsZXQgdHlwZXMgPSB7XG4gICAgICAgICdGSVJTVF9OQU1FJzogJ3RleHQnLFxuICAgICAgICAnTEFTVF9OQU1FJzogJ3RleHQnLFxuICAgICAgICAnVEVYVCc6ICd0ZXh0JyxcbiAgICAgICAgJ0VNQUlMJzogJ2VtYWlsJyxcbiAgICAgICAgJ0VNQUlMX0NPTkZJUk0nOiAnZW1haWwnLFxuICAgICAgICAnTlVNQkVSJzogJ251bWJlcicsXG4gICAgICAgICdQSE9ORSc6ICd0ZWwnLFxuICAgICAgICAnREFURSc6ICdkYXRlJyxcbiAgICAgICAgJ1pJUENPREUnOiAndGV4dCcsXG4gICAgICAgICdDT01QQU5ZJzogJ3RleHQnLFxuICAgICAgICAnQUREUkVTUyc6ICd0ZXh0JyxcbiAgICAgICAgJ1ZBVF9JRCc6ICd0ZXh0JyxcbiAgICAgICAgJ0NJVFknOiAndGV4dCcsXG4gICAgICAgICdDT1VOVFJZJzogJ3RleHQnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHR5cGVzW3R5cGVdO1xuICAgIH0sXG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHRoaXMuY3VzdG9tZXJba2V5XSA9IHZhbHVlO1xuICAgIH0sXG4gICAgc2hvdWxkRGlzcGxheUZpZWxkKGZpZWxkKSB7XG4gICAgICBpZiAoIWlzQ2hlY2tvdXRWaXNpYmxlKGZpZWxkKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMub3JnYW5pc2F0aW9uIHx8ICF0aGlzLm9yZ2FuaXNhdGlvbi5hbGxvd19idXNpbmVzcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpZWxkLmJ1c2luZXNzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzX2NvbXBhbnk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmlzX2NvbXBhbnkgJiYgdGhpcy5idXNpbmVzc0ZpZWxkVHlwZXMuaW5jbHVkZXMoZmllbGQudHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGlzQnVzaW5lc3NSZWxhdGVkKGZpZWxkKSB7XG4gICAgICBpZiAoIXRoaXMub3JnYW5pc2F0aW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpZWxkLmJ1c2luZXNzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5idXNpbmVzc0ZpZWxkVHlwZXMuaW5jbHVkZXMoZmllbGQudHlwZSk7XG4gICAgfSxcbiAgICBzZXROb3RWYWxpZChuYW1lKSB7XG4gICAgICBpZiAoIXRoaXMudG91Y2hlZEZpZWxkc1tuYW1lXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLiRzZXQodGhpcy5pbnZhbGlkRmllbGRzLCBuYW1lLCB0cnVlKTtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSAkKCdbbmFtZT1cIicgKyBuYW1lICsgJ1wiXScpO1xuICAgICAgY29udHJvbC5hZGRDbGFzcygnYm9yZGVyLWRhbmdlcicpLmF0dHIoJ2FyaWEtaW52YWxpZCcsICd0cnVlJyk7XG4gICAgICBjb25zdCBjb250cm9sSWQgPSBjb250cm9sLmF0dHIoJ2lkJyk7XG4gICAgICBpZiAoY29udHJvbElkKSB7XG4gICAgICAgIGNvbnN0IGVycm9ySWQgPSB0aGlzLmVycm9ySWQoY29udHJvbElkKTtcbiAgICAgICAgY29udHJvbC5hdHRyKCdhcmlhLWRlc2NyaWJlZGJ5JywgZXJyb3JJZCk7XG4gICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBsaXZlQ29udHJvbCA9ICQoJyMnICsgY29udHJvbElkKTtcbiAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSB0aGlzLnZhbGlkYXRpb25NZXNzYWdlKG5hbWUpO1xuICAgICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZXJyb3JJZCkpIHtcbiAgICAgICAgICAgICQoJzxwPicsIHsgaWQ6IGVycm9ySWQsIGNsYXNzOiAndGV4dC1kYW5nZXIgbXQtMScsIHJvbGU6ICdhbGVydCcgfSlcbiAgICAgICAgICAgICAgLnRleHQoZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgICAuaW5zZXJ0QWZ0ZXIobGl2ZUNvbnRyb2wuY2xvc2VzdCgnZmllbGRzZXQnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNldFZhbGlkKG5hbWUpIHtcbiAgICAgIHRoaXMuJHNldCh0aGlzLmludmFsaWRGaWVsZHMsIG5hbWUsIGZhbHNlKTtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSAkKCdbbmFtZT1cIicgKyBuYW1lICsgJ1wiXScpO1xuICAgICAgY29udHJvbC5yZW1vdmVDbGFzcygnYm9yZGVyLWRhbmdlcicpLmF0dHIoJ2FyaWEtaW52YWxpZCcsICdmYWxzZScpO1xuICAgICAgY29uc3QgY29udHJvbElkID0gY29udHJvbC5hdHRyKCdpZCcpO1xuICAgICAgaWYgKGNvbnRyb2xJZCkge1xuICAgICAgICAkKCcjJyArIHRoaXMuZXJyb3JJZChjb250cm9sSWQpKS5yZW1vdmUoKTtcbiAgICAgICAgY29udHJvbC5yZW1vdmVBdHRyKCdhcmlhLWRlc2NyaWJlZGJ5Jyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBlcnJvcklkKGNvbnRyb2xJZCkge1xuICAgICAgcmV0dXJuIGNvbnRyb2xJZC5zdGFydHNXaXRoKCdjdXN0b21lci1maWVsZC0nKVxuICAgICAgICA/IGNvbnRyb2xJZC5yZXBsYWNlKCdjdXN0b21lci1maWVsZC0nLCAnY3VzdG9tZXItZXJyb3ItJylcbiAgICAgICAgOiBgJHtjb250cm9sSWR9LWVycm9yYDtcbiAgICB9LFxuICAgIGlzSW52YWxpZChuYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkRmllbGRzW25hbWVdID09PSB0cnVlO1xuICAgIH0sXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2UobmFtZSkge1xuICAgICAgY29uc3QgaWQgPSBuYW1lLnJlcGxhY2UoL15jdXN0b21lclxcWy8sICcnKS5yZXBsYWNlKC9cXF0kLywgJycpO1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLm9yZ2FuaXNhdGlvbiAmJiB0aGlzLm9yZ2FuaXNhdGlvbi5maWVsZHMgPyB0aGlzLm9yZ2FuaXNhdGlvbi5maWVsZHNbaWRdIDogbnVsbDtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maWVsZHMgJiYgdHlwZW9mIHRoaXMuZmllbGRzW2lkXSAhPT0gJ3VuZGVmaW5lZCcgPyB0aGlzLmZpZWxkc1tpZF0gOiAnJztcbiAgICAgIGxldCBrZXkgPSAnYWNjZXNzaWJpbGl0eS5pbnZhbGlkX3ZhbHVlJztcbiAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5yZXF1aXJlZCAmJiAoIXZhbHVlIHx8ICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKSA9PT0gJycpKSkge1xuICAgICAgICBrZXkgPSAnYWNjZXNzaWJpbGl0eS5yZXF1aXJlZF9maWVsZCc7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkKSB7XG4gICAgICAgIGtleSA9IHtcbiAgICAgICAgICBFTUFJTDogJ2FjY2Vzc2liaWxpdHkuaW52YWxpZF9lbWFpbCcsIEVNQUlMX0NPTkZJUk06ICdhY2Nlc3NpYmlsaXR5LmludmFsaWRfZW1haWwnLFxuICAgICAgICAgIFBIT05FOiAnYWNjZXNzaWJpbGl0eS5pbnZhbGlkX3Bob25lJywgTlVNQkVSOiAnYWNjZXNzaWJpbGl0eS5pbnZhbGlkX251bWJlcicsXG4gICAgICAgICAgREFURTogJ2FjY2Vzc2liaWxpdHkuaW52YWxpZF9kYXRlJywgRFJPUERPV046ICdhY2Nlc3NpYmlsaXR5LmludmFsaWRfc2VsZWN0aW9uJyxcbiAgICAgICAgICBDSEVDS0JPWDogJ2FjY2Vzc2liaWxpdHkuaW52YWxpZF9zZWxlY3Rpb24nXG4gICAgICAgIH1bZmllbGQudHlwZV0gfHwga2V5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudHJhbnMoa2V5KTtcbiAgICB9LFxuICAgIGlzVmFsaWRGaWVsZChmaWVsZCwgc3Vic2NyaXB0aW9uSWQpIHtcbiAgICAgIHJldHVybiBmaWVsZEFwcGxpZXNUbyhmaWVsZCwgJ3N1YnNjcmlwdGlvbicsIHN1YnNjcmlwdGlvbklkKTtcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICBsZXQgZmllbGRzID0ge307XG4gICAgbGV0IHZhbHVlID0gbnVsbDtcblxuICAgIGxldCBwcmVmaWxsID0gJyc7XG5cbiAgICBmb3IgKGNvbnN0IFtpZCwgZmllbGRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMub3JnYW5pc2F0aW9uLmZpZWxkcykpIHtcblxuICAgICAgY29uc3QgbG9ja2FibGVUeXBlcyA9IFsnRklSU1RfTkFNRScsICdMQVNUX05BTUUnLCAnRU1BSUwnXTtcblxuICAgICAgaWYgKGZpZWxkLnR5cGUgIT09ICdDSEVDS0JPWCcpIHtcblxuICAgICAgICBpZiAodGhpcy5jbGllbnQpIHtcblxuICAgICAgICAgIGlmIChmaWVsZC5kZWZhdWx0ID09PSB0cnVlKSB7XG5cbiAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnRklSU1RfTkFNRScpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmNsaWVudC5uYW1lLmZpcnN0O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnTEFTVF9OQU1FJykge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuY2xpZW50Lm5hbWUubGFzdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ0VNQUlMJykge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuY2xpZW50LmVtYWlsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnQ09NUEFOWScpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmNsaWVudC5jb21wYW55O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnQUREUkVTUycpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmNsaWVudC5hZGRyZXNzIHx8ICcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnWklQQ09ERScpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmNsaWVudC56aXBjb2RlIHx8ICcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnQ0lUWScpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmNsaWVudC5jaXR5IHx8ICcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnVkFUX0lEJykge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuY2xpZW50LnZhdF9pZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsb2NrYWJsZVR5cGVzLmluY2x1ZGVzKGZpZWxkLnR5cGUpKSB7XG4gICAgICAgICAgICAgIHRoaXMubG9ja2VkX2ZpZWxkcy5wdXNoKGlkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgIHByZWZpbGwgPSBfLmZpbmQoQXJyYXkuaXNBcnJheSh0aGlzLmNsaWVudC5maWVsZHMpID8gdGhpcy5jbGllbnQuZmllbGRzIDogW10sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlLmlkID09PSBpZDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAocHJlZmlsbCkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHByZWZpbGwudmFsdWU7XG4gICAgICAgICAgICAgIGlmIChsb2NrYWJsZVR5cGVzLmluY2x1ZGVzKGZpZWxkLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2NrZWRfZmllbGRzLnB1c2goaWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09IFwiRU1BSUxfQ09ORklSTVwiKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jbGllbnQuZW1haWw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGNoZWNrb3V0RGVmYXVsdFZhbHVlKGZpZWxkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykgJiYgZmllbGQuZGVmYXVsdF92YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgZmllbGQuZGVmYXVsdF92YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFsdWUgPSBjaGVja291dERlZmF1bHRWYWx1ZShmaWVsZCk7XG4gICAgICB9XG5cbiAgICAgIGZpZWxkc1tpZF0gPSB2YWx1ZTtcblxuICAgIH1cblxuICAgIGlmICh0aGlzLmNsaWVudCkge1xuXG4gICAgICB0aGlzLmN1c3RvbWVyLnRva2VuID0gdGhpcy5jbGllbnQudG9rZW47XG4gICAgICB0aGlzLnZhbGlkLnBhc3N3b3JkID0gdHJ1ZTtcblxuICAgICAgaWYgKHRoaXMuY2xpZW50LmNvbXBhbnkpIHtcbiAgICAgICAgdGhpcy5pc19jb21wYW55ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIHRoaXMuJGVtaXQoJ2NhcnRfdXBkYXRlJyk7XG4gICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIGhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMudmFsaWQuY3VzdG9tZXIgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMucHJvY2VlZCgpO1xuICAgICAgfSxcbiAgICAgIGRlZXA6IHRydWVcbiAgICB9LFxuICAgIHBhc3N3b3Jkczoge1xuICAgICAgaGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy52YWxpZC5wYXNzd29yZCA9IHRoaXMudmFsaWRhdGVfcGFzc3dvcmQoKTtcbiAgICAgICAgdGhpcy5wcm9jZWVkKCk7XG4gICAgICB9LFxuICAgICAgZGVlcDogdHJ1ZVxuICAgIH0sXG4gICAgaXNfY29tcGFueToge1xuICAgICAgaGFuZGxlcih2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5jdXN0b21lci5jb21wYW55ID0gJyc7XG4gICAgICAgICAgdGhpcy5jdXN0b21lci52YXRfaWQgPSAnJztcbiAgICAgICAgICB0aGlzLmN1c3RvbWVyLmFkZHJlc3MgPSAnJztcbiAgICAgICAgICB0aGlzLmN1c3RvbWVyLnppcGNvZGUgPSAnJztcbiAgICAgICAgICB0aGlzLmN1c3RvbWVyLmNpdHkgPSAnJztcblxuICAgICAgICAgIGlmICh0aGlzLmZpZWxkcyAmJiB0aGlzLm9yZ2FuaXNhdGlvbiAmJiB0aGlzLm9yZ2FuaXNhdGlvbi5maWVsZHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2lkLCBmaWVsZF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5vcmdhbmlzYXRpb24uZmllbGRzKSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5pc0J1c2luZXNzUmVsYXRlZChmaWVsZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5maWVsZHMsIGlkLCAnJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXN0b21lci5maWVsZHMgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY3VzdG9tZXIuZmllbGRzLCBpZCkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuJGRlbGV0ZSh0aGlzLmN1c3RvbWVyLmZpZWxkcywgaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlZXA6IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjbGllbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc3RvcmUuZ2V0dGVycy5DbGllbnQ7XG4gICAgfSxcbiAgICBvcmdhbmlzYXRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc3RvcmUuZ2V0dGVycy5PcmdhbmlzYXRpb247XG4gICAgfSxcbiAgICBidXNpbmVzc0ZpZWxkcygpIHtcbiAgICAgIGlmICh0aGlzLm9yZ2FuaXNhdGlvbiAmJiB0aGlzLm9yZ2FuaXNhdGlvbi5idXNpbmVzc19maWVsZHMpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5vcmdhbmlzYXRpb24uYnVzaW5lc3NfZmllbGRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0sXG4gICAgYnVzaW5lc3NGaWVsZFR5cGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuYnVzaW5lc3NGaWVsZHMuZmlsdGVyKGZpZWxkID0+IGZpZWxkLmludm9pY2UpLm1hcChmaWVsZCA9PiBmaWVsZC50eXBlKTtcbiAgICB9LFxuICAgIGN1cnJlbnRMYW5ndWFnZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRzdG9yZS5nZXR0ZXJzLkdsb2JhbCgnbGFuZ3VhZ2UnKSB8fCAnJztcbiAgICB9LFxuICAgIHRlbERlZmF1bHRDb3VudHJ5KCkge1xuICAgICAgY29uc3QgbGFuZyA9IHRoaXMuJHN0b3JlLnN0YXRlLkdsb2JhbHMgJiYgdGhpcy4kc3RvcmUuc3RhdGUuR2xvYmFscy5sYW5ndWFnZTtcbiAgICAgIGlmIChsYW5nKSB7XG4gICAgICAgIHJldHVybiBsYW5nLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBsb2NhbGUgPSBuYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgbmF2aWdhdG9yLnVzZXJMYW5ndWFnZSB8fCAnJztcbiAgICAgIGNvbnN0IHBhcnRzID0gbG9jYWxlLnNwbGl0KCctJyk7XG4gICAgICByZXR1cm4gKHBhcnRzWzFdIHx8IHBhcnRzWzBdIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBzY29wZWQ+XG4udnVlLXRlbC1pbnB1dCB7XG4gIGhlaWdodDogY2FsYygyLjEyNXJlbSArIDJweCk7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkYmRmZWE7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cbi52dWUtdGVsLWlucHV0IC52dGlfX2Ryb3Bkb3duIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgcGFkZGluZzogMCAwLjVyZW07XG59XG4udnVlLXRlbC1pbnB1dCAudnRpX19pbnB1dCB7XG4gIGhlaWdodDogMTAwJTtcbiAgcGFkZGluZzogMC40Mzc1cmVtIDFyZW07XG4gIGJvcmRlcjogMDtcbn1cblxuZmllbGRzZXRbZGF0YS1maWVsZC10eXBlPVwiY291bnRyeVwiXSAudi1zZWxlY3Qge1xuICB3aWR0aDogMTAwJTtcbn1cblxuZmllbGRzZXRbZGF0YS1maWVsZC10eXBlPVwiY291bnRyeVwiXSAudnNfX2Ryb3Bkb3duLXRvZ2dsZSB7XG4gIGhlaWdodDogY2FsYygyLjEyNXJlbSArIDJweCk7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkYmRmZWE7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgcGFkZGluZzogMCAwLjVyZW07XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbmZpZWxkc2V0W2RhdGEtZmllbGQtdHlwZT1cImNvdW50cnlcIl0gLnZzX19zZWxlY3RlZCxcbmZpZWxkc2V0W2RhdGEtZmllbGQtdHlwZT1cImNvdW50cnlcIl0gLnZzX19zZWFyY2gge1xuICBtYXJnaW4tdG9wOiAwO1xufVxuXG5maWVsZHNldFtkYXRhLWZpZWxkLXR5cGU9XCJjb3VudHJ5XCJdIC52c19fc2VhcmNoIHtcbiAgcGFkZGluZzogMDtcbn1cblxuZmllbGRzZXRbZGF0YS1maWVsZC10eXBlPVwiY291bnRyeVwiXSA+Pj4gLnZzX19vcGVuLWluZGljYXRvciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIG1iLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWlubmVyXCI+XG4gICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGVcIj57eyB0cmFucygncHJvZHVjdC5zdGVwcy5jaGVja291dC50aXRsZScpIH19PC9oNT5cbiAgICAgICAgPGg2IGNsYXNzPVwiY2FyZC1zdWJ0aXRsZSBtYi0yIGZmLWJhc2VcIj57eyB0cmFucygncHJvZHVjdC5zdGVwcy5jaGVja291dC5zdWJ0aXRsZScpIH19PC9oNj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTQgYm9yZGVyLXRvcFwiPlxuICAgICAgICAgIDxmb3JtIHYtaWY9XCJmaWVsZHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCIgdi1zaG93PVwib3JnYW5pc2F0aW9uLmFsbG93X2J1c2luZXNzXCI+XG4gICAgICAgICAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wgY3VzdG9tLWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjdXN0b20tY29udHJvbC1pbnB1dFwiIGlkPVwiY3VzdG9tZXJfY29tcGFueVwiIHYtbW9kZWw9XCJpc19jb21wYW55XCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjdXN0b20tY29udHJvbC1sYWJlbFwiIGZvcj1cImN1c3RvbWVyX2NvbXBhbnlcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgdHJhbnMoJ3Byb2R1Y3Quc3RlcHMuY2hlY2tvdXQuY29tcGFueV9vcHRpb24nKSB9fVxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGNvbXBvbmVudCB2LWZvcj1cIihmaWVsZCwgaW5kZXgpIGluIG9yZ2FuaXNhdGlvbi5maWVsZHNcIiA6aXM9XCInZGl2J1wiIDprZXk9XCJgJHtpbmRleH0tJHtjdXJyZW50TGFuZ3VhZ2V9YFwiPlxuICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCIhKGZpZWxkLm9yZGVyICYmIGZpZWxkLnBlcl90aWNrZXQpICYmIGlzVmFsaWRGaWVsZChmaWVsZCwgYCR7dm91Y2hlci5pZH1gKSAmJiBzaG91bGREaXNwbGF5RmllbGQoZmllbGQpXCIgY2xhc3M9XCJtdC0zXCI+XG4gICAgICAgICAgICAgICAgPGZpZWxkc2V0IHYtaWY9XCJmaWVsZC50eXBlID09PSAnQ0hFQ0tCT1gnXCIgOmRhdGEtZmllbGQtdHlwZT1cImZpZWxkLnR5cGUudG9Mb3dlckNhc2UoKVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jb250cm9sIGN1c3RvbS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjdXN0b20tY29udHJvbC1pbnB1dFwiIDpuYW1lPVwiYGN1c3RvbWVyWyR7aW5kZXh9XWBcIiA6aWQ9XCJgY3VzdG9tZXItZmllbGQtJHtpbmRleH1gXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHYtbW9kZWw9XCJmaWVsZHNbaW5kZXhdXCIgOnJlcXVpcmVkPVwiZmllbGQucmVxdWlyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wtbGFiZWxcIiA6Zm9yPVwiYGN1c3RvbWVyLWZpZWxkLSR7aW5kZXh9YFwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLm5hbWUgfX08c3BhbiB2LWlmPVwiZmllbGQucmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICAgICAgPGZpZWxkc2V0IHYtZWxzZS1pZj1cImZpZWxkLnR5cGUgPT09ICdEUk9QRE9XTidcIiA6ZGF0YS1maWVsZC10eXBlPVwiZmllbGQudHlwZS50b0xvd2VyQ2FzZSgpXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJwYXJhZ3JhcGhcIiA6Zm9yPVwiYGN1c3RvbWVyLWZpZWxkLSR7aW5kZXh9YFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5uYW1lIH19PHNwYW4gdi1pZj1cImZpZWxkLnJlcXVpcmVkXCIgY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wtc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIDpuYW1lPVwiYGN1c3RvbWVyWyR7aW5kZXh9XWBcIiA6aWQ9XCJgY3VzdG9tZXItZmllbGQtJHtpbmRleH1gXCIgdi1tb2RlbD1cImZpZWxkc1tpbmRleF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnJlcXVpcmVkPVwiZmllbGQucmVxdWlyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiBzZWxlY3RlZCBkaXNhYmxlZD57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zKCdwcm9kdWN0LnN0ZXBzLmNoZWNrb3V0LmRyb3Bkb3duLnBsYWNlaG9sZGVyJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cIihvcHRpb24sIG9wdGlvbl9pbmRleCkgaW4gZmllbGQub3B0aW9uc1wiIDprZXk9XCJvcHRpb25faW5kZXhcIiA6dmFsdWU9XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZHJvcGRvd25PcHRpb25MYWJlbChmaWVsZCwgb3B0aW9uLCBvcHRpb25faW5kZXgpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgICAgIDxmaWVsZHNldCB2LWVsc2UtaWY9XCJmaWVsZC50eXBlID09PSAnUEhPTkUnXCIgOmRhdGEtZmllbGQtdHlwZT1cImZpZWxkLnR5cGUudG9Mb3dlckNhc2UoKVwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicGFyYWdyYXBoXCIgOmZvcj1cImBjdXN0b21lci1maWVsZC0ke2luZGV4fWBcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubmFtZSB9fTxzcGFuIHYtaWY9XCJmaWVsZC5yZXF1aXJlZFwiIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDx2dWUtdGVsLWlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdi1tb2RlbD1cImZpZWxkc1tpbmRleF1cIlxuICAgICAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImxvY2tlZF9maWVsZHMuaW5jbHVkZXMoaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICA6aW5wdXRPcHRpb25zPVwie1xuICAgICAgICAgICAgICAgICAgICAgIGlkOiBgY3VzdG9tZXItZmllbGQtJHtpbmRleH1gLFxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGBjdXN0b21lclske2luZGV4fV1gLFxuICAgICAgICAgICAgICAgICAgICAgIHNob3dEaWFsQ29kZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJydcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgOmRlZmF1bHRDb3VudHJ5PVwidGVsRGVmYXVsdENvdW50cnlcIlxuICAgICAgICAgICAgICAgICAgICAgIDpyZXF1aXJlZD1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtc2xvdDphcnJvdy1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvdnVlLXRlbC1pbnB1dD5cbiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgICAgIDxmaWVsZHNldCB2LWVsc2UtaWY9XCJmaWVsZC50eXBlID09PSAnQ09VTlRSWSdcIiA6ZGF0YS1maWVsZC10eXBlPVwiZmllbGQudHlwZS50b0xvd2VyQ2FzZSgpXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJwYXJhZ3JhcGhcIiA6Zm9yPVwiYGN1c3RvbWVyLWZpZWxkLSR7aW5kZXh9YFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5uYW1lIH19PHNwYW4gdi1pZj1cImZpZWxkLnJlcXVpcmVkXCIgY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxDb3VudHJ5U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgdi1tb2RlbD1cImZpZWxkc1tpbmRleF1cIlxuICAgICAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImxvY2tlZF9maWVsZHMuaW5jbHVkZXMoaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgOnBsYWNlaG9sZGVyPVwidHJhbnMoJ3Byb2R1Y3Quc3RlcHMuY2hlY2tvdXQuZHJvcGRvd24ucGxhY2Vob2xkZXInKVwiXG4gICAgICAgICAgICAgICAgICAgIDppbnB1dC1pZD1cImBjdXN0b21lci1maWVsZC0ke2luZGV4fWBcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICAgICAgICA8ZmllbGRzZXQgdi1lbHNlIDpjbGFzcz1cInsnYm9yZGVyLWJvdHRvbSBwYi00JzogZmllbGQudHlwZSA9PT0gJ1ZBVF9JRCd9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOmRhdGEtZmllbGQtdHlwZT1cImZpZWxkLnR5cGUudG9Mb3dlckNhc2UoKVwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicGFyYWdyYXBoXCIgOmZvcj1cImBjdXN0b21lci1maWVsZC0ke2luZGV4fWBcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubmFtZSB9fTxzcGFuIHYtaWY9XCJmaWVsZC5yZXF1aXJlZFwiIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCA6aWQ9XCJgY3VzdG9tZXItZmllbGQtJHtpbmRleH1gXCIgOm5hbWU9XCJgY3VzdG9tZXJbJHtpbmRleH1dYFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdi1tb2RlbD1cImZpZWxkc1tpbmRleF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlPVwiaW5wdXQoZmllbGQudHlwZSlcIiA6cmVxdWlyZWQ9XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgOnBsYWNlaG9sZGVyPVwiZmllbGQuaGVscF90ZXh0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICA6ZGlzYWJsZWQ9XCJsb2NrZWRfZmllbGRzLmluY2x1ZGVzKGluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgQGJsdXI9XCJtYXJrVG91Y2hlZChgY3VzdG9tZXJbJHtpbmRleH1dYClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIDphcmlhLWludmFsaWQ9XCJpc0ludmFsaWQoYGN1c3RvbWVyWyR7aW5kZXh9XWApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICA6YXJpYS1kZXNjcmliZWRieT1cImlzSW52YWxpZChgY3VzdG9tZXJbJHtpbmRleH1dYCkgPyBgY3VzdG9tZXItZXJyb3ItJHtpbmRleH1gIDogbnVsbFwiLz5cbiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgICAgIDxwIHYtaWY9XCJmaWVsZC5oZWxwX3RleHRcIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGwgbXQtMVwiPnt7IGZpZWxkLmhlbHBfdGV4dCB9fTwvcD5cbiAgICAgICAgICAgICAgICA8cCB2LWlmPVwiaXNJbnZhbGlkKGBjdXN0b21lclske2luZGV4fV1gKVwiIDppZD1cImBjdXN0b21lci1lcnJvci0ke2luZGV4fWBcIiBjbGFzcz1cInRleHQtZGFuZ2VyIG10LTFcIiByb2xlPVwiYWxlcnRcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHZhbGlkYXRpb25NZXNzYWdlKGBjdXN0b21lclske2luZGV4fV1gKSB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1ncmF5IGZvbnQtaXRhbGljXCI+XG4gICAgICAgICAgICAgIDxzcGFuPio8L3NwYW4+ID0ge3sgdHJhbnMoJ3Byb2R1Y3Quc3RlcHMuY2hlY2tvdXQucmVxdWlyZWQnKSB9fVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5cbmltcG9ydCB7Y2hlY2tvdXREZWZhdWx0VmFsdWUsIGZpZWxkQXBwbGllc1RvLCBpc0NoZWNrb3V0VmlzaWJsZX0gZnJvbSAnLi4vLi4vdXRpbHMvZm9ybUZpZWxkcyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcblxuICBwcm9wczogWyd2b3VjaGVyJ10sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VzdG9tZXI6IHtcbiAgICAgICAgY29tcGFueTogJycsXG4gICAgICAgIGZpcnN0X25hbWU6ICcnLFxuICAgICAgICBsYXN0X25hbWU6ICcnLFxuICAgICAgICBlbWFpbDogJycsXG4gICAgICAgIGFkZHJlc3M6ICcnLFxuICAgICAgICB6aXBjb2RlOiAnJyxcbiAgICAgICAgY2l0eTogJycsXG4gICAgICAgIHZhdF9pZDogJydcbiAgICAgIH0sXG4gICAgICBmaWVsZHM6IG51bGwsXG4gICAgICBpbnZhbGlkRmllbGRzOiB7fSxcbiAgICAgIHRvdWNoZWRGaWVsZHM6IHt9LFxuICAgICAgbG9ja2VkX2ZpZWxkczogW10sXG4gICAgICBpc19jb21wYW55OiBmYWxzZSxcbiAgICAgIHRlbElucHV0T3B0aW9uczoge1xuICAgICAgICBzaG93RGlhbENvZGU6IHRydWUsXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnJyxcbiAgICAgICAgc3R5bGVDbGFzc2VzOiBbJ2Zvcm0tY29udHJvbCcsICd3LTEwMCcsICdib3JkZXItMCddXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBtYXJrVG91Y2hlZChuYW1lKSB7XG4gICAgICB0aGlzLiRzZXQodGhpcy50b3VjaGVkRmllbGRzLCBuYW1lLCB0cnVlKTtcbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICB9LFxuICAgIHZhbGlkYXRlKCkge1xuICAgICAgbGV0IHZhbGlkYXRvcnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlczogWydURVhUJywgJ0ZJUlNUX05BTUUnLCAnTEFTVF9OQU1FJywgJ0NPTVBBTlknLCAnQUREUkVTUycsICdWQVRfSUQnLCAnWklQQ09ERScsICdDSVRZJywgJ0NPVU5UUlknXSxcbiAgICAgICAgICByZWdleDogbmV3IFJlZ0V4cCgvXi57MSw2NTUzNX0kLywgJ2knKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZXM6IFsnRU1BSUwnLCAnRU1BSUxfQ09ORklSTSddLFxuICAgICAgICAgIHJlZ2V4OiBuZXcgUmVnRXhwKC9eKChbXjw+KClbXFxdXFxcXC4sOzpcXHNAXCJdKyhcXC5bXjw+KClbXFxdXFxcXC4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKChcXFtbMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFxdKXwoKFthLXpBLVpcXC0wLTldK1xcLikrW2EtekEtWl17Mix9KSkkLywgJ2knKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZXM6IFsnTlVNQkVSJ10sXG4gICAgICAgICAgcmVnZXg6IG5ldyBSZWdFeHAoL15bMC05XXsxLDUwfShbLC5dWzAtOV17MSwyfSk/JC8sICdpJylcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGVzOiBbJ1BIT05FJ10sXG4gICAgICAgICAgcmVnZXg6IG5ldyBSZWdFeHAoL14oPz0oPzpcXEQqXFxkKXsxMCwxNX1cXEQqJClcXCs/WzAtOV17MSwzfVtcXHMtXT8oPzpcXCgwP1swLTldezEsNX1cXCl8WzAtOV17MSw1fSlbLVxcc10/WzAtOV1bXFxkXFxzLV17NSw3fVxccz8oPzp4W1xcZC1dezAsNH0pPyQvKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZXM6IFsnREFURSddLFxuICAgICAgICAgIHJlZ2V4OiBuZXcgUmVnRXhwKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLywgJ2knKVxuICAgICAgICB9XG4gICAgICBdO1xuXG4gICAgICBsZXQgZW1haWxzID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgW2lkLCBmaWVsZF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5vcmdhbmlzYXRpb24uZmllbGRzKSkge1xuXG4gICAgICAgIGlmICgoZmllbGQub3JkZXIgJiYgZmllbGQucGVyX3RpY2tldCkgfHwgIXRoaXMuaXNWYWxpZEZpZWxkKGZpZWxkLCBgJHt0aGlzLnZvdWNoZXIuaWR9YCkgfHwgIXRoaXMuc2hvdWxkRGlzcGxheUZpZWxkKGZpZWxkKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5maWVsZHNbaWRdO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnUEhPTkUnICYmICFmaWVsZC5yZXF1aXJlZCAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgZGlnaXRzID0gdmFsdWUucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICAgICAgICBpZiAoZGlnaXRzLmxlbmd0aCA8PSA0KSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0VmFsaWQoJ2N1c3RvbWVyWycgKyBpZCArICddJyk7XG5cbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdDSEVDS0JPWCcpIHtcblxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdGhpcy5zZXROb3RWYWxpZCgnY3VzdG9tZXJbJyArIGlkICsgJ10nKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZmllbGQucmVxdWlyZWQgJiYgdmFsdWUgIT09IHRydWUgJiYgdGhpcy5pc1ZhbGlkRmllbGQoZmllbGQsIGAke3RoaXMudm91Y2hlci5pZH1gKSkge1xuICAgICAgICAgICAgdGhpcy5zZXROb3RWYWxpZCgnY3VzdG9tZXJbJyArIGlkICsgJ10nKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnRFJPUERPV04nKSB7XG5cbiAgICAgICAgICBpZiAoZmllbGQucmVxdWlyZWQgJiYgdmFsdWUubGVuZ3RoID09PSAwICYmIHRoaXMuaXNWYWxpZEZpZWxkKGZpZWxkLCBgJHt0aGlzLnZvdWNoZXIuaWR9YCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Tm90VmFsaWQoJ2N1c3RvbWVyWycgKyBpZCArICddJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcblxuICAgICAgICAgICAgaWYgKCFmaWVsZC5vcHRpb25zLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICB0aGlzLnNldE5vdFZhbGlkKCdjdXN0b21lclsnICsgaWQgKyAnXScpO1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgIGlmICghdGhpcy5zaG91bGREaXNwbGF5RmllbGQoZmllbGQpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgdmFsaWRhdG9yID0gXy5maW5kKHZhbGlkYXRvcnMsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZS50eXBlcy5pbmNsdWRlcyhmaWVsZC50eXBlKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLnNldE5vdFZhbGlkKCdjdXN0b21lclsnICsgaWQgKyAnXScpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChmaWVsZC5yZXF1aXJlZCAmJiB2YWx1ZS5sZW5ndGggPT09IDAgJiYgdGhpcy5pc1ZhbGlkRmllbGQoZmllbGQsIGAke3RoaXMudm91Y2hlci5pZH1gKSkge1xuICAgICAgICAgICAgdGhpcy5zZXROb3RWYWxpZCgnY3VzdG9tZXJbJyArIGlkICsgJ10nKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xuXG4gICAgICAgICAgICBpZiAodmFsaWRhdG9yLnJlZ2V4LnRlc3QodmFsdWUpICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0Tm90VmFsaWQoJ2N1c3RvbWVyWycgKyBpZCArICddJyk7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdFTUFJTF9DT05GSVJNJykge1xuICAgICAgICAgICAgICBlbWFpbHMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZC5kZWZhdWx0KSB7XG5cbiAgICAgICAgICB0aGlzLmN1c3RvbWVyW2ZpZWxkLnR5cGUudG9Mb3dlckNhc2UoKV0gPSB2YWx1ZTtcblxuICAgICAgICAgIGNvbnN0IHNob3VsZFBlcnNpc3REZWZhdWx0RmllbGQgPSBbJ0NPTVBBTlknLCAnQUREUkVTUycsICdaSVBDT0RFJywgJ0NJVFknLCAnVkFUX0lEJ10uaW5jbHVkZXMoZmllbGQudHlwZSk7XG5cbiAgICAgICAgICBpZiAoc2hvdWxkUGVyc2lzdERlZmF1bHRGaWVsZCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmN1c3RvbWVyLmhhc093blByb3BlcnR5KCdmaWVsZHMnKSkge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbWVyLmZpZWxkcyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21lci5maWVsZHNbaWRdID0gdmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jdXN0b21lci5maWVsZHNbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnRU1BSUwnKSB7XG4gICAgICAgICAgICBlbWFpbHMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuY3VzdG9tZXIuaGFzT3duUHJvcGVydHkoJ2ZpZWxkcycpKSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbWVyLmZpZWxkcyA9IHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChmaWVsZC50eXBlICE9PSAnQ0hFQ0tCT1gnKSB7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21lci5maWVsZHNbaWRdID0gdmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jdXN0b21lci5maWVsZHNbaWRdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tZXIuZmllbGRzW2lkXSA9IHZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgICAgaWYgKGVtYWlscy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0ID0gZW1haWxzWzBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghZW1haWxzLmV2ZXJ5KChjdXIpID0+IGN1ci50b0xvd2VyQ2FzZSgpID09PSBmaXJzdCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBpbnB1dCh0eXBlKSB7XG4gICAgICBsZXQgdHlwZXMgPSB7XG4gICAgICAgICdGSVJTVF9OQU1FJzogJ3RleHQnLFxuICAgICAgICAnTEFTVF9OQU1FJzogJ3RleHQnLFxuICAgICAgICAnVEVYVCc6ICd0ZXh0JyxcbiAgICAgICAgJ0VNQUlMJzogJ2VtYWlsJyxcbiAgICAgICAgJ0VNQUlMX0NPTkZJUk0nOiAnZW1haWwnLFxuICAgICAgICAnTlVNQkVSJzogJ251bWJlcicsXG4gICAgICAgICdQSE9ORSc6ICd0ZWwnLFxuICAgICAgICAnREFURSc6ICdkYXRlJyxcbiAgICAgICAgJ1pJUENPREUnOiAndGV4dCcsXG4gICAgICAgICdDT01QQU5ZJzogJ3RleHQnLFxuICAgICAgICAnQUREUkVTUyc6ICd0ZXh0JyxcbiAgICAgICAgJ1ZBVF9JRCc6ICd0ZXh0JyxcbiAgICAgICAgJ0NJVFknOiAndGV4dCcsXG4gICAgICAgICdDT1VOVFJZJzogJ3RleHQnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHR5cGVzW3R5cGVdO1xuICAgIH0sXG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHRoaXMuY3VzdG9tZXJba2V5XSA9IHZhbHVlO1xuICAgIH0sXG4gICAgZHJvcGRvd25PcHRpb25MYWJlbChmaWVsZCwgb3B0aW9uLCBpbmRleCkge1xuICAgICAgcmV0dXJuIGZpZWxkLm9wdGlvbl9sYWJlbHM/LltpbmRleF0gfHwgb3B0aW9uO1xuICAgIH0sXG4gICAgc2hvdWxkRGlzcGxheUZpZWxkKGZpZWxkKSB7XG4gICAgICBpZiAoIWlzQ2hlY2tvdXRWaXNpYmxlKGZpZWxkKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMub3JnYW5pc2F0aW9uIHx8ICF0aGlzLm9yZ2FuaXNhdGlvbi5hbGxvd19idXNpbmVzcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpZWxkLmJ1c2luZXNzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzX2NvbXBhbnk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmlzX2NvbXBhbnkgJiYgdGhpcy5idXNpbmVzc0ZpZWxkVHlwZXMuaW5jbHVkZXMoZmllbGQudHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGlzQnVzaW5lc3NSZWxhdGVkKGZpZWxkKSB7XG4gICAgICBpZiAoIXRoaXMub3JnYW5pc2F0aW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpZWxkLmJ1c2luZXNzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5idXNpbmVzc0ZpZWxkVHlwZXMuaW5jbHVkZXMoZmllbGQudHlwZSk7XG4gICAgfSxcbiAgICBzZXROb3RWYWxpZChuYW1lKSB7XG4gICAgICBpZiAoIXRoaXMudG91Y2hlZEZpZWxkc1tuYW1lXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLiRzZXQodGhpcy5pbnZhbGlkRmllbGRzLCBuYW1lLCB0cnVlKTtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSAkKCdbbmFtZT1cIicgKyBuYW1lICsgJ1wiXScpO1xuICAgICAgY29udHJvbC5hZGRDbGFzcygnYm9yZGVyLWRhbmdlcicpLmF0dHIoJ2FyaWEtaW52YWxpZCcsICd0cnVlJyk7XG4gICAgICBjb25zdCBjb250cm9sSWQgPSBjb250cm9sLmF0dHIoJ2lkJyk7XG4gICAgICBpZiAoY29udHJvbElkKSB7XG4gICAgICAgIGNvbnN0IGVycm9ySWQgPSBjb250cm9sSWQucmVwbGFjZSgnY3VzdG9tZXItZmllbGQtJywgJ2N1c3RvbWVyLWVycm9yLScpO1xuICAgICAgICBjb250cm9sLmF0dHIoJ2FyaWEtZGVzY3JpYmVkYnknLCBlcnJvcklkKTtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGxpdmVDb250cm9sID0gJCgnIycgKyBjb250cm9sSWQpO1xuICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IHRoaXMudmFsaWRhdGlvbk1lc3NhZ2UobmFtZSk7XG4gICAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlcnJvcklkKSkge1xuICAgICAgICAgICAgJCgnPHA+JywgeyBpZDogZXJyb3JJZCwgY2xhc3M6ICd0ZXh0LWRhbmdlciBtdC0xJywgcm9sZTogJ2FsZXJ0JyB9KVxuICAgICAgICAgICAgICAudGV4dChlcnJvck1lc3NhZ2UpXG4gICAgICAgICAgICAgIC5pbnNlcnRBZnRlcihsaXZlQ29udHJvbC5jbG9zZXN0KCdmaWVsZHNldCcpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2V0VmFsaWQobmFtZSkge1xuICAgICAgdGhpcy4kc2V0KHRoaXMuaW52YWxpZEZpZWxkcywgbmFtZSwgZmFsc2UpO1xuICAgICAgY29uc3QgY29udHJvbCA9ICQoJ1tuYW1lPVwiJyArIG5hbWUgKyAnXCJdJyk7XG4gICAgICBjb250cm9sLnJlbW92ZUNsYXNzKCdib3JkZXItZGFuZ2VyJykuYXR0cignYXJpYS1pbnZhbGlkJywgJ2ZhbHNlJyk7XG4gICAgICBjb25zdCBjb250cm9sSWQgPSBjb250cm9sLmF0dHIoJ2lkJyk7XG4gICAgICBpZiAoY29udHJvbElkKSB7XG4gICAgICAgICQoJyMnICsgY29udHJvbElkLnJlcGxhY2UoJ2N1c3RvbWVyLWZpZWxkLScsICdjdXN0b21lci1lcnJvci0nKSkucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBpc0ludmFsaWQobmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZEZpZWxkc1tuYW1lXSA9PT0gdHJ1ZTtcbiAgICB9LFxuICAgIHZhbGlkYXRpb25NZXNzYWdlKG5hbWUpIHtcbiAgICAgIGNvbnN0IGlkID0gbmFtZS5yZXBsYWNlKC9eY3VzdG9tZXJcXFsvLCAnJykucmVwbGFjZSgvXFxdJC8sICcnKTtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5vcmdhbmlzYXRpb24gJiYgdGhpcy5vcmdhbmlzYXRpb24uZmllbGRzID8gdGhpcy5vcmdhbmlzYXRpb24uZmllbGRzW2lkXSA6IG51bGw7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZmllbGRzICYmIHR5cGVvZiB0aGlzLmZpZWxkc1tpZF0gIT09ICd1bmRlZmluZWQnID8gdGhpcy5maWVsZHNbaWRdIDogJyc7XG4gICAgICBsZXQga2V5ID0gJ2FjY2Vzc2liaWxpdHkuaW52YWxpZF92YWx1ZSc7XG4gICAgICBpZiAoZmllbGQgJiYgZmllbGQucmVxdWlyZWQgJiYgKCF2YWx1ZSB8fCAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkgPT09ICcnKSkpIHtcbiAgICAgICAga2V5ID0gJ2FjY2Vzc2liaWxpdHkucmVxdWlyZWRfZmllbGQnO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZCkge1xuICAgICAgICBrZXkgPSB7XG4gICAgICAgICAgRU1BSUw6ICdhY2Nlc3NpYmlsaXR5LmludmFsaWRfZW1haWwnLCBFTUFJTF9DT05GSVJNOiAnYWNjZXNzaWJpbGl0eS5pbnZhbGlkX2VtYWlsJyxcbiAgICAgICAgICBQSE9ORTogJ2FjY2Vzc2liaWxpdHkuaW52YWxpZF9waG9uZScsIE5VTUJFUjogJ2FjY2Vzc2liaWxpdHkuaW52YWxpZF9udW1iZXInLFxuICAgICAgICAgIERBVEU6ICdhY2Nlc3NpYmlsaXR5LmludmFsaWRfZGF0ZScsIERST1BET1dOOiAnYWNjZXNzaWJpbGl0eS5pbnZhbGlkX3NlbGVjdGlvbicsXG4gICAgICAgICAgQ0hFQ0tCT1g6ICdhY2Nlc3NpYmlsaXR5LmludmFsaWRfc2VsZWN0aW9uJ1xuICAgICAgICB9W2ZpZWxkLnR5cGVdIHx8IGtleTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRyYW5zKGtleSk7XG4gICAgfSxcbiAgICBpc1ZhbGlkRmllbGQoZmllbGQsIHZvdWNoZXJJZCkge1xuICAgICAgcmV0dXJuIGZpZWxkQXBwbGllc1RvKGZpZWxkLCAndm91Y2hlcicsIHZvdWNoZXJJZCk7XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgbGV0IGZpZWxkcyA9IHt9O1xuICAgIGxldCB2YWx1ZSA9IG51bGw7XG5cbiAgICBsZXQgcHJlZmlsbCA9ICcnO1xuXG4gICAgZm9yIChjb25zdCBbaWQsIGZpZWxkXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm9yZ2FuaXNhdGlvbi5maWVsZHMpKSB7XG5cbiAgICAgIGNvbnN0IGxvY2thYmxlVHlwZXMgPSBbJ0ZJUlNUX05BTUUnLCAnTEFTVF9OQU1FJywgJ0VNQUlMJ107XG5cbiAgICAgIGlmIChmaWVsZC50eXBlICE9PSAnQ0hFQ0tCT1gnKSB7XG5cbiAgICAgICAgaWYgKHRoaXMuY2xpZW50KSB7XG5cbiAgICAgICAgICBpZiAoZmllbGQuZGVmYXVsdCA9PT0gdHJ1ZSkge1xuXG4gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ0ZJUlNUX05BTUUnKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jbGllbnQubmFtZS5maXJzdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ0xBU1RfTkFNRScpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmNsaWVudC5uYW1lLmxhc3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdFTUFJTCcpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmNsaWVudC5lbWFpbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ0NPTVBBTlknKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jbGllbnQuY29tcGFueTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ0FERFJFU1MnKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jbGllbnQuYWRkcmVzcyB8fCAnJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ1pJUENPREUnKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jbGllbnQuemlwY29kZSB8fCAnJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ0NJVFknKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jbGllbnQuY2l0eSB8fCAnJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ1ZBVF9JRCcpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmNsaWVudC52YXRfaWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobG9ja2FibGVUeXBlcy5pbmNsdWRlcyhmaWVsZC50eXBlKSkge1xuICAgICAgICAgICAgICB0aGlzLmxvY2tlZF9maWVsZHMucHVzaChpZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICBwcmVmaWxsID0gXy5maW5kKHRoaXMuY2xpZW50LmZpZWxkcywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUuaWQgPT09IGlkO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChwcmVmaWxsKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gcHJlZmlsbC52YWx1ZTtcbiAgICAgICAgICAgICAgaWYgKGxvY2thYmxlVHlwZXMuaW5jbHVkZXMoZmllbGQudHlwZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2tlZF9maWVsZHMucHVzaChpZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJFTUFJTF9DT05GSVJNXCIpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmNsaWVudC5lbWFpbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gY2hlY2tvdXREZWZhdWx0VmFsdWUoZmllbGQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSAmJiBmaWVsZC5kZWZhdWx0X3ZhbHVlICE9PSBudWxsICYmIHR5cGVvZiBmaWVsZC5kZWZhdWx0X3ZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YWx1ZSA9IGNoZWNrb3V0RGVmYXVsdFZhbHVlKGZpZWxkKTtcbiAgICAgIH1cblxuICAgICAgZmllbGRzW2lkXSA9IHZhbHVlO1xuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2xpZW50KSB7XG5cbiAgICAgIHRoaXMuY3VzdG9tZXIudG9rZW4gPSB0aGlzLmNsaWVudC50b2tlbjtcblxuICAgICAgaWYgKHRoaXMuY2xpZW50LmNvbXBhbnkpIHtcbiAgICAgICAgdGhpcy5pc19jb21wYW55ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIHRoaXMuJGVtaXQoJ2NhcnRfdXBkYXRlJyk7XG4gICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIGhhbmRsZXIoKSB7XG4gICAgICAgIGxldCB2YWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcblxuICAgICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgICBsZXQgb3JkZXIgPSB0aGlzLiRzdG9yZS5nZXR0ZXJzLlZvdWNoZXJPcmRlcjtcblxuICAgICAgICAgIG9yZGVyLmN1c3RvbWVyID0gdGhpcy5jdXN0b21lcjtcbiAgICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgndXBkYXRlVm91Y2hlck9yZGVyJywgb3JkZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4kZW1pdCgodmFsaWQgPyAnY3VzdG9tZXJfcmVhZHknIDogJ2N1c3RvbWVyX2NhbmNlbCcpKTtcbiAgICAgIH0sXG4gICAgICBkZWVwOiB0cnVlXG4gICAgfSxcbiAgICBpc19jb21wYW55OiB7XG4gICAgICBoYW5kbGVyKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICB0aGlzLmN1c3RvbWVyLmNvbXBhbnkgPSAnJztcbiAgICAgICAgICB0aGlzLmN1c3RvbWVyLnZhdF9pZCA9ICcnO1xuICAgICAgICAgIHRoaXMuY3VzdG9tZXIuYWRkcmVzcyA9ICcnO1xuICAgICAgICAgIHRoaXMuY3VzdG9tZXIuemlwY29kZSA9ICcnO1xuICAgICAgICAgIHRoaXMuY3VzdG9tZXIuY2l0eSA9ICcnO1xuXG4gICAgICAgICAgaWYgKHRoaXMuZmllbGRzICYmIHRoaXMub3JnYW5pc2F0aW9uICYmIHRoaXMub3JnYW5pc2F0aW9uLmZpZWxkcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaWQsIGZpZWxkXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm9yZ2FuaXNhdGlvbi5maWVsZHMpKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmlzQnVzaW5lc3NSZWxhdGVkKGZpZWxkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLmZpZWxkcywgaWQsICcnKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbWVyLmZpZWxkcyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jdXN0b21lci5maWVsZHMsIGlkKSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy4kZGVsZXRlKHRoaXMuY3VzdG9tZXIuZmllbGRzLCBpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVlcDogdHJ1ZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGNsaWVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRzdG9yZS5nZXR0ZXJzLkNsaWVudDtcbiAgICB9LFxuICAgIHJlYm9va2luZygpIHtcbiAgICAgIHJldHVybiB0aGlzLiRzdG9yZS5nZXR0ZXJzLlJlYm9va2luZztcbiAgICB9LFxuICAgIG9yZ2FuaXNhdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLiRzdG9yZS5nZXR0ZXJzLk9yZ2FuaXNhdGlvbjtcbiAgICB9LFxuICAgIGJ1c2luZXNzRmllbGRzKCkge1xuICAgICAgaWYgKHRoaXMub3JnYW5pc2F0aW9uICYmIHRoaXMub3JnYW5pc2F0aW9uLmJ1c2luZXNzX2ZpZWxkcykge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLm9yZ2FuaXNhdGlvbi5idXNpbmVzc19maWVsZHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW107XG4gICAgfSxcbiAgICBidXNpbmVzc0ZpZWxkVHlwZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5idXNpbmVzc0ZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQuaW52b2ljZSkubWFwKGZpZWxkID0+IGZpZWxkLnR5cGUpO1xuICAgIH0sXG4gICAgY3VycmVudExhbmd1YWdlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnMuR2xvYmFsKCdsYW5ndWFnZScpIHx8ICcnO1xuICAgIH0sXG4gICAgdGVsRGVmYXVsdENvdW50cnkoKSB7XG4gICAgICBjb25zdCBsYW5nID0gdGhpcy4kc3RvcmUuc3RhdGUuR2xvYmFscyAmJiB0aGlzLiRzdG9yZS5zdGF0ZS5HbG9iYWxzLmxhbmd1YWdlO1xuICAgICAgaWYgKGxhbmcpIHtcbiAgICAgICAgcmV0dXJuIGxhbmcudG9Mb3dlckNhc2UoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvY2FsZSA9IG5hdmlnYXRvci5sYW5ndWFnZSB8fCBuYXZpZ2F0b3IudXNlckxhbmd1YWdlIHx8ICcnO1xuICAgICAgY29uc3QgcGFydHMgPSBsb2NhbGUuc3BsaXQoJy0nKTtcbiAgICAgIHJldHVybiAocGFydHNbMV0gfHwgcGFydHNbMF0gfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIHNjb3BlZD5cbi52dWUtdGVsLWlucHV0IHtcbiAgaGVpZ2h0OiBjYWxjKDIuMTI1cmVtICsgMnB4KTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RiZGZlYTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuXG4udnVlLXRlbC1pbnB1dCAudnRpX19kcm9wZG93biB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDAgMC41cmVtO1xufVxuXG4udnVlLXRlbC1pbnB1dCAudnRpX19pbnB1dCB7XG4gIGhlaWdodDogMTAwJTtcbiAgcGFkZGluZzogMC40Mzc1cmVtIDFyZW07XG4gIGJvcmRlcjogMDtcbn1cblxuZmllbGRzZXRbZGF0YS1maWVsZC10eXBlPVwiY291bnRyeVwiXSAudi1zZWxlY3Qge1xuICB3aWR0aDogMTAwJTtcbn1cblxuZmllbGRzZXRbZGF0YS1maWVsZC10eXBlPVwiY291bnRyeVwiXSAudnNfX2Ryb3Bkb3duLXRvZ2dsZSB7XG4gIGhlaWdodDogY2FsYygyLjEyNXJlbSArIDJweCk7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkYmRmZWE7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgcGFkZGluZzogMCAwLjVyZW07XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbmZpZWxkc2V0W2RhdGEtZmllbGQtdHlwZT1cImNvdW50cnlcIl0gLnZzX19zZWxlY3RlZCxcbmZpZWxkc2V0W2RhdGEtZmllbGQtdHlwZT1cImNvdW50cnlcIl0gLnZzX19zZWFyY2gge1xuICBtYXJnaW4tdG9wOiAwO1xufVxuXG5maWVsZHNldFtkYXRhLWZpZWxkLXR5cGU9XCJjb3VudHJ5XCJdIC52c19fc2VhcmNoIHtcbiAgcGFkZGluZzogMDtcbn1cblxuZmllbGRzZXRbZGF0YS1maWVsZC10eXBlPVwiY291bnRyeVwiXSA+Pj4gLnZzX19vcGVuLWluZGljYXRvciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIG1iLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWlubmVyXCI+XG4gICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGUgbWItMlwiPnt7IHRyYW5zKCd2b3VjaGVyX3RlbXBsYXRlX3NlbGVjdGlvbi50aXRsZScpIH19PC9oNT5cbiAgICAgICAgPGg2IGNsYXNzPVwiY2FyZC1zdWJ0aXRsZSBtdC0wIG1iLTMgZmYtYmFzZVwiPnt7IHRyYW5zKCd2b3VjaGVyX3RlbXBsYXRlX3NlbGVjdGlvbi5kZXNjcmlwdGlvbicpIH19PC9oNj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctZ3NcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIiB2LWZvcj1cIm9wdGlvbiBpbiB0ZW1wbGF0ZXNcIiA6a2V5PVwib3B0aW9uLmlkXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiY2FyZCBzaGFkb3ctbm9uZSBoLTEwMCB0ZW1wbGF0ZS1jYXJkXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwic2VsZWN0ZWQgPT09IG9wdGlvbi5pZCA/ICdib3JkZXIgYm9yZGVyLXByaW1hcnkgdGVtcGxhdGUtY2FyZC0tc2VsZWN0ZWQnIDogJ2JvcmRlciBib3JkZXItbGlnaHQnXCJcbiAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgIDphcmlhLXByZXNzZWQ9XCJzZWxlY3RlZCA9PT0gb3B0aW9uLmlkID8gJ3RydWUnIDogJ2ZhbHNlJ1wiXG4gICAgICAgICAgICAgIDphcmlhLWxhYmVsPVwib3B0aW9uLnRpdGxlXCJcbiAgICAgICAgICAgICAgQGNsaWNrLnByZXZlbnQ9XCJzZWxlY3RUZW1wbGF0ZShvcHRpb24uaWQpXCJcbiAgICAgICAgICAgICAgQGtleWRvd24uZW50ZXIucHJldmVudD1cInNlbGVjdFRlbXBsYXRlKG9wdGlvbi5pZClcIlxuICAgICAgICAgICAgICBAa2V5ZG93bi5zcGFjZS5wcmV2ZW50PVwic2VsZWN0VGVtcGxhdGUob3B0aW9uLmlkKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZSB0ZW1wbGF0ZS1jYXJkX19pbWFnZVwiPlxuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgIDpzcmM9XCJvcHRpb24ucHJldmlldyB8fCBwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICA6YWx0PVwib3B0aW9uLnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0xMDBcIlxuICAgICAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgdi1pZj1cInNlbGVjdGVkID09PSBvcHRpb24uaWRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJiYWRnZSBiYWRnZS1wcmltYXJ5IGJhZGdlLXBpbGwgcG9zaXRpb24tYWJzb2x1dGUgdGVtcGxhdGUtY2FyZF9fYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgOmFyaWEtbGFiZWw9XCJ0cmFucygndm91Y2hlcl90ZW1wbGF0ZV9zZWxlY3Rpb24uc2VsZWN0ZWQnKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGVtIGNsYXNzPVwiaWNvbiBuaSBuaS1jaGVja1wiPjwvZW0+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy0xNXB4IGZvbnQtd2VpZ2h0LWJvbGQgdGV4dC10cnVuY2F0ZSBwci0yXCI+e3sgb3B0aW9uLnRpdGxlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwic2VsZWN0ZWQgPT09IG9wdGlvbi5pZFwiIGNsYXNzPVwidGV4dC1wcmltYXJ5IGZzLTEycHggZm9udC13ZWlnaHQtYm9sZFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyB0cmFucygndm91Y2hlcl90ZW1wbGF0ZV9zZWxlY3Rpb24uc2VsZWN0ZWQnKSB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG15LTVcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1sZ1wiIDpkaXNhYmxlZD1cIiFzZWxlY3RlZFwiIEBjbGljay5wcmV2ZW50PVwicHJvY2VlZCgpXCIgOmFyaWEtbGFiZWw9XCJ0cmFucygncHJvZHVjdC5vcmRlci5wcm9jZWVkJylcIiBkYXRhLWJ1dHRvbj1cImNvbnRpbnVlXCI+XG4gICAgICAgIHt7IHRyYW5zKCdwcm9kdWN0Lm9yZGVyLnByb2NlZWQnKSB9fVxuICAgICAgICA8ZW0gY2xhc3M9XCJpY29uIG5pIG5pLWNoZXZyb24tcmlnaHQgcGwtMlwiPjwvZW0+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBwcm9wczogWyd2b3VjaGVyJ10sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0ZWQ6IG51bGwsXG4gICAgICBwbGFjZWhvbGRlcjogJy9pbWFnZXMvZGVmYXVsdC1hdmF0YXIucG5nJyxcbiAgICB9O1xuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdGVtcGxhdGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMudm91Y2hlcj8udGlja2V0X3RlbXBsYXRlcyB8fCBbXTtcbiAgICB9LFxuICAgIG9yZGVyKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnMuVm91Y2hlck9yZGVyO1xuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaW5pdGlhbGl6ZSgpIHtcbiAgICAgIGlmICghdGhpcy50ZW1wbGF0ZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3N1Ym1pdCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByZXNldCA9XG4gICAgICAgIHRoaXMub3JkZXI/LnZvdWNoZXI/LnRlbXBsYXRlID8/XG4gICAgICAgIHRoaXMudm91Y2hlci5kZWZhdWx0X3RpY2tldF90ZW1wbGF0ZSA/P1xuICAgICAgICB0aGlzLnRlbXBsYXRlc1swXT8uaWQgPz9cbiAgICAgICAgbnVsbDtcblxuICAgICAgdGhpcy5zZWxlY3RlZCA9IHByZXNldDtcbiAgICAgIHRoaXMucGVyc2lzdCgpO1xuICAgIH0sXG5cbiAgICBwZXJzaXN0KCkge1xuICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ3VwZGF0ZVZvdWNoZXJUZW1wbGF0ZScsIHRoaXMuc2VsZWN0ZWQpO1xuICAgIH0sXG5cbiAgICBwcm9jZWVkKCkge1xuICAgICAgdGhpcy5wZXJzaXN0KCk7XG4gICAgICB0aGlzLiRlbWl0KCdzdWJtaXQnKTtcbiAgICB9LFxuXG4gICAgc2VsZWN0VGVtcGxhdGUoaWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSBpZDtcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBzZWxlY3RlZCgpIHtcbiAgICAgIHRoaXMucGVyc2lzdCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBzY29wZWQ+XG4udGVtcGxhdGUtY2FyZCB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDE1MG1zIGVhc2UsIGJveC1zaGFkb3cgMTUwbXMgZWFzZSwgYm9yZGVyLWNvbG9yIDE1MG1zIGVhc2U7XG59XG5cbi50ZW1wbGF0ZS1jYXJkOmhvdmVyIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpO1xuICBib3gtc2hhZG93OiAwIDAuNXJlbSAxcmVtIHJnYmEoMTYsIDI0LCA0MCwgMC4xMik7XG59XG5cbi50ZW1wbGF0ZS1jYXJkLS1zZWxlY3RlZCB7XG4gIGJveC1zaGFkb3c6IDAgMCAwIDAuMnJlbSByZ2JhKDAsIDEyMywgMjU1LCAwLjEyKTtcbn1cblxuLnRlbXBsYXRlLWNhcmQ6Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmU6IG5vbmU7XG4gIGJveC1zaGFkb3c6IDAgMCAwIDAuMnJlbSByZ2JhKDAsIDEyMywgMjU1LCAwLjI1KSwgMCAwLjVyZW0gMXJlbSByZ2JhKDE2LCAyNCwgNDAsIDAuMTIpO1xufVxuXG4udGVtcGxhdGUtY2FyZF9faW1hZ2UgaW1nIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG9iamVjdC1maXQ6IGNvdmVyO1xuICBoZWlnaHQ6IDI4MHB4O1xufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNzY3Ljk4cHgpIHtcbiAgLnRlbXBsYXRlLWNhcmRfX2ltYWdlIGltZyB7XG4gICAgaGVpZ2h0OiAyMjBweDtcbiAgfVxufVxuXG4udGVtcGxhdGUtY2FyZF9fYmFkZ2Uge1xuICB0b3A6IDEycHg7XG4gIHJpZ2h0OiAxMnB4O1xuICB3aWR0aDogMzRweDtcbiAgaGVpZ2h0OiAzNHB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG5cbiAgPGxvYWRlciB2LWlmPVwiIXJlYWR5XCIvPlxuICA8ZGl2IHYtZWxzZT5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaW5uZXJcIj5cbiAgICAgICAgPGg1IGNsYXNzPVwiY2FyZC10aXRsZVwiPlxuICAgICAgICAgIHt7IHRyYW5zKCdyZXNlcnZhdGlvbi5vdmVydmlldy5jb25maXJtYXRpb25fbWVzc2FnZS50aXRsZScpIH19XG4gICAgICAgIDwvaDU+XG4gICAgICAgIDxwIGNsYXNzPVwiY2FyZC1zdWJ0aXRsZSBmZi1iYXNlXCIgdi1pZj1cImlzRmluYWxpemVkXCI+XG4gICAgICAgICAge3sgdHJhbnMoJ3Jlc2VydmF0aW9uLm92ZXJ2aWV3LmNvbmZpcm1hdGlvbl9tZXNzYWdlLmJvZHkuZmluYWxpemVkJykgfX1cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImNhcmQtc3VidGl0bGUgZmYtYmFzZVwiIHYtZWxzZS1pZj1cInJlc2VydmF0aW9uLmV4cGlyYXRpb25fZGF0ZVwiPlxuICAgICAgICAgIHt7IHRyYW5zKCdyZXNlcnZhdGlvbi5vdmVydmlldy5jb25maXJtYXRpb25fbWVzc2FnZS5ib2R5LndpdGhfZXhwaXJhdGlvbicpLnJlcGxhY2UoJ3tleHBpcmF0aW9uX2RhdGV9JywgcmVzZXJ2YXRpb24uZXhwaXJhdGlvbl9kYXRlKSB9fVxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiY2FyZC1zdWJ0aXRsZSBmZi1iYXNlXCIgdi1lbHNlPlxuICAgICAgICAgIHt7IHRyYW5zKCdyZXNlcnZhdGlvbi5vdmVydmlldy5jb25maXJtYXRpb25fbWVzc2FnZS5ib2R5LnN0YW5kYXJkJykgfX1cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQgbWItMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaW5uZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGluZyBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtc3RhcnQgZmxleC13cmFwXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGVcIj57eyB0cmFucygncmVzZXJ2YXRpb24ub3ZlcnZpZXcudGl0bGUnKSB9fTwvaDU+XG4gICAgICAgICAgICA8aDYgY2xhc3M9XCJjYXJkLXN1YnRpdGxlIG1iLTIgZmYtYmFzZVwiPlxuICAgICAgICAgICAgICB7eyBjYW5FZGl0ID8gdHJhbnMoJ3Jlc2VydmF0aW9uLm92ZXJ2aWV3LmVkaXQuc3VidGl0bGUnKSA6IHRyYW5zKCdyZXNlcnZhdGlvbi5vdmVydmlldy5zdWJ0aXRsZScpIH19XG4gICAgICAgICAgICA8L2g2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IHYtaWY9XCJzdWNjZXNzTWVzc2FnZVwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtc3VjY2VzcyBtdC0zXCIgcm9sZT1cImFsZXJ0XCI+XG4gICAgICAgICAge3sgc3VjY2Vzc01lc3NhZ2UgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgdi1pZj1cImVycm9yTWVzc2FnZVwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIG10LTNcIiByb2xlPVwiYWxlcnRcIj5cbiAgICAgICAgICB7eyBlcnJvck1lc3NhZ2UgfX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTQgYm9yZGVyLXRvcFwiIHYtaWY9XCIhY2FuRWRpdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJuay1kYXRhIGRhdGEtbGlzdFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtaXRlbVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YS1jb2xcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGEtbGFiZWxcIj57eyB0cmFucygncmVzZXJ2YXRpb24ub3ZlcnZpZXcuZmllbGRzLm5hbWUnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGEtdmFsdWUtcHJldmlld1wiPnt7IGN1c3RvbWVyLm5hbWUuZnVsbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhLWl0ZW1cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtY29sXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRhLWxhYmVsXCI+e3sgdHJhbnMoJ3Jlc2VydmF0aW9uLm92ZXJ2aWV3LmZpZWxkcy5lbWFpbCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0YS12YWx1ZVwiPnt7IGN1c3RvbWVyLmVtYWlsIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtaXRlbVwiIHYtaWY9XCJjdXN0b21lci5jb21wYW55XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhLWNvbFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0YS1sYWJlbFwiPnt7IHRyYW5zKCdwcm9kdWN0LnN0ZXBzLmNoZWNrb3V0LmNvbXBhbnknKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGEtdmFsdWVcIj57eyBjdXN0b21lci5jb21wYW55IH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtaXRlbVwiIHYtaWY9XCJjdXN0b21lci52YXRfaWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtY29sXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRhLWxhYmVsXCI+e3sgdHJhbnMoJ3Byb2R1Y3Quc3RlcHMuY2hlY2tvdXQudmF0X2lkJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRhLXZhbHVlXCI+e3sgY3VzdG9tZXIudmF0X2lkIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtaXRlbVwiIHYtZm9yPVwiZmllbGQgaW4gZmllbGRzXCIgOmtleT1cImZpZWxkLmlkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhLWNvbFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0YS1sYWJlbFwiPnt7IGZpZWxkLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRhLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cImZpZWxkLnR5cGUgPT09ICdDSEVDS0JPWCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGVtIHYtaWY9XCJmaWVsZC52YWx1ZSA9PT0gdHJ1ZSB8fCBmaWVsZC52YWx1ZSA9PT0gJzEnIHx8IGZpZWxkLnZhbHVlID09PSAxXCIgY2xhc3M9XCJpY29uIG5pIG5pLWNoZWNrXCI+PC9lbT5cbiAgICAgICAgICAgICAgICAgICAgPGVtIHYtZWxzZSBjbGFzcz1cImljb24gbmkgbmktY3Jvc3NcIj48L2VtPlxuICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XG4gICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLnZhbHVlIH19XG4gICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGZvcm0gdi1pZj1cImNhbkVkaXRcIiBAc3VibWl0LnByZXZlbnQ9XCJzYXZlQ2hhbmdlc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00IGJvcmRlci10b3AgcHQtM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7IHRyYW5zKCdwcm9kdWN0LnN0ZXBzLmNoZWNrb3V0LmZpcnN0bmFtZScpIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB2LW1vZGVsPVwiZm9ybS5maXJzdF9uYW1lXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyB0cmFucygncHJvZHVjdC5zdGVwcy5jaGVja291dC5sYXN0bmFtZScpIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB2LW1vZGVsPVwiZm9ybS5sYXN0X25hbWVcIiByZXF1aXJlZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7IHRyYW5zKCdwcm9kdWN0LnN0ZXBzLmNoZWNrb3V0LmVtYWlsJykgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB2LW1vZGVsPVwiZm9ybS5lbWFpbFwiIHJlcXVpcmVkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiIHYtaWY9XCJvcmdhbmlzYXRpb24uYWxsb3dfYnVzaW5lc3NcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jb250cm9sIGN1c3RvbS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImN1c3RvbS1jb250cm9sLWlucHV0XCIgaWQ9XCJyZXNlcnZhdGlvbl9jb21wYW55XCIgdi1tb2RlbD1cImlzX2NvbXBhbnlcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjdXN0b20tY29udHJvbC1sYWJlbFwiIGZvcj1cInJlc2VydmF0aW9uX2NvbXBhbnlcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHRyYW5zKCdyZXNlcnZhdGlvbi5vdmVydmlldy5lZGl0LmNvbXBhbnlfdG9nZ2xlJykgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiB2LWlmPVwiaXNfY29tcGFueVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgdHJhbnMoJ3Byb2R1Y3Quc3RlcHMuY2hlY2tvdXQuY29tcGFueScpIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB2LW1vZGVsPVwiZm9ybS5jb21wYW55XCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgdi1pZj1cImlzX2NvbXBhbnlcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7IHRyYW5zKCdwcm9kdWN0LnN0ZXBzLmNoZWNrb3V0LnZhdF9pZCcpIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB2LW1vZGVsPVwiZm9ybS52YXRfaWRcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgICAgIHYtZm9yPVwiZmllbGQgaW4gdmlzaWJsZUZpZWxkc1wiXG4gICAgICAgICAgICAgIDprZXk9XCJmaWVsZC5pZFwiXG4gICAgICAgICAgICAgIDppcz1cIidkaXYnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiB2LWlmPVwic2hvd0ZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiZmllbGQudHlwZSA9PT0gJ0NIRUNLQk9YJ1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jb250cm9sIGN1c3RvbS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgIDppZD1cIidyZXNlcnZhdGlvbl9maWVsZF8nICsgZmllbGQuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgIHYtbW9kZWw9XCJmaWVsZFZhbHVlc1tmaWVsZC5pZF1cIlxuICAgICAgICAgICAgICAgICAgICAgIDpyZXF1aXJlZD1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjdXN0b20tY29udHJvbC1sYWJlbFwiIDpmb3I9XCIncmVzZXJ2YXRpb25fZmllbGRfJyArIGZpZWxkLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubmFtZSB9fTxzcGFuIHYtaWY9XCJmaWVsZC5yZXF1aXJlZFwiIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlLWlmPVwiZmllbGQudHlwZSA9PT0gJ0RST1BET1dOJ1wiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7IGZpZWxkLm5hbWUgfX08c3BhbiB2LWlmPVwiZmllbGQucmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wtc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHYtbW9kZWw9XCJmaWVsZFZhbHVlc1tmaWVsZC5pZF1cIiA6cmVxdWlyZWQ9XCJmaWVsZC5yZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiIGRpc2FibGVkPnt7IHRyYW5zKCdwcm9kdWN0LnN0ZXBzLmNoZWNrb3V0LmRyb3Bkb3duLnBsYWNlaG9sZGVyJykgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCIob3B0aW9uLCBvcHRpb25JZHgpIGluIGZpZWxkLm9wdGlvbnNcIiA6a2V5PVwib3B0aW9uSWR4XCIgOnZhbHVlPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRyb3Bkb3duT3B0aW9uTGFiZWwoZmllbGQsIG9wdGlvbiwgb3B0aW9uSWR4KSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlLWlmPVwiZmllbGQudHlwZSA9PT0gJ1BIT05FJ1wiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7IGZpZWxkLm5hbWUgfX08c3BhbiB2LWlmPVwiZmllbGQucmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHZ1ZS10ZWwtaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdi1tb2RlbD1cImZpZWxkVmFsdWVzW2ZpZWxkLmlkXVwiXG4gICAgICAgICAgICAgICAgICAgIDpkZWZhdWx0Q291bnRyeT1cInRlbERlZmF1bHRDb3VudHJ5XCJcbiAgICAgICAgICAgICAgICAgICAgOmlucHV0T3B0aW9ucz1cInsgbmFtZTogJ3Jlc2VydmF0aW9uWycgKyBmaWVsZC5pZCArICddJywgc2hvd0RpYWxDb2RlOiB0cnVlLCBwbGFjZWhvbGRlcjogJycgfVwiXG4gICAgICAgICAgICAgICAgICAgIDpyZXF1aXJlZD1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtc2xvdDphcnJvdy1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvdnVlLXRlbC1pbnB1dD5cbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWVsc2UtaWY9XCJmaWVsZC50eXBlID09PSAnQ09VTlRSWSdcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyBmaWVsZC5uYW1lIH19PHNwYW4gdi1pZj1cImZpZWxkLnJlcXVpcmVkXCIgY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wtd3JhcFwiIDpkYXRhLWZpZWxkLXR5cGU9XCJmaWVsZC50eXBlLnRvTG93ZXJDYXNlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPENvdW50cnlTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICB2LW1vZGVsPVwiZmllbGRWYWx1ZXNbZmllbGQuaWRdXCJcbiAgICAgICAgICAgICAgICAgICAgICA6cGxhY2Vob2xkZXI9XCJ0cmFucygncHJvZHVjdC5zdGVwcy5jaGVja291dC5kcm9wZG93bi5wbGFjZWhvbGRlcicpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtZWxzZT5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyBmaWVsZC5uYW1lIH19PHNwYW4gdi1pZj1cImZpZWxkLnJlcXVpcmVkXCIgY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICA6dHlwZT1cImlucHV0VHlwZShmaWVsZC50eXBlKVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgdi1tb2RlbD1cImZpZWxkVmFsdWVzW2ZpZWxkLmlkXVwiXG4gICAgICAgICAgICAgICAgICAgIDpyZXF1aXJlZD1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtdC00XCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgbXItMlwiIEBjbGljaz1cInJlc2V0Rm9ybVwiIDpkaXNhYmxlZD1cInNhdmluZ1wiPlxuICAgICAgICAgICAgICB7eyB0cmFucygncmVzZXJ2YXRpb24ub3ZlcnZpZXcuZWRpdC5jYW5jZWwnKSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIDpkaXNhYmxlZD1cInNhdmluZ1wiPlxuICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwic2F2aW5nXCI+e3sgdHJhbnMoJ3Jlc2VydmF0aW9uLm92ZXJ2aWV3LmVkaXQuc2F2aW5nJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHYtZWxzZT57eyB0cmFucygncmVzZXJ2YXRpb24ub3ZlcnZpZXcuZWRpdC5zYXZlJykgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuXG5pbXBvcnQge2NoZWNrb3V0RGVmYXVsdFZhbHVlLCBmaWVsZEFwcGxpZXNUbywgaXNDaGVja291dFZpc2libGV9IGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1GaWVsZHMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3BzOiBbJ2lkJ10sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVhZHk6IGZhbHNlLFxuICAgICAgZmllbGRzOiBbXSxcbiAgICAgIGN1c3RvbWVyOiBudWxsLFxuICAgICAgZm9ybToge1xuICAgICAgICBmaXJzdF9uYW1lOiAnJyxcbiAgICAgICAgbGFzdF9uYW1lOiAnJyxcbiAgICAgICAgZW1haWw6ICcnLFxuICAgICAgICBjb21wYW55OiAnJyxcbiAgICAgICAgdmF0X2lkOiAnJ1xuICAgICAgfSxcbiAgICAgIGZpZWxkVmFsdWVzOiB7fSxcbiAgICAgIGlzX2NvbXBhbnk6IGZhbHNlLFxuICAgICAgc3VjY2Vzc01lc3NhZ2U6ICcnLFxuICAgICAgZXJyb3JNZXNzYWdlOiAnJyxcbiAgICAgIHNhdmluZzogZmFsc2UsXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5zdGFydCgpO1xuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBzdGFydCgpIHtcbiAgICAgIGlmICh0aGlzLm9yZ2FuaXNhdGlvbiAmJiB0aGlzLnJlc2VydmF0aW9uKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBpbml0aWFsaXplKCkge1xuICAgICAgaWYgKHRoaXMucmVzZXJ2YXRpb24pIHtcbiAgICAgICAgdGhpcy5jdXN0b21lciA9IHRoaXMucmVzZXJ2YXRpb24ucmVzZXJ2YXRpb24uY3VzdG9tZXI7XG4gICAgICAgIHRoaXMuZmllbGRzID0gQXJyYXkuaXNBcnJheSh0aGlzLmN1c3RvbWVyLmZpZWxkcykgPyB0aGlzLmN1c3RvbWVyLmZpZWxkcyA6IFtdO1xuICAgICAgICB0aGlzLnBvcHVsYXRlRm9ybSgpO1xuICAgICAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcG9wdWxhdGVGb3JtKCkge1xuICAgICAgaWYgKCF0aGlzLmN1c3RvbWVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5mb3JtID0ge1xuICAgICAgICBmaXJzdF9uYW1lOiB0aGlzLmN1c3RvbWVyLm5hbWUuZmlyc3QgfHwgJycsXG4gICAgICAgIGxhc3RfbmFtZTogdGhpcy5jdXN0b21lci5uYW1lLmxhc3QgfHwgJycsXG4gICAgICAgIGVtYWlsOiB0aGlzLmN1c3RvbWVyLmVtYWlsIHx8ICcnLFxuICAgICAgICBjb21wYW55OiB0aGlzLmN1c3RvbWVyLmNvbXBhbnkgfHwgJycsXG4gICAgICAgIHZhdF9pZDogdGhpcy5jdXN0b21lci52YXRfaWQgfHwgJydcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuaXNfY29tcGFueSA9ICEhKHRoaXMuZm9ybS5jb21wYW55IHx8IHRoaXMuZm9ybS52YXRfaWQpO1xuXG4gICAgICBjb25zdCB2YWx1ZXMgPSB7fTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY3VzdG9tZXIuZmllbGRzKSkge1xuICAgICAgICB0aGlzLmN1c3RvbWVyLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICB2YWx1ZXNbZmllbGQuaWRdID0gKGZpZWxkLnR5cGUgPT09ICdDSEVDS0JPWCcpXG4gICAgICAgICAgICA/IChmaWVsZC52YWx1ZSA9PT0gdHJ1ZSB8fCBmaWVsZC52YWx1ZSA9PT0gJzEnIHx8IGZpZWxkLnZhbHVlID09PSAxKVxuICAgICAgICAgICAgOiAoZmllbGQudmFsdWUgfHwgJycpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy52aXNpYmxlRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZXMsIGZpZWxkLmlkKSkge1xuICAgICAgICAgIHZhbHVlc1tmaWVsZC5pZF0gPSBjaGVja291dERlZmF1bHRWYWx1ZShmaWVsZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmZpZWxkVmFsdWVzID0gdmFsdWVzO1xuICAgIH0sXG5cbiAgICByZXNldEZvcm0oKSB7XG4gICAgICB0aGlzLnBvcHVsYXRlRm9ybSgpO1xuICAgICAgdGhpcy5zdWNjZXNzTWVzc2FnZSA9ICcnO1xuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICB9LFxuXG4gICAgYXN5bmMgc2F2ZUNoYW5nZXMoKSB7XG4gICAgICBpZiAodGhpcy5zYXZpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuZm9ybS5maXJzdF9uYW1lLnRyaW0oKSB8fCAhdGhpcy5mb3JtLmxhc3RfbmFtZS50cmltKCkgfHwgIXRoaXMuZm9ybS5lbWFpbC50cmltKCkpIHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSB0aGlzLnRyYW5zKCdyZXNlcnZhdGlvbi5vdmVydmlldy5lZGl0LnZhbGlkYXRpb24nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNhdmluZyA9IHRydWU7XG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xuXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICBjdXN0b21lcjoge1xuICAgICAgICAgIGZpcnN0X25hbWU6IHRoaXMuZm9ybS5maXJzdF9uYW1lLnRyaW0oKSxcbiAgICAgICAgICBsYXN0X25hbWU6IHRoaXMuZm9ybS5sYXN0X25hbWUudHJpbSgpLFxuICAgICAgICAgIGVtYWlsOiB0aGlzLmZvcm0uZW1haWwudHJpbSgpLFxuICAgICAgICAgIGNvbXBhbnk6IHRoaXMuaXNfY29tcGFueSA/ICh0aGlzLmZvcm0uY29tcGFueSB8fCBudWxsKSA6IG51bGwsXG4gICAgICAgICAgdmF0X2lkOiB0aGlzLmlzX2NvbXBhbnkgPyAodGhpcy5mb3JtLnZhdF9pZCB8fCBudWxsKSA6IG51bGwsXG4gICAgICAgICAgZmllbGRzOiB7fVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLmZpZWxkVmFsdWVzKS5mb3JFYWNoKChbaWQsIHZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc2hvdWxkSW5jbHVkZUZpZWxkKGlkKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5vcmdhbmlzYXRpb24uZmllbGRzW2lkXTtcbiAgICAgICAgaWYgKCFmaWVsZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnQ0hFQ0tCT1gnKSB7XG4gICAgICAgICAgcGF5bG9hZC5jdXN0b21lci5maWVsZHNbaWRdID0gISF2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJykge1xuICAgICAgICAgIHBheWxvYWQuY3VzdG9tZXIuZmllbGRzW2lkXSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBheWxvYWQuY3VzdG9tZXIuZmllbGRzW2lkXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBheGlvcy5wYXRjaChgL2FwaS9yZXNlcnZhdGlvbi8ke3RoaXMuJHJvdXRlLnBhcmFtcy5oYXNofWAsIHBheWxvYWQsIHtcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnbG9hZFJlc2VydmF0aW9uJywgdGhpcy4kcm91dGUucGFyYW1zLmhhc2gpO1xuICAgICAgICB0aGlzLnN1Y2Nlc3NNZXNzYWdlID0gdGhpcy50cmFucygncmVzZXJ2YXRpb24ub3ZlcnZpZXcuZWRpdC5zdWNjZXNzJyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGVyci5yZXNwb25zZT8uZGF0YT8uZXJyb3I7XG4gICAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSB0aGlzLnRyYW5zKCdlcnJvcnMuJyArIGNvZGUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSB0aGlzLnRyYW5zKCdlcnJvcnMuZXJyb3JfdW5rbm93bicpO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBpbnB1dFR5cGUodHlwZSkge1xuICAgICAgaWYgKHR5cGUgPT09ICdFTUFJTCcgfHwgdHlwZSA9PT0gJ0VNQUlMX0NPTkZJUk0nKSB7XG4gICAgICAgIHJldHVybiAnZW1haWwnO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09ICdOVU1CRVInKSB7XG4gICAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlID09PSAnREFURScpIHtcbiAgICAgICAgcmV0dXJuICdkYXRlJztcbiAgICAgIH1cbiAgICAgIHJldHVybiAndGV4dCc7XG4gICAgfSxcblxuICAgIGhhbmRsZUNvdW50cnlTZWxlY3QoaWQsIHZhbHVlKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHRoaXMuJHNldCh0aGlzLmZpZWxkVmFsdWVzLCBpZCwgJycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLiRzZXQodGhpcy5maWVsZFZhbHVlcywgaWQsIHZhbHVlKTtcbiAgICB9LFxuXG4gICAgZHJvcGRvd25PcHRpb25MYWJlbChmaWVsZCwgb3B0aW9uLCBpbmRleCkge1xuICAgICAgcmV0dXJuIGZpZWxkLm9wdGlvbl9sYWJlbHM/LltpbmRleF0gfHwgb3B0aW9uO1xuICAgIH0sXG5cbiAgICBzaG93RmllbGQoZmllbGQpIHtcbiAgICAgIGlmICghdGhpcy5pc19jb21wYW55ICYmIHRoaXMuY29tcGFueUZpZWxkKGZpZWxkLnR5cGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBzaG91bGRJbmNsdWRlRmllbGQoaWQpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5vcmdhbmlzYXRpb24/LmZpZWxkcz8uW2lkXTtcbiAgICAgIGlmICghZmllbGQgfHwgZmllbGQuZGVmYXVsdCA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB2aXNpYmxlID0gdGhpcy52aXNpYmxlRmllbGRzLmZpbmQoZW50cnkgPT4gZW50cnkuaWQgPT09IGlkKTtcbiAgICAgIHJldHVybiAhIXZpc2libGU7XG4gICAgfSxcblxuICAgIGNvbXBhbnlGaWVsZCh0eXBlKSB7XG4gICAgICByZXR1cm4gWydDT01QQU5ZJywgJ0FERFJFU1MnLCAnVkFUX0lEJ10uaW5jbHVkZXModHlwZSk7XG4gICAgfSxcblxuICAgIGZpZWxkQXBwbGllc1RvUHJvZHVjdChmaWVsZCwgcHJvZHVjdElkKSB7XG4gICAgICByZXR1cm4gaXNDaGVja291dFZpc2libGUoZmllbGQpICYmIGZpZWxkQXBwbGllc1RvKGZpZWxkLCAncHJvZHVjdCcsIHByb2R1Y3RJZCk7XG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgb3JnYW5pc2F0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnMuT3JnYW5pc2F0aW9uO1xuICAgIH0sXG4gICAgcmVzZXJ2YXRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc3RvcmUuZ2V0dGVycy5SZXNlcnZhdGlvbjtcbiAgICB9LFxuICAgIGlzRmluYWxpemVkKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5yZXNlcnZhdGlvbj8uaXNfZmluYWxpemVkO1xuICAgIH0sXG4gICAgY2FuRWRpdCgpIHtcbiAgICAgIHJldHVybiAhdGhpcy5pc0ZpbmFsaXplZDtcbiAgICB9LFxuICAgIHZpc2libGVGaWVsZHMoKSB7XG4gICAgICBpZiAoIXRoaXMub3JnYW5pc2F0aW9uIHx8ICF0aGlzLm9yZ2FuaXNhdGlvbi5maWVsZHMpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9kdWN0SWQgPSB0aGlzLnJlc2VydmF0aW9uPy5wcm9kdWN0Py5pZCA/IFN0cmluZyh0aGlzLnJlc2VydmF0aW9uLnByb2R1Y3QuaWQpIDogbnVsbDtcblxuICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMub3JnYW5pc2F0aW9uLmZpZWxkcylcbiAgICAgICAgLmZpbHRlcigoWywgZmllbGRdKSA9PiBmaWVsZC5kZWZhdWx0ICE9PSB0cnVlKVxuICAgICAgICAubWFwKChbaWQsIGZpZWxkXSkgPT4gKHsgaWQsIC4uLmZpZWxkIH0pKVxuICAgICAgICAuZmlsdGVyKGZpZWxkID0+ICEoZmllbGQub3JkZXIgJiYgZmllbGQucGVyX3RpY2tldCkpXG4gICAgICAgIC5maWx0ZXIoZmllbGQgPT4gdGhpcy5maWVsZEFwcGxpZXNUb1Byb2R1Y3QoZmllbGQsIHByb2R1Y3RJZCkpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiAoYS5zb3J0IHx8IDApIC0gKGIuc29ydCB8fCAwKSk7XG4gICAgfSxcbiAgICB0ZWxEZWZhdWx0Q291bnRyeSgpIHtcbiAgICAgIGNvbnN0IGxhbmcgPSB0aGlzLiRzdG9yZS5zdGF0ZS5HbG9iYWxzICYmIHRoaXMuJHN0b3JlLnN0YXRlLkdsb2JhbHMubGFuZ3VhZ2U7XG4gICAgICBpZiAobGFuZykge1xuICAgICAgICByZXR1cm4gbGFuZy50b0xvd2VyQ2FzZSgpO1xuICAgICAgfVxuICAgICAgY29uc3QgbG9jYWxlID0gbmF2aWdhdG9yLmxhbmd1YWdlIHx8IG5hdmlnYXRvci51c2VyTGFuZ3VhZ2UgfHwgJyc7XG4gICAgICBjb25zdCBwYXJ0cyA9IGxvY2FsZS5zcGxpdCgnLScpO1xuICAgICAgcmV0dXJuIChwYXJ0c1sxXSB8fCBwYXJ0c1swXSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICByZXNlcnZhdGlvbjoge1xuICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgIGhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuc3RhcnQoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGlzX2NvbXBhbnkodmFsdWUpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgdGhpcy5mb3JtLmNvbXBhbnkgPSAnJztcbiAgICAgICAgdGhpcy5mb3JtLnZhdF9pZCA9ICcnO1xuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZmllbGRWYWx1ZXMpLmZvckVhY2goKFtpZF0pID0+IHtcbiAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMub3JnYW5pc2F0aW9uLmZpZWxkcz8uW2lkXTtcbiAgICAgICAgICBpZiAoZmllbGQgJiYgdGhpcy5jb21wYW55RmllbGQoZmllbGQudHlwZSkpIHtcbiAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLmZpZWxkVmFsdWVzLCBpZCwgZmllbGQudHlwZSA9PT0gJ0NIRUNLQk9YJyA/IGZhbHNlIDogJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbjwvc2NyaXB0PlxuXG48c3R5bGUgdHlwZT1cInRleHQvY3NzXCIgc2NvcGVkPlxuXG4ucmVxdWlyZWQge1xuICBjb2xvcjogdmFyKC0tZGFuZ2VyKTtcbn1cblxuLnZ1ZS10ZWwtaW5wdXQge1xuICBoZWlnaHQ6IGNhbGMoMi4xMjVyZW0gKyAycHgpO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGJkZmVhO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG5cbi52dWUtdGVsLWlucHV0IC52dGlfX2Ryb3Bkb3duIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgcGFkZGluZzogMCAwLjVyZW07XG59XG5cbi52dWUtdGVsLWlucHV0IC52dGlfX2lucHV0IHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwYWRkaW5nOiAwLjQzNzVyZW0gMXJlbTtcbiAgYm9yZGVyOiAwO1xufVxuXG5bZGF0YS1maWVsZC10eXBlPVwiY291bnRyeVwiXSAudi1zZWxlY3Qge1xuICB3aWR0aDogMTAwJTtcbn1cblxuW2RhdGEtZmllbGQtdHlwZT1cImNvdW50cnlcIl0gLnZzX19kcm9wZG93bi10b2dnbGUge1xuICBoZWlnaHQ6IGNhbGMoMi4xMjVyZW0gKyAycHgpO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGJkZmVhO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIHBhZGRpbmc6IDAgMC41cmVtO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG5bZGF0YS1maWVsZC10eXBlPVwiY291bnRyeVwiXSAudnNfX3NlbGVjdGVkLFxuW2RhdGEtZmllbGQtdHlwZT1cImNvdW50cnlcIl0gLnZzX19zZWFyY2gge1xuICBtYXJnaW4tdG9wOiAwO1xufVxuXG5bZGF0YS1maWVsZC10eXBlPVwiY291bnRyeVwiXSAudnNfX3NlYXJjaCB7XG4gIHBhZGRpbmc6IDA7XG59XG5cbltkYXRhLWZpZWxkLXR5cGU9XCJjb3VudHJ5XCJdID4+PiAudnNfX29wZW4taW5kaWNhdG9yIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuPC9zdHlsZT5cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==*/