Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active April 27, 2017 20:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timelyportfolio/92526a84846d23a0b2cc50d966f34e2d to your computer and use it in GitHub Desktop.
Save timelyportfolio/92526a84846d23a0b2cc50d966f34e2d to your computer and use it in GitHub Desktop.
react-virtualized with jquery.sparklines from R
license: mit

Portable

Although done in R, this can easily be adapted to other languages.

Code

library(reactR)
library(htmltools)
library(pipeR)
library(tibble)
library(dplyr)

react_virt <-  htmlDependency(
  name = "react-virtualized",
  version = "9.7.3",
  src = c(href = "https://unpkg.com/react-virtualized@9.7.3/"),
  script = "dist/umd/react-virtualized.js",
  stylesheet = "styles.css"
)

rand_tbl <- tibble(
  id = 1:10000,
  data = lapply(1:10000, function(d){runif(10)})
) %>>%
  mutate(lastval = sapply(data, function(x){tail(x,1)})) 

js_data <- tags$script(HTML(
sprintf(
'
var data = %s;
',
  jsonlite::toJSON(rand_tbl, dataframe="rows")
)
))

js <- tags$script(HTML(babel_transform(
sprintf(
"
function rowGetter(params) {
  return data[params.index];
}

function rowRenderCallback(x) {
  $('.sparkline').sparkline('html',{width:200, chartRangeMin:0, chartRangeMax:1});
}

class App extends React.Component {
  render() {
    return (
      <ReactVirtualized.Table
        rowGetter={rowGetter}
        rowCount={data.length}
        height={300}
        width={400}
        rowHeight={40}
        headerHeight={30}
        onRowsRendered={rowRenderCallback}
      >

        <ReactVirtualized.Column
          label='Index'
          cellDataGetter={
            ({ columnData, dataKey, rowData }) => rowData.id
          }
          dataKey='index'
          width={50}
        />

        <ReactVirtualized.Column
          disableSort
          label='Data'
          dataKey='data'
          cellRenderer={
            ({ cellData, columnData, dataKey, rowData, rowIndex }) => <span className='sparkline' values={cellData.join(',')}></span>
          }
          width={200}
        />

        <ReactVirtualized.Column
          disableSort
          label='LastVal'
          dataKey='lastval'
          cellRenderer={
            ({ cellData, columnData, dataKey, rowData, rowIndex }) =>
              { const divStyle = {
                  width: 70 * cellData + 'px',
                  height: '10px',
                  backgroundColor: 'gray'
                }
                return <div style={{border:'2px solid black',height:'10px'}}>
                  <div style={divStyle}></div>
                </div>
              }
          }
          width={70}
        />

      </ReactVirtualized.Table>
    )
  }

}

const app = document.getElementById('rvtable');
ReactDOM.render(<App />, app);
"
)
)))

tagList(
  tags$div(id="rvtable"),
  js_data,
  js,
  html_dependency_react(),
  react_virt,
  htmlwidgets::getDependency('sparkline')[2:3]
) %>>%
  browsable()

This file has been truncated, but you can view the full file.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,LyoqDQogKiBSZWFjdCB2MTUuNS4wDQogKg0KICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4NCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKg0KICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlDQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQNCiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Lg0KICoNCiAqLw0KIWZ1bmN0aW9uKHQpe2lmKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9dCgpO2Vsc2UgaWYoImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sdCk7ZWxzZXt2YXIgZTtlPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxlLlJlYWN0PXQoKX19KGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIHQoZSxuLHIpe2Z1bmN0aW9uIG8oYSx1KXtpZighblthXSl7aWYoIWVbYV0pe3ZhciBzPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCF1JiZzKXJldHVybiBzKGEsITApO2lmKGkpcmV0dXJuIGkoYSwhMCk7dmFyIGM9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrYSsiJyIpO3Rocm93IGMuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsY312YXIgbD1uW2FdPXtleHBvcnRzOnt9fTtlW2FdWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKHQpe3ZhciBuPWVbYV1bMV1bdF07cmV0dXJuIG8obnx8dCl9LGwsbC5leHBvcnRzLHQsZSxuLHIpfXJldHVybiBuW2FdLmV4cG9ydHN9Zm9yKHZhciBpPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGE9MDthPHIubGVuZ3RoO2ErKylvKHJbYV0pO3JldHVybiBvfSh7MTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKHQpe3ZhciBlPXsiPSI6Ij0wIiwiOiI6Ij0yIn07cmV0dXJuIiQiKygiIit0KS5yZXBsYWNlKC9bPTpdL2csZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19KX1mdW5jdGlvbiBvKHQpe3ZhciBlPXsiPTAiOiI9IiwiPTIiOiI6In07cmV0dXJuKCIiKygiLiI9PT10WzBdJiYiJCI9PT10WzFdP3Quc3Vic3RyaW5nKDIpOnQuc3Vic3RyaW5nKDEpKSkucmVwbGFjZSgvKD0wfD0yKS9nLGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfSl9dmFyIGk9e2VzY2FwZTpyLHVuZXNjYXBlOm99O2UuZXhwb3J0cz1pfSx7fV0sMjpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KDIwKSxvPSh0KDI0KSxmdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKGUuaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIG49ZS5pbnN0YW5jZVBvb2wucG9wKCk7cmV0dXJuIGUuY2FsbChuLHQpLG59cmV0dXJuIG5ldyBlKHQpfSksaT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYobi5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgcj1uLmluc3RhbmNlUG9vbC5wb3AoKTtyZXR1cm4gbi5jYWxsKHIsdCxlKSxyfXJldHVybiBuZXcgbih0LGUpfSxhPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO2lmKHIuaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIG89ci5pbnN0YW5jZVBvb2wucG9wKCk7cmV0dXJuIHIuY2FsbChvLHQsZSxuKSxvfXJldHVybiBuZXcgcih0LGUsbil9LHU9ZnVuY3Rpb24odCxlLG4scil7dmFyIG89dGhpcztpZihvLmluc3RhbmNlUG9vbC5sZW5ndGgpe3ZhciBpPW8uaW5zdGFuY2VQb29sLnBvcCgpO3JldHVybiBvLmNhbGwoaSx0LGUsbixyKSxpfXJldHVybiBuZXcgbyh0LGUsbixyKX0scz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3QgaW5zdGFuY2VvZiBlfHxyKCIyNSIpLHQuZGVzdHJ1Y3RvcigpLGUuaW5zdGFuY2VQb29sLmxlbmd0aDxlLnBvb2xTaXplJiZlLmluc3RhbmNlUG9vbC5wdXNoKHQpfSxjPW8sbD1mdW5jdGlvbih0LGUpe3ZhciBuPXQ7cmV0dXJuIG4uaW5zdGFuY2VQb29sPVtdLG4uZ2V0UG9vbGVkPWV8fGMsbi5wb29sU2l6ZXx8KG4ucG9vbFNpemU9MTApLG4ucmVsZWFzZT1zLG59LHA9e2FkZFBvb2xpbmdUbzpsLG9uZUFyZ3VtZW50UG9vbGVyOm8sdHdvQXJndW1lbnRQb29sZXI6aSx0aHJlZUFyZ3VtZW50UG9vbGVyOmEsZm91ckFyZ3VtZW50UG9vbGVyOnV9O2UuZXhwb3J0cz1wfSx7MjA6MjAsMjQ6MjR9XSwzOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXQoMjYpLG89dCg0KSxpPXQoNiksYT10KDE0KSx1PXQoNSkscz10KDgpLGM9dCg5KSxsPXQoMTMpLHA9dCgxNiksZj10KDE5KSxkPSh0KDI1KSxjLmNyZWF0ZUVsZW1lbnQpLGg9Yy5jcmVhdGVGYWN0b3J5LHk9Yy5jbG9uZUVsZW1lbnQsdj1yLG09e0NoaWxkcmVuOnttYXA6by5tYXAsZm9yRWFjaDpvLmZvckVhY2gsY291bnQ6by5jb3VudCx0b0FycmF5Om8udG9BcnJheSxvbmx5OmZ9LENvbXBvbmVudDppLFB1cmVDb21wb25lbnQ6YSxjcmVhdGVFbGVtZW50OmQsY2xvbmVFbGVtZW50OnksaXNWYWxpZEVsZW1lbnQ6Yy5pc1ZhbGlkRWxlbWVudCxQcm9wVHlwZXM6bCxjcmVhdGVDbGFzczp1LmNyZWF0ZUNsYXNzLGNyZWF0ZUZhY3Rvcnk6aCxjcmVhdGVNaXhpbjpmdW5jdGlvbih0KXtyZXR1cm4gdH0sRE9NOnMsdmVyc2lvbjpwLF9fc3ByZWFkOnZ9O2UuZXhwb3J0cz1tfSx7MTM6MTMsMTQ6MTQsMTY6MTYsMTk6MTksMjU6MjUsMjY6MjYsNDo0LDU6NSw2OjYsODo4LDk6OX1dLDQ6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4oIiIrdCkucmVwbGFjZShFLCIkJi8iKX1mdW5jdGlvbiBvKHQsZSl7dGhpcy5mdW5jPXQsdGhpcy5jb250ZXh0PWUsdGhpcy5jb3VudD0wfWZ1bmN0aW9uIGkodCxlLG4pe3ZhciByPXQuZnVuYyxvPXQuY29udGV4dDtyLmNhbGwobyxlLHQuY291bnQrKyl9ZnVuY3Rpb24gYSh0LGUsbil7aWYobnVsbD09dClyZXR1cm4gdDt2YXIgcj1vLmdldFBvb2xlZChlLG4pO20odCxpLHIpLG8ucmVsZWFzZShyKX1mdW5jdGlvbiB1KHQsZSxuLHIpe3RoaXMucmVzdWx0PXQsdGhpcy5rZXlQcmVmaXg9ZSx0aGlzLmZ1bmM9bix0aGlzLmNvbnRleHQ9cix0aGlzLmNvdW50PTB9ZnVuY3Rpb24gcyh0LGUsbil7dmFyIG89dC5yZXN1bHQsaT10LmtleVByZWZpeCxhPXQuZnVuYyx1PXQuY29udGV4dCxzPWEuY2FsbCh1LGUsdC5jb3VudCsrKTtBcnJheS5pc0FycmF5KHMpP2MocyxvLG4sdi50aGF0UmV0dXJuc0FyZ3VtZW50KTpudWxsIT1zJiYoeS5pc1ZhbGlkRWxlbWVudChzKSYmKHM9eS5jbG9uZUFuZFJlcGxhY2VLZXkocyxpKyghcy5rZXl8fGUmJmUua2V5PT09cy5rZXk/IiI6cihzLmtleSkrIi8iKStuKSksby5wdXNoKHMpKX1mdW5jdGlvbiBjKHQsZSxuLG8saSl7dmFyIGE9IiI7bnVsbCE9biYmKGE9cihuKSsiLyIpO3ZhciBjPXUuZ2V0UG9vbGVkKGUsYSxvLGkpO20odCxzLGMpLHUucmVsZWFzZShjKX1mdW5jdGlvbiBsKHQsZSxuKXtpZihudWxsPT10KXJldHVybiB0O3ZhciByPVtdO3JldHVybiBjKHQscixudWxsLGUsbikscn1mdW5jdGlvbiBwKHQsZSxuKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBmKHQsZSl7cmV0dXJuIG0odCxwLG51bGwpfWZ1bmN0aW9uIGQodCl7dmFyIGU9W107cmV0dXJuIGModCxlLG51bGwsdi50aGF0UmV0dXJuc0FyZ3VtZW50KSxlfXZhciBoPXQoMikseT10KDkpLHY9dCgyMiksbT10KDIxKSxnPWgudHdvQXJndW1lbnRQb29sZXIsYj1oLmZvdXJBcmd1bWVudFBvb2xlcixFPS9cLysvZztvLnByb3RvdHlwZS5kZXN0cnVjdG9yPWZ1bmN0aW9uKCl7dGhpcy5mdW5jPW51bGwsdGhpcy5jb250ZXh0PW51bGwsdGhpcy5jb3VudD0wfSxoLmFkZFBvb2xpbmdUbyhvLGcpLHUucHJvdG90eXBlLmRlc3RydWN0b3I9ZnVuY3Rpb24oKXt0aGlzLnJlc3VsdD1udWxsLHRoaXMua2V5UHJlZml4PW51bGwsdGhpcy5mdW5jPW51bGwsdGhpcy5jb250ZXh0PW51bGwsdGhpcy5jb3VudD0wfSxoLmFkZFBvb2xpbmdUbyh1LGIpO3ZhciBfPXtmb3JFYWNoOmEsbWFwOmwsbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbDpjLGNvdW50OmYsdG9BcnJheTpkfTtlLmV4cG9ydHM9X30sezI6MiwyMToyMSwyMjoyMiw5Ojl9XSw1OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuIHR9ZnVuY3Rpb24gbyh0LGUpe3ZhciBuPUUuaGFzT3duUHJvcGVydHkoZSk/RVtlXTpudWxsO1AuaGFzT3duUHJvcGVydHkoZSkmJiJPVkVSUklERV9CQVNFIiE9PW4mJmYoIjczIixlKSx0JiYiREVGSU5FX01BTlkiIT09biYmIkRFRklORV9NQU5ZX01FUkdFRCIhPT1uJiZmKCI3NCIsZSl9ZnVuY3Rpb24gaSh0LGUpe2lmKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZmKCI3NSIpLHkuaXNWYWxpZEVsZW1lbnQoZSkmJmYoIjc2Iik7dmFyIG49dC5wcm90b3R5cGUscj1uLl9fcmVhY3RBdXRvQmluZFBhaXJzO2UuaGFzT3duUHJvcGVydHkoZykmJl8ubWl4aW5zKHQsZS5taXhpbnMpO2Zvcih2YXIgaSBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkoaSkmJmkhPT1nKXt2YXIgYT1lW2ldLHU9bi5oYXNPd25Qcm9wZXJ0eShpKTtpZihvKHUsaSksXy5oYXNPd25Qcm9wZXJ0eShpKSlfW2ldKHQsYSk7ZWxzZXt2YXIgbD1FLmhhc093blByb3BlcnR5KGkpLHA9ImZ1bmN0aW9uIj09dHlwZW9mIGEsZD1wJiYhbCYmIXUmJiExIT09ZS5hdXRvYmluZDtpZihkKXIucHVzaChpLGEpLG5baV09YTtlbHNlIGlmKHUpe3ZhciBoPUVbaV07KCFsfHwiREVGSU5FX01BTllfTUVSR0VEIiE9PWgmJiJERUZJTkVfTUFOWSIhPT1oKSYmZigiNzciLGgsaSksIkRFRklORV9NQU5ZX01FUkdFRCI9PT1oP25baV09cyhuW2ldLGEpOiJERUZJTkVfTUFOWSI9PT1oJiYobltpXT1jKG5baV0sYSkpfWVsc2UgbltpXT1hfX19fWZ1bmN0aW9uIGEodCxlKXtpZihlKWZvcih2YXIgbiBpbiBlKXt2YXIgcj1lW25dO2lmKGUuaGFzT3duUHJvcGVydHkobikpe3ZhciBvPW4gaW4gXztvJiZmKCI3OCIsbik7dmFyIGk9biBpbiB0O2kmJmYoIjc5IixuKSx0W25dPXJ9fX1mdW5jdGlvbiB1KHQsZSl7dCYmZSYmIm9iamVjdCI9PXR5cGVvZiB0JiYib2JqZWN0Ij09dHlwZW9mIGV8fGYoIjgwIik7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHZvaWQgMCE9PXRbbl0mJmYoIjgxIixuKSx0W25dPWVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIHModCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKG51bGw9PW4pcmV0dXJuIHI7aWYobnVsbD09cilyZXR1cm4gbjt2YXIgbz17fTtyZXR1cm4gdShvLG4pLHUobyxyKSxvfX1mdW5jdGlvbiBjKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIGwodCxlKXtyZXR1cm4gZS5iaW5kKHQpfWZ1bmN0aW9uIHAodCl7Zm9yKHZhciBlPXQuX19yZWFjdEF1dG9CaW5kUGFpcnMsbj0wO248ZS5sZW5ndGg7bis9Mil7dmFyIHI9ZVtuXSxvPWVbbisxXTt0W3JdPWwodCxvKX19dmFyIGY9dCgyMCksZD10KDI2KSxoPXQoNikseT10KDkpLHY9KHQoMTIpLHQoMTEpKSxtPXQoMjMpLGc9KHQoMjQpLHQoMjUpLCJtaXhpbnMiKSxiPVtdLEU9e21peGluczoiREVGSU5FX01BTlkiLHN0YXRpY3M6IkRFRklORV9NQU5ZIixwcm9wVHlwZXM6IkRFRklORV9NQU5ZIixjb250ZXh0VHlwZXM6IkRFRklORV9NQU5ZIixjaGlsZENvbnRleHRUeXBlczoiREVGSU5FX01BTlkiLGdldERlZmF1bHRQcm9wczoiREVGSU5FX01BTllfTUVSR0VEIixnZXRJbml0aWFsU3RhdGU6IkRFRklORV9NQU5ZX01FUkdFRCIsZ2V0Q2hpbGRDb250ZXh0OiJERUZJTkVfTUFOWV9NRVJHRUQiLHJlbmRlcjoiREVGSU5FX09OQ0UiLGNvbXBvbmVudFdpbGxNb3VudDoiREVGSU5FX01BTlkiLGNvbXBvbmVudERpZE1vdW50OiJERUZJTkVfTUFOWSIsY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczoiREVGSU5FX01BTlkiLHNob3VsZENvbXBvbmVudFVwZGF0ZToiREVGSU5FX09OQ0UiLGNvbXBvbmVudFdpbGxVcGRhdGU6IkRFRklORV9NQU5ZIixjb21wb25lbnREaWRVcGRhdGU6IkRFRklORV9NQU5ZIixjb21wb25lbnRXaWxsVW5tb3VudDoiREVGSU5FX01BTlkiLHVwZGF0ZUNvbXBvbmVudDoiT1ZFUlJJREVfQkFTRSJ9LF89e2Rpc3BsYXlOYW1lOmZ1bmN0aW9uKHQsZSl7dC5kaXNwbGF5TmFtZT1lfSxtaXhpbnM6ZnVuY3Rpb24odCxlKXtpZihlKWZvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWkodCxlW25dKX0sY2hpbGRDb250ZXh0VHlwZXM6ZnVuY3Rpb24odCxlKXt0LmNoaWxkQ29udGV4dFR5cGVzPWQoe30sdC5jaGlsZENvbnRleHRUeXBlcyxlKX0sY29udGV4dFR5cGVzOmZ1bmN0aW9uKHQsZSl7dC5jb250ZXh0VHlwZXM9ZCh7fSx0LmNvbnRleHRUeXBlcyxlKX0sZ2V0RGVmYXVsdFByb3BzOmZ1bmN0aW9uKHQsZSl7dC5nZXREZWZhdWx0UHJvcHM/dC5nZXREZWZhdWx0UHJvcHM9cyh0LmdldERlZmF1bHRQcm9wcyxlKTp0LmdldERlZmF1bHRQcm9wcz1lfSxwcm9wVHlwZXM6ZnVuY3Rpb24odCxlKXt0LnByb3BUeXBlcz1kKHt9LHQucHJvcFR5cGVzLGUpfSxzdGF0aWNzOmZ1bmN0aW9uKHQsZSl7YSh0LGUpfSxhdXRvYmluZDpmdW5jdGlvbigpe319LFA9e3JlcGxhY2VTdGF0ZTpmdW5jdGlvbih0LGUpe3RoaXMudXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0YXRlKHRoaXMsdCksZSYmdGhpcy51cGRhdGVyLmVucXVldWVDYWxsYmFjayh0aGlzLGUsInJlcGxhY2VTdGF0ZSIpfSxpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51cGRhdGVyLmlzTW91bnRlZCh0aGlzKX19LHg9ZnVuY3Rpb24oKXt9O2QoeC5wcm90b3R5cGUsaC5wcm90b3R5cGUsUCk7dmFyIE49e2NyZWF0ZUNsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlPXIoZnVuY3Rpb24odCxuLHIpe3RoaXMuX19yZWFjdEF1dG9CaW5kUGFpcnMubGVuZ3RoJiZwKHRoaXMpLHRoaXMucHJvcHM9dCx0aGlzLmNvbnRleHQ9bix0aGlzLnJlZnM9bSx0aGlzLnVwZGF0ZXI9cnx8dix0aGlzLnN0YXRlPW51bGw7dmFyIG89dGhpcy5nZXRJbml0aWFsU3RhdGU/dGhpcy5nZXRJbml0aWFsU3RhdGUoKTpudWxsOygib2JqZWN0IiE9dHlwZW9mIG98fEFycmF5LmlzQXJyYXkobykpJiZmKCI4MiIsZS5kaXNwbGF5TmFtZXx8IlJlYWN0Q29tcG9zaXRlQ29tcG9uZW50IiksdGhpcy5zdGF0ZT1vfSk7ZS5wcm90b3R5cGU9bmV3IHgsZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5fX3JlYWN0QXV0b0JpbmRQYWlycz1bXSxiLmZvckVhY2goaS5iaW5kKG51bGwsZSkpLGkoZSx0KSxlLmdldERlZmF1bHRQcm9wcyYmKGUuZGVmYXVsdFByb3BzPWUuZ2V0RGVmYXVsdFByb3BzKCkpLGUucHJvdG90eXBlLnJlbmRlcnx8ZigiODMiKTtmb3IodmFyIG4gaW4gRSllLnByb3RvdHlwZVtuXXx8KGUucHJvdG90eXBlW25dPW51bGwpO3JldHVybiBlfSxpbmplY3Rpb246e2luamVjdE1peGluOmZ1bmN0aW9uKHQpe2IucHVzaCh0KX19fTtlLmV4cG9ydHM9Tn0sezExOjExLDEyOjEyLDIwOjIwLDIzOjIzLDI0OjI0LDI1OjI1LDI2OjI2LDY6Niw5Ojl9XSw2OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCxlLG4pe3RoaXMucHJvcHM9dCx0aGlzLmNvbnRleHQ9ZSx0aGlzLnJlZnM9YSx0aGlzLnVwZGF0ZXI9bnx8aX12YXIgbz10KDIwKSxpPXQoMTEpLGE9KHQoMTcpLHQoMjMpKTt0KDI0KSx0KDI1KTtyLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9LHIucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKHQsZSl7Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9dCYmbygiODUiKSx0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsdCksZSYmdGhpcy51cGRhdGVyLmVucXVldWVDYWxsYmFjayh0aGlzLGUsInNldFN0YXRlIil9LHIucHJvdG90eXBlLmZvcmNlVXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMudXBkYXRlci5lbnF1ZXVlRm9yY2VVcGRhdGUodGhpcyksdCYmdGhpcy51cGRhdGVyLmVucXVldWVDYWxsYmFjayh0aGlzLHQsImZvcmNlVXBkYXRlIil9O2UuZXhwb3J0cz1yfSx7MTE6MTEsMTc6MTcsMjA6MjAsMjM6MjMsMjQ6MjQsMjU6MjV9XSw3OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXtjdXJyZW50Om51bGx9O2UuZXhwb3J0cz1yfSx7fV0sODpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KDkpLG89ci5jcmVhdGVGYWN0b3J5LGk9e2E6bygiYSIpLGFiYnI6bygiYWJiciIpLGFkZHJlc3M6bygiYWRkcmVzcyIpLGFyZWE6bygiYXJlYSIpLGFydGljbGU6bygiYXJ0aWNsZSIpLGFzaWRlOm8oImFzaWRlIiksYXVkaW86bygiYXVkaW8iKSxiOm8oImIiKSxiYXNlOm8oImJhc2UiKSxiZGk6bygiYmRpIiksYmRvOm8oImJkbyIpLGJpZzpvKCJiaWciKSxibG9ja3F1b3RlOm8oImJsb2NrcXVvdGUiKSxib2R5Om8oImJvZHkiKSxicjpvKCJiciIpLGJ1dHRvbjpvKCJidXR0b24iKSxjYW52YXM6bygiY2FudmFzIiksY2FwdGlvbjpvKCJjYXB0aW9uIiksY2l0ZTpvKCJjaXRlIiksY29kZTpvKCJjb2RlIiksY29sOm8oImNvbCIpLGNvbGdyb3VwOm8oImNvbGdyb3VwIiksZGF0YTpvKCJkYXRhIiksZGF0YWxpc3Q6bygiZGF0YWxpc3QiKSxkZDpvKCJkZCIpLGRlbDpvKCJkZWwiKSxkZXRhaWxzOm8oImRldGFpbHMiKSxkZm46bygiZGZuIiksZGlhbG9nOm8oImRpYWxvZyIpLGRpdjpvKCJkaXYiKSxkbDpvKCJkbCIpLGR0Om8oImR0IiksZW06bygiZW0iKSxlbWJlZDpvKCJlbWJlZCIpLGZpZWxkc2V0Om8oImZpZWxkc2V0IiksZmlnY2FwdGlvbjpvKCJmaWdjYXB0aW9uIiksZmlndXJlOm8oImZpZ3VyZSIpLGZvb3RlcjpvKCJmb290ZXIiKSxmb3JtOm8oImZvcm0iKSxoMTpvKCJoMSIpLGgyOm8oImgyIiksaDM6bygiaDMiKSxoNDpvKCJoNCIpLGg1Om8oImg1IiksaDY6bygiaDYiKSxoZWFkOm8oImhlYWQiKSxoZWFkZXI6bygiaGVhZGVyIiksaGdyb3VwOm8oImhncm91cCIpLGhyOm8oImhyIiksaHRtbDpvKCJodG1sIiksaTpvKCJpIiksaWZyYW1lOm8oImlmcmFtZSIpLGltZzpvKCJpbWciKSxpbnB1dDpvKCJpbnB1dCIpLGluczpvKCJpbnMiKSxrYmQ6bygia2JkIiksa2V5Z2VuOm8oImtleWdlbiIpLGxhYmVsOm8oImxhYmVsIiksbGVnZW5kOm8oImxlZ2VuZCIpLGxpOm8oImxpIiksbGluazpvKCJsaW5rIiksbWFpbjpvKCJtYWluIiksbWFwOm8oIm1hcCIpLG1hcms6bygibWFyayIpLG1lbnU6bygibWVudSIpLG1lbnVpdGVtOm8oIm1lbnVpdGVtIiksbWV0YTpvKCJtZXRhIiksbWV0ZXI6bygibWV0ZXIiKSxuYXY6bygibmF2Iiksbm9zY3JpcHQ6bygibm9zY3JpcHQiKSxvYmplY3Q6bygib2JqZWN0Iiksb2w6bygib2wiKSxvcHRncm91cDpvKCJvcHRncm91cCIpLG9wdGlvbjpvKCJvcHRpb24iKSxvdXRwdXQ6bygib3V0cHV0IikscDpvKCJwIikscGFyYW06bygicGFyYW0iKSxwaWN0dXJlOm8oInBpY3R1cmUiKSxwcmU6bygicHJlIikscHJvZ3Jlc3M6bygicHJvZ3Jlc3MiKSxxOm8oInEiKSxycDpvKCJycCIpLHJ0Om8oInJ0IikscnVieTpvKCJydWJ5IiksczpvKCJzIiksc2FtcDpvKCJzYW1wIiksc2NyaXB0Om8oInNjcmlwdCIpLHNlY3Rpb246bygic2VjdGlvbiIpLHNlbGVjdDpvKCJzZWxlY3QiKSxzbWFsbDpvKCJzbWFsbCIpLHNvdXJjZTpvKCJzb3VyY2UiKSxzcGFuOm8oInNwYW4iKSxzdHJvbmc6bygic3Ryb25nIiksc3R5bGU6bygic3R5bGUiKSxzdWI6bygic3ViIiksc3VtbWFyeTpvKCJzdW1tYXJ5Iiksc3VwOm8oInN1cCIpLHRhYmxlOm8oInRhYmxlIiksdGJvZHk6bygidGJvZHkiKSx0ZDpvKCJ0ZCIpLHRleHRhcmVhOm8oInRleHRhcmVhIiksdGZvb3Q6bygidGZvb3QiKSx0aDpvKCJ0aCIpLHRoZWFkOm8oInRoZWFkIiksdGltZTpvKCJ0aW1lIiksdGl0bGU6bygidGl0bGUiKSx0cjpvKCJ0ciIpLHRyYWNrOm8oInRyYWNrIiksdTpvKCJ1IiksdWw6bygidWwiKSx2YXI6bygidmFyIiksdmlkZW86bygidmlkZW8iKSx3YnI6bygid2JyIiksY2lyY2xlOm8oImNpcmNsZSIpLGNsaXBQYXRoOm8oImNsaXBQYXRoIiksZGVmczpvKCJkZWZzIiksZWxsaXBzZTpvKCJlbGxpcHNlIiksZzpvKCJnIiksaW1hZ2U6bygiaW1hZ2UiKSxsaW5lOm8oImxpbmUiKSxsaW5lYXJHcmFkaWVudDpvKCJsaW5lYXJHcmFkaWVudCIpLG1hc2s6bygibWFzayIpLHBhdGg6bygicGF0aCIpLHBhdHRlcm46bygicGF0dGVybiIpLHBvbHlnb246bygicG9seWdvbiIpLHBvbHlsaW5lOm8oInBvbHlsaW5lIikscmFkaWFsR3JhZGllbnQ6bygicmFkaWFsR3JhZGllbnQiKSxyZWN0Om8oInJlY3QiKSxzdG9wOm8oInN0b3AiKSxzdmc6bygic3ZnIiksdGV4dDpvKCJ0ZXh0IiksdHNwYW46bygidHNwYW4iKX07ZS5leHBvcnRzPWl9LHs5Ojl9XSw5OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuIHZvaWQgMCE9PXQucmVmfWZ1bmN0aW9uIG8odCl7cmV0dXJuIHZvaWQgMCE9PXQua2V5fXZhciBpPXQoMjYpLGE9dCg3KSx1PSh0KDI1KSx0KDE3KSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KSxzPXQoMTApLGM9e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9fc291cmNlOiEwfSxsPWZ1bmN0aW9uKHQsZSxuLHIsbyxpLGEpe3JldHVybnskJHR5cGVvZjpzLHR5cGU6dCxrZXk6ZSxyZWY6bixwcm9wczphLF9vd25lcjppfX07bC5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxzPXt9LHA9bnVsbCxmPW51bGw7aWYobnVsbCE9ZSl7cihlKSYmKGY9ZS5yZWYpLG8oZSkmJihwPSIiK2Uua2V5KSx2b2lkIDA9PT1lLl9fc2VsZj9udWxsOmUuX19zZWxmLHZvaWQgMD09PWUuX19zb3VyY2U/bnVsbDplLl9fc291cmNlO2ZvcihpIGluIGUpdS5jYWxsKGUsaSkmJiFjLmhhc093blByb3BlcnR5KGkpJiYoc1tpXT1lW2ldKX12YXIgZD1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWQpcy5jaGlsZHJlbj1uO2Vsc2UgaWYoZD4xKXtmb3IodmFyIGg9QXJyYXkoZCkseT0wO3k8ZDt5KyspaFt5XT1hcmd1bWVudHNbeSsyXTtzLmNoaWxkcmVuPWh9aWYodCYmdC5kZWZhdWx0UHJvcHMpe3ZhciB2PXQuZGVmYXVsdFByb3BzO2ZvcihpIGluIHYpdm9pZCAwPT09c1tpXSYmKHNbaV09dltpXSl9cmV0dXJuIGwodCxwLGYsMCwwLGEuY3VycmVudCxzKX0sbC5jcmVhdGVGYWN0b3J5PWZ1bmN0aW9uKHQpe3ZhciBlPWwuY3JlYXRlRWxlbWVudC5iaW5kKG51bGwsdCk7cmV0dXJuIGUudHlwZT10LGV9LGwuY2xvbmVBbmRSZXBsYWNlS2V5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGwodC50eXBlLGUsdC5yZWYsdC5fc2VsZix0Ll9zb3VyY2UsdC5fb3duZXIsdC5wcm9wcyl9LGwuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcyxwPWkoe30sdC5wcm9wcyksZj10LmtleSxkPXQucmVmLGg9KHQuX3NlbGYsdC5fc291cmNlLHQuX293bmVyKTtpZihudWxsIT1lKXtyKGUpJiYoZD1lLnJlZixoPWEuY3VycmVudCksbyhlKSYmKGY9IiIrZS5rZXkpO3ZhciB5O3QudHlwZSYmdC50eXBlLmRlZmF1bHRQcm9wcyYmKHk9dC50eXBlLmRlZmF1bHRQcm9wcyk7Zm9yKHMgaW4gZSl1LmNhbGwoZSxzKSYmIWMuaGFzT3duUHJvcGVydHkocykmJih2b2lkIDA9PT1lW3NdJiZ2b2lkIDAhPT15P3Bbc109eVtzXTpwW3NdPWVbc10pfXZhciB2PWFyZ3VtZW50cy5sZW5ndGgtMjtpZigxPT09dilwLmNoaWxkcmVuPW47ZWxzZSBpZih2PjEpe2Zvcih2YXIgbT1BcnJheSh2KSxnPTA7Zzx2O2crKyltW2ddPWFyZ3VtZW50c1tnKzJdO3AuY2hpbGRyZW49bX1yZXR1cm4gbCh0LnR5cGUsZixkLDAsMCxoLHApfSxsLmlzVmFsaWRFbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXQmJnQuJCR0eXBlb2Y9PT1zfSxlLmV4cG9ydHM9bH0sezEwOjEwLDE3OjE3LDI1OjI1LDI2OjI2LDc6N31dLDEwOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDM7ZS5leHBvcnRzPXJ9LHt9XSwxMTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj0odCgyNSkse2lzTW91bnRlZDpmdW5jdGlvbih0KXtyZXR1cm4hMX0sZW5xdWV1ZUNhbGxiYWNrOmZ1bmN0aW9uKHQsZSl7fSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24odCl7fSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKHQsZSl7fSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24odCxlKXt9fSk7ZS5leHBvcnRzPXJ9LHsyNToyNX1dLDEyOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9O2UuZXhwb3J0cz1yfSx7fV0sMTM6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCg5KSxvPXIuaXNWYWxpZEVsZW1lbnQsaT10KDI4KTtlLmV4cG9ydHM9aShvKX0sezI4OjI4LDk6OX1dLDE0OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCxlLG4pe3RoaXMucHJvcHM9dCx0aGlzLmNvbnRleHQ9ZSx0aGlzLnJlZnM9cyx0aGlzLnVwZGF0ZXI9bnx8dX1mdW5jdGlvbiBvKCl7fXZhciBpPXQoMjYpLGE9dCg2KSx1PXQoMTEpLHM9dCgyMyk7by5wcm90b3R5cGU9YS5wcm90b3R5cGUsci5wcm90b3R5cGU9bmV3IG8sci5wcm90b3R5cGUuY29uc3RydWN0b3I9cixpKHIucHJvdG90eXBlLGEucHJvdG90eXBlKSxyLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCxlLmV4cG9ydHM9cn0sezExOjExLDIzOjIzLDI2OjI2LDY6Nn1dLDE1OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXQoMjYpLG89dCgzKSxpPXIobyx7X19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ6e1JlYWN0Q3VycmVudE93bmVyOnQoNyl9fSk7ZS5leHBvcnRzPWl9LHsyNjoyNiwzOjMsNzo3fV0sMTY6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPSIxNS41LjAifSx7fV0sMTc6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPSExfSx7fV0sMTg6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXt2YXIgZT10JiYobyYmdFtvXXx8dFtpXSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpcmV0dXJuIGV9dmFyIG89ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yLGk9IkBAaXRlcmF0b3IiO2UuZXhwb3J0cz1yfSx7fV0sMTk6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4gaS5pc1ZhbGlkRWxlbWVudCh0KXx8bygiMTQzIiksdH12YXIgbz10KDIwKSxpPXQoOSk7dCgyNCk7ZS5leHBvcnRzPXJ9LHsyMDoyMCwyNDoyNCw5Ojl9XSwyMDpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKHQpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLTEsbj0iTWluaWZpZWQgUmVhY3QgZXJyb3IgIyIrdCsiOyB2aXNpdCBodHRwOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD0iK3Qscj0wO3I8ZTtyKyspbis9IiZhcmdzW109IitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW3IrMV0pO24rPSIgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLiI7dmFyIG89bmV3IEVycm9yKG4pO3Rocm93IG8ubmFtZT0iSW52YXJpYW50IFZpb2xhdGlvbiIsby5mcmFtZXNUb1BvcD0xLG99ZS5leHBvcnRzPXJ9LHt9XSwyMTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKHQsZSl7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9dC5rZXk/Yy5lc2NhcGUodC5rZXkpOmUudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIG8odCxlLG4saSl7dmFyIGY9dHlwZW9mIHQ7aWYoInVuZGVmaW5lZCIhPT1mJiYiYm9vbGVhbiIhPT1mfHwodD1udWxsKSxudWxsPT09dHx8InN0cmluZyI9PT1mfHwibnVtYmVyIj09PWZ8fCJvYmplY3QiPT09ZiYmdC4kJHR5cGVvZj09PXUpcmV0dXJuIG4oaSx0LCIiPT09ZT9sK3IodCwwKTplKSwxO3ZhciBkLGgseT0wLHY9IiI9PT1lP2w6ZStwO2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciBtPTA7bTx0Lmxlbmd0aDttKyspZD10W21dLGg9dityKGQsbSkseSs9byhkLGgsbixpKTtlbHNle3ZhciBnPXModCk7aWYoZyl7dmFyIGIsRT1nLmNhbGwodCk7aWYoZyE9PXQuZW50cmllcylmb3IodmFyIF89MDshKGI9RS5uZXh0KCkpLmRvbmU7KWQ9Yi52YWx1ZSxoPXYrcihkLF8rKykseSs9byhkLGgsbixpKTtlbHNlIGZvcig7IShiPUUubmV4dCgpKS5kb25lOyl7dmFyIFA9Yi52YWx1ZTtQJiYoZD1QWzFdLGg9ditjLmVzY2FwZShQWzBdKStwK3IoZCwwKSx5Kz1vKGQsaCxuLGkpKX19ZWxzZSBpZigib2JqZWN0Ij09PWYpe3ZhciB4PVN0cmluZyh0KTthKCIzMSIsIltvYmplY3QgT2JqZWN0XSI9PT14PyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKHQpLmpvaW4oIiwgIikrIn0iOngsIiIpfX1yZXR1cm4geX1mdW5jdGlvbiBpKHQsZSxuKXtyZXR1cm4gbnVsbD09dD8wOm8odCwiIixlLG4pfXZhciBhPXQoMjApLHU9KHQoNyksdCgxMCkpLHM9dCgxOCksYz0odCgyNCksdCgxKSksbD0odCgyNSksIi4iKSxwPSI6IjtlLmV4cG9ydHM9aX0sezE6MSwxMDoxMCwxODoxOCwyMDoyMCwyNDoyNCwyNToyNSw3Ojd9XSwyMjpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX12YXIgbz1mdW5jdGlvbigpe307by50aGF0UmV0dXJucz1yLG8udGhhdFJldHVybnNGYWxzZT1yKCExKSxvLnRoYXRSZXR1cm5zVHJ1ZT1yKCEwKSxvLnRoYXRSZXR1cm5zTnVsbD1yKG51bGwpLG8udGhhdFJldHVybnNUaGlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LG8udGhhdFJldHVybnNBcmd1bWVudD1mdW5jdGlvbih0KXtyZXR1cm4gdH0sZS5leHBvcnRzPW99LHt9XSwyMzpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17fTtlLmV4cG9ydHM9cn0se31dLDI0OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCxlLG4scixpLGEsdSxzKXtpZihvKGUpLCF0KXt2YXIgYztpZih2b2lkIDA9PT1lKWM9bmV3IEVycm9yKCJNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLiIpO2Vsc2V7dmFyIGw9W24scixpLGEsdSxzXSxwPTA7Yz1uZXcgRXJyb3IoZS5yZXBsYWNlKC8lcy9nLGZ1bmN0aW9uKCl7cmV0dXJuIGxbcCsrXX0pKSxjLm5hbWU9IkludmFyaWFudCBWaW9sYXRpb24ifXRocm93IGMuZnJhbWVzVG9Qb3A9MSxjfX12YXIgbz1mdW5jdGlvbih0KXt9O2UuZXhwb3J0cz1yfSx7fV0sMjU6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgyMiksbz1yO2UuZXhwb3J0cz1vfSx7MjI6MjJ9XSwyNjpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKHQpe2lmKG51bGw9PT10fHx2b2lkIDA9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkIik7cmV0dXJuIE9iamVjdCh0KX12YXIgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLGk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxhPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dHJ5e2lmKCFPYmplY3QuYXNzaWduKXJldHVybiExO3ZhciB0PW5ldyBTdHJpbmcoImFiYyIpO2lmKHRbNV09ImRlIiwiNSI9PT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KVswXSlyZXR1cm4hMTtmb3IodmFyIGU9e30sbj0wO248MTA7bisrKWVbIl8iK1N0cmluZy5mcm9tQ2hhckNvZGUobildPW47aWYoIjAxMjM0NTY3ODkiIT09T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfSkuam9pbigiIikpcmV0dXJuITE7dmFyIHI9e307cmV0dXJuImFiY2RlZmdoaWprbG1ub3BxcnN0Ii5zcGxpdCgiIikuZm9yRWFjaChmdW5jdGlvbih0KXtyW3RdPXR9KSwiYWJjZGVmZ2hpamtsbW5vcHFyc3QiPT09T2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSxyKSkuam9pbigiIil9Y2F0Y2godCl7cmV0dXJuITF9fSgpP09iamVjdC5hc3NpZ246ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4sdSxzPXIodCksYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspe249T2JqZWN0KGFyZ3VtZW50c1tjXSk7Zm9yKHZhciBsIGluIG4paS5jYWxsKG4sbCkmJihzW2xdPW5bbF0pO2lmKG8pe3U9byhuKTtmb3IodmFyIHA9MDtwPHUubGVuZ3RoO3ArKylhLmNhbGwobix1W3BdKSYmKHNbdVtwXV09blt1W3BdXSl9fXJldHVybiBzfX0se31dLDI3OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCxlLG4scixvKXt9dCgyNCksdCgyNSksdCgyOSk7ZS5leHBvcnRzPXJ9LHsyNDoyNCwyNToyNSwyOToyOX1dLDI4OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPSh0KDIyKSx0KDI0KSksbz0odCgyNSksdCgyOSksdCgyNykpO2UuZXhwb3J0cz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3RoaXMubWVzc2FnZT10LHRoaXMuc3RhY2s9IiJ9dmFyIG4saT0oImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yLGZ1bmN0aW9uKCl7cighMSwiUmVhY3QuUHJvcFR5cGVzIHR5cGUgY2hlY2tpbmcgY29kZSBpcyBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLiIpfSk7aS5pc1JlcXVpcmVkPWk7dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gaX07cmV0dXJuIG49e2FycmF5OmksYm9vbDppLGZ1bmM6aSxudW1iZXI6aSxvYmplY3Q6aSxzdHJpbmc6aSxzeW1ib2w6aSxhbnk6aSxhcnJheU9mOmEsZWxlbWVudDppLGluc3RhbmNlT2Y6YSxub2RlOmksb2JqZWN0T2Y6YSxvbmVPZjphLG9uZU9mVHlwZTphLHNoYXBlOmF9LGUucHJvdG90eXBlPUVycm9yLnByb3RvdHlwZSxuLmNoZWNrUHJvcFR5cGVzPW8sbi5Qcm9wVHlwZXM9bixufX0sezIyOjIyLDI0OjI0LDI1OjI1LDI3OjI3LDI5OjI5fV0sMjk6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPSJTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCJ9LHt9XX0se30sWzE1XSkoMTUpfSk7"></script>
<script src="data:application/x-javascript;base64,LyoqDQogKiBSZWFjdERPTSB2MTUuNS4wDQogKg0KICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4NCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKg0KICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlDQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQNCiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Lg0KICoNCiAqLw0KIWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9ZShyZXF1aXJlKCJyZWFjdCIpKTtlbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFsicmVhY3QiXSxlKTtlbHNle3ZhciB0O3Q9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLHQuUmVhY3RET009ZSh0LlJlYWN0KX19KGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gbyhpLHMpe2lmKCFuW2ldKXtpZighdFtpXSl7dmFyIHU9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIXMmJnUpcmV0dXJuIHUoaSwhMCk7aWYoYSlyZXR1cm4gYShpLCEwKTt2YXIgbD1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitpKyInIik7dGhyb3cgbC5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixsfXZhciBjPW5baV09e2V4cG9ydHM6e319O3RbaV1bMF0uY2FsbChjLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtpXVsxXVtlXTtyZXR1cm4gbyhufHxlKX0sYyxjLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIGE9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8ci5sZW5ndGg7aSsrKW8ocltpXSk7cmV0dXJuIG99KHsxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtQcm9wZXJ0aWVzOnsiYXJpYS1jdXJyZW50IjowLCJhcmlhLWRldGFpbHMiOjAsImFyaWEtZGlzYWJsZWQiOjAsImFyaWEtaGlkZGVuIjowLCJhcmlhLWludmFsaWQiOjAsImFyaWEta2V5c2hvcnRjdXRzIjowLCJhcmlhLWxhYmVsIjowLCJhcmlhLXJvbGVkZXNjcmlwdGlvbiI6MCwiYXJpYS1hdXRvY29tcGxldGUiOjAsImFyaWEtY2hlY2tlZCI6MCwiYXJpYS1leHBhbmRlZCI6MCwiYXJpYS1oYXNwb3B1cCI6MCwiYXJpYS1sZXZlbCI6MCwiYXJpYS1tb2RhbCI6MCwiYXJpYS1tdWx0aWxpbmUiOjAsImFyaWEtbXVsdGlzZWxlY3RhYmxlIjowLCJhcmlhLW9yaWVudGF0aW9uIjowLCJhcmlhLXBsYWNlaG9sZGVyIjowLCJhcmlhLXByZXNzZWQiOjAsImFyaWEtcmVhZG9ubHkiOjAsImFyaWEtcmVxdWlyZWQiOjAsImFyaWEtc2VsZWN0ZWQiOjAsImFyaWEtc29ydCI6MCwiYXJpYS12YWx1ZW1heCI6MCwiYXJpYS12YWx1ZW1pbiI6MCwiYXJpYS12YWx1ZW5vdyI6MCwiYXJpYS12YWx1ZXRleHQiOjAsImFyaWEtYXRvbWljIjowLCJhcmlhLWJ1c3kiOjAsImFyaWEtbGl2ZSI6MCwiYXJpYS1yZWxldmFudCI6MCwiYXJpYS1kcm9wZWZmZWN0IjowLCJhcmlhLWdyYWJiZWQiOjAsImFyaWEtYWN0aXZlZGVzY2VuZGFudCI6MCwiYXJpYS1jb2xjb3VudCI6MCwiYXJpYS1jb2xpbmRleCI6MCwiYXJpYS1jb2xzcGFuIjowLCJhcmlhLWNvbnRyb2xzIjowLCJhcmlhLWRlc2NyaWJlZGJ5IjowLCJhcmlhLWVycm9ybWVzc2FnZSI6MCwiYXJpYS1mbG93dG8iOjAsImFyaWEtbGFiZWxsZWRieSI6MCwiYXJpYS1vd25zIjowLCJhcmlhLXBvc2luc2V0IjowLCJhcmlhLXJvd2NvdW50IjowLCJhcmlhLXJvd2luZGV4IjowLCJhcmlhLXJvd3NwYW4iOjAsImFyaWEtc2V0c2l6ZSI6MH0sRE9NQXR0cmlidXRlTmFtZXM6e30sRE9NUHJvcGVydHlOYW1lczp7fX07dC5leHBvcnRzPXJ9LHt9XSwyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMzMpLG89ZSgxMzEpLGE9e2ZvY3VzRE9NQ29tcG9uZW50OmZ1bmN0aW9uKCl7byhyLmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcykpfX07dC5leHBvcnRzPWF9LHsxMzE6MTMxLDMzOjMzfV0sMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybihlLmN0cmxLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXkpJiYhKGUuY3RybEtleSYmZS5hbHRLZXkpfWZ1bmN0aW9uIG8oZSl7c3dpdGNoKGUpe2Nhc2UidG9wQ29tcG9zaXRpb25TdGFydCI6cmV0dXJuIHcuY29tcG9zaXRpb25TdGFydDtjYXNlInRvcENvbXBvc2l0aW9uRW5kIjpyZXR1cm4gdy5jb21wb3NpdGlvbkVuZDtjYXNlInRvcENvbXBvc2l0aW9uVXBkYXRlIjpyZXR1cm4gdy5jb21wb3NpdGlvblVwZGF0ZX19ZnVuY3Rpb24gYShlLHQpe3JldHVybiJ0b3BLZXlEb3duIj09PWUmJnQua2V5Q29kZT09PXl9ZnVuY3Rpb24gaShlLHQpe3N3aXRjaChlKXtjYXNlInRvcEtleVVwIjpyZXR1cm4tMSE9PWcuaW5kZXhPZih0LmtleUNvZGUpO2Nhc2UidG9wS2V5RG93biI6cmV0dXJuIHQua2V5Q29kZSE9PXk7Y2FzZSJ0b3BLZXlQcmVzcyI6Y2FzZSJ0b3BNb3VzZURvd24iOmNhc2UidG9wQmx1ciI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLmRldGFpbDtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJiJkYXRhImluIHQ/dC5kYXRhOm51bGx9ZnVuY3Rpb24gdShlLHQsbixyKXt2YXIgdSxsO2lmKF8/dT1vKGUpOlA/aShlLG4pJiYodT13LmNvbXBvc2l0aW9uRW5kKTphKGUsbikmJih1PXcuY29tcG9zaXRpb25TdGFydCksIXUpcmV0dXJuIG51bGw7RSYmKFB8fHUhPT13LmNvbXBvc2l0aW9uU3RhcnQ/dT09PXcuY29tcG9zaXRpb25FbmQmJlAmJihsPVAuZ2V0RGF0YSgpKTpQPWguZ2V0UG9vbGVkKHIpKTt2YXIgYz1tLmdldFBvb2xlZCh1LHQsbixyKTtpZihsKWMuZGF0YT1sO2Vsc2V7dmFyIHA9cyhuKTtudWxsIT09cCYmKGMuZGF0YT1wKX1yZXR1cm4gZC5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGMpLGN9ZnVuY3Rpb24gbChlLHQpe3N3aXRjaChlKXtjYXNlInRvcENvbXBvc2l0aW9uRW5kIjpyZXR1cm4gcyh0KTtjYXNlInRvcEtleVByZXNzIjpyZXR1cm4gdC53aGljaCE9PXg/bnVsbDooaz0hMCxUKTtjYXNlInRvcFRleHRJbnB1dCI6dmFyIG49dC5kYXRhO3JldHVybiBuPT09VCYmaz9udWxsOm47ZGVmYXVsdDpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gYyhlLHQpe2lmKFApe2lmKCJ0b3BDb21wb3NpdGlvbkVuZCI9PT1lfHwhXyYmaShlLHQpKXt2YXIgbj1QLmdldERhdGEoKTtyZXR1cm4gaC5yZWxlYXNlKFApLFA9bnVsbCxufXJldHVybiBudWxsfXN3aXRjaChlKXtjYXNlInRvcFBhc3RlIjpyZXR1cm4gbnVsbDtjYXNlInRvcEtleVByZXNzIjpyZXR1cm4gdC53aGljaCYmIXIodCk/U3RyaW5nLmZyb21DaGFyQ29kZSh0LndoaWNoKTpudWxsO2Nhc2UidG9wQ29tcG9zaXRpb25FbmQiOnJldHVybiBFP251bGw6dC5kYXRhO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIHAoZSx0LG4scil7dmFyIG87aWYoIShvPWI/bChlLG4pOmMoZSxuKSkpcmV0dXJuIG51bGw7dmFyIGE9di5nZXRQb29sZWQody5iZWZvcmVJbnB1dCx0LG4scik7cmV0dXJuIGEuZGF0YT1vLGQuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhhKSxhfXZhciBkPWUoMTkpLGY9ZSgxMjMpLGg9ZSgyMCksbT1lKDc4KSx2PWUoODIpLGc9WzksMTMsMjcsMzJdLHk9MjI5LF89Zi5jYW5Vc2VET00mJiJDb21wb3NpdGlvbkV2ZW50ImluIHdpbmRvdyxDPW51bGw7Zi5jYW5Vc2VET00mJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJihDPWRvY3VtZW50LmRvY3VtZW50TW9kZSk7dmFyIGI9Zi5jYW5Vc2VET00mJiJUZXh0RXZlbnQiaW4gd2luZG93JiYhQyYmIWZ1bmN0aW9uKCl7dmFyIGU9d2luZG93Lm9wZXJhO3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudmVyc2lvbiYmcGFyc2VJbnQoZS52ZXJzaW9uKCksMTApPD0xMn0oKSxFPWYuY2FuVXNlRE9NJiYoIV98fEMmJkM+OCYmQzw9MTEpLHg9MzIsVD1TdHJpbmcuZnJvbUNoYXJDb2RlKHgpLHc9e2JlZm9yZUlucHV0OntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDoib25CZWZvcmVJbnB1dCIsY2FwdHVyZWQ6Im9uQmVmb3JlSW5wdXRDYXB0dXJlIn0sZGVwZW5kZW5jaWVzOlsidG9wQ29tcG9zaXRpb25FbmQiLCJ0b3BLZXlQcmVzcyIsInRvcFRleHRJbnB1dCIsInRvcFBhc3RlIl19LGNvbXBvc2l0aW9uRW5kOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDoib25Db21wb3NpdGlvbkVuZCIsY2FwdHVyZWQ6Im9uQ29tcG9zaXRpb25FbmRDYXB0dXJlIn0sZGVwZW5kZW5jaWVzOlsidG9wQmx1ciIsInRvcENvbXBvc2l0aW9uRW5kIiwidG9wS2V5RG93biIsInRvcEtleVByZXNzIiwidG9wS2V5VXAiLCJ0b3BNb3VzZURvd24iXX0sY29tcG9zaXRpb25TdGFydDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Im9uQ29tcG9zaXRpb25TdGFydCIsY2FwdHVyZWQ6Im9uQ29tcG9zaXRpb25TdGFydENhcHR1cmUifSxkZXBlbmRlbmNpZXM6WyJ0b3BCbHVyIiwidG9wQ29tcG9zaXRpb25TdGFydCIsInRvcEtleURvd24iLCJ0b3BLZXlQcmVzcyIsInRvcEtleVVwIiwidG9wTW91c2VEb3duIl19LGNvbXBvc2l0aW9uVXBkYXRlOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDoib25Db21wb3NpdGlvblVwZGF0ZSIsY2FwdHVyZWQ6Im9uQ29tcG9zaXRpb25VcGRhdGVDYXB0dXJlIn0sZGVwZW5kZW5jaWVzOlsidG9wQmx1ciIsInRvcENvbXBvc2l0aW9uVXBkYXRlIiwidG9wS2V5RG93biIsInRvcEtleVByZXNzIiwidG9wS2V5VXAiLCJ0b3BNb3VzZURvd24iXX19LGs9ITEsUD1udWxsLFM9e2V2ZW50VHlwZXM6dyxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVyblt1KGUsdCxuLHIpLHAoZSx0LG4scildfX07dC5leHBvcnRzPVN9LHsxMjM6MTIzLDE5OjE5LDIwOjIwLDc4Ojc4LDgyOjgyfV0sNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIGUrdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnN1YnN0cmluZygxKX12YXIgbz17YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsYm9yZGVySW1hZ2VPdXRzZXQ6ITAsYm9yZGVySW1hZ2VTbGljZTohMCxib3JkZXJJbWFnZVdpZHRoOiEwLGJveEZsZXg6ITAsYm94RmxleEdyb3VwOiEwLGJveE9yZGluYWxHcm91cDohMCxjb2x1bW5Db3VudDohMCxmbGV4OiEwLGZsZXhHcm93OiEwLGZsZXhQb3NpdGl2ZTohMCxmbGV4U2hyaW5rOiEwLGZsZXhOZWdhdGl2ZTohMCxmbGV4T3JkZXI6ITAsZ3JpZFJvdzohMCxncmlkQ29sdW1uOiEwLGZvbnRXZWlnaHQ6ITAsbGluZUNsYW1wOiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHRhYlNpemU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwLGZpbGxPcGFjaXR5OiEwLGZsb29kT3BhY2l0eTohMCxzdG9wT3BhY2l0eTohMCxzdHJva2VEYXNoYXJyYXk6ITAsc3Ryb2tlRGFzaG9mZnNldDohMCxzdHJva2VNaXRlcmxpbWl0OiEwLHN0cm9rZU9wYWNpdHk6ITAsc3Ryb2tlV2lkdGg6ITB9LGE9WyJXZWJraXQiLCJtcyIsIk1veiIsIk8iXTtPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2EuZm9yRWFjaChmdW5jdGlvbih0KXtvW3IodCxlKV09b1tlXX0pfSk7dmFyIGk9e2JhY2tncm91bmQ6e2JhY2tncm91bmRBdHRhY2htZW50OiEwLGJhY2tncm91bmRDb2xvcjohMCxiYWNrZ3JvdW5kSW1hZ2U6ITAsYmFja2dyb3VuZFBvc2l0aW9uWDohMCxiYWNrZ3JvdW5kUG9zaXRpb25ZOiEwLGJhY2tncm91bmRSZXBlYXQ6ITB9LGJhY2tncm91bmRQb3NpdGlvbjp7YmFja2dyb3VuZFBvc2l0aW9uWDohMCxiYWNrZ3JvdW5kUG9zaXRpb25ZOiEwfSxib3JkZXI6e2JvcmRlcldpZHRoOiEwLGJvcmRlclN0eWxlOiEwLGJvcmRlckNvbG9yOiEwfSxib3JkZXJCb3R0b206e2JvcmRlckJvdHRvbVdpZHRoOiEwLGJvcmRlckJvdHRvbVN0eWxlOiEwLGJvcmRlckJvdHRvbUNvbG9yOiEwfSxib3JkZXJMZWZ0Ontib3JkZXJMZWZ0V2lkdGg6ITAsYm9yZGVyTGVmdFN0eWxlOiEwLGJvcmRlckxlZnRDb2xvcjohMH0sYm9yZGVyUmlnaHQ6e2JvcmRlclJpZ2h0V2lkdGg6ITAsYm9yZGVyUmlnaHRTdHlsZTohMCxib3JkZXJSaWdodENvbG9yOiEwfSxib3JkZXJUb3A6e2JvcmRlclRvcFdpZHRoOiEwLGJvcmRlclRvcFN0eWxlOiEwLGJvcmRlclRvcENvbG9yOiEwfSxmb250Ontmb250U3R5bGU6ITAsZm9udFZhcmlhbnQ6ITAsZm9udFdlaWdodDohMCxmb250U2l6ZTohMCxsaW5lSGVpZ2h0OiEwLGZvbnRGYW1pbHk6ITB9LG91dGxpbmU6e291dGxpbmVXaWR0aDohMCxvdXRsaW5lU3R5bGU6ITAsb3V0bGluZUNvbG9yOiEwfX0scz17aXNVbml0bGVzc051bWJlcjpvLHNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9uczppfTt0LmV4cG9ydHM9c30se31dLDU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSg0KSxvPWUoMTIzKSxhPShlKDU4KSxlKDEyNSksZSg5NCkpLGk9ZSgxMzYpLHM9ZSgxNDApLHU9KGUoMTQyKSxzKGZ1bmN0aW9uKGUpe3JldHVybiBpKGUpfSkpLGw9ITEsYz0iY3NzRmxvYXQiO2lmKG8uY2FuVXNlRE9NKXt2YXIgcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZTt0cnl7cC5mb250PSIifWNhdGNoKGUpe2w9ITB9dm9pZCAwPT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmNzc0Zsb2F0JiYoYz0ic3R5bGVGbG9hdCIpfXZhciBkPXtjcmVhdGVNYXJrdXBGb3JTdHlsZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj0iIjtmb3IodmFyIHIgaW4gZSlpZihlLmhhc093blByb3BlcnR5KHIpKXt2YXIgbz1lW3JdO251bGwhPW8mJihuKz11KHIpKyI6IixuKz1hKHIsbyx0KSsiOyIpfXJldHVybiBufHxudWxsfSxzZXRWYWx1ZUZvclN0eWxlczpmdW5jdGlvbihlLHQsbil7dmFyIG89ZS5zdHlsZTtmb3IodmFyIGkgaW4gdClpZih0Lmhhc093blByb3BlcnR5KGkpKXt2YXIgcz1hKGksdFtpXSxuKTtpZigiZmxvYXQiIT09aSYmImNzc0Zsb2F0IiE9PWl8fChpPWMpLHMpb1tpXT1zO2Vsc2V7dmFyIHU9bCYmci5zaG9ydGhhbmRQcm9wZXJ0eUV4cGFuc2lvbnNbaV07aWYodSlmb3IodmFyIHAgaW4gdSlvW3BdPSIiO2Vsc2Ugb1tpXT0iIn19fX07dC5leHBvcnRzPWR9LHsxMjM6MTIzLDEyNToxMjUsMTM2OjEzNiwxNDA6MTQwLDE0MjoxNDIsNDo0LDU4OjU4LDk0Ojk0fV0sNjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9dmFyIG89ZSgxMTIpLGE9ZSgyNCksaT0oZSgxMzcpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtyKHRoaXMsZSksdGhpcy5fY2FsbGJhY2tzPW51bGwsdGhpcy5fY29udGV4dHM9bnVsbCx0aGlzLl9hcmc9dH1yZXR1cm4gZS5wcm90b3R5cGUuZW5xdWV1ZT1mdW5jdGlvbihlLHQpe3RoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fFtdLHRoaXMuX2NhbGxiYWNrcy5wdXNoKGUpLHRoaXMuX2NvbnRleHRzPXRoaXMuX2NvbnRleHRzfHxbXSx0aGlzLl9jb250ZXh0cy5wdXNoKHQpfSxlLnByb3RvdHlwZS5ub3RpZnlBbGw9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9jYWxsYmFja3MsdD10aGlzLl9jb250ZXh0cyxuPXRoaXMuX2FyZztpZihlJiZ0KXtlLmxlbmd0aCE9PXQubGVuZ3RoJiZvKCIyNCIpLHRoaXMuX2NhbGxiYWNrcz1udWxsLHRoaXMuX2NvbnRleHRzPW51bGw7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspZVtyXS5jYWxsKHRbcl0sbik7ZS5sZW5ndGg9MCx0Lmxlbmd0aD0wfX0sZS5wcm90b3R5cGUuY2hlY2twb2ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jYWxsYmFja3M/dGhpcy5fY2FsbGJhY2tzLmxlbmd0aDowfSxlLnByb3RvdHlwZS5yb2xsYmFjaz1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3MmJnRoaXMuX2NvbnRleHRzJiYodGhpcy5fY2FsbGJhY2tzLmxlbmd0aD1lLHRoaXMuX2NvbnRleHRzLmxlbmd0aD1lKX0sZS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLl9jYWxsYmFja3M9bnVsbCx0aGlzLl9jb250ZXh0cz1udWxsfSxlLnByb3RvdHlwZS5kZXN0cnVjdG9yPWZ1bmN0aW9uKCl7dGhpcy5yZXNldCgpfSxlfSgpKTt0LmV4cG9ydHM9YS5hZGRQb29saW5nVG8oaSl9LHsxMTI6MTEyLDEzNzoxMzcsMjQ6MjR9XSw3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9ZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJzZWxlY3QiPT09dHx8ImlucHV0Ij09PXQmJiJmaWxlIj09PWUudHlwZX1mdW5jdGlvbiBvKGUpe3ZhciB0PVQuZ2V0UG9vbGVkKFMuY2hhbmdlLE0sZSx3KGUpKTtDLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXModCkseC5iYXRjaGVkVXBkYXRlcyhhLHQpfWZ1bmN0aW9uIGEoZSl7Xy5lbnF1ZXVlRXZlbnRzKGUpLF8ucHJvY2Vzc0V2ZW50UXVldWUoITEpfWZ1bmN0aW9uIGkoZSx0KXtOPWUsTT10LE4uYXR0YWNoRXZlbnQoIm9uY2hhbmdlIixvKX1mdW5jdGlvbiBzKCl7TiYmKE4uZGV0YWNoRXZlbnQoIm9uY2hhbmdlIixvKSxOPW51bGwsTT1udWxsKX1mdW5jdGlvbiB1KGUsdCl7aWYoInRvcENoYW5nZSI9PT1lKXJldHVybiB0fWZ1bmN0aW9uIGwoZSx0LG4peyJ0b3BGb2N1cyI9PT1lPyhzKCksaSh0LG4pKToidG9wQmx1ciI9PT1lJiZzKCl9ZnVuY3Rpb24gYyhlLHQpe049ZSxNPXQsTz1lLnZhbHVlLEk9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwidmFsdWUiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTiwidmFsdWUiLEQpLE4uYXR0YWNoRXZlbnQ/Ti5hdHRhY2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIsZCk6Ti5hZGRFdmVudExpc3RlbmVyKCJwcm9wZXJ0eWNoYW5nZSIsZCwhMSl9ZnVuY3Rpb24gcCgpe04mJihkZWxldGUgTi52YWx1ZSxOLmRldGFjaEV2ZW50P04uZGV0YWNoRXZlbnQoIm9ucHJvcGVydHljaGFuZ2UiLGQpOk4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigicHJvcGVydHljaGFuZ2UiLGQsITEpLE49bnVsbCxNPW51bGwsTz1udWxsLEk9bnVsbCl9ZnVuY3Rpb24gZChlKXtpZigidmFsdWUiPT09ZS5wcm9wZXJ0eU5hbWUpe3ZhciB0PWUuc3JjRWxlbWVudC52YWx1ZTt0IT09TyYmKE89dCxvKGUpKX19ZnVuY3Rpb24gZihlLHQpe2lmKCJ0b3BJbnB1dCI9PT1lKXJldHVybiB0fWZ1bmN0aW9uIGgoZSx0LG4peyJ0b3BGb2N1cyI9PT1lPyhwKCksYyh0LG4pKToidG9wQmx1ciI9PT1lJiZwKCl9ZnVuY3Rpb24gbShlLHQpe2lmKCgidG9wU2VsZWN0aW9uQ2hhbmdlIj09PWV8fCJ0b3BLZXlVcCI9PT1lfHwidG9wS2V5RG93biI9PT1lKSYmTiYmTi52YWx1ZSE9PU8pcmV0dXJuIE89Ti52YWx1ZSxNfWZ1bmN0aW9uIHYoZSl7cmV0dXJuIGUubm9kZU5hbWUmJiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJigiY2hlY2tib3giPT09ZS50eXBlfHwicmFkaW8iPT09ZS50eXBlKX1mdW5jdGlvbiBnKGUsdCl7aWYoInRvcENsaWNrIj09PWUpcmV0dXJuIHR9ZnVuY3Rpb24geShlLHQpe2lmKG51bGwhPWUpe3ZhciBuPWUuX3dyYXBwZXJTdGF0ZXx8dC5fd3JhcHBlclN0YXRlO2lmKG4mJm4uY29udHJvbGxlZCYmIm51bWJlciI9PT10LnR5cGUpe3ZhciByPSIiK3QudmFsdWU7dC5nZXRBdHRyaWJ1dGUoInZhbHVlIikhPT1yJiZ0LnNldEF0dHJpYnV0ZSgidmFsdWUiLHIpfX19dmFyIF89ZSgxNiksQz1lKDE5KSxiPWUoMTIzKSxFPWUoMzMpLHg9ZSg3MSksVD1lKDgwKSx3PWUoMTAyKSxrPWUoMTA5KSxQPWUoMTEwKSxTPXtjaGFuZ2U6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOiJvbkNoYW5nZSIsY2FwdHVyZWQ6Im9uQ2hhbmdlQ2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRvcEJsdXIiLCJ0b3BDaGFuZ2UiLCJ0b3BDbGljayIsInRvcEZvY3VzIiwidG9wSW5wdXQiLCJ0b3BLZXlEb3duIiwidG9wS2V5VXAiLCJ0b3BTZWxlY3Rpb25DaGFuZ2UiXX19LE49bnVsbCxNPW51bGwsTz1udWxsLEk9bnVsbCxSPSExO2IuY2FuVXNlRE9NJiYoUj1rKCJjaGFuZ2UiKSYmKCFkb2N1bWVudC5kb2N1bWVudE1vZGV8fGRvY3VtZW50LmRvY3VtZW50TW9kZT44KSk7dmFyIEE9ITE7Yi5jYW5Vc2VET00mJihBPWsoImlucHV0IikmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHxkb2N1bWVudC5kb2N1bWVudE1vZGU+MTEpKTt2YXIgRD17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkuZ2V0LmNhbGwodGhpcyl9LHNldDpmdW5jdGlvbihlKXtPPSIiK2UsSS5zZXQuY2FsbCh0aGlzLGUpfX0sTD17ZXZlbnRUeXBlczpTLGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIGEsaSxzPXQ/RS5nZXROb2RlRnJvbUluc3RhbmNlKHQpOndpbmRvdztpZihyKHMpP1I/YT11Omk9bDpQKHMpP0E/YT1mOihhPW0saT1oKTp2KHMpJiYoYT1nKSxhKXt2YXIgYz1hKGUsdCk7aWYoYyl7dmFyIHA9VC5nZXRQb29sZWQoUy5jaGFuZ2UsYyxuLG8pO3JldHVybiBwLnR5cGU9ImNoYW5nZSIsQy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKHApLHB9fWkmJmkoZSxzLHQpLCJ0b3BCbHVyIj09PWUmJnkodCxzKX19O3QuZXhwb3J0cz1MfSx7MTAyOjEwMiwxMDk6MTA5LDExMDoxMTAsMTIzOjEyMywxNjoxNiwxOToxOSwzMzozMyw3MTo3MSw4MDo4MH1dLDg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpJiYodD10WzFdKSx0P3QubmV4dFNpYmxpbmc6ZS5maXJzdENoaWxkfWZ1bmN0aW9uIG8oZSx0LG4pe2MuaW5zZXJ0VHJlZUJlZm9yZShlLHQsbil9ZnVuY3Rpb24gYShlLHQsbil7QXJyYXkuaXNBcnJheSh0KT9zKGUsdFswXSx0WzFdLG4pOm0oZSx0LG4pfWZ1bmN0aW9uIGkoZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgbj10WzFdO3Q9dFswXSx1KGUsdCxuKSxlLnJlbW92ZUNoaWxkKG4pfWUucmVtb3ZlQ2hpbGQodCl9ZnVuY3Rpb24gcyhlLHQsbixyKXtmb3IodmFyIG89dDs7KXt2YXIgYT1vLm5leHRTaWJsaW5nO2lmKG0oZSxvLHIpLG89PT1uKWJyZWFrO289YX19ZnVuY3Rpb24gdShlLHQsbil7Zm9yKDs7KXt2YXIgcj10Lm5leHRTaWJsaW5nO2lmKHI9PT1uKWJyZWFrO2UucmVtb3ZlQ2hpbGQocil9fWZ1bmN0aW9uIGwoZSx0LG4pe3ZhciByPWUucGFyZW50Tm9kZSxvPWUubmV4dFNpYmxpbmc7bz09PXQ/biYmbShyLGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG4pLG8pOm4/KGgobyxuKSx1KHIsbyx0KSk6dShyLGUsdCl9dmFyIGM9ZSg5KSxwPWUoMTMpLGQ9KGUoMzMpLGUoNTgpLGUoOTMpKSxmPWUoMTE0KSxoPWUoMTE1KSxtPWQoZnVuY3Rpb24oZSx0LG4pe2UuaW5zZXJ0QmVmb3JlKHQsbil9KSx2PXAuZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAsZz17ZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA6dixyZXBsYWNlRGVsaW1pdGVkVGV4dDpsLHByb2Nlc3NVcGRhdGVzOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBzPXRbbl07c3dpdGNoKHMudHlwZSl7Y2FzZSJJTlNFUlRfTUFSS1VQIjpvKGUscy5jb250ZW50LHIoZSxzLmFmdGVyTm9kZSkpO2JyZWFrO2Nhc2UiTU9WRV9FWElTVElORyI6YShlLHMuZnJvbU5vZGUscihlLHMuYWZ0ZXJOb2RlKSk7YnJlYWs7Y2FzZSJTRVRfTUFSS1VQIjpmKGUscy5jb250ZW50KTticmVhaztjYXNlIlRFWFRfQ09OVEVOVCI6aChlLHMuY29udGVudCk7YnJlYWs7Y2FzZSJSRU1PVkVfTk9ERSI6aShlLHMuZnJvbU5vZGUpfX19fTt0LmV4cG9ydHM9Z30sezExNDoxMTQsMTE1OjExNSwxMzoxMywzMzozMyw1ODo1OCw5OjksOTM6OTN9XSw5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7aWYoaCl7dmFyIHQ9ZS5ub2RlLG49ZS5jaGlsZHJlbjtpZihuLmxlbmd0aClmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyltKHQsbltyXSxudWxsKTtlbHNlIG51bGwhPWUuaHRtbD9wKHQsZS5odG1sKTpudWxsIT1lLnRleHQmJmYodCxlLnRleHQpfX1mdW5jdGlvbiBvKGUsdCl7ZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0Lm5vZGUsZSkscih0KX1mdW5jdGlvbiBhKGUsdCl7aD9lLmNoaWxkcmVuLnB1c2godCk6ZS5ub2RlLmFwcGVuZENoaWxkKHQubm9kZSl9ZnVuY3Rpb24gaShlLHQpe2g/ZS5odG1sPXQ6cChlLm5vZGUsdCl9ZnVuY3Rpb24gcyhlLHQpe2g/ZS50ZXh0PXQ6ZihlLm5vZGUsdCl9ZnVuY3Rpb24gdSgpe3JldHVybiB0aGlzLm5vZGUubm9kZU5hbWV9ZnVuY3Rpb24gbChlKXtyZXR1cm57bm9kZTplLGNoaWxkcmVuOltdLGh0bWw6bnVsbCx0ZXh0Om51bGwsdG9TdHJpbmc6dX19dmFyIGM9ZSgxMCkscD1lKDExNCksZD1lKDkzKSxmPWUoMTE1KSxoPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJiJudW1iZXIiPT10eXBlb2YgZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHwidW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvciYmInN0cmluZyI9PXR5cGVvZiBuYXZpZ2F0b3IudXNlckFnZW50JiYvXGJFZGdlXC9cZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxtPWQoZnVuY3Rpb24oZSx0LG4pezExPT09dC5ub2RlLm5vZGVUeXBlfHwxPT09dC5ub2RlLm5vZGVUeXBlJiYib2JqZWN0Ij09PXQubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYobnVsbD09dC5ub2RlLm5hbWVzcGFjZVVSSXx8dC5ub2RlLm5hbWVzcGFjZVVSST09PWMuaHRtbCk/KHIodCksZS5pbnNlcnRCZWZvcmUodC5ub2RlLG4pKTooZS5pbnNlcnRCZWZvcmUodC5ub2RlLG4pLHIodCkpfSk7bC5pbnNlcnRUcmVlQmVmb3JlPW0sbC5yZXBsYWNlQ2hpbGRXaXRoVHJlZT1vLGwucXVldWVDaGlsZD1hLGwucXVldWVIVE1MPWksbC5xdWV1ZVRleHQ9cyx0LmV4cG9ydHM9bH0sezEwOjEwLDExNDoxMTQsMTE1OjExNSw5Mzo5M31dLDEwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtodG1sOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixtYXRobWw6Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiLHN2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcifTt0LmV4cG9ydHM9cn0se31dLDExOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4oZSZ0KT09PXR9dmFyIG89ZSgxMTIpLGE9KGUoMTM3KSx7TVVTVF9VU0VfUFJPUEVSVFk6MSxIQVNfQk9PTEVBTl9WQUxVRTo0LEhBU19OVU1FUklDX1ZBTFVFOjgsSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUU6MjQsSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRTozMixpbmplY3RET01Qcm9wZXJ0eUNvbmZpZzpmdW5jdGlvbihlKXt2YXIgdD1hLG49ZS5Qcm9wZXJ0aWVzfHx7fSxpPWUuRE9NQXR0cmlidXRlTmFtZXNwYWNlc3x8e30sdT1lLkRPTUF0dHJpYnV0ZU5hbWVzfHx7fSxsPWUuRE9NUHJvcGVydHlOYW1lc3x8e30sYz1lLkRPTU11dGF0aW9uTWV0aG9kc3x8e307ZS5pc0N1c3RvbUF0dHJpYnV0ZSYmcy5faXNDdXN0b21BdHRyaWJ1dGVGdW5jdGlvbnMucHVzaChlLmlzQ3VzdG9tQXR0cmlidXRlKTtmb3IodmFyIHAgaW4gbil7cy5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHApJiZvKCI0OCIscCk7dmFyIGQ9cC50b0xvd2VyQ2FzZSgpLGY9bltwXSxoPXthdHRyaWJ1dGVOYW1lOmQsYXR0cmlidXRlTmFtZXNwYWNlOm51bGwscHJvcGVydHlOYW1lOnAsbXV0YXRpb25NZXRob2Q6bnVsbCxtdXN0VXNlUHJvcGVydHk6cihmLHQuTVVTVF9VU0VfUFJPUEVSVFkpLGhhc0Jvb2xlYW5WYWx1ZTpyKGYsdC5IQVNfQk9PTEVBTl9WQUxVRSksaGFzTnVtZXJpY1ZhbHVlOnIoZix0LkhBU19OVU1FUklDX1ZBTFVFKSxoYXNQb3NpdGl2ZU51bWVyaWNWYWx1ZTpyKGYsdC5IQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSksaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZTpyKGYsdC5IQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVFKX07aWYoaC5oYXNCb29sZWFuVmFsdWUraC5oYXNOdW1lcmljVmFsdWUraC5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlPD0xfHxvKCI1MCIscCksdS5oYXNPd25Qcm9wZXJ0eShwKSl7dmFyIG09dVtwXTtoLmF0dHJpYnV0ZU5hbWU9bX1pLmhhc093blByb3BlcnR5KHApJiYoaC5hdHRyaWJ1dGVOYW1lc3BhY2U9aVtwXSksbC5oYXNPd25Qcm9wZXJ0eShwKSYmKGgucHJvcGVydHlOYW1lPWxbcF0pLGMuaGFzT3duUHJvcGVydHkocCkmJihoLm11dGF0aW9uTWV0aG9kPWNbcF0pLHMucHJvcGVydGllc1twXT1ofX19KSxpPSI6QS1aX2EtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRCIscz17SURfQVRUUklCVVRFX05BTUU6ImRhdGEtcmVhY3RpZCIsUk9PVF9BVFRSSUJVVEVfTkFNRToiZGF0YS1yZWFjdHJvb3QiLEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVI6aSxBVFRSSUJVVEVfTkFNRV9DSEFSOmkrIlxcLS4wLTlcXHUwMEI3XFx1MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwIixwcm9wZXJ0aWVzOnt9LGdldFBvc3NpYmxlU3RhbmRhcmROYW1lOm51bGwsX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zOltdLGlzQ3VzdG9tQXR0cmlidXRlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8cy5faXNDdXN0b21BdHRyaWJ1dGVGdW5jdGlvbnMubGVuZ3RoO3QrKylpZigoMCxzLl9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uc1t0XSkoZSkpcmV0dXJuITA7cmV0dXJuITF9LGluamVjdGlvbjphfTt0LmV4cG9ydHM9c30sezExMjoxMTIsMTM3OjEzN31dLDEyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuISFsLmhhc093blByb3BlcnR5KGUpfHwhdS5oYXNPd25Qcm9wZXJ0eShlKSYmKHMudGVzdChlKT8obFtlXT0hMCwhMCk6KHVbZV09ITAsITEpKX1mdW5jdGlvbiBvKGUsdCl7cmV0dXJuIG51bGw9PXR8fGUuaGFzQm9vbGVhblZhbHVlJiYhdHx8ZS5oYXNOdW1lcmljVmFsdWUmJmlzTmFOKHQpfHxlLmhhc1Bvc2l0aXZlTnVtZXJpY1ZhbHVlJiZ0PDF8fGUuaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZSYmITE9PT10fXZhciBhPWUoMTEpLGk9KGUoMzMpLGUoNTgpLGUoMTExKSkscz0oZSgxNDIpLG5ldyBSZWdFeHAoIl5bIithLkFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIrIl1bIithLkFUVFJJQlVURV9OQU1FX0NIQVIrIl0qJCIpKSx1PXt9LGw9e30sYz17Y3JlYXRlTWFya3VwRm9ySUQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGEuSURfQVRUUklCVVRFX05BTUUrIj0iK2koZSl9LHNldEF0dHJpYnV0ZUZvcklEOmZ1bmN0aW9uKGUsdCl7ZS5zZXRBdHRyaWJ1dGUoYS5JRF9BVFRSSUJVVEVfTkFNRSx0KX0sY3JlYXRlTWFya3VwRm9yUm9vdDpmdW5jdGlvbigpe3JldHVybiBhLlJPT1RfQVRUUklCVVRFX05BTUUrJz0iIid9LHNldEF0dHJpYnV0ZUZvclJvb3Q6ZnVuY3Rpb24oZSl7ZS5zZXRBdHRyaWJ1dGUoYS5ST09UX0FUVFJJQlVURV9OQU1FLCIiKX0sY3JlYXRlTWFya3VwRm9yUHJvcGVydHk6ZnVuY3Rpb24oZSx0KXt2YXIgbj1hLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoZSk/YS5wcm9wZXJ0aWVzW2VdOm51bGw7aWYobil7aWYobyhuLHQpKXJldHVybiIiO3ZhciByPW4uYXR0cmlidXRlTmFtZTtyZXR1cm4gbi5oYXNCb29sZWFuVmFsdWV8fG4uaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZSYmITA9PT10P3IrJz0iIic6cisiPSIraSh0KX1yZXR1cm4gYS5pc0N1c3RvbUF0dHJpYnV0ZShlKT9udWxsPT10PyIiOmUrIj0iK2kodCk6bnVsbH0sY3JlYXRlTWFya3VwRm9yQ3VzdG9tQXR0cmlidXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIoZSkmJm51bGwhPXQ/ZSsiPSIraSh0KToiIn0sc2V0VmFsdWVGb3JQcm9wZXJ0eTpmdW5jdGlvbihlLHQsbil7dmFyIHI9YS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHQpP2EucHJvcGVydGllc1t0XTpudWxsO2lmKHIpe3ZhciBpPXIubXV0YXRpb25NZXRob2Q7aWYoaSlpKGUsbik7ZWxzZXtpZihvKHIsbikpcmV0dXJuIHZvaWQgdGhpcy5kZWxldGVWYWx1ZUZvclByb3BlcnR5KGUsdCk7aWYoci5tdXN0VXNlUHJvcGVydHkpZVtyLnByb3BlcnR5TmFtZV09bjtlbHNle3ZhciBzPXIuYXR0cmlidXRlTmFtZSx1PXIuYXR0cmlidXRlTmFtZXNwYWNlO3U/ZS5zZXRBdHRyaWJ1dGVOUyh1LHMsIiIrbik6ci5oYXNCb29sZWFuVmFsdWV8fHIuaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZSYmITA9PT1uP2Uuc2V0QXR0cmlidXRlKHMsIiIpOmUuc2V0QXR0cmlidXRlKHMsIiIrbil9fX1lbHNlIGlmKGEuaXNDdXN0b21BdHRyaWJ1dGUodCkpcmV0dXJuIHZvaWQgYy5zZXRWYWx1ZUZvckF0dHJpYnV0ZShlLHQsbil9LHNldFZhbHVlRm9yQXR0cmlidXRlOmZ1bmN0aW9uKGUsdCxuKXtyKHQpJiYobnVsbD09bj9lLnJlbW92ZUF0dHJpYnV0ZSh0KTplLnNldEF0dHJpYnV0ZSh0LCIiK24pKX0sZGVsZXRlVmFsdWVGb3JBdHRyaWJ1dGU6ZnVuY3Rpb24oZSx0KXtlLnJlbW92ZUF0dHJpYnV0ZSh0KX0sZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eTpmdW5jdGlvbihlLHQpe3ZhciBuPWEucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSh0KT9hLnByb3BlcnRpZXNbdF06bnVsbDtpZihuKXt2YXIgcj1uLm11dGF0aW9uTWV0aG9kO2lmKHIpcihlLHZvaWQgMCk7ZWxzZSBpZihuLm11c3RVc2VQcm9wZXJ0eSl7dmFyIG89bi5wcm9wZXJ0eU5hbWU7bi5oYXNCb29sZWFuVmFsdWU/ZVtvXT0hMTplW29dPSIifWVsc2UgZS5yZW1vdmVBdHRyaWJ1dGUobi5hdHRyaWJ1dGVOYW1lKX1lbHNlIGEuaXNDdXN0b21BdHRyaWJ1dGUodCkmJmUucmVtb3ZlQXR0cmlidXRlKHQpfX07dC5leHBvcnRzPWN9LHsxMToxMSwxMTE6MTExLDE0MjoxNDIsMzM6MzMsNTg6NTh9XSwxMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDExMiksbz1lKDkpLGE9ZSgxMjMpLGk9ZSgxMjgpLHM9ZSgxMjkpLHU9KGUoMTM3KSx7ZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA6ZnVuY3Rpb24oZSx0KXtpZihhLmNhblVzZURPTXx8cigiNTYiKSx0fHxyKCI1NyIpLCJIVE1MIj09PWUubm9kZU5hbWUmJnIoIjU4IiksInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgbj1pKHQscylbMF07ZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuLGUpfWVsc2Ugby5yZXBsYWNlQ2hpbGRXaXRoVHJlZShlLHQpfX0pO3QuZXhwb3J0cz11fSx7MTEyOjExMiwxMjM6MTIzLDEyODoxMjgsMTI5OjEyOSwxMzc6MTM3LDk6OX1dLDE0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPVsiUmVzcG9uZGVyRXZlbnRQbHVnaW4iLCJTaW1wbGVFdmVudFBsdWdpbiIsIlRhcEV2ZW50UGx1Z2luIiwiRW50ZXJMZWF2ZUV2ZW50UGx1Z2luIiwiQ2hhbmdlRXZlbnRQbHVnaW4iLCJTZWxlY3RFdmVudFBsdWdpbiIsIkJlZm9yZUlucHV0RXZlbnRQbHVnaW4iXTt0LmV4cG9ydHM9cn0se31dLDE1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTkpLG89ZSgzMyksYT1lKDg0KSxpPXttb3VzZUVudGVyOntyZWdpc3RyYXRpb25OYW1lOiJvbk1vdXNlRW50ZXIiLGRlcGVuZGVuY2llczpbInRvcE1vdXNlT3V0IiwidG9wTW91c2VPdmVyIl19LG1vdXNlTGVhdmU6e3JlZ2lzdHJhdGlvbk5hbWU6Im9uTW91c2VMZWF2ZSIsZGVwZW5kZW5jaWVzOlsidG9wTW91c2VPdXQiLCJ0b3BNb3VzZU92ZXIiXX19LHM9e2V2ZW50VHlwZXM6aSxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKGUsdCxuLHMpe2lmKCJ0b3BNb3VzZU92ZXIiPT09ZSYmKG4ucmVsYXRlZFRhcmdldHx8bi5mcm9tRWxlbWVudCkpcmV0dXJuIG51bGw7aWYoInRvcE1vdXNlT3V0IiE9PWUmJiJ0b3BNb3VzZU92ZXIiIT09ZSlyZXR1cm4gbnVsbDt2YXIgdTtpZihzLndpbmRvdz09PXMpdT1zO2Vsc2V7dmFyIGw9cy5vd25lckRvY3VtZW50O3U9bD9sLmRlZmF1bHRWaWV3fHxsLnBhcmVudFdpbmRvdzp3aW5kb3d9dmFyIGMscDtpZigidG9wTW91c2VPdXQiPT09ZSl7Yz10O3ZhciBkPW4ucmVsYXRlZFRhcmdldHx8bi50b0VsZW1lbnQ7cD1kP28uZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoZCk6bnVsbH1lbHNlIGM9bnVsbCxwPXQ7aWYoYz09PXApcmV0dXJuIG51bGw7dmFyIGY9bnVsbD09Yz91Om8uZ2V0Tm9kZUZyb21JbnN0YW5jZShjKSxoPW51bGw9PXA/dTpvLmdldE5vZGVGcm9tSW5zdGFuY2UocCksbT1hLmdldFBvb2xlZChpLm1vdXNlTGVhdmUsYyxuLHMpO20udHlwZT0ibW91c2VsZWF2ZSIsbS50YXJnZXQ9ZixtLnJlbGF0ZWRUYXJnZXQ9aDt2YXIgdj1hLmdldFBvb2xlZChpLm1vdXNlRW50ZXIscCxuLHMpO3JldHVybiB2LnR5cGU9Im1vdXNlZW50ZXIiLHYudGFyZ2V0PWgsdi5yZWxhdGVkVGFyZ2V0PWYsci5hY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3BhdGNoZXMobSx2LGMscCksW20sdl19fTt0LmV4cG9ydHM9c30sezE5OjE5LDMzOjMzLDg0Ojg0fV0sMTY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4iYnV0dG9uIj09PWV8fCJpbnB1dCI9PT1lfHwic2VsZWN0Ij09PWV8fCJ0ZXh0YXJlYSI9PT1lfWZ1bmN0aW9uIG8oZSx0LG4pe3N3aXRjaChlKXtjYXNlIm9uQ2xpY2siOmNhc2Uib25DbGlja0NhcHR1cmUiOmNhc2Uib25Eb3VibGVDbGljayI6Y2FzZSJvbkRvdWJsZUNsaWNrQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlRG93biI6Y2FzZSJvbk1vdXNlRG93bkNhcHR1cmUiOmNhc2Uib25Nb3VzZU1vdmUiOmNhc2Uib25Nb3VzZU1vdmVDYXB0dXJlIjpjYXNlIm9uTW91c2VVcCI6Y2FzZSJvbk1vdXNlVXBDYXB0dXJlIjpyZXR1cm4hKCFuLmRpc2FibGVkfHwhcih0KSk7ZGVmYXVsdDpyZXR1cm4hMX19dmFyIGE9ZSgxMTIpLGk9ZSgxNykscz1lKDE4KSx1PWUoNTApLGw9ZSg5MSksYz1lKDk4KSxwPShlKDEzNykse30pLGQ9bnVsbCxmPWZ1bmN0aW9uKGUsdCl7ZSYmKHMuZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyKGUsdCksZS5pc1BlcnNpc3RlbnQoKXx8ZS5jb25zdHJ1Y3Rvci5yZWxlYXNlKGUpKX0saD1mdW5jdGlvbihlKXtyZXR1cm4gZihlLCEwKX0sbT1mdW5jdGlvbihlKXtyZXR1cm4gZihlLCExKX0sdj1mdW5jdGlvbihlKXtyZXR1cm4iLiIrZS5fcm9vdE5vZGVJRH0sZz17aW5qZWN0aW9uOntpbmplY3RFdmVudFBsdWdpbk9yZGVyOmkuaW5qZWN0RXZlbnRQbHVnaW5PcmRlcixpbmplY3RFdmVudFBsdWdpbnNCeU5hbWU6aS5pbmplY3RFdmVudFBsdWdpbnNCeU5hbWV9LHB1dExpc3RlbmVyOmZ1bmN0aW9uKGUsdCxuKXsiZnVuY3Rpb24iIT10eXBlb2YgbiYmYSgiOTQiLHQsdHlwZW9mIG4pO3ZhciByPXYoZSk7KHBbdF18fChwW3RdPXt9KSlbcl09bjt2YXIgbz1pLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3RdO28mJm8uZGlkUHV0TGlzdGVuZXImJm8uZGlkUHV0TGlzdGVuZXIoZSx0LG4pfSxnZXRMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe3ZhciBuPXBbdF07aWYobyh0LGUuX2N1cnJlbnRFbGVtZW50LnR5cGUsZS5fY3VycmVudEVsZW1lbnQucHJvcHMpKXJldHVybiBudWxsO3ZhciByPXYoZSk7cmV0dXJuIG4mJm5bcl19LGRlbGV0ZUxpc3RlbmVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49aS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1t0XTtuJiZuLndpbGxEZWxldGVMaXN0ZW5lciYmbi53aWxsRGVsZXRlTGlzdGVuZXIoZSx0KTt2YXIgcj1wW3RdO3ImJmRlbGV0ZSByW3YoZSldfSxkZWxldGVBbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7dmFyIHQ9dihlKTtmb3IodmFyIG4gaW4gcClpZihwLmhhc093blByb3BlcnR5KG4pJiZwW25dW3RdKXt2YXIgcj1pLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW25dO3ImJnIud2lsbERlbGV0ZUxpc3RlbmVyJiZyLndpbGxEZWxldGVMaXN0ZW5lcihlLG4pLGRlbGV0ZSBwW25dW3RdfX0sZXh0cmFjdEV2ZW50czpmdW5jdGlvbihlLHQsbixyKXtmb3IodmFyIG8sYT1pLnBsdWdpbnMscz0wO3M8YS5sZW5ndGg7cysrKXt2YXIgdT1hW3NdO2lmKHUpe3ZhciBjPXUuZXh0cmFjdEV2ZW50cyhlLHQsbixyKTtjJiYobz1sKG8sYykpfX1yZXR1cm4gb30sZW5xdWV1ZUV2ZW50czpmdW5jdGlvbihlKXtlJiYoZD1sKGQsZSkpfSxwcm9jZXNzRXZlbnRRdWV1ZTpmdW5jdGlvbihlKXt2YXIgdD1kO2Q9bnVsbCxlP2ModCxoKTpjKHQsbSksZCYmYSgiOTUiKSx1LnJldGhyb3dDYXVnaHRFcnJvcigpfSxfX3B1cmdlOmZ1bmN0aW9uKCl7cD17fX0sX19nZXRMaXN0ZW5lckJhbms6ZnVuY3Rpb24oKXtyZXR1cm4gcH19O3QuZXhwb3J0cz1nfSx7MTEyOjExMiwxMzc6MTM3LDE3OjE3LDE4OjE4LDUwOjUwLDkxOjkxLDk4Ojk4fV0sMTc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe2lmKHMpZm9yKHZhciBlIGluIHUpe3ZhciB0PXVbZV0sbj1zLmluZGV4T2YoZSk7aWYobj4tMXx8aSgiOTYiLGUpLCFsLnBsdWdpbnNbbl0pe3QuZXh0cmFjdEV2ZW50c3x8aSgiOTciLGUpLGwucGx1Z2luc1tuXT10O3ZhciByPXQuZXZlbnRUeXBlcztmb3IodmFyIGEgaW4gcilvKHJbYV0sdCxhKXx8aSgiOTgiLGEsZSl9fX1mdW5jdGlvbiBvKGUsdCxuKXtsLmV2ZW50TmFtZURpc3BhdGNoQ29uZmlncy5oYXNPd25Qcm9wZXJ0eShuKSYmaSgiOTkiLG4pLGwuZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzW25dPWU7dmFyIHI9ZS5waGFzZWRSZWdpc3RyYXRpb25OYW1lcztpZihyKXtmb3IodmFyIG8gaW4gcilpZihyLmhhc093blByb3BlcnR5KG8pKXt2YXIgcz1yW29dO2Eocyx0LG4pfXJldHVybiEwfXJldHVybiEhZS5yZWdpc3RyYXRpb25OYW1lJiYoYShlLnJlZ2lzdHJhdGlvbk5hbWUsdCxuKSwhMCl9ZnVuY3Rpb24gYShlLHQsbil7bC5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tlXSYmaSgiMTAwIixlKSxsLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW2VdPXQsbC5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW2VdPXQuZXZlbnRUeXBlc1tuXS5kZXBlbmRlbmNpZXN9dmFyIGk9ZSgxMTIpLHM9KGUoMTM3KSxudWxsKSx1PXt9LGw9e3BsdWdpbnM6W10sZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzOnt9LHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzOnt9LHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXM6e30scG9zc2libGVSZWdpc3RyYXRpb25OYW1lczpudWxsLGluamVjdEV2ZW50UGx1Z2luT3JkZXI6ZnVuY3Rpb24oZSl7cyYmaSgiMTAxIikscz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKSxyKCl9LGluamVjdEV2ZW50UGx1Z2luc0J5TmFtZTpmdW5jdGlvbihlKXt2YXIgdD0hMTtmb3IodmFyIG4gaW4gZSlpZihlLmhhc093blByb3BlcnR5KG4pKXt2YXIgbz1lW25dO3UuaGFzT3duUHJvcGVydHkobikmJnVbbl09PT1vfHwodVtuXSYmaSgiMTAyIixuKSx1W25dPW8sdD0hMCl9dCYmcigpfSxnZXRQbHVnaW5Nb2R1bGVGb3JFdmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLmRpc3BhdGNoQ29uZmlnO2lmKHQucmVnaXN0cmF0aW9uTmFtZSlyZXR1cm4gbC5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1t0LnJlZ2lzdHJhdGlvbk5hbWVdfHxudWxsO2lmKHZvaWQgMCE9PXQucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpe3ZhciBuPXQucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM7Zm9yKHZhciByIGluIG4paWYobi5oYXNPd25Qcm9wZXJ0eShyKSl7dmFyIG89bC5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tuW3JdXTtpZihvKXJldHVybiBvfX1yZXR1cm4gbnVsbH0sX3Jlc2V0RXZlbnRQbHVnaW5zOmZ1bmN0aW9uKCl7cz1udWxsO2Zvcih2YXIgZSBpbiB1KXUuaGFzT3duUHJvcGVydHkoZSkmJmRlbGV0ZSB1W2VdO2wucGx1Z2lucy5sZW5ndGg9MDt2YXIgdD1sLmV2ZW50TmFtZURpc3BhdGNoQ29uZmlncztmb3IodmFyIG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiZkZWxldGUgdFtuXTt2YXIgcj1sLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzO2Zvcih2YXIgbyBpbiByKXIuaGFzT3duUHJvcGVydHkobykmJmRlbGV0ZSByW29dfX07dC5leHBvcnRzPWx9LHsxMTI6MTEyLDEzNzoxMzd9XSwxODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiJ0b3BNb3VzZVVwIj09PWV8fCJ0b3BUb3VjaEVuZCI9PT1lfHwidG9wVG91Y2hDYW5jZWwiPT09ZX1mdW5jdGlvbiBvKGUpe3JldHVybiJ0b3BNb3VzZU1vdmUiPT09ZXx8InRvcFRvdWNoTW92ZSI9PT1lfWZ1bmN0aW9uIGEoZSl7cmV0dXJuInRvcE1vdXNlRG93biI9PT1lfHwidG9wVG91Y2hTdGFydCI9PT1lfWZ1bmN0aW9uIGkoZSx0LG4scil7dmFyIG89ZS50eXBlfHwidW5rbm93bi1ldmVudCI7ZS5jdXJyZW50VGFyZ2V0PWcuZ2V0Tm9kZUZyb21JbnN0YW5jZShyKSx0P20uaW52b2tlR3VhcmRlZENhbGxiYWNrV2l0aENhdGNoKG8sbixlKTptLmludm9rZUd1YXJkZWRDYWxsYmFjayhvLG4sZSksZS5jdXJyZW50VGFyZ2V0PW51bGx9ZnVuY3Rpb24gcyhlLHQpe3ZhciBuPWUuX2Rpc3BhdGNoTGlzdGVuZXJzLHI9ZS5fZGlzcGF0Y2hJbnN0YW5jZXM7aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIG89MDtvPG4ubGVuZ3RoJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO28rKylpKGUsdCxuW29dLHJbb10pO2Vsc2UgbiYmaShlLHQsbixyKTtlLl9kaXNwYXRjaExpc3RlbmVycz1udWxsLGUuX2Rpc3BhdGNoSW5zdGFuY2VzPW51bGx9ZnVuY3Rpb24gdShlKXt2YXIgdD1lLl9kaXNwYXRjaExpc3RlbmVycyxuPWUuX2Rpc3BhdGNoSW5zdGFuY2VzO2lmKEFycmF5LmlzQXJyYXkodCkpe2Zvcih2YXIgcj0wO3I8dC5sZW5ndGgmJiFlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7cisrKWlmKHRbcl0oZSxuW3JdKSlyZXR1cm4gbltyXX1lbHNlIGlmKHQmJnQoZSxuKSlyZXR1cm4gbjtyZXR1cm4gbnVsbH1mdW5jdGlvbiBsKGUpe3ZhciB0PXUoZSk7cmV0dXJuIGUuX2Rpc3BhdGNoSW5zdGFuY2VzPW51bGwsZS5fZGlzcGF0Y2hMaXN0ZW5lcnM9bnVsbCx0fWZ1bmN0aW9uIGMoZSl7dmFyIHQ9ZS5fZGlzcGF0Y2hMaXN0ZW5lcnMsbj1lLl9kaXNwYXRjaEluc3RhbmNlcztBcnJheS5pc0FycmF5KHQpJiZoKCIxMDMiKSxlLmN1cnJlbnRUYXJnZXQ9dD9nLmdldE5vZGVGcm9tSW5zdGFuY2Uobik6bnVsbDt2YXIgcj10P3QoZSk6bnVsbDtyZXR1cm4gZS5jdXJyZW50VGFyZ2V0PW51bGwsZS5fZGlzcGF0Y2hMaXN0ZW5lcnM9bnVsbCxlLl9kaXNwYXRjaEluc3RhbmNlcz1udWxsLHJ9ZnVuY3Rpb24gcChlKXtyZXR1cm4hIWUuX2Rpc3BhdGNoTGlzdGVuZXJzfXZhciBkLGYsaD1lKDExMiksbT1lKDUwKSx2PShlKDEzNyksZSgxNDIpLHtpbmplY3RDb21wb25lbnRUcmVlOmZ1bmN0aW9uKGUpe2Q9ZX0saW5qZWN0VHJlZVRyYXZlcnNhbDpmdW5jdGlvbihlKXtmPWV9fSksZz17aXNFbmRpc2g6cixpc01vdmVpc2g6byxpc1N0YXJ0aXNoOmEsZXhlY3V0ZURpcmVjdERpc3BhdGNoOmMsZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyOnMsZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZTpsLGhhc0Rpc3BhdGNoZXM6cCxnZXRJbnN0YW5jZUZyb21Ob2RlOmZ1bmN0aW9uKGUpe3JldHVybiBkLmdldEluc3RhbmNlRnJvbU5vZGUoZSl9LGdldE5vZGVGcm9tSW5zdGFuY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGQuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKX0saXNBbmNlc3RvcjpmdW5jdGlvbihlLHQpe3JldHVybiBmLmlzQW5jZXN0b3IoZSx0KX0sZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZi5nZXRMb3dlc3RDb21tb25BbmNlc3RvcihlLHQpfSxnZXRQYXJlbnRJbnN0YW5jZTpmdW5jdGlvbihlKXtyZXR1cm4gZi5nZXRQYXJlbnRJbnN0YW5jZShlKX0sdHJhdmVyc2VUd29QaGFzZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGYudHJhdmVyc2VUd29QaGFzZShlLHQsbil9LHRyYXZlcnNlRW50ZXJMZWF2ZTpmdW5jdGlvbihlLHQsbixyLG8pe3JldHVybiBmLnRyYXZlcnNlRW50ZXJMZWF2ZShlLHQsbixyLG8pfSxpbmplY3Rpb246dn07dC5leHBvcnRzPWd9LHsxMTI6MTEyLDEzNzoxMzcsMTQyOjE0Miw1MDo1MH1dLDE5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4pe3ZhciByPXQuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNbbl07cmV0dXJuIGcoZSxyKX1mdW5jdGlvbiBvKGUsdCxuKXt2YXIgbz1yKGUsbix0KTtvJiYobi5fZGlzcGF0Y2hMaXN0ZW5lcnM9bShuLl9kaXNwYXRjaExpc3RlbmVycyxvKSxuLl9kaXNwYXRjaEluc3RhbmNlcz1tKG4uX2Rpc3BhdGNoSW5zdGFuY2VzLGUpKX1mdW5jdGlvbiBhKGUpe2UmJmUuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMmJmgudHJhdmVyc2VUd29QaGFzZShlLl90YXJnZXRJbnN0LG8sZSl9ZnVuY3Rpb24gaShlKXtpZihlJiZlLmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKXt2YXIgdD1lLl90YXJnZXRJbnN0LG49dD9oLmdldFBhcmVudEluc3RhbmNlKHQpOm51bGw7aC50cmF2ZXJzZVR3b1BoYXNlKG4sbyxlKX19ZnVuY3Rpb24gcyhlLHQsbil7aWYobiYmbi5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lKXt2YXIgcj1uLmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUsbz1nKGUscik7byYmKG4uX2Rpc3BhdGNoTGlzdGVuZXJzPW0obi5fZGlzcGF0Y2hMaXN0ZW5lcnMsbyksbi5fZGlzcGF0Y2hJbnN0YW5jZXM9bShuLl9kaXNwYXRjaEluc3RhbmNlcyxlKSl9fWZ1bmN0aW9uIHUoZSl7ZSYmZS5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lJiZzKGUuX3RhcmdldEluc3QsbnVsbCxlKX1mdW5jdGlvbiBsKGUpe3YoZSxhKX1mdW5jdGlvbiBjKGUpe3YoZSxpKX1mdW5jdGlvbiBwKGUsdCxuLHIpe2gudHJhdmVyc2VFbnRlckxlYXZlKG4scixzLGUsdCl9ZnVuY3Rpb24gZChlKXt2KGUsdSl9dmFyIGY9ZSgxNiksaD1lKDE4KSxtPWUoOTEpLHY9ZSg5OCksZz0oZSgxNDIpLGYuZ2V0TGlzdGVuZXIpLHk9e2FjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXM6bCxhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2tpcFRhcmdldDpjLGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzOmQsYWNjdW11bGF0ZUVudGVyTGVhdmVEaXNwYXRjaGVzOnB9O3QuZXhwb3J0cz15fSx7MTQyOjE0MiwxNjoxNiwxODoxOCw5MTo5MSw5ODo5OH1dLDIwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dGhpcy5fcm9vdD1lLHRoaXMuX3N0YXJ0VGV4dD10aGlzLmdldFRleHQoKSx0aGlzLl9mYWxsYmFja1RleHQ9bnVsbH12YXIgbz1lKDE0MyksYT1lKDI0KSxpPWUoMTA2KTtvKHIucHJvdG90eXBlLHtkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fcm9vdD1udWxsLHRoaXMuX3N0YXJ0VGV4dD1udWxsLHRoaXMuX2ZhbGxiYWNrVGV4dD1udWxsfSxnZXRUZXh0OmZ1bmN0aW9uKCl7cmV0dXJuInZhbHVlImluIHRoaXMuX3Jvb3Q/dGhpcy5fcm9vdC52YWx1ZTp0aGlzLl9yb290W2koKV19LGdldERhdGE6ZnVuY3Rpb24oKXtpZih0aGlzLl9mYWxsYmFja1RleHQpcmV0dXJuIHRoaXMuX2ZhbGxiYWNrVGV4dDt2YXIgZSx0LG49dGhpcy5fc3RhcnRUZXh0LHI9bi5sZW5ndGgsbz10aGlzLmdldFRleHQoKSxhPW8ubGVuZ3RoO2ZvcihlPTA7ZTxyJiZuW2VdPT09b1tlXTtlKyspO3ZhciBpPXItZTtmb3IodD0xO3Q8PWkmJm5bci10XT09PW9bYS10XTt0KyspO3ZhciBzPXQ+MT8xLXQ6dm9pZCAwO3JldHVybiB0aGlzLl9mYWxsYmFja1RleHQ9by5zbGljZShlLHMpLHRoaXMuX2ZhbGxiYWNrVGV4dH19KSxhLmFkZFBvb2xpbmdUbyhyKSx0LmV4cG9ydHM9cn0sezEwNjoxMDYsMTQzOjE0MywyNDoyNH1dLDIxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTEpLG89ci5pbmplY3Rpb24uTVVTVF9VU0VfUFJPUEVSVFksYT1yLmluamVjdGlvbi5IQVNfQk9PTEVBTl9WQUxVRSxpPXIuaW5qZWN0aW9uLkhBU19OVU1FUklDX1ZBTFVFLHM9ci5pbmplY3Rpb24uSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUsdT1yLmluamVjdGlvbi5IQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVFLGw9e2lzQ3VzdG9tQXR0cmlidXRlOlJlZ0V4cC5wcm90b3R5cGUudGVzdC5iaW5kKG5ldyBSZWdFeHAoIl4oZGF0YXxhcmlhKS1bIityLkFUVFJJQlVURV9OQU1FX0NIQVIrIl0qJCIpKSxQcm9wZXJ0aWVzOnthY2NlcHQ6MCxhY2NlcHRDaGFyc2V0OjAsYWNjZXNzS2V5OjAsYWN0aW9uOjAsYWxsb3dGdWxsU2NyZWVuOmEsYWxsb3dUcmFuc3BhcmVuY3k6MCxhbHQ6MCxhczowLGFzeW5jOmEsYXV0b0NvbXBsZXRlOjAsYXV0b1BsYXk6YSxjYXB0dXJlOmEsY2VsbFBhZGRpbmc6MCxjZWxsU3BhY2luZzowLGNoYXJTZXQ6MCxjaGFsbGVuZ2U6MCxjaGVja2VkOm98YSxjaXRlOjAsY2xhc3NJRDowLGNsYXNzTmFtZTowLGNvbHM6cyxjb2xTcGFuOjAsY29udGVudDowLGNvbnRlbnRFZGl0YWJsZTowLGNvbnRleHRNZW51OjAsY29udHJvbHM6YSxjb29yZHM6MCxjcm9zc09yaWdpbjowLGRhdGE6MCxkYXRlVGltZTowLGRlZmF1bHQ6YSxkZWZlcjphLGRpcjowLGRpc2FibGVkOmEsZG93bmxvYWQ6dSxkcmFnZ2FibGU6MCxlbmNUeXBlOjAsZm9ybTowLGZvcm1BY3Rpb246MCxmb3JtRW5jVHlwZTowLGZvcm1NZXRob2Q6MCxmb3JtTm9WYWxpZGF0ZTphLGZvcm1UYXJnZXQ6MCxmcmFtZUJvcmRlcjowLGhlYWRlcnM6MCxoZWlnaHQ6MCxoaWRkZW46YSxoaWdoOjAsaHJlZjowLGhyZWZMYW5nOjAsaHRtbEZvcjowLGh0dHBFcXVpdjowLGljb246MCxpZDowLGlucHV0TW9kZTowLGludGVncml0eTowLGlzOjAsa2V5UGFyYW1zOjAsa2V5VHlwZTowLGtpbmQ6MCxsYWJlbDowLGxhbmc6MCxsaXN0OjAsbG9vcDphLGxvdzowLG1hbmlmZXN0OjAsbWFyZ2luSGVpZ2h0OjAsbWFyZ2luV2lkdGg6MCxtYXg6MCxtYXhMZW5ndGg6MCxtZWRpYTowLG1lZGlhR3JvdXA6MCxtZXRob2Q6MCxtaW46MCxtaW5MZW5ndGg6MCxtdWx0aXBsZTpvfGEsbXV0ZWQ6b3xhLG5hbWU6MCxub25jZTowLG5vVmFsaWRhdGU6YSxvcGVuOmEsb3B0aW11bTowLHBhdHRlcm46MCxwbGFjZWhvbGRlcjowLHBsYXlzSW5saW5lOmEscG9zdGVyOjAscHJlbG9hZDowLHByb2ZpbGU6MCxyYWRpb0dyb3VwOjAscmVhZE9ubHk6YSxyZWZlcnJlclBvbGljeTowLHJlbDowLHJlcXVpcmVkOmEscmV2ZXJzZWQ6YSxyb2xlOjAscm93czpzLHJvd1NwYW46aSxzYW5kYm94OjAsc2NvcGU6MCxzY29wZWQ6YSxzY3JvbGxpbmc6MCxzZWFtbGVzczphLHNlbGVjdGVkOm98YSxzaGFwZTowLHNpemU6cyxzaXplczowLHNwYW46cyxzcGVsbENoZWNrOjAsc3JjOjAsc3JjRG9jOjAsc3JjTGFuZzowLHNyY1NldDowLHN0YXJ0Omksc3RlcDowLHN0eWxlOjAsc3VtbWFyeTowLHRhYkluZGV4OjAsdGFyZ2V0OjAsdGl0bGU6MCx0eXBlOjAsdXNlTWFwOjAsdmFsdWU6MCx3aWR0aDowLHdtb2RlOjAsd3JhcDowLGFib3V0OjAsZGF0YXR5cGU6MCxpbmxpc3Q6MCxwcmVmaXg6MCxwcm9wZXJ0eTowLHJlc291cmNlOjAsdHlwZW9mOjAsdm9jYWI6MCxhdXRvQ2FwaXRhbGl6ZTowLGF1dG9Db3JyZWN0OjAsYXV0b1NhdmU6MCxjb2xvcjowLGl0ZW1Qcm9wOjAsaXRlbVNjb3BlOmEsaXRlbVR5cGU6MCxpdGVtSUQ6MCxpdGVtUmVmOjAscmVzdWx0czowLHNlY3VyaXR5OjAsdW5zZWxlY3RhYmxlOjB9LERPTUF0dHJpYnV0ZU5hbWVzOnthY2NlcHRDaGFyc2V0OiJhY2NlcHQtY2hhcnNldCIsY2xhc3NOYW1lOiJjbGFzcyIsaHRtbEZvcjoiZm9yIixodHRwRXF1aXY6Imh0dHAtZXF1aXYifSxET01Qcm9wZXJ0eU5hbWVzOnt9LERPTU11dGF0aW9uTWV0aG9kczp7dmFsdWU6ZnVuY3Rpb24oZSx0KXtpZihudWxsPT10KXJldHVybiBlLnJlbW92ZUF0dHJpYnV0ZSgidmFsdWUiKTsibnVtYmVyIiE9PWUudHlwZXx8ITE9PT1lLmhhc0F0dHJpYnV0ZSgidmFsdWUiKT9lLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiK3QpOmUudmFsaWRpdHkmJiFlLnZhbGlkaXR5LmJhZElucHV0JiZlLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PWUmJmUuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIrdCl9fX07dC5leHBvcnRzPWx9LHsxMToxMX1dLDIyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9eyI9IjoiPTAiLCI6IjoiPTIifTtyZXR1cm4iJCIrKCIiK2UpLnJlcGxhY2UoL1s9Ol0vZyxmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9eyI9MCI6Ij0iLCI9MiI6IjoifTtyZXR1cm4oIiIrKCIuIj09PWVbMF0mJiIkIj09PWVbMV0/ZS5zdWJzdHJpbmcoMik6ZS5zdWJzdHJpbmcoMSkpKS5yZXBsYWNlKC8oPTB8PTIpL2csZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KX12YXIgYT17ZXNjYXBlOnIsdW5lc2NhcGU6b307dC5leHBvcnRzPWF9LHt9XSwyMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe251bGwhPWUuY2hlY2tlZExpbmsmJm51bGwhPWUudmFsdWVMaW5rJiZzKCI4NyIpfWZ1bmN0aW9uIG8oZSl7cihlKSwobnVsbCE9ZS52YWx1ZXx8bnVsbCE9ZS5vbkNoYW5nZSkmJnMoIjg4Iil9ZnVuY3Rpb24gYShlKXtyKGUpLChudWxsIT1lLmNoZWNrZWR8fG51bGwhPWUub25DaGFuZ2UpJiZzKCI4OSIpfWZ1bmN0aW9uIGkoZSl7aWYoZSl7dmFyIHQ9ZS5nZXROYW1lKCk7aWYodClyZXR1cm4iIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAiK3QrImAuIn1yZXR1cm4iIn12YXIgcz1lKDExMiksdT1lKDY0KSxsPWUoMTQ1KSxjPWUoMTIwKSxwPWwoYy5pc1ZhbGlkRWxlbWVudCksZD0oZSgxMzcpLGUoMTQyKSx7YnV0dG9uOiEwLGNoZWNrYm94OiEwLGltYWdlOiEwLGhpZGRlbjohMCxyYWRpbzohMCxyZXNldDohMCxzdWJtaXQ6ITB9KSxmPXt2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIWVbdF18fGRbZS50eXBlXXx8ZS5vbkNoYW5nZXx8ZS5yZWFkT25seXx8ZS5kaXNhYmxlZD9udWxsOm5ldyBFcnJvcigiWW91IHByb3ZpZGVkIGEgYHZhbHVlYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuIGBvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgdGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdFZhbHVlYC4gT3RoZXJ3aXNlLCBzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4iKX0sY2hlY2tlZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIWVbdF18fGUub25DaGFuZ2V8fGUucmVhZE9ubHl8fGUuZGlzYWJsZWQ/bnVsbDpuZXcgRXJyb3IoIllvdSBwcm92aWRlZCBhIGBjaGVja2VkYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuIGBvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgdGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdENoZWNrZWRgLiBPdGhlcndpc2UsIHNldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLiIpfSxvbkNoYW5nZTpwLmZ1bmN9LGg9e30sbT17Y2hlY2tQcm9wVHlwZXM6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgciBpbiBmKXtpZihmLmhhc093blByb3BlcnR5KHIpKXZhciBvPWZbcl0odCxyLGUsInByb3AiLG51bGwsdSk7byBpbnN0YW5jZW9mIEVycm9yJiYhKG8ubWVzc2FnZSBpbiBoKSYmKGhbby5tZXNzYWdlXT0hMCxpKG4pKX19LGdldFZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlTGluaz8obyhlKSxlLnZhbHVlTGluay52YWx1ZSk6ZS52YWx1ZX0sZ2V0Q2hlY2tlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGVja2VkTGluaz8oYShlKSxlLmNoZWNrZWRMaW5rLnZhbHVlKTplLmNoZWNrZWR9LGV4ZWN1dGVPbkNoYW5nZTpmdW5jdGlvbihlLHQpe3JldHVybiBlLnZhbHVlTGluaz8obyhlKSxlLnZhbHVlTGluay5yZXF1ZXN0Q2hhbmdlKHQudGFyZ2V0LnZhbHVlKSk6ZS5jaGVja2VkTGluaz8oYShlKSxlLmNoZWNrZWRMaW5rLnJlcXVlc3RDaGFuZ2UodC50YXJnZXQuY2hlY2tlZCkpOmUub25DaGFuZ2U/ZS5vbkNoYW5nZS5jYWxsKHZvaWQgMCx0KTp2b2lkIDB9fTt0LmV4cG9ydHM9bX0sezExMjoxMTIsMTIwOjEyMCwxMzc6MTM3LDE0MjoxNDIsMTQ1OjE0NSw2NDo2NH1dLDI0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTEyKSxvPShlKDEzNyksZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZih0Lmluc3RhbmNlUG9vbC5sZW5ndGgpe3ZhciBuPXQuaW5zdGFuY2VQb29sLnBvcCgpO3JldHVybiB0LmNhbGwobixlKSxufXJldHVybiBuZXcgdChlKX0pLGE9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKG4uaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIHI9bi5pbnN0YW5jZVBvb2wucG9wKCk7cmV0dXJuIG4uY2FsbChyLGUsdCkscn1yZXR1cm4gbmV3IG4oZSx0KX0saT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcztpZihyLmluc3RhbmNlUG9vbC5sZW5ndGgpe3ZhciBvPXIuaW5zdGFuY2VQb29sLnBvcCgpO3JldHVybiByLmNhbGwobyxlLHQsbiksb31yZXR1cm4gbmV3IHIoZSx0LG4pfSxzPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXRoaXM7aWYoby5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgYT1vLmluc3RhbmNlUG9vbC5wb3AoKTtyZXR1cm4gby5jYWxsKGEsZSx0LG4sciksYX1yZXR1cm4gbmV3IG8oZSx0LG4scil9LHU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztlIGluc3RhbmNlb2YgdHx8cigiMjUiKSxlLmRlc3RydWN0b3IoKSx0Lmluc3RhbmNlUG9vbC5sZW5ndGg8dC5wb29sU2l6ZSYmdC5pbnN0YW5jZVBvb2wucHVzaChlKX0sbD1vLGM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lO3JldHVybiBuLmluc3RhbmNlUG9vbD1bXSxuLmdldFBvb2xlZD10fHxsLG4ucG9vbFNpemV8fChuLnBvb2xTaXplPTEwKSxuLnJlbGVhc2U9dSxufSxwPXthZGRQb29saW5nVG86YyxvbmVBcmd1bWVudFBvb2xlcjpvLHR3b0FyZ3VtZW50UG9vbGVyOmEsdGhyZWVBcmd1bWVudFBvb2xlcjppLGZvdXJBcmd1bWVudFBvb2xlcjpzfTt0LmV4cG9ydHM9cH0sezExMjoxMTIsMTM3OjEzN31dLDI1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG0pfHwoZVttXT1mKysscFtlW21dXT17fSkscFtlW21dXX12YXIgbyxhPWUoMTQzKSxpPWUoMTcpLHM9ZSg1MSksdT1lKDkwKSxsPWUoMTA3KSxjPWUoMTA5KSxwPXt9LGQ9ITEsZj0wLGg9e3RvcEFib3J0OiJhYm9ydCIsdG9wQW5pbWF0aW9uRW5kOmwoImFuaW1hdGlvbmVuZCIpfHwiYW5pbWF0aW9uZW5kIix0b3BBbmltYXRpb25JdGVyYXRpb246bCgiYW5pbWF0aW9uaXRlcmF0aW9uIil8fCJhbmltYXRpb25pdGVyYXRpb24iLHRvcEFuaW1hdGlvblN0YXJ0OmwoImFuaW1hdGlvbnN0YXJ0Iil8fCJhbmltYXRpb25zdGFydCIsdG9wQmx1cjoiYmx1ciIsdG9wQ2FuUGxheToiY2FucGxheSIsdG9wQ2FuUGxheVRocm91Z2g6ImNhbnBsYXl0aHJvdWdoIix0b3BDaGFuZ2U6ImNoYW5nZSIsdG9wQ2xpY2s6ImNsaWNrIix0b3BDb21wb3NpdGlvbkVuZDoiY29tcG9zaXRpb25lbmQiLHRvcENvbXBvc2l0aW9uU3RhcnQ6ImNvbXBvc2l0aW9uc3RhcnQiLHRvcENvbXBvc2l0aW9uVXBkYXRlOiJjb21wb3NpdGlvbnVwZGF0ZSIsdG9wQ29udGV4dE1lbnU6ImNvbnRleHRtZW51Iix0b3BDb3B5OiJjb3B5Iix0b3BDdXQ6ImN1dCIsdG9wRG91YmxlQ2xpY2s6ImRibGNsaWNrIix0b3BEcmFnOiJkcmFnIix0b3BEcmFnRW5kOiJkcmFnZW5kIix0b3BEcmFnRW50ZXI6ImRyYWdlbnRlciIsdG9wRHJhZ0V4aXQ6ImRyYWdleGl0Iix0b3BEcmFnTGVhdmU6ImRyYWdsZWF2ZSIsdG9wRHJhZ092ZXI6ImRyYWdvdmVyIix0b3BEcmFnU3RhcnQ6ImRyYWdzdGFydCIsdG9wRHJvcDoiZHJvcCIsdG9wRHVyYXRpb25DaGFuZ2U6ImR1cmF0aW9uY2hhbmdlIix0b3BFbXB0aWVkOiJlbXB0aWVkIix0b3BFbmNyeXB0ZWQ6ImVuY3J5cHRlZCIsdG9wRW5kZWQ6ImVuZGVkIix0b3BFcnJvcjoiZXJyb3IiLA0KdG9wRm9jdXM6ImZvY3VzIix0b3BJbnB1dDoiaW5wdXQiLHRvcEtleURvd246ImtleWRvd24iLHRvcEtleVByZXNzOiJrZXlwcmVzcyIsdG9wS2V5VXA6ImtleXVwIix0b3BMb2FkZWREYXRhOiJsb2FkZWRkYXRhIix0b3BMb2FkZWRNZXRhZGF0YToibG9hZGVkbWV0YWRhdGEiLHRvcExvYWRTdGFydDoibG9hZHN0YXJ0Iix0b3BNb3VzZURvd246Im1vdXNlZG93biIsdG9wTW91c2VNb3ZlOiJtb3VzZW1vdmUiLHRvcE1vdXNlT3V0OiJtb3VzZW91dCIsdG9wTW91c2VPdmVyOiJtb3VzZW92ZXIiLHRvcE1vdXNlVXA6Im1vdXNldXAiLHRvcFBhc3RlOiJwYXN0ZSIsdG9wUGF1c2U6InBhdXNlIix0b3BQbGF5OiJwbGF5Iix0b3BQbGF5aW5nOiJwbGF5aW5nIix0b3BQcm9ncmVzczoicHJvZ3Jlc3MiLHRvcFJhdGVDaGFuZ2U6InJhdGVjaGFuZ2UiLHRvcFNjcm9sbDoic2Nyb2xsIix0b3BTZWVrZWQ6InNlZWtlZCIsdG9wU2Vla2luZzoic2Vla2luZyIsdG9wU2VsZWN0aW9uQ2hhbmdlOiJzZWxlY3Rpb25jaGFuZ2UiLHRvcFN0YWxsZWQ6InN0YWxsZWQiLHRvcFN1c3BlbmQ6InN1c3BlbmQiLHRvcFRleHRJbnB1dDoidGV4dElucHV0Iix0b3BUaW1lVXBkYXRlOiJ0aW1ldXBkYXRlIix0b3BUb3VjaENhbmNlbDoidG91Y2hjYW5jZWwiLHRvcFRvdWNoRW5kOiJ0b3VjaGVuZCIsdG9wVG91Y2hNb3ZlOiJ0b3VjaG1vdmUiLHRvcFRvdWNoU3RhcnQ6InRvdWNoc3RhcnQiLHRvcFRyYW5zaXRpb25FbmQ6bCgidHJhbnNpdGlvbmVuZCIpfHwidHJhbnNpdGlvbmVuZCIsdG9wVm9sdW1lQ2hhbmdlOiJ2b2x1bWVjaGFuZ2UiLHRvcFdhaXRpbmc6IndhaXRpbmciLHRvcFdoZWVsOiJ3aGVlbCJ9LG09Il9yZWFjdExpc3RlbmVyc0lEIitTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoMiksdj1hKHt9LHMse1JlYWN0RXZlbnRMaXN0ZW5lcjpudWxsLGluamVjdGlvbjp7aW5qZWN0UmVhY3RFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGUpe2Uuc2V0SGFuZGxlVG9wTGV2ZWwodi5oYW5kbGVUb3BMZXZlbCksdi5SZWFjdEV2ZW50TGlzdGVuZXI9ZX19LHNldEVuYWJsZWQ6ZnVuY3Rpb24oZSl7di5SZWFjdEV2ZW50TGlzdGVuZXImJnYuUmVhY3RFdmVudExpc3RlbmVyLnNldEVuYWJsZWQoZSl9LGlzRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiEoIXYuUmVhY3RFdmVudExpc3RlbmVyfHwhdi5SZWFjdEV2ZW50TGlzdGVuZXIuaXNFbmFibGVkKCkpfSxsaXN0ZW5UbzpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj10LG89cihuKSxhPWkucmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tlXSxzPTA7czxhLmxlbmd0aDtzKyspe3ZhciB1PWFbc107by5oYXNPd25Qcm9wZXJ0eSh1KSYmb1t1XXx8KCJ0b3BXaGVlbCI9PT11P2MoIndoZWVsIik/di5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wV2hlZWwiLCJ3aGVlbCIsbik6YygibW91c2V3aGVlbCIpP3YuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoInRvcFdoZWVsIiwibW91c2V3aGVlbCIsbik6di5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wV2hlZWwiLCJET01Nb3VzZVNjcm9sbCIsbik6InRvcFNjcm9sbCI9PT11P2MoInNjcm9sbCIsITApP3YuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KCJ0b3BTY3JvbGwiLCJzY3JvbGwiLG4pOnYuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoInRvcFNjcm9sbCIsInNjcm9sbCIsdi5SZWFjdEV2ZW50TGlzdGVuZXIuV0lORE9XX0hBTkRMRSk6InRvcEZvY3VzIj09PXV8fCJ0b3BCbHVyIj09PXU/KGMoImZvY3VzIiwhMCk/KHYuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KCJ0b3BGb2N1cyIsImZvY3VzIixuKSx2LlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQ2FwdHVyZWRFdmVudCgidG9wQmx1ciIsImJsdXIiLG4pKTpjKCJmb2N1c2luIikmJih2LlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCJ0b3BGb2N1cyIsImZvY3VzaW4iLG4pLHYuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoInRvcEJsdXIiLCJmb2N1c291dCIsbikpLG8udG9wQmx1cj0hMCxvLnRvcEZvY3VzPSEwKTpoLmhhc093blByb3BlcnR5KHUpJiZ2LlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KHUsaFt1XSxuKSxvW3VdPSEwKX19LHRyYXBCdWJibGVkRXZlbnQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2LlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KGUsdCxuKX0sdHJhcENhcHR1cmVkRXZlbnQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2LlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQ2FwdHVyZWRFdmVudChlLHQsbil9LHN1cHBvcnRzRXZlbnRQYWdlWFk6ZnVuY3Rpb24oKXtpZighZG9jdW1lbnQuY3JlYXRlRXZlbnQpcmV0dXJuITE7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIk1vdXNlRXZlbnQiKTtyZXR1cm4gbnVsbCE9ZSYmInBhZ2VYImluIGV9LGVuc3VyZVNjcm9sbFZhbHVlTW9uaXRvcmluZzpmdW5jdGlvbigpe2lmKHZvaWQgMD09PW8mJihvPXYuc3VwcG9ydHNFdmVudFBhZ2VYWSgpKSwhbyYmIWQpe3ZhciBlPXUucmVmcmVzaFNjcm9sbFZhbHVlczt2LlJlYWN0RXZlbnRMaXN0ZW5lci5tb25pdG9yU2Nyb2xsVmFsdWUoZSksZD0hMH19fSk7dC5leHBvcnRzPXZ9LHsxMDc6MTA3LDEwOToxMDksMTQzOjE0MywxNzoxNyw1MTo1MSw5MDo5MH1dLDI2OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3ZhciBvPXZvaWQgMD09PWVbbl07bnVsbCE9dCYmbyYmKGVbbl09YSh0LCEwKSl9dmFyIG89ZSg2NiksYT1lKDEwOCksaT0oZSgyMiksZSgxMTYpKSxzPWUoMTE3KTtlKDE0Mik7dm9pZCAwIT09biYmbi5lbnY7dmFyIHU9e2luc3RhbnRpYXRlQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4sbyl7aWYobnVsbD09ZSlyZXR1cm4gbnVsbDt2YXIgYT17fTtyZXR1cm4gcyhlLHIsYSksYX0sdXBkYXRlQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4scixzLHUsbCxjLHApe2lmKHR8fGUpe3ZhciBkLGY7Zm9yKGQgaW4gdClpZih0Lmhhc093blByb3BlcnR5KGQpKXtmPWUmJmVbZF07dmFyIGg9ZiYmZi5fY3VycmVudEVsZW1lbnQsbT10W2RdO2lmKG51bGwhPWYmJmkoaCxtKSlvLnJlY2VpdmVDb21wb25lbnQoZixtLHMsYyksdFtkXT1mO2Vsc2V7ZiYmKHJbZF09by5nZXRIb3N0Tm9kZShmKSxvLnVubW91bnRDb21wb25lbnQoZiwhMSkpO3ZhciB2PWEobSwhMCk7dFtkXT12O3ZhciBnPW8ubW91bnRDb21wb25lbnQodixzLHUsbCxjLHApO24ucHVzaChnKX19Zm9yKGQgaW4gZSkhZS5oYXNPd25Qcm9wZXJ0eShkKXx8dCYmdC5oYXNPd25Qcm9wZXJ0eShkKXx8KGY9ZVtkXSxyW2RdPW8uZ2V0SG9zdE5vZGUoZiksby51bm1vdW50Q29tcG9uZW50KGYsITEpKX19LHVubW91bnRDaGlsZHJlbjpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkobikpe3ZhciByPWVbbl07by51bm1vdW50Q29tcG9uZW50KHIsdCl9fX07dC5leHBvcnRzPXV9KS5jYWxsKHRoaXMsdm9pZCAwKX0sezEwODoxMDgsMTE2OjExNiwxMTc6MTE3LDE0MjoxNDIsMjI6MjIsNjY6NjZ9XSwyNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDgpLG89ZSgzNyksYT17cHJvY2Vzc0NoaWxkcmVuVXBkYXRlczpvLmRhbmdlcm91c2x5UHJvY2Vzc0NoaWxkcmVuVXBkYXRlcyxyZXBsYWNlTm9kZVdpdGhNYXJrdXA6ci5kYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cH07dC5leHBvcnRzPWF9LHszNzozNyw4Ojh9XSwyODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDExMiksbz0oZSgxMzcpLCExKSxhPXtyZXBsYWNlTm9kZVdpdGhNYXJrdXA6bnVsbCxwcm9jZXNzQ2hpbGRyZW5VcGRhdGVzOm51bGwsaW5qZWN0aW9uOntpbmplY3RFbnZpcm9ubWVudDpmdW5jdGlvbihlKXtvJiZyKCIxMDQiKSxhLnJlcGxhY2VOb2RlV2l0aE1hcmt1cD1lLnJlcGxhY2VOb2RlV2l0aE1hcmt1cCxhLnByb2Nlc3NDaGlsZHJlblVwZGF0ZXM9ZS5wcm9jZXNzQ2hpbGRyZW5VcGRhdGVzLG89ITB9fX07dC5leHBvcnRzPWF9LHsxMTI6MTEyLDEzNzoxMzd9XSwyOTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe31mdW5jdGlvbiBvKGUpe3JldHVybiEoIWUucHJvdG90eXBlfHwhZS5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCl9ZnVuY3Rpb24gYShlKXtyZXR1cm4hKCFlLnByb3RvdHlwZXx8IWUucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50KX12YXIgaT1lKDExMikscz1lKDE0MyksdT1lKDEyMCksbD1lKDI4KSxjPWUoMTE5KSxwPWUoNTApLGQ9ZSg1NyksZj0oZSg1OCksZSg2MikpLGg9ZSg2NiksbT1lKDEzMCksdj0oZSgxMzcpLGUoMTQxKSksZz1lKDExNikseT0oZSgxNDIpLHtJbXB1cmVDbGFzczowLFB1cmVDbGFzczoxLFN0YXRlbGVzc0Z1bmN0aW9uYWw6Mn0pO3IucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPWQuZ2V0KHRoaXMpLl9jdXJyZW50RWxlbWVudC50eXBlLHQ9ZSh0aGlzLnByb3BzLHRoaXMuY29udGV4dCx0aGlzLnVwZGF0ZXIpO3JldHVybiB0fTt2YXIgXz0xLEM9e2NvbnN0cnVjdDpmdW5jdGlvbihlKXt0aGlzLl9jdXJyZW50RWxlbWVudD1lLHRoaXMuX3Jvb3ROb2RlSUQ9MCx0aGlzLl9jb21wb3NpdGVUeXBlPW51bGwsdGhpcy5faW5zdGFuY2U9bnVsbCx0aGlzLl9ob3N0UGFyZW50PW51bGwsdGhpcy5faG9zdENvbnRhaW5lckluZm89bnVsbCx0aGlzLl91cGRhdGVCYXRjaE51bWJlcj1udWxsLHRoaXMuX3BlbmRpbmdFbGVtZW50PW51bGwsdGhpcy5fcGVuZGluZ1N0YXRlUXVldWU9bnVsbCx0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlPSExLHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZT0hMSx0aGlzLl9yZW5kZXJlZE5vZGVUeXBlPW51bGwsdGhpcy5fcmVuZGVyZWRDb21wb25lbnQ9bnVsbCx0aGlzLl9jb250ZXh0PW51bGwsdGhpcy5fbW91bnRPcmRlcj0wLHRoaXMuX3RvcExldmVsV3JhcHBlcj1udWxsLHRoaXMuX3BlbmRpbmdDYWxsYmFja3M9bnVsbCx0aGlzLl9jYWxsZWRDb21wb25lbnRXaWxsVW5tb3VudD0hMX0sbW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4scyl7dGhpcy5fY29udGV4dD1zLHRoaXMuX21vdW50T3JkZXI9XysrLHRoaXMuX2hvc3RQYXJlbnQ9dCx0aGlzLl9ob3N0Q29udGFpbmVySW5mbz1uO3ZhciBsLGM9dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHMscD10aGlzLl9wcm9jZXNzQ29udGV4dChzKSxmPXRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUsaD1lLmdldFVwZGF0ZVF1ZXVlKCksdj1vKGYpLGc9dGhpcy5fY29uc3RydWN0Q29tcG9uZW50KHYsYyxwLGgpO3Z8fG51bGwhPWcmJm51bGwhPWcucmVuZGVyP2EoZik/dGhpcy5fY29tcG9zaXRlVHlwZT15LlB1cmVDbGFzczp0aGlzLl9jb21wb3NpdGVUeXBlPXkuSW1wdXJlQ2xhc3M6KGw9ZyxudWxsPT09Z3x8ITE9PT1nfHx1LmlzVmFsaWRFbGVtZW50KGcpfHxpKCIxMDUiLGYuZGlzcGxheU5hbWV8fGYubmFtZXx8IkNvbXBvbmVudCIpLGc9bmV3IHIoZiksdGhpcy5fY29tcG9zaXRlVHlwZT15LlN0YXRlbGVzc0Z1bmN0aW9uYWwpLGcucHJvcHM9YyxnLmNvbnRleHQ9cCxnLnJlZnM9bSxnLnVwZGF0ZXI9aCx0aGlzLl9pbnN0YW5jZT1nLGQuc2V0KGcsdGhpcyk7dmFyIEM9Zy5zdGF0ZTt2b2lkIDA9PT1DJiYoZy5zdGF0ZT1DPW51bGwpLCgib2JqZWN0IiE9dHlwZW9mIEN8fEFycmF5LmlzQXJyYXkoQykpJiZpKCIxMDYiLHRoaXMuZ2V0TmFtZSgpfHwiUmVhY3RDb21wb3NpdGVDb21wb25lbnQiKSx0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZT1udWxsLHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGU9ITEsdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlPSExO3ZhciBiO3JldHVybiBiPWcudW5zdGFibGVfaGFuZGxlRXJyb3I/dGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50V2l0aEVycm9ySGFuZGxpbmcobCx0LG4sZSxzKTp0aGlzLnBlcmZvcm1Jbml0aWFsTW91bnQobCx0LG4sZSxzKSxnLmNvbXBvbmVudERpZE1vdW50JiZlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoZy5jb21wb25lbnREaWRNb3VudCxnKSxifSxfY29uc3RydWN0Q29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLl9jb25zdHJ1Y3RDb21wb25lbnRXaXRob3V0T3duZXIoZSx0LG4scil9LF9jb25zdHJ1Y3RDb21wb25lbnRXaXRob3V0T3duZXI6ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtyZXR1cm4gZT9uZXcgbyh0LG4scik6byh0LG4scil9LHBlcmZvcm1Jbml0aWFsTW91bnRXaXRoRXJyb3JIYW5kbGluZzpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBhLGk9ci5jaGVja3BvaW50KCk7dHJ5e2E9dGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50KGUsdCxuLHIsbyl9Y2F0Y2gocyl7ci5yb2xsYmFjayhpKSx0aGlzLl9pbnN0YW5jZS51bnN0YWJsZV9oYW5kbGVFcnJvcihzKSx0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSYmKHRoaXMuX2luc3RhbmNlLnN0YXRlPXRoaXMuX3Byb2Nlc3NQZW5kaW5nU3RhdGUodGhpcy5faW5zdGFuY2UucHJvcHMsdGhpcy5faW5zdGFuY2UuY29udGV4dCkpLGk9ci5jaGVja3BvaW50KCksdGhpcy5fcmVuZGVyZWRDb21wb25lbnQudW5tb3VudENvbXBvbmVudCghMCksci5yb2xsYmFjayhpKSxhPXRoaXMucGVyZm9ybUluaXRpYWxNb3VudChlLHQsbixyLG8pfXJldHVybiBhfSxwZXJmb3JtSW5pdGlhbE1vdW50OmZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGE9dGhpcy5faW5zdGFuY2U7YS5jb21wb25lbnRXaWxsTW91bnQmJihhLmNvbXBvbmVudFdpbGxNb3VudCgpLHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlJiYoYS5zdGF0ZT10aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKGEucHJvcHMsYS5jb250ZXh0KSkpLHZvaWQgMD09PWUmJihlPXRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCgpKTt2YXIgaT1mLmdldFR5cGUoZSk7dGhpcy5fcmVuZGVyZWROb2RlVHlwZT1pO3ZhciBzPXRoaXMuX2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQoZSxpIT09Zi5FTVBUWSk7cmV0dXJuIHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50PXMsaC5tb3VudENvbXBvbmVudChzLHIsdCxuLHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQobyksMCl9LGdldEhvc3ROb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIGguZ2V0SG9zdE5vZGUodGhpcy5fcmVuZGVyZWRDb21wb25lbnQpfSx1bm1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGUpe2lmKHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50KXt2YXIgdD10aGlzLl9pbnN0YW5jZTtpZih0LmNvbXBvbmVudFdpbGxVbm1vdW50JiYhdC5fY2FsbGVkQ29tcG9uZW50V2lsbFVubW91bnQpaWYodC5fY2FsbGVkQ29tcG9uZW50V2lsbFVubW91bnQ9ITAsZSl7dmFyIG49dGhpcy5nZXROYW1lKCkrIi5jb21wb25lbnRXaWxsVW5tb3VudCgpIjtwLmludm9rZUd1YXJkZWRDYWxsYmFjayhuLHQuY29tcG9uZW50V2lsbFVubW91bnQuYmluZCh0KSl9ZWxzZSB0LmNvbXBvbmVudFdpbGxVbm1vdW50KCk7dGhpcy5fcmVuZGVyZWRDb21wb25lbnQmJihoLnVubW91bnRDb21wb25lbnQodGhpcy5fcmVuZGVyZWRDb21wb25lbnQsZSksdGhpcy5fcmVuZGVyZWROb2RlVHlwZT1udWxsLHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50PW51bGwsdGhpcy5faW5zdGFuY2U9bnVsbCksdGhpcy5fcGVuZGluZ1N0YXRlUXVldWU9bnVsbCx0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlPSExLHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZT0hMSx0aGlzLl9wZW5kaW5nQ2FsbGJhY2tzPW51bGwsdGhpcy5fcGVuZGluZ0VsZW1lbnQ9bnVsbCx0aGlzLl9jb250ZXh0PW51bGwsdGhpcy5fcm9vdE5vZGVJRD0wLHRoaXMuX3RvcExldmVsV3JhcHBlcj1udWxsLGQucmVtb3ZlKHQpfX0sX21hc2tDb250ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUsbj10LmNvbnRleHRUeXBlcztpZighbilyZXR1cm4gbTt2YXIgcj17fTtmb3IodmFyIG8gaW4gbilyW29dPWVbb107cmV0dXJuIHJ9LF9wcm9jZXNzQ29udGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fbWFza0NvbnRleHQoZSl9LF9wcm9jZXNzQ2hpbGRDb250ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSxyPXRoaXMuX2luc3RhbmNlO2lmKHIuZ2V0Q2hpbGRDb250ZXh0JiYodD1yLmdldENoaWxkQ29udGV4dCgpKSx0KXsib2JqZWN0IiE9dHlwZW9mIG4uY2hpbGRDb250ZXh0VHlwZXMmJmkoIjEwNyIsdGhpcy5nZXROYW1lKCl8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIpO2Zvcih2YXIgbyBpbiB0KW8gaW4gbi5jaGlsZENvbnRleHRUeXBlc3x8aSgiMTA4Iix0aGlzLmdldE5hbWUoKXx8IlJlYWN0Q29tcG9zaXRlQ29tcG9uZW50IixvKTtyZXR1cm4gcyh7fSxlLHQpfXJldHVybiBlfSxfY2hlY2tDb250ZXh0VHlwZXM6ZnVuY3Rpb24oZSx0LG4pe30scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fY3VycmVudEVsZW1lbnQsbz10aGlzLl9jb250ZXh0O3RoaXMuX3BlbmRpbmdFbGVtZW50PW51bGwsdGhpcy51cGRhdGVDb21wb25lbnQodCxyLGUsbyxuKX0scGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5OmZ1bmN0aW9uKGUpe251bGwhPXRoaXMuX3BlbmRpbmdFbGVtZW50P2gucmVjZWl2ZUNvbXBvbmVudCh0aGlzLHRoaXMuX3BlbmRpbmdFbGVtZW50LGUsdGhpcy5fY29udGV4dCk6bnVsbCE9PXRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlfHx0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU/dGhpcy51cGRhdGVDb21wb25lbnQoZSx0aGlzLl9jdXJyZW50RWxlbWVudCx0aGlzLl9jdXJyZW50RWxlbWVudCx0aGlzLl9jb250ZXh0LHRoaXMuX2NvbnRleHQpOnRoaXMuX3VwZGF0ZUJhdGNoTnVtYmVyPW51bGx9LHVwZGF0ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBhPXRoaXMuX2luc3RhbmNlO251bGw9PWEmJmkoIjEzNiIsdGhpcy5nZXROYW1lKCl8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIpO3ZhciBzLHU9ITE7dGhpcy5fY29udGV4dD09PW8/cz1hLmNvbnRleHQ6KHM9dGhpcy5fcHJvY2Vzc0NvbnRleHQobyksdT0hMCk7dmFyIGw9dC5wcm9wcyxjPW4ucHJvcHM7dCE9PW4mJih1PSEwKSx1JiZhLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJmEuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhjLHMpO3ZhciBwPXRoaXMuX3Byb2Nlc3NQZW5kaW5nU3RhdGUoYyxzKSxkPSEwO3RoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZXx8KGEuc2hvdWxkQ29tcG9uZW50VXBkYXRlP2Q9YS5zaG91bGRDb21wb25lbnRVcGRhdGUoYyxwLHMpOnRoaXMuX2NvbXBvc2l0ZVR5cGU9PT15LlB1cmVDbGFzcyYmKGQ9IXYobCxjKXx8IXYoYS5zdGF0ZSxwKSkpLHRoaXMuX3VwZGF0ZUJhdGNoTnVtYmVyPW51bGwsZD8odGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlPSExLHRoaXMuX3BlcmZvcm1Db21wb25lbnRVcGRhdGUobixjLHAscyxlLG8pKToodGhpcy5fY3VycmVudEVsZW1lbnQ9bix0aGlzLl9jb250ZXh0PW8sYS5wcm9wcz1jLGEuc3RhdGU9cCxhLmNvbnRleHQ9cyl9LF9wcm9jZXNzUGVuZGluZ1N0YXRlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5faW5zdGFuY2Uscj10aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSxvPXRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGU7aWYodGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZT0hMSx0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZT1udWxsLCFyKXJldHVybiBuLnN0YXRlO2lmKG8mJjE9PT1yLmxlbmd0aClyZXR1cm4gclswXTtmb3IodmFyIGE9cyh7fSxvP3JbMF06bi5zdGF0ZSksaT1vPzE6MDtpPHIubGVuZ3RoO2krKyl7dmFyIHU9cltpXTtzKGEsImZ1bmN0aW9uIj09dHlwZW9mIHU/dS5jYWxsKG4sYSxlLHQpOnUpfXJldHVybiBhfSxfcGVyZm9ybUNvbXBvbmVudFVwZGF0ZTpmdW5jdGlvbihlLHQsbixyLG8sYSl7dmFyIGkscyx1LGw9dGhpcy5faW5zdGFuY2UsYz1Cb29sZWFuKGwuY29tcG9uZW50RGlkVXBkYXRlKTtjJiYoaT1sLnByb3BzLHM9bC5zdGF0ZSx1PWwuY29udGV4dCksbC5jb21wb25lbnRXaWxsVXBkYXRlJiZsLmNvbXBvbmVudFdpbGxVcGRhdGUodCxuLHIpLHRoaXMuX2N1cnJlbnRFbGVtZW50PWUsdGhpcy5fY29udGV4dD1hLGwucHJvcHM9dCxsLnN0YXRlPW4sbC5jb250ZXh0PXIsdGhpcy5fdXBkYXRlUmVuZGVyZWRDb21wb25lbnQobyxhKSxjJiZvLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUobC5jb21wb25lbnREaWRVcGRhdGUuYmluZChsLGkscyx1KSxsKX0sX3VwZGF0ZVJlbmRlcmVkQ29tcG9uZW50OmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fcmVuZGVyZWRDb21wb25lbnQscj1uLl9jdXJyZW50RWxlbWVudCxvPXRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCgpO2lmKGcocixvKSloLnJlY2VpdmVDb21wb25lbnQobixvLGUsdGhpcy5fcHJvY2Vzc0NoaWxkQ29udGV4dCh0KSk7ZWxzZXt2YXIgYT1oLmdldEhvc3ROb2RlKG4pO2gudW5tb3VudENvbXBvbmVudChuLCExKTt2YXIgaT1mLmdldFR5cGUobyk7dGhpcy5fcmVuZGVyZWROb2RlVHlwZT1pO3ZhciBzPXRoaXMuX2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQobyxpIT09Zi5FTVBUWSk7dGhpcy5fcmVuZGVyZWRDb21wb25lbnQ9czt2YXIgdT1oLm1vdW50Q29tcG9uZW50KHMsZSx0aGlzLl9ob3N0UGFyZW50LHRoaXMuX2hvc3RDb250YWluZXJJbmZvLHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQodCksMCk7dGhpcy5fcmVwbGFjZU5vZGVXaXRoTWFya3VwKGEsdSxuKX19LF9yZXBsYWNlTm9kZVdpdGhNYXJrdXA6ZnVuY3Rpb24oZSx0LG4pe2wucmVwbGFjZU5vZGVXaXRoTWFya3VwKGUsdCxuKX0sX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudFdpdGhvdXRPd25lck9yQ29udGV4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnN0YW5jZS5yZW5kZXIoKX0sX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudDpmdW5jdGlvbigpe3ZhciBlO2lmKHRoaXMuX2NvbXBvc2l0ZVR5cGUhPT15LlN0YXRlbGVzc0Z1bmN0aW9uYWwpe2MuY3VycmVudD10aGlzO3RyeXtlPXRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudFdpdGhvdXRPd25lck9yQ29udGV4dCgpfWZpbmFsbHl7Yy5jdXJyZW50PW51bGx9fWVsc2UgZT10aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0T3duZXJPckNvbnRleHQoKTtyZXR1cm4gbnVsbD09PWV8fCExPT09ZXx8dS5pc1ZhbGlkRWxlbWVudChlKXx8aSgiMTA5Iix0aGlzLmdldE5hbWUoKXx8IlJlYWN0Q29tcG9zaXRlQ29tcG9uZW50IiksZX0sYXR0YWNoUmVmOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRQdWJsaWNJbnN0YW5jZSgpO251bGw9PW4mJmkoIjExMCIpO3ZhciByPXQuZ2V0UHVibGljSW5zdGFuY2UoKTsobi5yZWZzPT09bT9uLnJlZnM9e306bi5yZWZzKVtlXT1yfSxkZXRhY2hSZWY6ZnVuY3Rpb24oZSl7ZGVsZXRlIHRoaXMuZ2V0UHVibGljSW5zdGFuY2UoKS5yZWZzW2VdfSxnZXROYW1lOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSx0PXRoaXMuX2luc3RhbmNlJiZ0aGlzLl9pbnN0YW5jZS5jb25zdHJ1Y3RvcjtyZXR1cm4gZS5kaXNwbGF5TmFtZXx8dCYmdC5kaXNwbGF5TmFtZXx8ZS5uYW1lfHx0JiZ0Lm5hbWV8fG51bGx9LGdldFB1YmxpY0luc3RhbmNlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5faW5zdGFuY2U7cmV0dXJuIHRoaXMuX2NvbXBvc2l0ZVR5cGU9PT15LlN0YXRlbGVzc0Z1bmN0aW9uYWw/bnVsbDplfSxfaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudDpudWxsfTt0LmV4cG9ydHM9Q30sezExMjoxMTIsMTE2OjExNiwxMTk6MTE5LDEyMDoxMjAsMTMwOjEzMCwxMzc6MTM3LDE0MToxNDEsMTQyOjE0MiwxNDM6MTQzLDI4OjI4LDUwOjUwLDU3OjU3LDU4OjU4LDYyOjYyLDY2OjY2fV0sMzA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgzMyksbz1lKDQ3KSxhPWUoNjApLGk9ZSg2Nikscz1lKDcxKSx1PWUoNzIpLGw9ZSg5NiksYz1lKDEwMykscD1lKDExMyk7ZSgxNDIpO28uaW5qZWN0KCk7dmFyIGQ9e2ZpbmRET01Ob2RlOmwscmVuZGVyOmEucmVuZGVyLHVubW91bnRDb21wb25lbnRBdE5vZGU6YS51bm1vdW50Q29tcG9uZW50QXROb2RlLHZlcnNpb246dSx1bnN0YWJsZV9iYXRjaGVkVXBkYXRlczpzLmJhdGNoZWRVcGRhdGVzLHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyOnB9OyJ1bmRlZmluZWQiIT10eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fJiYiZnVuY3Rpb24iPT10eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdCYmX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdCh7Q29tcG9uZW50VHJlZTp7Z2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGU6ci5nZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxnZXROb2RlRnJvbUluc3RhbmNlOmZ1bmN0aW9uKGUpe3JldHVybiBlLl9yZW5kZXJlZENvbXBvbmVudCYmKGU9YyhlKSksZT9yLmdldE5vZGVGcm9tSW5zdGFuY2UoZSk6bnVsbH19LE1vdW50OmEsUmVjb25jaWxlcjppfSk7dC5leHBvcnRzPWR9LHsxMDM6MTAzLDExMzoxMTMsMTQyOjE0MiwzMzozMyw0Nzo0Nyw2MDo2MCw2Njo2Niw3MTo3MSw3Mjo3Miw5Njo5Nn1dLDMxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7aWYoZSl7dmFyIHQ9ZS5fY3VycmVudEVsZW1lbnQuX293bmVyfHxudWxsO2lmKHQpe3ZhciBuPXQuZ2V0TmFtZSgpO2lmKG4pcmV0dXJuIiBUaGlzIERPTSBub2RlIHdhcyByZW5kZXJlZCBieSBgIituKyJgLiJ9fXJldHVybiIifWZ1bmN0aW9uIG8oZSx0KXt0JiYoWVtlLl90YWddJiYobnVsbCE9dC5jaGlsZHJlbnx8bnVsbCE9dC5kYW5nZXJvdXNseVNldElubmVySFRNTCkmJm0oIjEzNyIsZS5fdGFnLGUuX2N1cnJlbnRFbGVtZW50Ll9vd25lcj8iIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICIrZS5fY3VycmVudEVsZW1lbnQuX293bmVyLmdldE5hbWUoKSsiLiI6IiIpLG51bGwhPXQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJihudWxsIT10LmNoaWxkcmVuJiZtKCI2MCIpLCJvYmplY3QiPT10eXBlb2YgdC5kYW5nZXJvdXNseVNldElubmVySFRNTCYmaiBpbiB0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MfHxtKCI2MSIpKSxudWxsIT10LnN0eWxlJiYib2JqZWN0IiE9dHlwZW9mIHQuc3R5bGUmJm0oIjYyIixyKGUpKSl9ZnVuY3Rpb24gYShlLHQsbixyKXtpZighKHIgaW5zdGFuY2VvZiBSKSl7dmFyIG89ZS5faG9zdENvbnRhaW5lckluZm8sYT1vLl9ub2RlJiZvLl9ub2RlLm5vZGVUeXBlPT09SCxzPWE/by5fbm9kZTpvLl9vd25lckRvY3VtZW50O0YodCxzKSxyLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoaSx7aW5zdDplLHJlZ2lzdHJhdGlvbk5hbWU6dCxsaXN0ZW5lcjpufSl9fWZ1bmN0aW9uIGkoKXt2YXIgZT10aGlzO3gucHV0TGlzdGVuZXIoZS5pbnN0LGUucmVnaXN0cmF0aW9uTmFtZSxlLmxpc3RlbmVyKX1mdW5jdGlvbiBzKCl7dmFyIGU9dGhpcztTLnBvc3RNb3VudFdyYXBwZXIoZSl9ZnVuY3Rpb24gdSgpe3ZhciBlPXRoaXM7Ty5wb3N0TW91bnRXcmFwcGVyKGUpfWZ1bmN0aW9uIGwoKXt2YXIgZT10aGlzO04ucG9zdE1vdW50V3JhcHBlcihlKX1mdW5jdGlvbiBjKCl7dmFyIGU9dGhpcztlLl9yb290Tm9kZUlEfHxtKCI2MyIpO3ZhciB0PVUoZSk7c3dpdGNoKHR8fG0oIjY0IiksZS5fdGFnKXtjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W3cudHJhcEJ1YmJsZWRFdmVudCgidG9wTG9hZCIsImxvYWQiLHQpXTticmVhaztjYXNlInZpZGVvIjpjYXNlImF1ZGlvIjplLl93cmFwcGVyU3RhdGUubGlzdGVuZXJzPVtdO2Zvcih2YXIgbiBpbiBxKXEuaGFzT3duUHJvcGVydHkobikmJmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMucHVzaCh3LnRyYXBCdWJibGVkRXZlbnQobixxW25dLHQpKTticmVhaztjYXNlInNvdXJjZSI6ZS5fd3JhcHBlclN0YXRlLmxpc3RlbmVycz1bdy50cmFwQnViYmxlZEV2ZW50KCJ0b3BFcnJvciIsImVycm9yIix0KV07YnJlYWs7Y2FzZSJpbWciOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W3cudHJhcEJ1YmJsZWRFdmVudCgidG9wRXJyb3IiLCJlcnJvciIsdCksdy50cmFwQnViYmxlZEV2ZW50KCJ0b3BMb2FkIiwibG9hZCIsdCldO2JyZWFrO2Nhc2UiZm9ybSI6ZS5fd3JhcHBlclN0YXRlLmxpc3RlbmVycz1bdy50cmFwQnViYmxlZEV2ZW50KCJ0b3BSZXNldCIsInJlc2V0Iix0KSx3LnRyYXBCdWJibGVkRXZlbnQoInRvcFN1Ym1pdCIsInN1Ym1pdCIsdCldO2JyZWFrO2Nhc2UiaW5wdXQiOmNhc2Uic2VsZWN0IjpjYXNlInRleHRhcmVhIjplLl93cmFwcGVyU3RhdGUubGlzdGVuZXJzPVt3LnRyYXBCdWJibGVkRXZlbnQoInRvcEludmFsaWQiLCJpbnZhbGlkIix0KV19fWZ1bmN0aW9uIHAoKXtNLnBvc3RVcGRhdGVXcmFwcGVyKHRoaXMpfWZ1bmN0aW9uIGQoZSl7Ry5jYWxsKFEsZSl8fChYLnRlc3QoZSl8fG0oIjY1IixlKSxRW2VdPSEwKX1mdW5jdGlvbiBmKGUsdCl7cmV0dXJuIGUuaW5kZXhPZigiLSIpPj0wfHxudWxsIT10LmlzfWZ1bmN0aW9uIGgoZSl7dmFyIHQ9ZS50eXBlO2QodCksdGhpcy5fY3VycmVudEVsZW1lbnQ9ZSx0aGlzLl90YWc9dC50b0xvd2VyQ2FzZSgpLHRoaXMuX25hbWVzcGFjZVVSST1udWxsLHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW49bnVsbCx0aGlzLl9wcmV2aW91c1N0eWxlPW51bGwsdGhpcy5fcHJldmlvdXNTdHlsZUNvcHk9bnVsbCx0aGlzLl9ob3N0Tm9kZT1udWxsLHRoaXMuX2hvc3RQYXJlbnQ9bnVsbCx0aGlzLl9yb290Tm9kZUlEPTAsdGhpcy5fZG9tSUQ9MCx0aGlzLl9ob3N0Q29udGFpbmVySW5mbz1udWxsLHRoaXMuX3dyYXBwZXJTdGF0ZT1udWxsLHRoaXMuX3RvcExldmVsV3JhcHBlcj1udWxsLHRoaXMuX2ZsYWdzPTB9dmFyIG09ZSgxMTIpLHY9ZSgxNDMpLGc9ZSgyKSx5PWUoNSksXz1lKDkpLEM9ZSgxMCksYj1lKDExKSxFPWUoMTIpLHg9ZSgxNiksVD1lKDE3KSx3PWUoMjUpLGs9ZSgzMiksUD1lKDMzKSxTPWUoMzgpLE49ZSgzOSksTT1lKDQwKSxPPWUoNDMpLEk9KGUoNTgpLGUoNjEpKSxSPWUoNjgpLEE9KGUoMTI5KSxlKDk1KSksRD0oZSgxMzcpLGUoMTA5KSxlKDE0MSksZSgxMTgpLGUoMTQyKSxrKSxMPXguZGVsZXRlTGlzdGVuZXIsVT1QLmdldE5vZGVGcm9tSW5zdGFuY2UsRj13Lmxpc3RlblRvLFY9VC5yZWdpc3RyYXRpb25OYW1lTW9kdWxlcyxCPXtzdHJpbmc6ITAsbnVtYmVyOiEwfSxqPSJfX2h0bWwiLFc9e2NoaWxkcmVuOm51bGwsZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6bnVsbCxzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmc6bnVsbH0sSD0xMSxxPXt0b3BBYm9ydDoiYWJvcnQiLHRvcENhblBsYXk6ImNhbnBsYXkiLHRvcENhblBsYXlUaHJvdWdoOiJjYW5wbGF5dGhyb3VnaCIsdG9wRHVyYXRpb25DaGFuZ2U6ImR1cmF0aW9uY2hhbmdlIix0b3BFbXB0aWVkOiJlbXB0aWVkIix0b3BFbmNyeXB0ZWQ6ImVuY3J5cHRlZCIsdG9wRW5kZWQ6ImVuZGVkIix0b3BFcnJvcjoiZXJyb3IiLHRvcExvYWRlZERhdGE6ImxvYWRlZGRhdGEiLHRvcExvYWRlZE1ldGFkYXRhOiJsb2FkZWRtZXRhZGF0YSIsdG9wTG9hZFN0YXJ0OiJsb2Fkc3RhcnQiLHRvcFBhdXNlOiJwYXVzZSIsdG9wUGxheToicGxheSIsdG9wUGxheWluZzoicGxheWluZyIsdG9wUHJvZ3Jlc3M6InByb2dyZXNzIix0b3BSYXRlQ2hhbmdlOiJyYXRlY2hhbmdlIix0b3BTZWVrZWQ6InNlZWtlZCIsdG9wU2Vla2luZzoic2Vla2luZyIsdG9wU3RhbGxlZDoic3RhbGxlZCIsdG9wU3VzcGVuZDoic3VzcGVuZCIsdG9wVGltZVVwZGF0ZToidGltZXVwZGF0ZSIsdG9wVm9sdW1lQ2hhbmdlOiJ2b2x1bWVjaGFuZ2UiLHRvcFdhaXRpbmc6IndhaXRpbmcifSxLPXthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9LHo9e2xpc3Rpbmc6ITAscHJlOiEwLHRleHRhcmVhOiEwfSxZPXYoe21lbnVpdGVtOiEwfSxLKSxYPS9eW2EtekEtWl1bYS16QS1aOl9cLlwtXGRdKiQvLFE9e30sRz17fS5oYXNPd25Qcm9wZXJ0eSwkPTE7aC5kaXNwbGF5TmFtZT0iUmVhY3RET01Db21wb25lbnQiLGguTWl4aW49e21vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuX3Jvb3ROb2RlSUQ9JCsrLHRoaXMuX2RvbUlEPW4uX2lkQ291bnRlcisrLHRoaXMuX2hvc3RQYXJlbnQ9dCx0aGlzLl9ob3N0Q29udGFpbmVySW5mbz1uO3ZhciBhPXRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO3N3aXRjaCh0aGlzLl90YWcpe2Nhc2UiYXVkaW8iOmNhc2UiZm9ybSI6Y2FzZSJpZnJhbWUiOmNhc2UiaW1nIjpjYXNlImxpbmsiOmNhc2Uib2JqZWN0IjpjYXNlInNvdXJjZSI6Y2FzZSJ2aWRlbyI6dGhpcy5fd3JhcHBlclN0YXRlPXtsaXN0ZW5lcnM6bnVsbH0sZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGMsdGhpcyk7YnJlYWs7Y2FzZSJpbnB1dCI6Uy5tb3VudFdyYXBwZXIodGhpcyxhLHQpLGE9Uy5nZXRIb3N0UHJvcHModGhpcyxhKSxlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYyx0aGlzKTticmVhaztjYXNlIm9wdGlvbiI6Ti5tb3VudFdyYXBwZXIodGhpcyxhLHQpLGE9Ti5nZXRIb3N0UHJvcHModGhpcyxhKTticmVhaztjYXNlInNlbGVjdCI6TS5tb3VudFdyYXBwZXIodGhpcyxhLHQpLGE9TS5nZXRIb3N0UHJvcHModGhpcyxhKSxlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYyx0aGlzKTticmVhaztjYXNlInRleHRhcmVhIjpPLm1vdW50V3JhcHBlcih0aGlzLGEsdCksYT1PLmdldEhvc3RQcm9wcyh0aGlzLGEpLGUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShjLHRoaXMpfW8odGhpcyxhKTt2YXIgaSxwO251bGwhPXQ/KGk9dC5fbmFtZXNwYWNlVVJJLHA9dC5fdGFnKTpuLl90YWcmJihpPW4uX25hbWVzcGFjZVVSSSxwPW4uX3RhZyksKG51bGw9PWl8fGk9PT1DLnN2ZyYmImZvcmVpZ25vYmplY3QiPT09cCkmJihpPUMuaHRtbCksaT09PUMuaHRtbCYmKCJzdmciPT09dGhpcy5fdGFnP2k9Qy5zdmc6Im1hdGgiPT09dGhpcy5fdGFnJiYoaT1DLm1hdGhtbCkpLHRoaXMuX25hbWVzcGFjZVVSST1pO3ZhciBkO2lmKGUudXNlQ3JlYXRlRWxlbWVudCl7dmFyIGYsaD1uLl9vd25lckRvY3VtZW50O2lmKGk9PT1DLmh0bWwpaWYoInNjcmlwdCI9PT10aGlzLl90YWcpe3ZhciBtPWguY3JlYXRlRWxlbWVudCgiZGl2Iiksdj10aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO20uaW5uZXJIVE1MPSI8Iit2KyI+PC8iK3YrIj4iLGY9bS5yZW1vdmVDaGlsZChtLmZpcnN0Q2hpbGQpfWVsc2UgZj1hLmlzP2guY3JlYXRlRWxlbWVudCh0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlLGEuaXMpOmguY3JlYXRlRWxlbWVudCh0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlKTtlbHNlIGY9aC5jcmVhdGVFbGVtZW50TlMoaSx0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlKTtQLnByZWNhY2hlTm9kZSh0aGlzLGYpLHRoaXMuX2ZsYWdzfD1ELmhhc0NhY2hlZENoaWxkTm9kZXMsdGhpcy5faG9zdFBhcmVudHx8RS5zZXRBdHRyaWJ1dGVGb3JSb290KGYpLHRoaXMuX3VwZGF0ZURPTVByb3BlcnRpZXMobnVsbCxhLGUpO3ZhciB5PV8oZik7dGhpcy5fY3JlYXRlSW5pdGlhbENoaWxkcmVuKGUsYSxyLHkpLGQ9eX1lbHNle3ZhciBiPXRoaXMuX2NyZWF0ZU9wZW5UYWdNYXJrdXBBbmRQdXRMaXN0ZW5lcnMoZSxhKSx4PXRoaXMuX2NyZWF0ZUNvbnRlbnRNYXJrdXAoZSxhLHIpO2Q9IXgmJktbdGhpcy5fdGFnXT9iKyIvPiI6YisiPiIreCsiPC8iK3RoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUrIj4ifXN3aXRjaCh0aGlzLl90YWcpe2Nhc2UiaW5wdXQiOmUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShzLHRoaXMpLGEuYXV0b0ZvY3VzJiZlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoZy5mb2N1c0RPTUNvbXBvbmVudCx0aGlzKTticmVhaztjYXNlInRleHRhcmVhIjplLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodSx0aGlzKSxhLmF1dG9Gb2N1cyYmZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGcuZm9jdXNET01Db21wb25lbnQsdGhpcyk7YnJlYWs7Y2FzZSJzZWxlY3QiOmNhc2UiYnV0dG9uIjphLmF1dG9Gb2N1cyYmZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGcuZm9jdXNET01Db21wb25lbnQsdGhpcyk7YnJlYWs7Y2FzZSJvcHRpb24iOmUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShsLHRoaXMpfXJldHVybiBkfSxfY3JlYXRlT3BlblRhZ01hcmt1cEFuZFB1dExpc3RlbmVyczpmdW5jdGlvbihlLHQpe3ZhciBuPSI8Iit0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO2Zvcih2YXIgciBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkocikpe3ZhciBvPXRbcl07aWYobnVsbCE9bylpZihWLmhhc093blByb3BlcnR5KHIpKW8mJmEodGhpcyxyLG8sZSk7ZWxzZXsic3R5bGUiPT09ciYmKG8mJihvPXRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5PXYoe30sdC5zdHlsZSkpLG89eS5jcmVhdGVNYXJrdXBGb3JTdHlsZXMobyx0aGlzKSk7dmFyIGk9bnVsbDtudWxsIT10aGlzLl90YWcmJmYodGhpcy5fdGFnLHQpP1cuaGFzT3duUHJvcGVydHkocil8fChpPUUuY3JlYXRlTWFya3VwRm9yQ3VzdG9tQXR0cmlidXRlKHIsbykpOmk9RS5jcmVhdGVNYXJrdXBGb3JQcm9wZXJ0eShyLG8pLGkmJihuKz0iICIraSl9fXJldHVybiBlLnJlbmRlclRvU3RhdGljTWFya3VwP246KHRoaXMuX2hvc3RQYXJlbnR8fChuKz0iICIrRS5jcmVhdGVNYXJrdXBGb3JSb290KCkpLG4rPSIgIitFLmNyZWF0ZU1hcmt1cEZvcklEKHRoaXMuX2RvbUlEKSl9LF9jcmVhdGVDb250ZW50TWFya3VwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0iIixvPXQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw7aWYobnVsbCE9byludWxsIT1vLl9faHRtbCYmKHI9by5fX2h0bWwpO2Vsc2V7dmFyIGE9Qlt0eXBlb2YgdC5jaGlsZHJlbl0/dC5jaGlsZHJlbjpudWxsLGk9bnVsbCE9YT9udWxsOnQuY2hpbGRyZW47aWYobnVsbCE9YSlyPUEoYSk7ZWxzZSBpZihudWxsIT1pKXt2YXIgcz10aGlzLm1vdW50Q2hpbGRyZW4oaSxlLG4pO3I9cy5qb2luKCIiKX19cmV0dXJuIHpbdGhpcy5fdGFnXSYmIlxuIj09PXIuY2hhckF0KDApPyJcbiIrcjpyfSxfY3JlYXRlSW5pdGlhbENoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw7aWYobnVsbCE9byludWxsIT1vLl9faHRtbCYmXy5xdWV1ZUhUTUwocixvLl9faHRtbCk7ZWxzZXt2YXIgYT1CW3R5cGVvZiB0LmNoaWxkcmVuXT90LmNoaWxkcmVuOm51bGwsaT1udWxsIT1hP251bGw6dC5jaGlsZHJlbjtpZihudWxsIT1hKSIiIT09YSYmXy5xdWV1ZVRleHQocixhKTtlbHNlIGlmKG51bGwhPWkpZm9yKHZhciBzPXRoaXMubW91bnRDaGlsZHJlbihpLGUsbiksdT0wO3U8cy5sZW5ndGg7dSsrKV8ucXVldWVDaGlsZChyLHNbdV0pfX0scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fY3VycmVudEVsZW1lbnQ7dGhpcy5fY3VycmVudEVsZW1lbnQ9ZSx0aGlzLnVwZGF0ZUNvbXBvbmVudCh0LHIsZSxuKX0sdXBkYXRlQ29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBhPXQucHJvcHMsaT10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztzd2l0Y2godGhpcy5fdGFnKXtjYXNlImlucHV0IjphPVMuZ2V0SG9zdFByb3BzKHRoaXMsYSksaT1TLmdldEhvc3RQcm9wcyh0aGlzLGkpO2JyZWFrO2Nhc2Uib3B0aW9uIjphPU4uZ2V0SG9zdFByb3BzKHRoaXMsYSksaT1OLmdldEhvc3RQcm9wcyh0aGlzLGkpO2JyZWFrO2Nhc2Uic2VsZWN0IjphPU0uZ2V0SG9zdFByb3BzKHRoaXMsYSksaT1NLmdldEhvc3RQcm9wcyh0aGlzLGkpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOmE9Ty5nZXRIb3N0UHJvcHModGhpcyxhKSxpPU8uZ2V0SG9zdFByb3BzKHRoaXMsaSl9c3dpdGNoKG8odGhpcyxpKSx0aGlzLl91cGRhdGVET01Qcm9wZXJ0aWVzKGEsaSxlKSx0aGlzLl91cGRhdGVET01DaGlsZHJlbihhLGksZSxyKSx0aGlzLl90YWcpe2Nhc2UiaW5wdXQiOlMudXBkYXRlV3JhcHBlcih0aGlzKTticmVhaztjYXNlInRleHRhcmVhIjpPLnVwZGF0ZVdyYXBwZXIodGhpcyk7YnJlYWs7Y2FzZSJzZWxlY3QiOmUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShwLHRoaXMpfX0sX3VwZGF0ZURPTVByb3BlcnRpZXM6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLG8saTtmb3IociBpbiBlKWlmKCF0Lmhhc093blByb3BlcnR5KHIpJiZlLmhhc093blByb3BlcnR5KHIpJiZudWxsIT1lW3JdKWlmKCJzdHlsZSI9PT1yKXt2YXIgcz10aGlzLl9wcmV2aW91c1N0eWxlQ29weTtmb3IobyBpbiBzKXMuaGFzT3duUHJvcGVydHkobykmJihpPWl8fHt9LGlbb109IiIpO3RoaXMuX3ByZXZpb3VzU3R5bGVDb3B5PW51bGx9ZWxzZSBWLmhhc093blByb3BlcnR5KHIpP2Vbcl0mJkwodGhpcyxyKTpmKHRoaXMuX3RhZyxlKT9XLmhhc093blByb3BlcnR5KHIpfHxFLmRlbGV0ZVZhbHVlRm9yQXR0cmlidXRlKFUodGhpcykscik6KGIucHJvcGVydGllc1tyXXx8Yi5pc0N1c3RvbUF0dHJpYnV0ZShyKSkmJkUuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShVKHRoaXMpLHIpO2ZvcihyIGluIHQpe3ZhciB1PXRbcl0sbD0ic3R5bGUiPT09cj90aGlzLl9wcmV2aW91c1N0eWxlQ29weTpudWxsIT1lP2Vbcl06dm9pZCAwO2lmKHQuaGFzT3duUHJvcGVydHkocikmJnUhPT1sJiYobnVsbCE9dXx8bnVsbCE9bCkpaWYoInN0eWxlIj09PXIpaWYodT91PXRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5PXYoe30sdSk6dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk9bnVsbCxsKXtmb3IobyBpbiBsKSFsLmhhc093blByb3BlcnR5KG8pfHx1JiZ1Lmhhc093blByb3BlcnR5KG8pfHwoaT1pfHx7fSxpW29dPSIiKTtmb3IobyBpbiB1KXUuaGFzT3duUHJvcGVydHkobykmJmxbb10hPT11W29dJiYoaT1pfHx7fSxpW29dPXVbb10pfWVsc2UgaT11O2Vsc2UgaWYoVi5oYXNPd25Qcm9wZXJ0eShyKSl1P2EodGhpcyxyLHUsbik6bCYmTCh0aGlzLHIpO2Vsc2UgaWYoZih0aGlzLl90YWcsdCkpVy5oYXNPd25Qcm9wZXJ0eShyKXx8RS5zZXRWYWx1ZUZvckF0dHJpYnV0ZShVKHRoaXMpLHIsdSk7ZWxzZSBpZihiLnByb3BlcnRpZXNbcl18fGIuaXNDdXN0b21BdHRyaWJ1dGUocikpe3ZhciBjPVUodGhpcyk7bnVsbCE9dT9FLnNldFZhbHVlRm9yUHJvcGVydHkoYyxyLHUpOkUuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShjLHIpfX1pJiZ5LnNldFZhbHVlRm9yU3R5bGVzKFUodGhpcyksaSx0aGlzKX0sX3VwZGF0ZURPTUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPUJbdHlwZW9mIGUuY2hpbGRyZW5dP2UuY2hpbGRyZW46bnVsbCxhPUJbdHlwZW9mIHQuY2hpbGRyZW5dP3QuY2hpbGRyZW46bnVsbCxpPWUuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJmUuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sLHM9dC5kYW5nZXJvdXNseVNldElubmVySFRNTCYmdC5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwsdT1udWxsIT1vP251bGw6ZS5jaGlsZHJlbixsPW51bGwhPWE/bnVsbDp0LmNoaWxkcmVuLGM9bnVsbCE9b3x8bnVsbCE9aSxwPW51bGwhPWF8fG51bGwhPXM7bnVsbCE9dSYmbnVsbD09bD90aGlzLnVwZGF0ZUNoaWxkcmVuKG51bGwsbixyKTpjJiYhcCYmdGhpcy51cGRhdGVUZXh0Q29udGVudCgiIiksbnVsbCE9YT9vIT09YSYmdGhpcy51cGRhdGVUZXh0Q29udGVudCgiIithKTpudWxsIT1zP2khPT1zJiZ0aGlzLnVwZGF0ZU1hcmt1cCgiIitzKTpudWxsIT1sJiZ0aGlzLnVwZGF0ZUNoaWxkcmVuKGwsbixyKX0sZ2V0SG9zdE5vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gVSh0aGlzKX0sdW5tb3VudENvbXBvbmVudDpmdW5jdGlvbihlKXtzd2l0Y2godGhpcy5fdGFnKXtjYXNlImF1ZGlvIjpjYXNlImZvcm0iOmNhc2UiaWZyYW1lIjpjYXNlImltZyI6Y2FzZSJsaW5rIjpjYXNlIm9iamVjdCI6Y2FzZSJzb3VyY2UiOmNhc2UidmlkZW8iOnZhciB0PXRoaXMuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM7aWYodClmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl0W25dLnJlbW92ZSgpO2JyZWFrO2Nhc2UiaHRtbCI6Y2FzZSJoZWFkIjpjYXNlImJvZHkiOm0oIjY2Iix0aGlzLl90YWcpfXRoaXMudW5tb3VudENoaWxkcmVuKGUpLFAudW5jYWNoZU5vZGUodGhpcykseC5kZWxldGVBbGxMaXN0ZW5lcnModGhpcyksdGhpcy5fcm9vdE5vZGVJRD0wLHRoaXMuX2RvbUlEPTAsdGhpcy5fd3JhcHBlclN0YXRlPW51bGx9LGdldFB1YmxpY0luc3RhbmNlOmZ1bmN0aW9uKCl7cmV0dXJuIFUodGhpcyl9fSx2KGgucHJvdG90eXBlLGguTWl4aW4sSS5NaXhpbiksdC5leHBvcnRzPWh9LHsxMDoxMCwxMDk6MTA5LDExOjExLDExMjoxMTIsMTE4OjExOCwxMjoxMiwxMjk6MTI5LDEzNzoxMzcsMTQxOjE0MSwxNDI6MTQyLDE0MzoxNDMsMTY6MTYsMTc6MTcsMjoyLDI1OjI1LDMyOjMyLDMzOjMzLDM4OjM4LDM5OjM5LDQwOjQwLDQzOjQzLDU6NSw1ODo1OCw2MTo2MSw2ODo2OCw5OjksOTU6OTV9XSwzMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17aGFzQ2FjaGVkQ2hpbGROb2RlczoxfTt0LmV4cG9ydHM9cn0se31dLDMzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gMT09PWUubm9kZVR5cGUmJmUuZ2V0QXR0cmlidXRlKGgpPT09U3RyaW5nKHQpfHw4PT09ZS5ub2RlVHlwZSYmZS5ub2RlVmFsdWU9PT0iIHJlYWN0LXRleHQ6ICIrdCsiICJ8fDg9PT1lLm5vZGVUeXBlJiZlLm5vZGVWYWx1ZT09PSIgcmVhY3QtZW1wdHk6ICIrdCsiICJ9ZnVuY3Rpb24gbyhlKXtmb3IodmFyIHQ7dD1lLl9yZW5kZXJlZENvbXBvbmVudDspZT10O3JldHVybiBlfWZ1bmN0aW9uIGEoZSx0KXt2YXIgbj1vKGUpO24uX2hvc3ROb2RlPXQsdFt2XT1ufWZ1bmN0aW9uIGkoZSl7dmFyIHQ9ZS5faG9zdE5vZGU7dCYmKGRlbGV0ZSB0W3ZdLGUuX2hvc3ROb2RlPW51bGwpfWZ1bmN0aW9uIHMoZSx0KXtpZighKGUuX2ZsYWdzJm0uaGFzQ2FjaGVkQ2hpbGROb2Rlcykpe3ZhciBuPWUuX3JlbmRlcmVkQ2hpbGRyZW4saT10LmZpcnN0Q2hpbGQ7ZTpmb3IodmFyIHMgaW4gbilpZihuLmhhc093blByb3BlcnR5KHMpKXt2YXIgdT1uW3NdLGw9byh1KS5fZG9tSUQ7aWYoMCE9PWwpe2Zvcig7bnVsbCE9PWk7aT1pLm5leHRTaWJsaW5nKWlmKHIoaSxsKSl7YSh1LGkpO2NvbnRpbnVlIGV9cCgiMzIiLGwpfX1lLl9mbGFnc3w9bS5oYXNDYWNoZWRDaGlsZE5vZGVzfX1mdW5jdGlvbiB1KGUpe2lmKGVbdl0pcmV0dXJuIGVbdl07Zm9yKHZhciB0PVtdOyFlW3ZdOyl7aWYodC5wdXNoKGUpLCFlLnBhcmVudE5vZGUpcmV0dXJuIG51bGw7ZT1lLnBhcmVudE5vZGV9Zm9yKHZhciBuLHI7ZSYmKHI9ZVt2XSk7ZT10LnBvcCgpKW49cix0Lmxlbmd0aCYmcyhyLGUpO3JldHVybiBufWZ1bmN0aW9uIGwoZSl7dmFyIHQ9dShlKTtyZXR1cm4gbnVsbCE9dCYmdC5faG9zdE5vZGU9PT1lP3Q6bnVsbH1mdW5jdGlvbiBjKGUpe2lmKHZvaWQgMD09PWUuX2hvc3ROb2RlJiZwKCIzMyIpLGUuX2hvc3ROb2RlKXJldHVybiBlLl9ob3N0Tm9kZTtmb3IodmFyIHQ9W107IWUuX2hvc3ROb2RlOyl0LnB1c2goZSksZS5faG9zdFBhcmVudHx8cCgiMzQiKSxlPWUuX2hvc3RQYXJlbnQ7Zm9yKDt0Lmxlbmd0aDtlPXQucG9wKCkpcyhlLGUuX2hvc3ROb2RlKTtyZXR1cm4gZS5faG9zdE5vZGV9dmFyIHA9ZSgxMTIpLGQ9ZSgxMSksZj1lKDMyKSxoPShlKDEzNyksZC5JRF9BVFRSSUJVVEVfTkFNRSksbT1mLHY9Il9fcmVhY3RJbnRlcm5hbEluc3RhbmNlJCIrTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiksZz17Z2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGU6dSxnZXRJbnN0YW5jZUZyb21Ob2RlOmwsZ2V0Tm9kZUZyb21JbnN0YW5jZTpjLHByZWNhY2hlQ2hpbGROb2RlczpzLHByZWNhY2hlTm9kZTphLHVuY2FjaGVOb2RlOml9O3QuZXhwb3J0cz1nfSx7MTE6MTEsMTEyOjExMiwxMzc6MTM3LDMyOjMyfV0sMzQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybntfdG9wTGV2ZWxXcmFwcGVyOmUsX2lkQ291bnRlcjoxLF9vd25lckRvY3VtZW50OnQ/dC5ub2RlVHlwZT09PW8/dDp0Lm93bmVyRG9jdW1lbnQ6bnVsbCxfbm9kZTp0LF90YWc6dD90Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk6bnVsbCxfbmFtZXNwYWNlVVJJOnQ/dC5uYW1lc3BhY2VVUkk6bnVsbH19dmFyIG89KGUoMTE4KSw5KTt0LmV4cG9ydHM9cn0sezExODoxMTh9XSwzNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDE0Myksbz1lKDkpLGE9ZSgzMyksaT1mdW5jdGlvbihlKXt0aGlzLl9jdXJyZW50RWxlbWVudD1udWxsLHRoaXMuX2hvc3ROb2RlPW51bGwsdGhpcy5faG9zdFBhcmVudD1udWxsLHRoaXMuX2hvc3RDb250YWluZXJJbmZvPW51bGwsdGhpcy5fZG9tSUQ9MH07cihpLnByb3RvdHlwZSx7bW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9bi5faWRDb3VudGVyKys7dGhpcy5fZG9tSUQ9aSx0aGlzLl9ob3N0UGFyZW50PXQsdGhpcy5faG9zdENvbnRhaW5lckluZm89bjt2YXIgcz0iIHJlYWN0LWVtcHR5OiAiK3RoaXMuX2RvbUlEKyIgIjtpZihlLnVzZUNyZWF0ZUVsZW1lbnQpe3ZhciB1PW4uX293bmVyRG9jdW1lbnQsbD11LmNyZWF0ZUNvbW1lbnQocyk7cmV0dXJuIGEucHJlY2FjaGVOb2RlKHRoaXMsbCksbyhsKX1yZXR1cm4gZS5yZW5kZXJUb1N0YXRpY01hcmt1cD8iIjoiPCEtLSIrcysiLS0+In0scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlvbigpe30sZ2V0SG9zdE5vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gYS5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpfSx1bm1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKCl7YS51bmNhY2hlTm9kZSh0aGlzKX19KSx0LmV4cG9ydHM9aX0sezE0MzoxNDMsMzM6MzMsOTo5fV0sMzY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e3VzZUNyZWF0ZUVsZW1lbnQ6ITAsdXNlRmliZXI6ITF9O3QuZXhwb3J0cz1yfSx7fV0sMzc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSg4KSxvPWUoMzMpLGE9e2Rhbmdlcm91c2x5UHJvY2Vzc0NoaWxkcmVuVXBkYXRlczpmdW5jdGlvbihlLHQpe3ZhciBuPW8uZ2V0Tm9kZUZyb21JbnN0YW5jZShlKTtyLnByb2Nlc3NVcGRhdGVzKG4sdCl9fTt0LmV4cG9ydHM9YX0sezMzOjMzLDg6OH1dLDM4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXt0aGlzLl9yb290Tm9kZUlEJiZkLnVwZGF0ZVdyYXBwZXIodGhpcyl9ZnVuY3Rpb24gbyhlKXtyZXR1cm4iY2hlY2tib3giPT09ZS50eXBlfHwicmFkaW8iPT09ZS50eXBlP251bGwhPWUuY2hlY2tlZDpudWxsIT1lLnZhbHVlfWZ1bmN0aW9uIGEoZSl7dmFyIHQ9dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHMsbj1sLmV4ZWN1dGVPbkNoYW5nZSh0LGUpO3AuYXNhcChyLHRoaXMpO3ZhciBvPXQubmFtZTtpZigicmFkaW8iPT09dC50eXBlJiZudWxsIT1vKXtmb3IodmFyIGE9Yy5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpLHM9YTtzLnBhcmVudE5vZGU7KXM9cy5wYXJlbnROb2RlO2Zvcih2YXIgdT1zLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWU9IitKU09OLnN0cmluZ2lmeSgiIitvKSsnXVt0eXBlPSJyYWRpbyJdJyksZD0wO2Q8dS5sZW5ndGg7ZCsrKXt2YXIgZj11W2RdO2lmKGYhPT1hJiZmLmZvcm09PT1hLmZvcm0pe3ZhciBoPWMuZ2V0SW5zdGFuY2VGcm9tTm9kZShmKTtofHxpKCI5MCIpLHAuYXNhcChyLGgpfX19cmV0dXJuIG59dmFyIGk9ZSgxMTIpLHM9ZSgxNDMpLHU9ZSgxMiksbD1lKDIzKSxjPWUoMzMpLHA9ZSg3MSksZD0oZSgxMzcpLGUoMTQyKSx7Z2V0SG9zdFByb3BzOmZ1bmN0aW9uKGUsdCl7dmFyIG49bC5nZXRWYWx1ZSh0KSxyPWwuZ2V0Q2hlY2tlZCh0KTtyZXR1cm4gcyh7dHlwZTp2b2lkIDAsc3RlcDp2b2lkIDAsbWluOnZvaWQgMCxtYXg6dm9pZCAwfSx0LHtkZWZhdWx0Q2hlY2tlZDp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCx2YWx1ZTpudWxsIT1uP246ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSxjaGVja2VkOm51bGwhPXI/cjplLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQsb25DaGFuZ2U6ZS5fd3JhcHBlclN0YXRlLm9uQ2hhbmdlfSl9LG1vdW50V3JhcHBlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXQuZGVmYXVsdFZhbHVlO2UuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbENoZWNrZWQ6bnVsbCE9dC5jaGVja2VkP3QuY2hlY2tlZDp0LmRlZmF1bHRDaGVja2VkLGluaXRpYWxWYWx1ZTpudWxsIT10LnZhbHVlP3QudmFsdWU6bixsaXN0ZW5lcnM6bnVsbCxvbkNoYW5nZTphLmJpbmQoZSksY29udHJvbGxlZDpvKHQpfX0sdXBkYXRlV3JhcHBlcjpmdW5jdGlvbihlKXt2YXIgdD1lLl9jdXJyZW50RWxlbWVudC5wcm9wcyxuPXQuY2hlY2tlZDtudWxsIT1uJiZ1LnNldFZhbHVlRm9yUHJvcGVydHkoYy5nZXROb2RlRnJvbUluc3RhbmNlKGUpLCJjaGVja2VkIixufHwhMSk7dmFyIHI9Yy5nZXROb2RlRnJvbUluc3RhbmNlKGUpLG89bC5nZXRWYWx1ZSh0KTtpZihudWxsIT1vKWlmKDA9PT1vJiYiIj09PXIudmFsdWUpci52YWx1ZT0iMCI7ZWxzZSBpZigibnVtYmVyIj09PXQudHlwZSl7dmFyIGE9cGFyc2VGbG9hdChyLnZhbHVlLDEwKXx8MDtvIT1hJiYoci52YWx1ZT0iIitvKX1lbHNlIG8hPXIudmFsdWUmJihyLnZhbHVlPSIiK28pO2Vsc2UgbnVsbD09dC52YWx1ZSYmbnVsbCE9dC5kZWZhdWx0VmFsdWUmJnIuZGVmYXVsdFZhbHVlIT09IiIrdC5kZWZhdWx0VmFsdWUmJihyLmRlZmF1bHRWYWx1ZT0iIit0LmRlZmF1bHRWYWx1ZSksbnVsbD09dC5jaGVja2VkJiZudWxsIT10LmRlZmF1bHRDaGVja2VkJiYoci5kZWZhdWx0Q2hlY2tlZD0hIXQuZGVmYXVsdENoZWNrZWQpfSxwb3N0TW91bnRXcmFwcGVyOmZ1bmN0aW9uKGUpe3ZhciB0PWUuX2N1cnJlbnRFbGVtZW50LnByb3BzLG49Yy5nZXROb2RlRnJvbUluc3RhbmNlKGUpO3N3aXRjaCh0LnR5cGUpe2Nhc2Uic3VibWl0IjpjYXNlInJlc2V0IjpicmVhaztjYXNlImNvbG9yIjpjYXNlImRhdGUiOmNhc2UiZGF0ZXRpbWUiOmNhc2UiZGF0ZXRpbWUtbG9jYWwiOmNhc2UibW9udGgiOmNhc2UidGltZSI6Y2FzZSJ3ZWVrIjpuLnZhbHVlPSIiLG4udmFsdWU9bi5kZWZhdWx0VmFsdWU7YnJlYWs7ZGVmYXVsdDpuLnZhbHVlPW4udmFsdWV9dmFyIHI9bi5uYW1lOyIiIT09ciYmKG4ubmFtZT0iIiksbi5kZWZhdWx0Q2hlY2tlZD0hbi5kZWZhdWx0Q2hlY2tlZCxuLmRlZmF1bHRDaGVja2VkPSFuLmRlZmF1bHRDaGVja2VkLCIiIT09ciYmKG4ubmFtZT1yKX19KTt0LmV4cG9ydHM9ZH0sezExMjoxMTIsMTI6MTIsMTM3OjEzNywxNDI6MTQyLDE0MzoxNDMsMjM6MjMsMzM6MzMsNzE6NzF9XSwzOTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PSIiO3JldHVybiBhLkNoaWxkcmVuLmZvckVhY2goZSxmdW5jdGlvbihlKXtudWxsIT1lJiYoInN0cmluZyI9PXR5cGVvZiBlfHwibnVtYmVyIj09dHlwZW9mIGU/dCs9ZTp1fHwodT0hMCkpfSksdH12YXIgbz1lKDE0MyksYT1lKDEyMCksaT1lKDMzKSxzPWUoNDApLHU9KGUoMTQyKSwhMSksbD17bW91bnRXcmFwcGVyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1udWxsO2lmKG51bGwhPW4pe3ZhciBhPW47Im9wdGdyb3VwIj09PWEuX3RhZyYmKGE9YS5faG9zdFBhcmVudCksbnVsbCE9YSYmInNlbGVjdCI9PT1hLl90YWcmJihvPXMuZ2V0U2VsZWN0VmFsdWVDb250ZXh0KGEpKX12YXIgaT1udWxsO2lmKG51bGwhPW8pe3ZhciB1O2lmKHU9bnVsbCE9dC52YWx1ZT90LnZhbHVlKyIiOnIodC5jaGlsZHJlbiksaT0hMSxBcnJheS5pc0FycmF5KG8pKXtmb3IodmFyIGw9MDtsPG8ubGVuZ3RoO2wrKylpZigiIitvW2xdPT09dSl7aT0hMDticmVha319ZWxzZSBpPSIiK289PT11fWUuX3dyYXBwZXJTdGF0ZT17c2VsZWN0ZWQ6aX19LHBvc3RNb3VudFdyYXBwZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fY3VycmVudEVsZW1lbnQucHJvcHM7bnVsbCE9dC52YWx1ZSYmaS5nZXROb2RlRnJvbUluc3RhbmNlKGUpLnNldEF0dHJpYnV0ZSgidmFsdWUiLHQudmFsdWUpfSxnZXRIb3N0UHJvcHM6ZnVuY3Rpb24oZSx0KXt2YXIgbj1vKHtzZWxlY3RlZDp2b2lkIDAsY2hpbGRyZW46dm9pZCAwfSx0KTtudWxsIT1lLl93cmFwcGVyU3RhdGUuc2VsZWN0ZWQmJihuLnNlbGVjdGVkPWUuX3dyYXBwZXJTdGF0ZS5zZWxlY3RlZCk7dmFyIGE9cih0LmNoaWxkcmVuKTtyZXR1cm4gYSYmKG4uY2hpbGRyZW49YSksbn19O3QuZXhwb3J0cz1sfSx7MTIwOjEyMCwxNDI6MTQyLDE0MzoxNDMsMzM6MzMsNDA6NDB9XSw0MDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7aWYodGhpcy5fcm9vdE5vZGVJRCYmdGhpcy5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGUpe3RoaXMuX3dyYXBwZXJTdGF0ZS5wZW5kaW5nVXBkYXRlPSExO3ZhciBlPXRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzLHQ9cy5nZXRWYWx1ZShlKTtudWxsIT10JiZvKHRoaXMsQm9vbGVhbihlLm11bHRpcGxlKSx0KX19ZnVuY3Rpb24gbyhlLHQsbil7dmFyIHIsbyxhPXUuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKS5vcHRpb25zO2lmKHQpe2ZvcihyPXt9LG89MDtvPG4ubGVuZ3RoO28rKylyWyIiK25bb11dPSEwO2ZvcihvPTA7bzxhLmxlbmd0aDtvKyspe3ZhciBpPXIuaGFzT3duUHJvcGVydHkoYVtvXS52YWx1ZSk7YVtvXS5zZWxlY3RlZCE9PWkmJihhW29dLnNlbGVjdGVkPWkpfX1lbHNle2ZvcihyPSIiK24sbz0wO288YS5sZW5ndGg7bysrKWlmKGFbb10udmFsdWU9PT1yKXJldHVybiB2b2lkKGFbb10uc2VsZWN0ZWQ9ITApO2EubGVuZ3RoJiYoYVswXS5zZWxlY3RlZD0hMCl9fWZ1bmN0aW9uIGEoZSl7dmFyIHQ9dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHMsbj1zLmV4ZWN1dGVPbkNoYW5nZSh0LGUpO3JldHVybiB0aGlzLl9yb290Tm9kZUlEJiYodGhpcy5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGU9ITApLGwuYXNhcChyLHRoaXMpLG59dmFyIGk9ZSgxNDMpLHM9ZSgyMyksdT1lKDMzKSxsPWUoNzEpLGM9KGUoMTQyKSwhMSkscD17Z2V0SG9zdFByb3BzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkoe30sdCx7b25DaGFuZ2U6ZS5fd3JhcHBlclN0YXRlLm9uQ2hhbmdlLHZhbHVlOnZvaWQgMH0pfSxtb3VudFdyYXBwZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1zLmdldFZhbHVlKHQpO2UuX3dyYXBwZXJTdGF0ZT17cGVuZGluZ1VwZGF0ZTohMSxpbml0aWFsVmFsdWU6bnVsbCE9bj9uOnQuZGVmYXVsdFZhbHVlLGxpc3RlbmVyczpudWxsLG9uQ2hhbmdlOmEuYmluZChlKSx3YXNNdWx0aXBsZTpCb29sZWFuKHQubXVsdGlwbGUpfSx2b2lkIDA9PT10LnZhbHVlfHx2b2lkIDA9PT10LmRlZmF1bHRWYWx1ZXx8Y3x8KGM9ITApfSxnZXRTZWxlY3RWYWx1ZUNvbnRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWV9LHBvc3RVcGRhdGVXcmFwcGVyOmZ1bmN0aW9uKGUpe3ZhciB0PWUuX2N1cnJlbnRFbGVtZW50LnByb3BzO2UuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU9dm9pZCAwO3ZhciBuPWUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTtlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU9Qm9vbGVhbih0Lm11bHRpcGxlKTt2YXIgcj1zLmdldFZhbHVlKHQpO251bGwhPXI/KGUuX3dyYXBwZXJTdGF0ZS5wZW5kaW5nVXBkYXRlPSExLG8oZSxCb29sZWFuKHQubXVsdGlwbGUpLHIpKTpuIT09Qm9vbGVhbih0Lm11bHRpcGxlKSYmKG51bGwhPXQuZGVmYXVsdFZhbHVlP28oZSxCb29sZWFuKHQubXVsdGlwbGUpLHQuZGVmYXVsdFZhbHVlKTpvKGUsQm9vbGVhbih0Lm11bHRpcGxlKSx0Lm11bHRpcGxlP1tdOiIiKSl9fTt0LmV4cG9ydHM9cH0sezE0MjoxNDIsMTQzOjE0MywyMzoyMywzMzozMyw3MTo3MX1dLDQxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7cmV0dXJuIGU9PT1uJiZ0PT09cn1mdW5jdGlvbiBvKGUpe3ZhciB0PWRvY3VtZW50LnNlbGVjdGlvbixuPXQuY3JlYXRlUmFuZ2UoKSxyPW4udGV4dC5sZW5ndGgsbz1uLmR1cGxpY2F0ZSgpO28ubW92ZVRvRWxlbWVudFRleHQoZSksby5zZXRFbmRQb2ludCgiRW5kVG9TdGFydCIsbik7dmFyIGE9by50ZXh0Lmxlbmd0aDtyZXR1cm57c3RhcnQ6YSxlbmQ6YStyfX1mdW5jdGlvbiBhKGUpe3ZhciB0PXdpbmRvdy5nZXRTZWxlY3Rpb24mJndpbmRvdy5nZXRTZWxlY3Rpb24oKTtpZighdHx8MD09PXQucmFuZ2VDb3VudClyZXR1cm4gbnVsbDt2YXIgbj10LmFuY2hvck5vZGUsbz10LmFuY2hvck9mZnNldCxhPXQuZm9jdXNOb2RlLGk9dC5mb2N1c09mZnNldCxzPXQuZ2V0UmFuZ2VBdCgwKTt0cnl7cy5zdGFydENvbnRhaW5lci5ub2RlVHlwZSxzLmVuZENvbnRhaW5lci5ub2RlVHlwZX1jYXRjaChlKXtyZXR1cm4gbnVsbH12YXIgdT1yKHQuYW5jaG9yTm9kZSx0LmFuY2hvck9mZnNldCx0LmZvY3VzTm9kZSx0LmZvY3VzT2Zmc2V0KSxsPXU/MDpzLnRvU3RyaW5nKCkubGVuZ3RoLGM9cy5jbG9uZVJhbmdlKCk7Yy5zZWxlY3ROb2RlQ29udGVudHMoZSksYy5zZXRFbmQocy5zdGFydENvbnRhaW5lcixzLnN0YXJ0T2Zmc2V0KTt2YXIgcD1yKGMuc3RhcnRDb250YWluZXIsYy5zdGFydE9mZnNldCxjLmVuZENvbnRhaW5lcixjLmVuZE9mZnNldCksZD1wPzA6Yy50b1N0cmluZygpLmxlbmd0aCxmPWQrbCxoPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7aC5zZXRTdGFydChuLG8pLGguc2V0RW5kKGEsaSk7dmFyIG09aC5jb2xsYXBzZWQ7cmV0dXJue3N0YXJ0Om0/ZjpkLGVuZDptP2Q6Zn19ZnVuY3Rpb24gaShlLHQpe3ZhciBuLHIsbz1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS5kdXBsaWNhdGUoKTt2b2lkIDA9PT10LmVuZD8obj10LnN0YXJ0LHI9bik6dC5zdGFydD50LmVuZD8obj10LmVuZCxyPXQuc3RhcnQpOihuPXQuc3RhcnQscj10LmVuZCksby5tb3ZlVG9FbGVtZW50VGV4dChlKSxvLm1vdmVTdGFydCgiY2hhcmFjdGVyIixuKSxvLnNldEVuZFBvaW50KCJFbmRUb1N0YXJ0IixvKSxvLm1vdmVFbmQoImNoYXJhY3RlciIsci1uKSxvLnNlbGVjdCgpfWZ1bmN0aW9uIHMoZSx0KXtpZih3aW5kb3cuZ2V0U2VsZWN0aW9uKXt2YXIgbj13aW5kb3cuZ2V0U2VsZWN0aW9uKCkscj1lW2MoKV0ubGVuZ3RoLG89TWF0aC5taW4odC5zdGFydCxyKSxhPXZvaWQgMD09PXQuZW5kP286TWF0aC5taW4odC5lbmQscik7aWYoIW4uZXh0ZW5kJiZvPmEpe3ZhciBpPWE7YT1vLG89aX12YXIgcz1sKGUsbyksdT1sKGUsYSk7aWYocyYmdSl7dmFyIHA9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtwLnNldFN0YXJ0KHMubm9kZSxzLm9mZnNldCksbi5yZW1vdmVBbGxSYW5nZXMoKSxvPmE/KG4uYWRkUmFuZ2UocCksbi5leHRlbmQodS5ub2RlLHUub2Zmc2V0KSk6KHAuc2V0RW5kKHUubm9kZSx1Lm9mZnNldCksbi5hZGRSYW5nZShwKSl9fX12YXIgdT1lKDEyMyksbD1lKDEwNSksYz1lKDEwNikscD11LmNhblVzZURPTSYmInNlbGVjdGlvbiJpbiBkb2N1bWVudCYmISgiZ2V0U2VsZWN0aW9uImluIHdpbmRvdyksZD17Z2V0T2Zmc2V0czpwP286YSxzZXRPZmZzZXRzOnA/aTpzfTt0LmV4cG9ydHM9ZH0sezEwNToxMDUsMTA2OjEwNiwxMjM6MTIzfV0sNDI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxMTIpLG89ZSgxNDMpLGE9ZSg4KSxpPWUoOSkscz1lKDMzKSx1PWUoOTUpLGw9KGUoMTM3KSxlKDExOCksZnVuY3Rpb24oZSl7dGhpcy5fY3VycmVudEVsZW1lbnQ9ZSx0aGlzLl9zdHJpbmdUZXh0PSIiK2UsDQp0aGlzLl9ob3N0Tm9kZT1udWxsLHRoaXMuX2hvc3RQYXJlbnQ9bnVsbCx0aGlzLl9kb21JRD0wLHRoaXMuX21vdW50SW5kZXg9MCx0aGlzLl9jbG9zaW5nQ29tbWVudD1udWxsLHRoaXMuX2NvbW1lbnROb2Rlcz1udWxsfSk7byhsLnByb3RvdHlwZSx7bW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89bi5faWRDb3VudGVyKyssYT0iIHJlYWN0LXRleHQ6ICIrbysiICI7aWYodGhpcy5fZG9tSUQ9byx0aGlzLl9ob3N0UGFyZW50PXQsZS51c2VDcmVhdGVFbGVtZW50KXt2YXIgbD1uLl9vd25lckRvY3VtZW50LGM9bC5jcmVhdGVDb21tZW50KGEpLHA9bC5jcmVhdGVDb21tZW50KCIgL3JlYWN0LXRleHQgIiksZD1pKGwuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtyZXR1cm4gaS5xdWV1ZUNoaWxkKGQsaShjKSksdGhpcy5fc3RyaW5nVGV4dCYmaS5xdWV1ZUNoaWxkKGQsaShsLmNyZWF0ZVRleHROb2RlKHRoaXMuX3N0cmluZ1RleHQpKSksaS5xdWV1ZUNoaWxkKGQsaShwKSkscy5wcmVjYWNoZU5vZGUodGhpcyxjKSx0aGlzLl9jbG9zaW5nQ29tbWVudD1wLGR9dmFyIGY9dSh0aGlzLl9zdHJpbmdUZXh0KTtyZXR1cm4gZS5yZW5kZXJUb1N0YXRpY01hcmt1cD9mOiI8IS0tIithKyItLT4iK2YrIjwhLS0gL3JlYWN0LXRleHQgLS0+In0scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQpe2lmKGUhPT10aGlzLl9jdXJyZW50RWxlbWVudCl7dGhpcy5fY3VycmVudEVsZW1lbnQ9ZTt2YXIgbj0iIitlO2lmKG4hPT10aGlzLl9zdHJpbmdUZXh0KXt0aGlzLl9zdHJpbmdUZXh0PW47dmFyIHI9dGhpcy5nZXRIb3N0Tm9kZSgpO2EucmVwbGFjZURlbGltaXRlZFRleHQoclswXSxyWzFdLG4pfX19LGdldEhvc3ROb2RlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY29tbWVudE5vZGVzO2lmKGUpcmV0dXJuIGU7aWYoIXRoaXMuX2Nsb3NpbmdDb21tZW50KWZvcih2YXIgdD1zLmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcyksbj10Lm5leHRTaWJsaW5nOzspe2lmKG51bGw9PW4mJnIoIjY3Iix0aGlzLl9kb21JRCksOD09PW4ubm9kZVR5cGUmJiIgL3JlYWN0LXRleHQgIj09PW4ubm9kZVZhbHVlKXt0aGlzLl9jbG9zaW5nQ29tbWVudD1uO2JyZWFrfW49bi5uZXh0U2libGluZ31yZXR1cm4gZT1bdGhpcy5faG9zdE5vZGUsdGhpcy5fY2xvc2luZ0NvbW1lbnRdLHRoaXMuX2NvbW1lbnROb2Rlcz1lLGV9LHVubW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oKXt0aGlzLl9jbG9zaW5nQ29tbWVudD1udWxsLHRoaXMuX2NvbW1lbnROb2Rlcz1udWxsLHMudW5jYWNoZU5vZGUodGhpcyl9fSksdC5leHBvcnRzPWx9LHsxMTI6MTEyLDExODoxMTgsMTM3OjEzNywxNDM6MTQzLDMzOjMzLDg6OCw5OjksOTU6OTV9XSw0MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7dGhpcy5fcm9vdE5vZGVJRCYmYy51cGRhdGVXcmFwcGVyKHRoaXMpfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHMsbj1zLmV4ZWN1dGVPbkNoYW5nZSh0LGUpO3JldHVybiBsLmFzYXAocix0aGlzKSxufXZhciBhPWUoMTEyKSxpPWUoMTQzKSxzPWUoMjMpLHU9ZSgzMyksbD1lKDcxKSxjPShlKDEzNyksZSgxNDIpLHtnZXRIb3N0UHJvcHM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbCE9dC5kYW5nZXJvdXNseVNldElubmVySFRNTCYmYSgiOTEiKSxpKHt9LHQse3ZhbHVlOnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLGNoaWxkcmVuOiIiK2UuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUsb25DaGFuZ2U6ZS5fd3JhcHBlclN0YXRlLm9uQ2hhbmdlfSl9LG1vdW50V3JhcHBlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXMuZ2V0VmFsdWUodCkscj1uO2lmKG51bGw9PW4pe3ZhciBpPXQuZGVmYXVsdFZhbHVlLHU9dC5jaGlsZHJlbjtudWxsIT11JiYobnVsbCE9aSYmYSgiOTIiKSxBcnJheS5pc0FycmF5KHUpJiYodS5sZW5ndGg8PTF8fGEoIjkzIiksdT11WzBdKSxpPSIiK3UpLG51bGw9PWkmJihpPSIiKSxyPWl9ZS5fd3JhcHBlclN0YXRlPXtpbml0aWFsVmFsdWU6IiIrcixsaXN0ZW5lcnM6bnVsbCxvbkNoYW5nZTpvLmJpbmQoZSl9fSx1cGRhdGVXcmFwcGVyOmZ1bmN0aW9uKGUpe3ZhciB0PWUuX2N1cnJlbnRFbGVtZW50LnByb3BzLG49dS5nZXROb2RlRnJvbUluc3RhbmNlKGUpLHI9cy5nZXRWYWx1ZSh0KTtpZihudWxsIT1yKXt2YXIgbz0iIityO28hPT1uLnZhbHVlJiYobi52YWx1ZT1vKSxudWxsPT10LmRlZmF1bHRWYWx1ZSYmKG4uZGVmYXVsdFZhbHVlPW8pfW51bGwhPXQuZGVmYXVsdFZhbHVlJiYobi5kZWZhdWx0VmFsdWU9dC5kZWZhdWx0VmFsdWUpfSxwb3N0TW91bnRXcmFwcGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXUuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKSxuPXQudGV4dENvbnRlbnQ7bj09PWUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUmJih0LnZhbHVlPW4pfX0pO3QuZXhwb3J0cz1jfSx7MTEyOjExMiwxMzc6MTM3LDE0MjoxNDIsMTQzOjE0MywyMzoyMywzMzozMyw3MTo3MX1dLDQ0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXsiX2hvc3ROb2RlImluIGV8fHUoIjMzIiksIl9ob3N0Tm9kZSJpbiB0fHx1KCIzMyIpO2Zvcih2YXIgbj0wLHI9ZTtyO3I9ci5faG9zdFBhcmVudCluKys7Zm9yKHZhciBvPTAsYT10O2E7YT1hLl9ob3N0UGFyZW50KW8rKztmb3IoO24tbz4wOyllPWUuX2hvc3RQYXJlbnQsbi0tO2Zvcig7by1uPjA7KXQ9dC5faG9zdFBhcmVudCxvLS07Zm9yKHZhciBpPW47aS0tOyl7aWYoZT09PXQpcmV0dXJuIGU7ZT1lLl9ob3N0UGFyZW50LHQ9dC5faG9zdFBhcmVudH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBvKGUsdCl7Il9ob3N0Tm9kZSJpbiBlfHx1KCIzNSIpLCJfaG9zdE5vZGUiaW4gdHx8dSgiMzUiKTtmb3IoO3Q7KXtpZih0PT09ZSlyZXR1cm4hMDt0PXQuX2hvc3RQYXJlbnR9cmV0dXJuITF9ZnVuY3Rpb24gYShlKXtyZXR1cm4iX2hvc3ROb2RlImluIGV8fHUoIjM2IiksZS5faG9zdFBhcmVudH1mdW5jdGlvbiBpKGUsdCxuKXtmb3IodmFyIHI9W107ZTspci5wdXNoKGUpLGU9ZS5faG9zdFBhcmVudDt2YXIgbztmb3Iobz1yLmxlbmd0aDtvLS0gPjA7KXQocltvXSwiY2FwdHVyZWQiLG4pO2ZvcihvPTA7bzxyLmxlbmd0aDtvKyspdChyW29dLCJidWJibGVkIixuKX1mdW5jdGlvbiBzKGUsdCxuLG8sYSl7Zm9yKHZhciBpPWUmJnQ/cihlLHQpOm51bGwscz1bXTtlJiZlIT09aTspcy5wdXNoKGUpLGU9ZS5faG9zdFBhcmVudDtmb3IodmFyIHU9W107dCYmdCE9PWk7KXUucHVzaCh0KSx0PXQuX2hvc3RQYXJlbnQ7dmFyIGw7Zm9yKGw9MDtsPHMubGVuZ3RoO2wrKyluKHNbbF0sImJ1YmJsZWQiLG8pO2ZvcihsPXUubGVuZ3RoO2wtLSA+MDspbih1W2xdLCJjYXB0dXJlZCIsYSl9dmFyIHU9ZSgxMTIpO2UoMTM3KTt0LmV4cG9ydHM9e2lzQW5jZXN0b3I6byxnZXRMb3dlc3RDb21tb25BbmNlc3RvcjpyLGdldFBhcmVudEluc3RhbmNlOmEsdHJhdmVyc2VUd29QaGFzZTppLHRyYXZlcnNlRW50ZXJMZWF2ZTpzfX0sezExMjoxMTIsMTM3OjEzN31dLDQ1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTIwKSxvPWUoMzApLGE9bztyLmFkZG9ucyYmKHIuX19TRUNSRVRfSU5KRUNURURfUkVBQ1RfRE9NX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9YSksdC5leHBvcnRzPWF9LHsxMjA6MTIwLDMwOjMwfV0sNDY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe3RoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKX12YXIgbz1lKDE0MyksYT1lKDcxKSxpPWUoODkpLHM9ZSgxMjkpLHU9e2luaXRpYWxpemU6cyxjbG9zZTpmdW5jdGlvbigpe2QuaXNCYXRjaGluZ1VwZGF0ZXM9ITF9fSxsPXtpbml0aWFsaXplOnMsY2xvc2U6YS5mbHVzaEJhdGNoZWRVcGRhdGVzLmJpbmQoYSl9LGM9W2wsdV07byhyLnByb3RvdHlwZSxpLHtnZXRUcmFuc2FjdGlvbldyYXBwZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGN9fSk7dmFyIHA9bmV3IHIsZD17aXNCYXRjaGluZ1VwZGF0ZXM6ITEsYmF0Y2hlZFVwZGF0ZXM6ZnVuY3Rpb24oZSx0LG4scixvLGEpe3ZhciBpPWQuaXNCYXRjaGluZ1VwZGF0ZXM7cmV0dXJuIGQuaXNCYXRjaGluZ1VwZGF0ZXM9ITAsaT9lKHQsbixyLG8sYSk6cC5wZXJmb3JtKGUsbnVsbCx0LG4scixvLGEpfX07dC5leHBvcnRzPWR9LHsxMjk6MTI5LDE0MzoxNDMsNzE6NzEsODk6ODl9XSw0NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7eHx8KHg9ITAseS5FdmVudEVtaXR0ZXIuaW5qZWN0UmVhY3RFdmVudExpc3RlbmVyKGcpLHkuRXZlbnRQbHVnaW5IdWIuaW5qZWN0RXZlbnRQbHVnaW5PcmRlcihzKSx5LkV2ZW50UGx1Z2luVXRpbHMuaW5qZWN0Q29tcG9uZW50VHJlZShkKSx5LkV2ZW50UGx1Z2luVXRpbHMuaW5qZWN0VHJlZVRyYXZlcnNhbChoKSx5LkV2ZW50UGx1Z2luSHViLmluamVjdEV2ZW50UGx1Z2luc0J5TmFtZSh7U2ltcGxlRXZlbnRQbHVnaW46RSxFbnRlckxlYXZlRXZlbnRQbHVnaW46dSxDaGFuZ2VFdmVudFBsdWdpbjppLFNlbGVjdEV2ZW50UGx1Z2luOmIsQmVmb3JlSW5wdXRFdmVudFBsdWdpbjphfSkseS5Ib3N0Q29tcG9uZW50LmluamVjdEdlbmVyaWNDb21wb25lbnRDbGFzcyhwKSx5Lkhvc3RDb21wb25lbnQuaW5qZWN0VGV4dENvbXBvbmVudENsYXNzKG0pLHkuRE9NUHJvcGVydHkuaW5qZWN0RE9NUHJvcGVydHlDb25maWcobykseS5ET01Qcm9wZXJ0eS5pbmplY3RET01Qcm9wZXJ0eUNvbmZpZyhsKSx5LkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKEMpLHkuRW1wdHlDb21wb25lbnQuaW5qZWN0RW1wdHlDb21wb25lbnRGYWN0b3J5KGZ1bmN0aW9uKGUpe3JldHVybiBuZXcgZihlKX0pLHkuVXBkYXRlcy5pbmplY3RSZWNvbmNpbGVUcmFuc2FjdGlvbihfKSx5LlVwZGF0ZXMuaW5qZWN0QmF0Y2hpbmdTdHJhdGVneSh2KSx5LkNvbXBvbmVudC5pbmplY3RFbnZpcm9ubWVudChjKSl9dmFyIG89ZSgxKSxhPWUoMyksaT1lKDcpLHM9ZSgxNCksdT1lKDE1KSxsPWUoMjEpLGM9ZSgyNykscD1lKDMxKSxkPWUoMzMpLGY9ZSgzNSksaD1lKDQ0KSxtPWUoNDIpLHY9ZSg0NiksZz1lKDUyKSx5PWUoNTUpLF89ZSg2NSksQz1lKDczKSxiPWUoNzQpLEU9ZSg3NSkseD0hMTt0LmV4cG9ydHM9e2luamVjdDpyfX0sezE6MSwxNDoxNCwxNToxNSwyMToyMSwyNzoyNywzOjMsMzE6MzEsMzM6MzMsMzU6MzUsNDI6NDIsNDQ6NDQsNDY6NDYsNTI6NTIsNTU6NTUsNjU6NjUsNzo3LDczOjczLDc0Ojc0LDc1Ojc1fV0sNDg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLmZvciYmU3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpfHw2MDEwMzt0LmV4cG9ydHM9cn0se31dLDQ5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByLG89e2luamVjdEVtcHR5Q29tcG9uZW50RmFjdG9yeTpmdW5jdGlvbihlKXtyPWV9fSxhPXtjcmVhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSl9fTthLmluamVjdGlvbj1vLHQuZXhwb3J0cz1hfSx7fV0sNTA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbil7dHJ5e3Qobil9Y2F0Y2goZSl7bnVsbD09PW8mJihvPWUpfX12YXIgbz1udWxsLGE9e2ludm9rZUd1YXJkZWRDYWxsYmFjazpyLGludm9rZUd1YXJkZWRDYWxsYmFja1dpdGhDYXRjaDpyLHJldGhyb3dDYXVnaHRFcnJvcjpmdW5jdGlvbigpe2lmKG8pe3ZhciBlPW87dGhyb3cgbz1udWxsLGV9fX07dC5leHBvcnRzPWF9LHt9XSw1MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe28uZW5xdWV1ZUV2ZW50cyhlKSxvLnByb2Nlc3NFdmVudFF1ZXVlKCExKX12YXIgbz1lKDE2KSxhPXtoYW5kbGVUb3BMZXZlbDpmdW5jdGlvbihlLHQsbixhKXtyKG8uZXh0cmFjdEV2ZW50cyhlLHQsbixhKSl9fTt0LmV4cG9ydHM9YX0sezE2OjE2fV0sNTI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IoO2UuX2hvc3RQYXJlbnQ7KWU9ZS5faG9zdFBhcmVudDt2YXIgdD1wLmdldE5vZGVGcm9tSW5zdGFuY2UoZSksbj10LnBhcmVudE5vZGU7cmV0dXJuIHAuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobil9ZnVuY3Rpb24gbyhlLHQpe3RoaXMudG9wTGV2ZWxUeXBlPWUsdGhpcy5uYXRpdmVFdmVudD10LHRoaXMuYW5jZXN0b3JzPVtdfWZ1bmN0aW9uIGEoZSl7dmFyIHQ9ZihlLm5hdGl2ZUV2ZW50KSxuPXAuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUodCksbz1uO2Rve2UuYW5jZXN0b3JzLnB1c2gobyksbz1vJiZyKG8pfXdoaWxlKG8pO2Zvcih2YXIgYT0wO2E8ZS5hbmNlc3RvcnMubGVuZ3RoO2ErKyluPWUuYW5jZXN0b3JzW2FdLG0uX2hhbmRsZVRvcExldmVsKGUudG9wTGV2ZWxUeXBlLG4sZS5uYXRpdmVFdmVudCxmKGUubmF0aXZlRXZlbnQpKX1mdW5jdGlvbiBpKGUpe2UoaCh3aW5kb3cpKX12YXIgcz1lKDE0MyksdT1lKDEyMiksbD1lKDEyMyksYz1lKDI0KSxwPWUoMzMpLGQ9ZSg3MSksZj1lKDEwMiksaD1lKDEzNCk7cyhvLnByb3RvdHlwZSx7ZGVzdHJ1Y3RvcjpmdW5jdGlvbigpe3RoaXMudG9wTGV2ZWxUeXBlPW51bGwsdGhpcy5uYXRpdmVFdmVudD1udWxsLHRoaXMuYW5jZXN0b3JzLmxlbmd0aD0wfX0pLGMuYWRkUG9vbGluZ1RvKG8sYy50d29Bcmd1bWVudFBvb2xlcik7dmFyIG09e19lbmFibGVkOiEwLF9oYW5kbGVUb3BMZXZlbDpudWxsLFdJTkRPV19IQU5ETEU6bC5jYW5Vc2VET00/d2luZG93Om51bGwsc2V0SGFuZGxlVG9wTGV2ZWw6ZnVuY3Rpb24oZSl7bS5faGFuZGxlVG9wTGV2ZWw9ZX0sc2V0RW5hYmxlZDpmdW5jdGlvbihlKXttLl9lbmFibGVkPSEhZX0saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIG0uX2VuYWJsZWR9LHRyYXBCdWJibGVkRXZlbnQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuP3UubGlzdGVuKG4sdCxtLmRpc3BhdGNoRXZlbnQuYmluZChudWxsLGUpKTpudWxsfSx0cmFwQ2FwdHVyZWRFdmVudDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG4/dS5jYXB0dXJlKG4sdCxtLmRpc3BhdGNoRXZlbnQuYmluZChudWxsLGUpKTpudWxsfSxtb25pdG9yU2Nyb2xsVmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9aS5iaW5kKG51bGwsZSk7dS5saXN0ZW4od2luZG93LCJzY3JvbGwiLHQpfSxkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKGUsdCl7aWYobS5fZW5hYmxlZCl7dmFyIG49by5nZXRQb29sZWQoZSx0KTt0cnl7ZC5iYXRjaGVkVXBkYXRlcyhhLG4pfWZpbmFsbHl7by5yZWxlYXNlKG4pfX19fTt0LmV4cG9ydHM9bX0sezEwMjoxMDIsMTIyOjEyMiwxMjM6MTIzLDEzNDoxMzQsMTQzOjE0MywyNDoyNCwzMzozMyw3MTo3MX1dLDUzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtsb2dUb3BMZXZlbFJlbmRlcnM6ITF9O3QuZXhwb3J0cz1yfSx7fV0sNTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gc3x8aSgiMTExIixlLnR5cGUpLG5ldyBzKGUpfWZ1bmN0aW9uIG8oZSl7cmV0dXJuIG5ldyB1KGUpfWZ1bmN0aW9uIGEoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiB1fXZhciBpPWUoMTEyKSxzPShlKDEzNyksbnVsbCksdT1udWxsLGw9e2luamVjdEdlbmVyaWNDb21wb25lbnRDbGFzczpmdW5jdGlvbihlKXtzPWV9LGluamVjdFRleHRDb21wb25lbnRDbGFzczpmdW5jdGlvbihlKXt1PWV9fSxjPXtjcmVhdGVJbnRlcm5hbENvbXBvbmVudDpyLGNyZWF0ZUluc3RhbmNlRm9yVGV4dDpvLGlzVGV4dENvbXBvbmVudDphLGluamVjdGlvbjpsfTt0LmV4cG9ydHM9Y30sezExMjoxMTIsMTM3OjEzN31dLDU1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTEpLG89ZSgxNiksYT1lKDE4KSxpPWUoMjgpLHM9ZSg0OSksdT1lKDI1KSxsPWUoNTQpLGM9ZSg3MSkscD17Q29tcG9uZW50OmkuaW5qZWN0aW9uLERPTVByb3BlcnR5OnIuaW5qZWN0aW9uLEVtcHR5Q29tcG9uZW50OnMuaW5qZWN0aW9uLEV2ZW50UGx1Z2luSHViOm8uaW5qZWN0aW9uLEV2ZW50UGx1Z2luVXRpbHM6YS5pbmplY3Rpb24sRXZlbnRFbWl0dGVyOnUuaW5qZWN0aW9uLEhvc3RDb21wb25lbnQ6bC5pbmplY3Rpb24sVXBkYXRlczpjLmluamVjdGlvbn07dC5leHBvcnRzPXB9LHsxMToxMSwxNjoxNiwxODoxOCwyNToyNSwyODoyOCw0OTo0OSw1NDo1NCw3MTo3MX1dLDU2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGEoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGUpfXZhciBvPWUoNDEpLGE9ZSgxMjYpLGk9ZSgxMzEpLHM9ZSgxMzIpLHU9e2hhc1NlbGVjdGlvbkNhcGFiaWxpdGllczpmdW5jdGlvbihlKXt2YXIgdD1lJiZlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHQmJigiaW5wdXQiPT09dCYmInRleHQiPT09ZS50eXBlfHwidGV4dGFyZWEiPT09dHx8InRydWUiPT09ZS5jb250ZW50RWRpdGFibGUpfSxnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbjpmdW5jdGlvbigpe3ZhciBlPXMoKTtyZXR1cm57Zm9jdXNlZEVsZW06ZSxzZWxlY3Rpb25SYW5nZTp1Lmhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhlKT91LmdldFNlbGVjdGlvbihlKTpudWxsfX0scmVzdG9yZVNlbGVjdGlvbjpmdW5jdGlvbihlKXt2YXIgdD1zKCksbj1lLmZvY3VzZWRFbGVtLG89ZS5zZWxlY3Rpb25SYW5nZTt0IT09biYmcihuKSYmKHUuaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKG4pJiZ1LnNldFNlbGVjdGlvbihuLG8pLGkobikpfSxnZXRTZWxlY3Rpb246ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoInNlbGVjdGlvblN0YXJ0ImluIGUpdD17c3RhcnQ6ZS5zZWxlY3Rpb25TdGFydCxlbmQ6ZS5zZWxlY3Rpb25FbmR9O2Vsc2UgaWYoZG9jdW1lbnQuc2VsZWN0aW9uJiZlLm5vZGVOYW1lJiYiaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXt2YXIgbj1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtuLnBhcmVudEVsZW1lbnQoKT09PWUmJih0PXtzdGFydDotbi5tb3ZlU3RhcnQoImNoYXJhY3RlciIsLWUudmFsdWUubGVuZ3RoKSxlbmQ6LW4ubW92ZUVuZCgiY2hhcmFjdGVyIiwtZS52YWx1ZS5sZW5ndGgpfSl9ZWxzZSB0PW8uZ2V0T2Zmc2V0cyhlKTtyZXR1cm4gdHx8e3N0YXJ0OjAsZW5kOjB9fSxzZXRTZWxlY3Rpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj10LnN0YXJ0LHI9dC5lbmQ7aWYodm9pZCAwPT09ciYmKHI9biksInNlbGVjdGlvblN0YXJ0ImluIGUpZS5zZWxlY3Rpb25TdGFydD1uLGUuc2VsZWN0aW9uRW5kPU1hdGgubWluKHIsZS52YWx1ZS5sZW5ndGgpO2Vsc2UgaWYoZG9jdW1lbnQuc2VsZWN0aW9uJiZlLm5vZGVOYW1lJiYiaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXt2YXIgYT1lLmNyZWF0ZVRleHRSYW5nZSgpO2EuY29sbGFwc2UoITApLGEubW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLG4pLGEubW92ZUVuZCgiY2hhcmFjdGVyIixyLW4pLGEuc2VsZWN0KCl9ZWxzZSBvLnNldE9mZnNldHMoZSx0KX19O3QuZXhwb3J0cz11fSx7MTI2OjEyNiwxMzE6MTMxLDEzMjoxMzIsNDE6NDF9XSw1NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17cmVtb3ZlOmZ1bmN0aW9uKGUpe2UuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZT12b2lkIDB9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gZS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWUuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZX0sc2V0OmZ1bmN0aW9uKGUsdCl7ZS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlPXR9fTt0LmV4cG9ydHM9cn0se31dLDU4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz17ZGVidWdUb29sOm51bGx9fSx7fV0sNTk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSg5Miksbz0vXjxcIVwtXC0vLGE9e0NIRUNLU1VNX0FUVFJfTkFNRToiZGF0YS1yZWFjdC1jaGVja3N1bSIsYWRkQ2hlY2tzdW1Ub01hcmt1cDpmdW5jdGlvbihlKXt2YXIgdD1yKGUpO3JldHVybiBvLnRlc3QoZSk/ZTplLnJlcGxhY2UoL1wvPz4vLCIgIithLkNIRUNLU1VNX0FUVFJfTkFNRSsnPSInK3QrJyIkJicpfSxjYW5SZXVzZU1hcmt1cDpmdW5jdGlvbihlLHQpe3ZhciBuPXQuZ2V0QXR0cmlidXRlKGEuQ0hFQ0tTVU1fQVRUUl9OQU1FKTtyZXR1cm4gbj1uJiZwYXJzZUludChuLDEwKSxyKGUpPT09bn19O3QuZXhwb3J0cz1hfSx7OTI6OTJ9XSw2MDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7Zm9yKHZhciBuPU1hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKSxyPTA7cjxuO3IrKylpZihlLmNoYXJBdChyKSE9PXQuY2hhckF0KHIpKXJldHVybiByO3JldHVybiBlLmxlbmd0aD09PXQubGVuZ3RoPy0xOm59ZnVuY3Rpb24gbyhlKXtyZXR1cm4gZT9lLm5vZGVUeXBlPT09QT9lLmRvY3VtZW50RWxlbWVudDplLmZpcnN0Q2hpbGQ6bnVsbH1mdW5jdGlvbiBhKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoTyl8fCIifWZ1bmN0aW9uIGkoZSx0LG4scixvKXt2YXIgYTtpZihiLmxvZ1RvcExldmVsUmVuZGVycyl7dmFyIGk9ZS5fY3VycmVudEVsZW1lbnQucHJvcHMuY2hpbGQscz1pLnR5cGU7YT0iUmVhY3QgbW91bnQ6ICIrKCJzdHJpbmciPT10eXBlb2Ygcz9zOnMuZGlzcGxheU5hbWV8fHMubmFtZSksY29uc29sZS50aW1lKGEpfXZhciB1PVQubW91bnRDb21wb25lbnQoZSxuLG51bGwsXyhlLHQpLG8sMCk7YSYmY29uc29sZS50aW1lRW5kKGEpLGUuX3JlbmRlcmVkQ29tcG9uZW50Ll90b3BMZXZlbFdyYXBwZXI9ZSxWLl9tb3VudEltYWdlSW50b05vZGUodSx0LGUscixuKX1mdW5jdGlvbiBzKGUsdCxuLHIpe3ZhciBvPWsuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5nZXRQb29sZWQoIW4mJkMudXNlQ3JlYXRlRWxlbWVudCk7by5wZXJmb3JtKGksbnVsbCxlLHQsbyxuLHIpLGsuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5yZWxlYXNlKG8pfWZ1bmN0aW9uIHUoZSx0LG4pe2ZvcihULnVubW91bnRDb21wb25lbnQoZSxuKSx0Lm5vZGVUeXBlPT09QSYmKHQ9dC5kb2N1bWVudEVsZW1lbnQpO3QubGFzdENoaWxkOyl0LnJlbW92ZUNoaWxkKHQubGFzdENoaWxkKX1mdW5jdGlvbiBsKGUpe3ZhciB0PW8oZSk7aWYodCl7dmFyIG49eS5nZXRJbnN0YW5jZUZyb21Ob2RlKHQpO3JldHVybiEoIW58fCFuLl9ob3N0UGFyZW50KX19ZnVuY3Rpb24gYyhlKXtyZXR1cm4hKCFlfHxlLm5vZGVUeXBlIT09UiYmZS5ub2RlVHlwZSE9PUEmJmUubm9kZVR5cGUhPT1EKX1mdW5jdGlvbiBwKGUpe3ZhciB0PW8oZSksbj10JiZ5LmdldEluc3RhbmNlRnJvbU5vZGUodCk7cmV0dXJuIG4mJiFuLl9ob3N0UGFyZW50P246bnVsbH1mdW5jdGlvbiBkKGUpe3ZhciB0PXAoZSk7cmV0dXJuIHQ/dC5faG9zdENvbnRhaW5lckluZm8uX3RvcExldmVsV3JhcHBlcjpudWxsfXZhciBmPWUoMTEyKSxoPWUoOSksbT1lKDExKSx2PWUoMTIwKSxnPWUoMjUpLHk9KGUoMTE5KSxlKDMzKSksXz1lKDM0KSxDPWUoMzYpLGI9ZSg1MyksRT1lKDU3KSx4PShlKDU4KSxlKDU5KSksVD1lKDY2KSx3PWUoNzApLGs9ZSg3MSksUD1lKDEzMCksUz1lKDEwOCksTj0oZSgxMzcpLGUoMTE0KSksTT1lKDExNiksTz0oZSgxNDIpLG0uSURfQVRUUklCVVRFX05BTUUpLEk9bS5ST09UX0FUVFJJQlVURV9OQU1FLFI9MSxBPTksRD0xMSxMPXt9LFU9MSxGPWZ1bmN0aW9uKCl7dGhpcy5yb290SUQ9VSsrfTtGLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9LEYucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3BzLmNoaWxkfSxGLmlzUmVhY3RUb3BMZXZlbFdyYXBwZXI9ITA7dmFyIFY9e1RvcExldmVsV3JhcHBlcjpGLF9pbnN0YW5jZXNCeVJlYWN0Um9vdElEOkwsc2Nyb2xsTW9uaXRvcjpmdW5jdGlvbihlLHQpe3QoKX0sX3VwZGF0ZVJvb3RDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4scixvKXtyZXR1cm4gVi5zY3JvbGxNb25pdG9yKHIsZnVuY3Rpb24oKXt3LmVucXVldWVFbGVtZW50SW50ZXJuYWwoZSx0LG4pLG8mJncuZW5xdWV1ZUNhbGxiYWNrSW50ZXJuYWwoZSxvKX0pLGV9LF9yZW5kZXJOZXdSb290Q29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLHIpe2ModCl8fGYoIjM3IiksZy5lbnN1cmVTY3JvbGxWYWx1ZU1vbml0b3JpbmcoKTt2YXIgbz1TKGUsITEpO2suYmF0Y2hlZFVwZGF0ZXMocyxvLHQsbixyKTt2YXIgYT1vLl9pbnN0YW5jZS5yb290SUQ7cmV0dXJuIExbYV09byxvfSxyZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbnVsbCE9ZSYmRS5oYXMoZSl8fGYoIjM4IiksVi5fcmVuZGVyU3VidHJlZUludG9Db250YWluZXIoZSx0LG4scil9LF9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjpmdW5jdGlvbihlLHQsbixyKXt3LnZhbGlkYXRlQ2FsbGJhY2sociwiUmVhY3RET00ucmVuZGVyIiksdi5pc1ZhbGlkRWxlbWVudCh0KXx8ZigiMzkiLCJzdHJpbmciPT10eXBlb2YgdD8iIEluc3RlYWQgb2YgcGFzc2luZyBhIHN0cmluZyBsaWtlICdkaXYnLCBwYXNzIFJlYWN0LmNyZWF0ZUVsZW1lbnQoJ2RpdicpIG9yIDxkaXYgLz4uIjoiZnVuY3Rpb24iPT10eXBlb2YgdD8iIEluc3RlYWQgb2YgcGFzc2luZyBhIGNsYXNzIGxpa2UgRm9vLCBwYXNzIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRm9vKSBvciA8Rm9vIC8+LiI6bnVsbCE9dCYmdm9pZCAwIT09dC5wcm9wcz8iIFRoaXMgbWF5IGJlIGNhdXNlZCBieSB1bmludGVudGlvbmFsbHkgbG9hZGluZyB0d28gaW5kZXBlbmRlbnQgY29waWVzIG9mIFJlYWN0LiI6IiIpO3ZhciBpLHM9di5jcmVhdGVFbGVtZW50KEYse2NoaWxkOnR9KTtpZihlKXt2YXIgdT1FLmdldChlKTtpPXUuX3Byb2Nlc3NDaGlsZENvbnRleHQodS5fY29udGV4dCl9ZWxzZSBpPVA7dmFyIGM9ZChuKTtpZihjKXt2YXIgcD1jLl9jdXJyZW50RWxlbWVudCxoPXAucHJvcHMuY2hpbGQ7aWYoTShoLHQpKXt2YXIgbT1jLl9yZW5kZXJlZENvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpLGc9ciYmZnVuY3Rpb24oKXtyLmNhbGwobSl9O3JldHVybiBWLl91cGRhdGVSb290Q29tcG9uZW50KGMscyxpLG4sZyksbX1WLnVubW91bnRDb21wb25lbnRBdE5vZGUobil9dmFyIHk9byhuKSxfPXkmJiEhYSh5KSxDPWwobiksYj1fJiYhYyYmIUMseD1WLl9yZW5kZXJOZXdSb290Q29tcG9uZW50KHMsbixiLGkpLl9yZW5kZXJlZENvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpO3JldHVybiByJiZyLmNhbGwoeCkseH0scmVuZGVyOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gVi5fcmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCxlLHQsbil9LHVubW91bnRDb21wb25lbnRBdE5vZGU6ZnVuY3Rpb24oZSl7YyhlKXx8ZigiNDAiKTt2YXIgdD1kKGUpO3JldHVybiB0PyhkZWxldGUgTFt0Ll9pbnN0YW5jZS5yb290SURdLGsuYmF0Y2hlZFVwZGF0ZXModSx0LGUsITEpLCEwKToobChlKSwxPT09ZS5ub2RlVHlwZSYmZS5oYXNBdHRyaWJ1dGUoSSksITEpfSxfbW91bnRJbWFnZUludG9Ob2RlOmZ1bmN0aW9uKGUsdCxuLGEsaSl7aWYoYyh0KXx8ZigiNDEiKSxhKXt2YXIgcz1vKHQpO2lmKHguY2FuUmV1c2VNYXJrdXAoZSxzKSlyZXR1cm4gdm9pZCB5LnByZWNhY2hlTm9kZShuLHMpO3ZhciB1PXMuZ2V0QXR0cmlidXRlKHguQ0hFQ0tTVU1fQVRUUl9OQU1FKTtzLnJlbW92ZUF0dHJpYnV0ZSh4LkNIRUNLU1VNX0FUVFJfTkFNRSk7dmFyIGw9cy5vdXRlckhUTUw7cy5zZXRBdHRyaWJ1dGUoeC5DSEVDS1NVTV9BVFRSX05BTUUsdSk7dmFyIHA9ZSxkPXIocCxsKSxtPSIgKGNsaWVudCkgIitwLnN1YnN0cmluZyhkLTIwLGQrMjApKyJcbiAoc2VydmVyKSAiK2wuc3Vic3RyaW5nKGQtMjAsZCsyMCk7dC5ub2RlVHlwZT09PUEmJmYoIjQyIixtKX1pZih0Lm5vZGVUeXBlPT09QSYmZigiNDMiKSxpLnVzZUNyZWF0ZUVsZW1lbnQpe2Zvcig7dC5sYXN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5sYXN0Q2hpbGQpO2guaW5zZXJ0VHJlZUJlZm9yZSh0LGUsbnVsbCl9ZWxzZSBOKHQsZSkseS5wcmVjYWNoZU5vZGUobix0LmZpcnN0Q2hpbGQpfX07dC5leHBvcnRzPVZ9LHsxMDg6MTA4LDExOjExLDExMjoxMTIsMTE0OjExNCwxMTY6MTE2LDExOToxMTksMTIwOjEyMCwxMzA6MTMwLDEzNzoxMzcsMTQyOjE0MiwyNToyNSwzMzozMywzNDozNCwzNjozNiw1Mzo1Myw1Nzo1Nyw1ODo1OCw1OTo1OSw2Njo2Niw3MDo3MCw3MTo3MSw5Ojl9XSw2MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuKXtyZXR1cm57dHlwZToiSU5TRVJUX01BUktVUCIsY29udGVudDplLGZyb21JbmRleDpudWxsLGZyb21Ob2RlOm51bGwsdG9JbmRleDpuLGFmdGVyTm9kZTp0fX1mdW5jdGlvbiBvKGUsdCxuKXtyZXR1cm57dHlwZToiTU9WRV9FWElTVElORyIsY29udGVudDpudWxsLGZyb21JbmRleDplLl9tb3VudEluZGV4LGZyb21Ob2RlOmQuZ2V0SG9zdE5vZGUoZSksdG9JbmRleDpuLGFmdGVyTm9kZTp0fX1mdW5jdGlvbiBhKGUsdCl7cmV0dXJue3R5cGU6IlJFTU9WRV9OT0RFIixjb250ZW50Om51bGwsZnJvbUluZGV4OmUuX21vdW50SW5kZXgsZnJvbU5vZGU6dCx0b0luZGV4Om51bGwsYWZ0ZXJOb2RlOm51bGx9fWZ1bmN0aW9uIGkoZSl7cmV0dXJue3R5cGU6IlNFVF9NQVJLVVAiLGNvbnRlbnQ6ZSxmcm9tSW5kZXg6bnVsbCxmcm9tTm9kZTpudWxsLHRvSW5kZXg6bnVsbCxhZnRlck5vZGU6bnVsbH19ZnVuY3Rpb24gcyhlKXtyZXR1cm57dHlwZToiVEVYVF9DT05URU5UIixjb250ZW50OmUsZnJvbUluZGV4Om51bGwsZnJvbU5vZGU6bnVsbCx0b0luZGV4Om51bGwsYWZ0ZXJOb2RlOm51bGx9fWZ1bmN0aW9uIHUoZSx0KXtyZXR1cm4gdCYmKGU9ZXx8W10sZS5wdXNoKHQpKSxlfWZ1bmN0aW9uIGwoZSx0KXtwLnByb2Nlc3NDaGlsZHJlblVwZGF0ZXMoZSx0KX12YXIgYz1lKDExMikscD1lKDI4KSxkPShlKDU3KSxlKDU4KSxlKDExOSksZSg2NikpLGY9ZSgyNiksaD0oZSgxMjkpLGUoOTcpKSxtPShlKDEzNykse01peGluOntfcmVjb25jaWxlckluc3RhbnRpYXRlQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmLmluc3RhbnRpYXRlQ2hpbGRyZW4oZSx0LG4pfSxfcmVjb25jaWxlclVwZGF0ZUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuLHIsbyxhKXt2YXIgaTtyZXR1cm4gaT1oKHQsMCksZi51cGRhdGVDaGlsZHJlbihlLGksbixyLG8sdGhpcyx0aGlzLl9ob3N0Q29udGFpbmVySW5mbyxhLDApLGl9LG1vdW50Q2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX3JlY29uY2lsZXJJbnN0YW50aWF0ZUNoaWxkcmVuKGUsdCxuKTt0aGlzLl9yZW5kZXJlZENoaWxkcmVuPXI7dmFyIG89W10sYT0wO2Zvcih2YXIgaSBpbiByKWlmKHIuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBzPXJbaV0sdT1kLm1vdW50Q29tcG9uZW50KHMsdCx0aGlzLHRoaXMuX2hvc3RDb250YWluZXJJbmZvLG4sMCk7cy5fbW91bnRJbmRleD1hKyssby5wdXNoKHUpfXJldHVybiBvfSx1cGRhdGVUZXh0Q29udGVudDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9yZW5kZXJlZENoaWxkcmVuO2YudW5tb3VudENoaWxkcmVuKHQsITEpO2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJmMoIjExOCIpO2wodGhpcyxbcyhlKV0pfSx1cGRhdGVNYXJrdXA6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtmLnVubW91bnRDaGlsZHJlbih0LCExKTtmb3IodmFyIG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiZjKCIxMTgiKTtsKHRoaXMsW2koZSldKX0sdXBkYXRlQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4pe3RoaXMuX3VwZGF0ZUNoaWxkcmVuKGUsdCxuKX0sX3VwZGF0ZUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLl9yZW5kZXJlZENoaWxkcmVuLG89e30sYT1bXSxpPXRoaXMuX3JlY29uY2lsZXJVcGRhdGVDaGlsZHJlbihyLGUsYSxvLHQsbik7aWYoaXx8cil7dmFyIHMsYz1udWxsLHA9MCxmPTAsaD0wLG09bnVsbDtmb3IocyBpbiBpKWlmKGkuaGFzT3duUHJvcGVydHkocykpe3ZhciB2PXImJnJbc10sZz1pW3NdO3Y9PT1nPyhjPXUoYyx0aGlzLm1vdmVDaGlsZCh2LG0scCxmKSksZj1NYXRoLm1heCh2Ll9tb3VudEluZGV4LGYpLHYuX21vdW50SW5kZXg9cCk6KHYmJihmPU1hdGgubWF4KHYuX21vdW50SW5kZXgsZikpLGM9dShjLHRoaXMuX21vdW50Q2hpbGRBdEluZGV4KGcsYVtoXSxtLHAsdCxuKSksaCsrKSxwKyssbT1kLmdldEhvc3ROb2RlKGcpfWZvcihzIGluIG8pby5oYXNPd25Qcm9wZXJ0eShzKSYmKGM9dShjLHRoaXMuX3VubW91bnRDaGlsZChyW3NdLG9bc10pKSk7YyYmbCh0aGlzLGMpLHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW49aX19LHVubW91bnRDaGlsZHJlbjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9yZW5kZXJlZENoaWxkcmVuO2YudW5tb3VudENoaWxkcmVuKHQsZSksdGhpcy5fcmVuZGVyZWRDaGlsZHJlbj1udWxsfSxtb3ZlQ2hpbGQ6ZnVuY3Rpb24oZSx0LG4scil7aWYoZS5fbW91bnRJbmRleDxyKXJldHVybiBvKGUsdCxuKX0sY3JlYXRlQ2hpbGQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByKG4sdCxlLl9tb3VudEluZGV4KX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYShlLHQpfSxfbW91bnRDaGlsZEF0SW5kZXg6ZnVuY3Rpb24oZSx0LG4scixvLGEpe3JldHVybiBlLl9tb3VudEluZGV4PXIsdGhpcy5jcmVhdGVDaGlsZChlLG4sdCl9LF91bm1vdW50Q2hpbGQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnJlbW92ZUNoaWxkKGUsdCk7cmV0dXJuIGUuX21vdW50SW5kZXg9bnVsbCxufX19KTt0LmV4cG9ydHM9bX0sezExMjoxMTIsMTE5OjExOSwxMjk6MTI5LDEzNzoxMzcsMjY6MjYsMjg6MjgsNTc6NTcsNTg6NTgsNjY6NjYsOTc6OTd9XSw2MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDExMiksbz1lKDEyMCksYT0oZSgxMzcpLHtIT1NUOjAsQ09NUE9TSVRFOjEsRU1QVFk6MixnZXRUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZXx8ITE9PT1lP2EuRU1QVFk6by5pc1ZhbGlkRWxlbWVudChlKT8iZnVuY3Rpb24iPT10eXBlb2YgZS50eXBlP2EuQ09NUE9TSVRFOmEuSE9TVDp2b2lkIHIoIjI2IixlKX19KTt0LmV4cG9ydHM9YX0sezExMjoxMTIsMTIwOjEyMCwxMzc6MTM3fV0sNjM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4hKCFlfHwiZnVuY3Rpb24iIT10eXBlb2YgZS5hdHRhY2hSZWZ8fCJmdW5jdGlvbiIhPXR5cGVvZiBlLmRldGFjaFJlZil9dmFyIG89ZSgxMTIpLGE9KGUoMTM3KSx7YWRkQ29tcG9uZW50QXNSZWZUbzpmdW5jdGlvbihlLHQsbil7cihuKXx8bygiMTE5Iiksbi5hdHRhY2hSZWYodCxlKX0scmVtb3ZlQ29tcG9uZW50QXNSZWZGcm9tOmZ1bmN0aW9uKGUsdCxuKXtyKG4pfHxvKCIxMjAiKTt2YXIgYT1uLmdldFB1YmxpY0luc3RhbmNlKCk7YSYmYS5yZWZzW3RdPT09ZS5nZXRQdWJsaWNJbnN0YW5jZSgpJiZuLmRldGFjaFJlZih0KX19KTt0LmV4cG9ydHM9YX0sezExMjoxMTIsMTM3OjEzN31dLDY0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz0iU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQifSx7fV0sNjU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt0aGlzLnJlaW5pdGlhbGl6ZVRyYW5zYWN0aW9uKCksdGhpcy5yZW5kZXJUb1N0YXRpY01hcmt1cD0hMSx0aGlzLnJlYWN0TW91bnRSZWFkeT1hLmdldFBvb2xlZChudWxsKSx0aGlzLnVzZUNyZWF0ZUVsZW1lbnQ9ZX12YXIgbz1lKDE0MyksYT1lKDYpLGk9ZSgyNCkscz1lKDI1KSx1PWUoNTYpLGw9KGUoNTgpLGUoODkpKSxjPWUoNzApLHA9e2luaXRpYWxpemU6dS5nZXRTZWxlY3Rpb25JbmZvcm1hdGlvbixjbG9zZTp1LnJlc3RvcmVTZWxlY3Rpb259LGQ9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt2YXIgZT1zLmlzRW5hYmxlZCgpO3JldHVybiBzLnNldEVuYWJsZWQoITEpLGV9LGNsb3NlOmZ1bmN0aW9uKGUpe3Muc2V0RW5hYmxlZChlKX19LGY9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt0aGlzLnJlYWN0TW91bnRSZWFkeS5yZXNldCgpfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMucmVhY3RNb3VudFJlYWR5Lm5vdGlmeUFsbCgpfX0saD1bcCxkLGZdLG09e2dldFRyYW5zYWN0aW9uV3JhcHBlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gaH0sZ2V0UmVhY3RNb3VudFJlYWR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhY3RNb3VudFJlYWR5fSxnZXRVcGRhdGVRdWV1ZTpmdW5jdGlvbigpe3JldHVybiBjfSxjaGVja3BvaW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhY3RNb3VudFJlYWR5LmNoZWNrcG9pbnQoKX0scm9sbGJhY2s6ZnVuY3Rpb24oZSl7dGhpcy5yZWFjdE1vdW50UmVhZHkucm9sbGJhY2soZSl9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXthLnJlbGVhc2UodGhpcy5yZWFjdE1vdW50UmVhZHkpLHRoaXMucmVhY3RNb3VudFJlYWR5PW51bGx9fTtvKHIucHJvdG90eXBlLGwsbSksaS5hZGRQb29saW5nVG8ociksdC5leHBvcnRzPXJ9LHsxNDM6MTQzLDI0OjI0LDI1OjI1LDU2OjU2LDU4OjU4LDY6Niw3MDo3MCw4OTo4OX1dLDY2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXtvLmF0dGFjaFJlZnModGhpcyx0aGlzLl9jdXJyZW50RWxlbWVudCl9dmFyIG89ZSg2NyksYT0oZSg1OCksZSgxNDIpLHttb3VudENvbXBvbmVudDpmdW5jdGlvbihlLHQsbixvLGEsaSl7dmFyIHM9ZS5tb3VudENvbXBvbmVudCh0LG4sbyxhLGkpO3JldHVybiBlLl9jdXJyZW50RWxlbWVudCYmbnVsbCE9ZS5fY3VycmVudEVsZW1lbnQucmVmJiZ0LmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUocixlKSxzfSxnZXRIb3N0Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRIb3N0Tm9kZSgpfSx1bm1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGUsdCl7by5kZXRhY2hSZWZzKGUsZS5fY3VycmVudEVsZW1lbnQpLGUudW5tb3VudENvbXBvbmVudCh0KX0scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQsbixhKXt2YXIgaT1lLl9jdXJyZW50RWxlbWVudDtpZih0IT09aXx8YSE9PWUuX2NvbnRleHQpe3ZhciBzPW8uc2hvdWxkVXBkYXRlUmVmcyhpLHQpO3MmJm8uZGV0YWNoUmVmcyhlLGkpLGUucmVjZWl2ZUNvbXBvbmVudCh0LG4sYSkscyYmZS5fY3VycmVudEVsZW1lbnQmJm51bGwhPWUuX2N1cnJlbnRFbGVtZW50LnJlZiYmbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHIsZSl9fSxwZXJmb3JtVXBkYXRlSWZOZWNlc3Nhcnk6ZnVuY3Rpb24oZSx0LG4pe2UuX3VwZGF0ZUJhdGNoTnVtYmVyPT09biYmZS5wZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkodCl9fSk7dC5leHBvcnRzPWF9LHsxNDI6MTQyLDU4OjU4LDY3OjY3fV0sNjc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbil7ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZSh0LmdldFB1YmxpY0luc3RhbmNlKCkpOmEuYWRkQ29tcG9uZW50QXNSZWZUbyh0LGUsbil9ZnVuY3Rpb24gbyhlLHQsbil7ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZShudWxsKTphLnJlbW92ZUNvbXBvbmVudEFzUmVmRnJvbSh0LGUsbil9dmFyIGE9ZSg2MyksaT17fTtpLmF0dGFjaFJlZnM9ZnVuY3Rpb24oZSx0KXtpZihudWxsIT09dCYmIm9iamVjdCI9PXR5cGVvZiB0KXt2YXIgbj10LnJlZjtudWxsIT1uJiZyKG4sZSx0Ll9vd25lcil9fSxpLnNob3VsZFVwZGF0ZVJlZnM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsLHI9bnVsbDtudWxsIT09ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYobj1lLnJlZixyPWUuX293bmVyKTt2YXIgbz1udWxsLGE9bnVsbDtyZXR1cm4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdCYmKG89dC5yZWYsYT10Ll9vd25lciksbiE9PW98fCJzdHJpbmciPT10eXBlb2YgbyYmYSE9PXJ9LGkuZGV0YWNoUmVmcz1mdW5jdGlvbihlLHQpe2lmKG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHQpe3ZhciBuPXQucmVmO251bGwhPW4mJm8obixlLHQuX293bmVyKX19LHQuZXhwb3J0cz1pfSx7NjM6NjN9XSw2ODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3RoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKSx0aGlzLnJlbmRlclRvU3RhdGljTWFya3VwPWUsdGhpcy51c2VDcmVhdGVFbGVtZW50PSExLHRoaXMudXBkYXRlUXVldWU9bmV3IHModGhpcyl9dmFyIG89ZSgxNDMpLGE9ZSgyNCksaT1lKDg5KSxzPShlKDU4KSxlKDY5KSksdT1bXSxsPXtlbnF1ZXVlOmZ1bmN0aW9uKCl7fX0sYz17Z2V0VHJhbnNhY3Rpb25XcmFwcGVyczpmdW5jdGlvbigpe3JldHVybiB1fSxnZXRSZWFjdE1vdW50UmVhZHk6ZnVuY3Rpb24oKXtyZXR1cm4gbH0sZ2V0VXBkYXRlUXVldWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51cGRhdGVRdWV1ZX0sZGVzdHJ1Y3RvcjpmdW5jdGlvbigpe30sY2hlY2twb2ludDpmdW5jdGlvbigpe30scm9sbGJhY2s6ZnVuY3Rpb24oKXt9fTtvKHIucHJvdG90eXBlLGksYyksYS5hZGRQb29saW5nVG8ociksdC5leHBvcnRzPXJ9LHsxNDM6MTQzLDI0OjI0LDU4OjU4LDY5OjY5LDg5Ojg5fV0sNjk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfXZhciBvPWUoNzApLGE9KGUoMTQyKSxmdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7cih0aGlzLGUpLHRoaXMudHJhbnNhY3Rpb249dH1yZXR1cm4gZS5wcm90b3R5cGUuaXNNb3VudGVkPWZ1bmN0aW9uKGUpe3JldHVybiExfSxlLnByb3RvdHlwZS5lbnF1ZXVlQ2FsbGJhY2s9ZnVuY3Rpb24oZSx0LG4pe3RoaXMudHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0aW9uKCkmJm8uZW5xdWV1ZUNhbGxiYWNrKGUsdCxuKX0sZS5wcm90b3R5cGUuZW5xdWV1ZUZvcmNlVXBkYXRlPWZ1bmN0aW9uKGUpe3RoaXMudHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0aW9uKCkmJm8uZW5xdWV1ZUZvcmNlVXBkYXRlKGUpfSxlLnByb3RvdHlwZS5lbnF1ZXVlUmVwbGFjZVN0YXRlPWZ1bmN0aW9uKGUsdCl7dGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNhY3Rpb24oKSYmby5lbnF1ZXVlUmVwbGFjZVN0YXRlKGUsdCl9LGUucHJvdG90eXBlLmVucXVldWVTZXRTdGF0ZT1mdW5jdGlvbihlLHQpe3RoaXMudHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0aW9uKCkmJm8uZW5xdWV1ZVNldFN0YXRlKGUsdCl9LGV9KCkpO3QuZXhwb3J0cz1hfSx7MTQyOjE0Miw3MDo3MH1dLDcwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dS5lbnF1ZXVlVXBkYXRlKGUpfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9dHlwZW9mIGU7aWYoIm9iamVjdCIhPT10KXJldHVybiB0O3ZhciBuPWUuY29uc3RydWN0b3ImJmUuY29uc3RydWN0b3IubmFtZXx8dCxyPU9iamVjdC5rZXlzKGUpO3JldHVybiByLmxlbmd0aD4wJiZyLmxlbmd0aDwyMD9uKyIgKGtleXM6ICIrci5qb2luKCIsICIpKyIpIjpufWZ1bmN0aW9uIGEoZSx0KXt2YXIgbj1zLmdldChlKTtyZXR1cm4gbnx8bnVsbH12YXIgaT1lKDExMikscz0oZSgxMTkpLGUoNTcpKSx1PShlKDU4KSxlKDcxKSksbD0oZSgxMzcpLGUoMTQyKSx7aXNNb3VudGVkOmZ1bmN0aW9uKGUpe3ZhciB0PXMuZ2V0KGUpO3JldHVybiEhdCYmISF0Ll9yZW5kZXJlZENvbXBvbmVudH0sZW5xdWV1ZUNhbGxiYWNrOmZ1bmN0aW9uKGUsdCxuKXtsLnZhbGlkYXRlQ2FsbGJhY2sodCxuKTt2YXIgbz1hKGUpO2lmKCFvKXJldHVybiBudWxsO28uX3BlbmRpbmdDYWxsYmFja3M/by5fcGVuZGluZ0NhbGxiYWNrcy5wdXNoKHQpOm8uX3BlbmRpbmdDYWxsYmFja3M9W3RdLHIobyl9LGVucXVldWVDYWxsYmFja0ludGVybmFsOmZ1bmN0aW9uKGUsdCl7ZS5fcGVuZGluZ0NhbGxiYWNrcz9lLl9wZW5kaW5nQ2FsbGJhY2tzLnB1c2godCk6ZS5fcGVuZGluZ0NhbGxiYWNrcz1bdF0scihlKX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKGUpe3ZhciB0PWEoZSwiZm9yY2VVcGRhdGUiKTt0JiYodC5fcGVuZGluZ0ZvcmNlVXBkYXRlPSEwLHIodCkpfSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1hKGUsInJlcGxhY2VTdGF0ZSIpO28mJihvLl9wZW5kaW5nU3RhdGVRdWV1ZT1bdF0sby5fcGVuZGluZ1JlcGxhY2VTdGF0ZT0hMCx2b2lkIDAhPT1uJiZudWxsIT09biYmKGwudmFsaWRhdGVDYWxsYmFjayhuLCJyZXBsYWNlU3RhdGUiKSxvLl9wZW5kaW5nQ2FsbGJhY2tzP28uX3BlbmRpbmdDYWxsYmFja3MucHVzaChuKTpvLl9wZW5kaW5nQ2FsbGJhY2tzPVtuXSkscihvKSl9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbihlLHQpe3ZhciBuPWEoZSwic2V0U3RhdGUiKTtuJiYoKG4uX3BlbmRpbmdTdGF0ZVF1ZXVlfHwobi5fcGVuZGluZ1N0YXRlUXVldWU9W10pKS5wdXNoKHQpLHIobikpfSxlbnF1ZXVlRWxlbWVudEludGVybmFsOmZ1bmN0aW9uKGUsdCxuKXtlLl9wZW5kaW5nRWxlbWVudD10LGUuX2NvbnRleHQ9bixyKGUpfSx2YWxpZGF0ZUNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUmJmkoIjEyMiIsdCxvKGUpKX19KTt0LmV4cG9ydHM9bH0sezExMjoxMTIsMTE5OjExOSwxMzc6MTM3LDE0MjoxNDIsNTc6NTcsNTg6NTgsNzE6NzF9XSw3MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7UC5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uJiZifHxjKCIxMjMiKX1mdW5jdGlvbiBvKCl7dGhpcy5yZWluaXRpYWxpemVUcmFuc2FjdGlvbigpLHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoPW51bGwsdGhpcy5jYWxsYmFja1F1ZXVlPWQuZ2V0UG9vbGVkKCksdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbj1QLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uZ2V0UG9vbGVkKCEwKX1mdW5jdGlvbiBhKGUsdCxuLG8sYSxpKXtyZXR1cm4gcigpLGIuYmF0Y2hlZFVwZGF0ZXMoZSx0LG4sbyxhLGkpfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4gZS5fbW91bnRPcmRlci10Ll9tb3VudE9yZGVyfWZ1bmN0aW9uIHMoZSl7dmFyIHQ9ZS5kaXJ0eUNvbXBvbmVudHNMZW5ndGg7dCE9PWcubGVuZ3RoJiZjKCIxMjQiLHQsZy5sZW5ndGgpLGcuc29ydChpKSx5Kys7Zm9yKHZhciBuPTA7bjx0O24rKyl7dmFyIHI9Z1tuXSxvPXIuX3BlbmRpbmdDYWxsYmFja3M7ci5fcGVuZGluZ0NhbGxiYWNrcz1udWxsO3ZhciBhO2lmKGgubG9nVG9wTGV2ZWxSZW5kZXJzKXt2YXIgcz1yO3IuX2N1cnJlbnRFbGVtZW50LnR5cGUuaXNSZWFjdFRvcExldmVsV3JhcHBlciYmKHM9ci5fcmVuZGVyZWRDb21wb25lbnQpLGE9IlJlYWN0IHVwZGF0ZTogIitzLmdldE5hbWUoKSxjb25zb2xlLnRpbWUoYSl9aWYobS5wZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkocixlLnJlY29uY2lsZVRyYW5zYWN0aW9uLHkpLGEmJmNvbnNvbGUudGltZUVuZChhKSxvKWZvcih2YXIgdT0wO3U8by5sZW5ndGg7dSsrKWUuY2FsbGJhY2tRdWV1ZS5lbnF1ZXVlKG9bdV0sci5nZXRQdWJsaWNJbnN0YW5jZSgpKX19ZnVuY3Rpb24gdShlKXtpZihyKCksIWIuaXNCYXRjaGluZ1VwZGF0ZXMpcmV0dXJuIHZvaWQgYi5iYXRjaGVkVXBkYXRlcyh1LGUpO2cucHVzaChlKSxudWxsPT1lLl91cGRhdGVCYXRjaE51bWJlciYmKGUuX3VwZGF0ZUJhdGNoTnVtYmVyPXkrMSl9ZnVuY3Rpb24gbChlLHQpe2IuaXNCYXRjaGluZ1VwZGF0ZXN8fGMoIjEyNSIpLF8uZW5xdWV1ZShlLHQpLEM9ITB9dmFyIGM9ZSgxMTIpLHA9ZSgxNDMpLGQ9ZSg2KSxmPWUoMjQpLGg9ZSg1MyksbT1lKDY2KSx2PWUoODkpLGc9KGUoMTM3KSxbXSkseT0wLF89ZC5nZXRQb29sZWQoKSxDPSExLGI9bnVsbCxFPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGg9Zy5sZW5ndGh9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGghPT1nLmxlbmd0aD8oZy5zcGxpY2UoMCx0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0aCksdygpKTpnLmxlbmd0aD0wfX0seD17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMuY2FsbGJhY2tRdWV1ZS5yZXNldCgpfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuY2FsbGJhY2tRdWV1ZS5ub3RpZnlBbGwoKX19LFQ9W0UseF07cChvLnByb3RvdHlwZSx2LHtnZXRUcmFuc2FjdGlvbldyYXBwZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIFR9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0aD1udWxsLGQucmVsZWFzZSh0aGlzLmNhbGxiYWNrUXVldWUpLHRoaXMuY2FsbGJhY2tRdWV1ZT1udWxsLFAuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5yZWxlYXNlKHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb24pLHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb249bnVsbH0scGVyZm9ybTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHYucGVyZm9ybS5jYWxsKHRoaXMsdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbi5wZXJmb3JtLHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb24sZSx0LG4pfX0pLGYuYWRkUG9vbGluZ1RvKG8pO3ZhciB3PWZ1bmN0aW9uKCl7Zm9yKDtnLmxlbmd0aHx8Qzspe2lmKGcubGVuZ3RoKXt2YXIgZT1vLmdldFBvb2xlZCgpO2UucGVyZm9ybShzLG51bGwsZSksby5yZWxlYXNlKGUpfWlmKEMpe0M9ITE7dmFyIHQ9XztfPWQuZ2V0UG9vbGVkKCksdC5ub3RpZnlBbGwoKSxkLnJlbGVhc2UodCl9fX0saz17aW5qZWN0UmVjb25jaWxlVHJhbnNhY3Rpb246ZnVuY3Rpb24oZSl7ZXx8YygiMTI2IiksUC5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uPWV9LGluamVjdEJhdGNoaW5nU3RyYXRlZ3k6ZnVuY3Rpb24oZSl7ZXx8YygiMTI3IiksImZ1bmN0aW9uIiE9dHlwZW9mIGUuYmF0Y2hlZFVwZGF0ZXMmJmMoIjEyOCIpLCJib29sZWFuIiE9dHlwZW9mIGUuaXNCYXRjaGluZ1VwZGF0ZXMmJmMoIjEyOSIpLGI9ZX19LFA9e1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb246bnVsbCxiYXRjaGVkVXBkYXRlczphLGVucXVldWVVcGRhdGU6dSxmbHVzaEJhdGNoZWRVcGRhdGVzOncsaW5qZWN0aW9uOmssYXNhcDpsfTt0LmV4cG9ydHM9UH0sezExMjoxMTIsMTM3OjEzNywxNDM6MTQzLDI0OjI0LDUzOjUzLDY6Niw2Njo2Niw4OTo4OX1dLDcyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz0iMTUuNS4wIn0se31dLDczOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXt4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UifSxvPXthY2NlbnRIZWlnaHQ6ImFjY2VudC1oZWlnaHQiLGFjY3VtdWxhdGU6MCxhZGRpdGl2ZTowLGFsaWdubWVudEJhc2VsaW5lOiJhbGlnbm1lbnQtYmFzZWxpbmUiLGFsbG93UmVvcmRlcjoiYWxsb3dSZW9yZGVyIixhbHBoYWJldGljOjAsYW1wbGl0dWRlOjAsYXJhYmljRm9ybToiYXJhYmljLWZvcm0iLGFzY2VudDowLGF0dHJpYnV0ZU5hbWU6ImF0dHJpYnV0ZU5hbWUiLGF0dHJpYnV0ZVR5cGU6ImF0dHJpYnV0ZVR5cGUiLGF1dG9SZXZlcnNlOiJhdXRvUmV2ZXJzZSIsYXppbXV0aDowLGJhc2VGcmVxdWVuY3k6ImJhc2VGcmVxdWVuY3kiLGJhc2VQcm9maWxlOiJiYXNlUHJvZmlsZSIsYmFzZWxpbmVTaGlmdDoiYmFzZWxpbmUtc2hpZnQiLGJib3g6MCxiZWdpbjowLGJpYXM6MCxieTowLGNhbGNNb2RlOiJjYWxjTW9kZSIsY2FwSGVpZ2h0OiJjYXAtaGVpZ2h0IixjbGlwOjAsY2xpcFBhdGg6ImNsaXAtcGF0aCIsY2xpcFJ1bGU6ImNsaXAtcnVsZSIsY2xpcFBhdGhVbml0czoiY2xpcFBhdGhVbml0cyIsY29sb3JJbnRlcnBvbGF0aW9uOiJjb2xvci1pbnRlcnBvbGF0aW9uIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMiLGNvbG9yUHJvZmlsZToiY29sb3ItcHJvZmlsZSIsY29sb3JSZW5kZXJpbmc6ImNvbG9yLXJlbmRlcmluZyIsY29udGVudFNjcmlwdFR5cGU6ImNvbnRlbnRTY3JpcHRUeXBlIixjb250ZW50U3R5bGVUeXBlOiJjb250ZW50U3R5bGVUeXBlIixjdXJzb3I6MCxjeDowLGN5OjAsZDowLGRlY2VsZXJhdGU6MCxkZXNjZW50OjAsZGlmZnVzZUNvbnN0YW50OiJkaWZmdXNlQ29uc3RhbnQiLGRpcmVjdGlvbjowLGRpc3BsYXk6MCxkaXZpc29yOjAsZG9taW5hbnRCYXNlbGluZToiZG9taW5hbnQtYmFzZWxpbmUiLGR1cjowLGR4OjAsZHk6MCxlZGdlTW9kZToiZWRnZU1vZGUiLGVsZXZhdGlvbjowLGVuYWJsZUJhY2tncm91bmQ6ImVuYWJsZS1iYWNrZ3JvdW5kIixlbmQ6MCxleHBvbmVudDowLGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQ6ImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiLGZpbGw6MCxmaWxsT3BhY2l0eToiZmlsbC1vcGFjaXR5IixmaWxsUnVsZToiZmlsbC1ydWxlIixmaWx0ZXI6MCxmaWx0ZXJSZXM6ImZpbHRlclJlcyIsZmlsdGVyVW5pdHM6ImZpbHRlclVuaXRzIixmbG9vZENvbG9yOiJmbG9vZC1jb2xvciIsZmxvb2RPcGFjaXR5OiJmbG9vZC1vcGFjaXR5Iixmb2N1c2FibGU6MCxmb250RmFtaWx5OiJmb250LWZhbWlseSIsZm9udFNpemU6ImZvbnQtc2l6ZSIsZm9udFNpemVBZGp1c3Q6ImZvbnQtc2l6ZS1hZGp1c3QiLGZvbnRTdHJldGNoOiJmb250LXN0cmV0Y2giLGZvbnRTdHlsZToiZm9udC1zdHlsZSIsZm9udFZhcmlhbnQ6ImZvbnQtdmFyaWFudCIsZm9udFdlaWdodDoiZm9udC13ZWlnaHQiLGZvcm1hdDowLGZyb206MCxmeDowLGZ5OjAsZzE6MCxnMjowLGdseXBoTmFtZToiZ2x5cGgtbmFtZSIsZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWw6ImdseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwiLGdseXBoT3JpZW50YXRpb25WZXJ0aWNhbDoiZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwiLGdseXBoUmVmOiJnbHlwaFJlZiIsZ3JhZGllbnRUcmFuc2Zvcm06ImdyYWRpZW50VHJhbnNmb3JtIixncmFkaWVudFVuaXRzOiJncmFkaWVudFVuaXRzIixoYW5naW5nOjAsaG9yaXpBZHZYOiJob3Jpei1hZHYteCIsaG9yaXpPcmlnaW5YOiJob3Jpei1vcmlnaW4teCIsaWRlb2dyYXBoaWM6MCxpbWFnZVJlbmRlcmluZzoiaW1hZ2UtcmVuZGVyaW5nIixpbjowLGluMjowLGludGVyY2VwdDowLGs6MCxrMTowLGsyOjAsazM6MCxrNDowLGtlcm5lbE1hdHJpeDoia2VybmVsTWF0cml4IixrZXJuZWxVbml0TGVuZ3RoOiJrZXJuZWxVbml0TGVuZ3RoIixrZXJuaW5nOjAsa2V5UG9pbnRzOiJrZXlQb2ludHMiLGtleVNwbGluZXM6ImtleVNwbGluZXMiLGtleVRpbWVzOiJrZXlUaW1lcyIsbGVuZ3RoQWRqdXN0OiJsZW5ndGhBZGp1c3QiLGxldHRlclNwYWNpbmc6ImxldHRlci1zcGFjaW5nIixsaWdodGluZ0NvbG9yOiJsaWdodGluZy1jb2xvciIsbGltaXRpbmdDb25lQW5nbGU6ImxpbWl0aW5nQ29uZUFuZ2xlIixsb2NhbDowLG1hcmtlckVuZDoibWFya2VyLWVuZCIsbWFya2VyTWlkOiJtYXJrZXItbWlkIixtYXJrZXJTdGFydDoibWFya2VyLXN0YXJ0IixtYXJrZXJIZWlnaHQ6Im1hcmtlckhlaWdodCIsbWFya2VyVW5pdHM6Im1hcmtlclVuaXRzIixtYXJrZXJXaWR0aDoibWFya2VyV2lkdGgiLG1hc2s6MCxtYXNrQ29udGVudFVuaXRzOiJtYXNrQ29udGVudFVuaXRzIixtYXNrVW5pdHM6Im1hc2tVbml0cyIsbWF0aGVtYXRpY2FsOjAsbW9kZTowLG51bU9jdGF2ZXM6Im51bU9jdGF2ZXMiLG9mZnNldDowLG9wYWNpdHk6MCxvcGVyYXRvcjowLG9yZGVyOjAsb3JpZW50OjAsb3JpZW50YXRpb246MCxvcmlnaW46MCxvdmVyZmxvdzowLG92ZXJsaW5lUG9zaXRpb246Im92ZXJsaW5lLXBvc2l0aW9uIixvdmVybGluZVRoaWNrbmVzczoib3ZlcmxpbmUtdGhpY2tuZXNzIixwYWludE9yZGVyOiJwYWludC1vcmRlciIscGFub3NlMToicGFub3NlLTEiLHBhdGhMZW5ndGg6InBhdGhMZW5ndGgiLHBhdHRlcm5Db250ZW50VW5pdHM6InBhdHRlcm5Db250ZW50VW5pdHMiLHBhdHRlcm5UcmFuc2Zvcm06InBhdHRlcm5UcmFuc2Zvcm0iLHBhdHRlcm5Vbml0czoicGF0dGVyblVuaXRzIixwb2ludGVyRXZlbnRzOiJwb2ludGVyLWV2ZW50cyIscG9pbnRzOjAscG9pbnRzQXRYOiJwb2ludHNBdFgiLHBvaW50c0F0WToicG9pbnRzQXRZIixwb2ludHNBdFo6InBvaW50c0F0WiIscHJlc2VydmVBbHBoYToicHJlc2VydmVBbHBoYSIscHJlc2VydmVBc3BlY3RSYXRpbzoicHJlc2VydmVBc3BlY3RSYXRpbyIscHJpbWl0aXZlVW5pdHM6InByaW1pdGl2ZVVuaXRzIixyOjAscmFkaXVzOjAscmVmWDoicmVmWCIscmVmWToicmVmWSIscmVuZGVyaW5nSW50ZW50OiJyZW5kZXJpbmctaW50ZW50IixyZXBlYXRDb3VudDoicmVwZWF0Q291bnQiLHJlcGVhdER1cjoicmVwZWF0RHVyIixyZXF1aXJlZEV4dGVuc2lvbnM6InJlcXVpcmVkRXh0ZW5zaW9ucyIscmVxdWlyZWRGZWF0dXJlczoicmVxdWlyZWRGZWF0dXJlcyIscmVzdGFydDowLHJlc3VsdDowLHJvdGF0ZTowLHJ4OjAscnk6MCxzY2FsZTowLHNlZWQ6MCxzaGFwZVJlbmRlcmluZzoic2hhcGUtcmVuZGVyaW5nIixzbG9wZTowLHNwYWNpbmc6MCxzcGVjdWxhckNvbnN0YW50OiJzcGVjdWxhckNvbnN0YW50IixzcGVjdWxhckV4cG9uZW50OiJzcGVjdWxhckV4cG9uZW50IixzcGVlZDowLHNwcmVhZE1ldGhvZDoic3ByZWFkTWV0aG9kIixzdGFydE9mZnNldDoic3RhcnRPZmZzZXQiLHN0ZERldmlhdGlvbjoic3RkRGV2aWF0aW9uIixzdGVtaDowLHN0ZW12OjAsc3RpdGNoVGlsZXM6InN0aXRjaFRpbGVzIixzdG9wQ29sb3I6InN0b3AtY29sb3IiLHN0b3BPcGFjaXR5OiJzdG9wLW9wYWNpdHkiLHN0cmlrZXRocm91Z2hQb3NpdGlvbjoic3RyaWtldGhyb3VnaC1wb3NpdGlvbiIsc3RyaWtldGhyb3VnaFRoaWNrbmVzczoic3RyaWtldGhyb3VnaC10aGlja25lc3MiLHN0cmluZzowLHN0cm9rZTowLHN0cm9rZURhc2hhcnJheToic3Ryb2tlLWRhc2hhcnJheSIsc3Ryb2tlRGFzaG9mZnNldDoic3Ryb2tlLWRhc2hvZmZzZXQiLHN0cm9rZUxpbmVjYXA6InN0cm9rZS1saW5lY2FwIixzdHJva2VMaW5lam9pbjoic3Ryb2tlLWxpbmVqb2luIixzdHJva2VNaXRlcmxpbWl0OiJzdHJva2UtbWl0ZXJsaW1pdCIsc3Ryb2tlT3BhY2l0eToic3Ryb2tlLW9wYWNpdHkiLHN0cm9rZVdpZHRoOiJzdHJva2Utd2lkdGgiLHN1cmZhY2VTY2FsZToic3VyZmFjZVNjYWxlIixzeXN0ZW1MYW5ndWFnZToic3lzdGVtTGFuZ3VhZ2UiLHRhYmxlVmFsdWVzOiJ0YWJsZVZhbHVlcyIsdGFyZ2V0WDoidGFyZ2V0WCIsdGFyZ2V0WToidGFyZ2V0WSIsdGV4dEFuY2hvcjoidGV4dC1hbmNob3IiLHRleHREZWNvcmF0aW9uOiJ0ZXh0LWRlY29yYXRpb24iLHRleHRSZW5kZXJpbmc6InRleHQtcmVuZGVyaW5nIix0ZXh0TGVuZ3RoOiJ0ZXh0TGVuZ3RoIix0bzowLHRyYW5zZm9ybTowLHUxOjAsdTI6MCx1bmRlcmxpbmVQb3NpdGlvbjoidW5kZXJsaW5lLXBvc2l0aW9uIix1bmRlcmxpbmVUaGlja25lc3M6InVuZGVybGluZS10aGlja25lc3MiLHVuaWNvZGU6MCx1bmljb2RlQmlkaToidW5pY29kZS1iaWRpIix1bmljb2RlUmFuZ2U6InVuaWNvZGUtcmFuZ2UiLHVuaXRzUGVyRW06InVuaXRzLXBlci1lbSIsdkFscGhhYmV0aWM6InYtYWxwaGFiZXRpYyIsdkhhbmdpbmc6InYtaGFuZ2luZyIsdklkZW9ncmFwaGljOiJ2LWlkZW9ncmFwaGljIix2TWF0aGVtYXRpY2FsOiJ2LW1hdGhlbWF0aWNhbCIsdmFsdWVzOjAsdmVjdG9yRWZmZWN0OiJ2ZWN0b3ItZWZmZWN0Iix2ZXJzaW9uOjAsdmVydEFkdlk6InZlcnQtYWR2LXkiLHZlcnRPcmlnaW5YOiJ2ZXJ0LW9yaWdpbi14Iix2ZXJ0T3JpZ2luWToidmVydC1vcmlnaW4teSIsdmlld0JveDoidmlld0JveCIsdmlld1RhcmdldDoidmlld1RhcmdldCIsdmlzaWJpbGl0eTowLHdpZHRoczowLHdvcmRTcGFjaW5nOiJ3b3JkLXNwYWNpbmciLHdyaXRpbmdNb2RlOiJ3cml0aW5nLW1vZGUiLHg6MCx4SGVpZ2h0OiJ4LWhlaWdodCIseDE6MCx4MjowLHhDaGFubmVsU2VsZWN0b3I6InhDaGFubmVsU2VsZWN0b3IiLHhsaW5rQWN0dWF0ZToieGxpbms6YWN0dWF0ZSIseGxpbmtBcmNyb2xlOiJ4bGluazphcmNyb2xlIix4bGlua0hyZWY6InhsaW5rOmhyZWYiLHhsaW5rUm9sZToieGxpbms6cm9sZSIseGxpbmtTaG93OiJ4bGluazpzaG93Iix4bGlua1RpdGxlOiJ4bGluazp0aXRsZSIseGxpbmtUeXBlOiJ4bGluazp0eXBlIix4bWxCYXNlOiJ4bWw6YmFzZSIseG1sbnM6MCx4bWxuc1hsaW5rOiJ4bWxuczp4bGluayIseG1sTGFuZzoieG1sOmxhbmciLHhtbFNwYWNlOiJ4bWw6c3BhY2UiLHk6MCx5MTowLHkyOjAseUNoYW5uZWxTZWxlY3RvcjoieUNoYW5uZWxTZWxlY3RvciIsejowLHpvb21BbmRQYW46Inpvb21BbmRQYW4ifSxhPXtQcm9wZXJ0aWVzOnt9LERPTUF0dHJpYnV0ZU5hbWVzcGFjZXM6e3hsaW5rQWN0dWF0ZTpyLnhsaW5rLHhsaW5rQXJjcm9sZTpyLnhsaW5rLHhsaW5rSHJlZjpyLnhsaW5rLHhsaW5rUm9sZTpyLnhsaW5rLHhsaW5rU2hvdzpyLnhsaW5rLHhsaW5rVGl0bGU6ci54bGluayx4bGlua1R5cGU6ci54bGluayx4bWxCYXNlOnIueG1sLHhtbExhbmc6ci54bWwseG1sU3BhY2U6ci54bWx9LERPTUF0dHJpYnV0ZU5hbWVzOnt9fTtPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2EuUHJvcGVydGllc1tlXT0wLG9bZV0mJihhLkRPTUF0dHJpYnV0ZU5hbWVzW2VdPW9bZV0pfSksdC5leHBvcnRzPWF9LHt9XSw3NDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2lmKCJzZWxlY3Rpb25TdGFydCJpbiBlJiZ1Lmhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhlKSlyZXR1cm57c3RhcnQ6ZS5zZWxlY3Rpb25TdGFydCxlbmQ6ZS5zZWxlY3Rpb25FbmR9O2lmKHdpbmRvdy5nZXRTZWxlY3Rpb24pe3ZhciB0PXdpbmRvdy5nZXRTZWxlY3Rpb24oKTtyZXR1cm57YW5jaG9yTm9kZTp0LmFuY2hvck5vZGUsYW5jaG9yT2Zmc2V0OnQuYW5jaG9yT2Zmc2V0LGZvY3VzTm9kZTp0LmZvY3VzTm9kZSxmb2N1c09mZnNldDp0LmZvY3VzT2Zmc2V0fX1pZihkb2N1bWVudC5zZWxlY3Rpb24pe3ZhciBuPWRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO3JldHVybntwYXJlbnRFbGVtZW50Om4ucGFyZW50RWxlbWVudCgpLHRleHQ6bi50ZXh0LHRvcDpuLmJvdW5kaW5nVG9wLGxlZnQ6bi5ib3VuZGluZ0xlZnR9fX1mdW5jdGlvbiBvKGUsdCl7aWYoeXx8bnVsbD09bXx8bSE9PWMoKSlyZXR1cm4gbnVsbDt2YXIgbj1yKG0pO2lmKCFnfHwhZChnLG4pKXtnPW47dmFyIG89bC5nZXRQb29sZWQoaC5zZWxlY3QsdixlLHQpO3JldHVybiBvLnR5cGU9InNlbGVjdCIsby50YXJnZXQ9bSxhLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMobyksb31yZXR1cm4gbnVsbH12YXIgYT1lKDE5KSxpPWUoMTIzKSxzPWUoMzMpLHU9ZSg1NiksbD1lKDgwKSxjPWUoMTMyKSxwPWUoMTEwKSxkPWUoMTQxKSxmPWkuY2FuVXNlRE9NJiYiZG9jdW1lbnRNb2RlImluIGRvY3VtZW50JiZkb2N1bWVudC5kb2N1bWVudE1vZGU8PTExLGg9e3NlbGVjdDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Im9uU2VsZWN0IixjYXB0dXJlZDoib25TZWxlY3RDYXB0dXJlIn0sZGVwZW5kZW5jaWVzOlsidG9wQmx1ciIsInRvcENvbnRleHRNZW51IiwidG9wRm9jdXMiLCJ0b3BLZXlEb3duIiwidG9wS2V5VXAiLCJ0b3BNb3VzZURvd24iLCJ0b3BNb3VzZVVwIiwidG9wU2VsZWN0aW9uQ2hhbmdlIl19fSxtPW51bGwsdj1udWxsLGc9bnVsbCx5PSExLF89ITEsQz17ZXZlbnRUeXBlczpoLGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24oZSx0LG4scil7aWYoIV8pcmV0dXJuIG51bGw7dmFyIGE9dD9zLmdldE5vZGVGcm9tSW5zdGFuY2UodCk6d2luZG93O3N3aXRjaChlKXtjYXNlInRvcEZvY3VzIjoocChhKXx8InRydWUiPT09YS5jb250ZW50RWRpdGFibGUpJiYobT1hLHY9dCxnPW51bGwpO2JyZWFrDQo7Y2FzZSJ0b3BCbHVyIjptPW51bGwsdj1udWxsLGc9bnVsbDticmVhaztjYXNlInRvcE1vdXNlRG93biI6eT0hMDticmVhaztjYXNlInRvcENvbnRleHRNZW51IjpjYXNlInRvcE1vdXNlVXAiOnJldHVybiB5PSExLG8obixyKTtjYXNlInRvcFNlbGVjdGlvbkNoYW5nZSI6aWYoZilicmVhaztjYXNlInRvcEtleURvd24iOmNhc2UidG9wS2V5VXAiOnJldHVybiBvKG4scil9cmV0dXJuIG51bGx9LGRpZFB1dExpc3RlbmVyOmZ1bmN0aW9uKGUsdCxuKXsib25TZWxlY3QiPT09dCYmKF89ITApfX07dC5leHBvcnRzPUN9LHsxMTA6MTEwLDEyMzoxMjMsMTMyOjEzMiwxNDE6MTQxLDE5OjE5LDMzOjMzLDU2OjU2LDgwOjgwfV0sNzU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4iLiIrZS5fcm9vdE5vZGVJRH1mdW5jdGlvbiBvKGUpe3JldHVybiJidXR0b24iPT09ZXx8ImlucHV0Ij09PWV8fCJzZWxlY3QiPT09ZXx8InRleHRhcmVhIj09PWV9dmFyIGE9ZSgxMTIpLGk9ZSgxMjIpLHM9ZSgxOSksdT1lKDMzKSxsPWUoNzYpLGM9ZSg3NykscD1lKDgwKSxkPWUoODEpLGY9ZSg4MyksaD1lKDg0KSxtPWUoNzkpLHY9ZSg4NSksZz1lKDg2KSx5PWUoODcpLF89ZSg4OCksQz1lKDEyOSksYj1lKDk5KSxFPShlKDEzNykse30pLHg9e307WyJhYm9ydCIsImFuaW1hdGlvbkVuZCIsImFuaW1hdGlvbkl0ZXJhdGlvbiIsImFuaW1hdGlvblN0YXJ0IiwiYmx1ciIsImNhblBsYXkiLCJjYW5QbGF5VGhyb3VnaCIsImNsaWNrIiwiY29udGV4dE1lbnUiLCJjb3B5IiwiY3V0IiwiZG91YmxlQ2xpY2siLCJkcmFnIiwiZHJhZ0VuZCIsImRyYWdFbnRlciIsImRyYWdFeGl0IiwiZHJhZ0xlYXZlIiwiZHJhZ092ZXIiLCJkcmFnU3RhcnQiLCJkcm9wIiwiZHVyYXRpb25DaGFuZ2UiLCJlbXB0aWVkIiwiZW5jcnlwdGVkIiwiZW5kZWQiLCJlcnJvciIsImZvY3VzIiwiaW5wdXQiLCJpbnZhbGlkIiwia2V5RG93biIsImtleVByZXNzIiwia2V5VXAiLCJsb2FkIiwibG9hZGVkRGF0YSIsImxvYWRlZE1ldGFkYXRhIiwibG9hZFN0YXJ0IiwibW91c2VEb3duIiwibW91c2VNb3ZlIiwibW91c2VPdXQiLCJtb3VzZU92ZXIiLCJtb3VzZVVwIiwicGFzdGUiLCJwYXVzZSIsInBsYXkiLCJwbGF5aW5nIiwicHJvZ3Jlc3MiLCJyYXRlQ2hhbmdlIiwicmVzZXQiLCJzY3JvbGwiLCJzZWVrZWQiLCJzZWVraW5nIiwic3RhbGxlZCIsInN1Ym1pdCIsInN1c3BlbmQiLCJ0aW1lVXBkYXRlIiwidG91Y2hDYW5jZWwiLCJ0b3VjaEVuZCIsInRvdWNoTW92ZSIsInRvdWNoU3RhcnQiLCJ0cmFuc2l0aW9uRW5kIiwidm9sdW1lQ2hhbmdlIiwid2FpdGluZyIsIndoZWVsIl0uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxuPSJvbiIrdCxyPSJ0b3AiK3Qsbz17cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6bixjYXB0dXJlZDpuKyJDYXB0dXJlIn0sZGVwZW5kZW5jaWVzOltyXX07RVtlXT1vLHhbcl09b30pO3ZhciBUPXt9LHc9e2V2ZW50VHlwZXM6RSxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXhbZV07aWYoIW8pcmV0dXJuIG51bGw7dmFyIGk7c3dpdGNoKGUpe2Nhc2UidG9wQWJvcnQiOmNhc2UidG9wQ2FuUGxheSI6Y2FzZSJ0b3BDYW5QbGF5VGhyb3VnaCI6Y2FzZSJ0b3BEdXJhdGlvbkNoYW5nZSI6Y2FzZSJ0b3BFbXB0aWVkIjpjYXNlInRvcEVuY3J5cHRlZCI6Y2FzZSJ0b3BFbmRlZCI6Y2FzZSJ0b3BFcnJvciI6Y2FzZSJ0b3BJbnB1dCI6Y2FzZSJ0b3BJbnZhbGlkIjpjYXNlInRvcExvYWQiOmNhc2UidG9wTG9hZGVkRGF0YSI6Y2FzZSJ0b3BMb2FkZWRNZXRhZGF0YSI6Y2FzZSJ0b3BMb2FkU3RhcnQiOmNhc2UidG9wUGF1c2UiOmNhc2UidG9wUGxheSI6Y2FzZSJ0b3BQbGF5aW5nIjpjYXNlInRvcFByb2dyZXNzIjpjYXNlInRvcFJhdGVDaGFuZ2UiOmNhc2UidG9wUmVzZXQiOmNhc2UidG9wU2Vla2VkIjpjYXNlInRvcFNlZWtpbmciOmNhc2UidG9wU3RhbGxlZCI6Y2FzZSJ0b3BTdWJtaXQiOmNhc2UidG9wU3VzcGVuZCI6Y2FzZSJ0b3BUaW1lVXBkYXRlIjpjYXNlInRvcFZvbHVtZUNoYW5nZSI6Y2FzZSJ0b3BXYWl0aW5nIjppPXA7YnJlYWs7Y2FzZSJ0b3BLZXlQcmVzcyI6aWYoMD09PWIobikpcmV0dXJuIG51bGw7Y2FzZSJ0b3BLZXlEb3duIjpjYXNlInRvcEtleVVwIjppPWY7YnJlYWs7Y2FzZSJ0b3BCbHVyIjpjYXNlInRvcEZvY3VzIjppPWQ7YnJlYWs7Y2FzZSJ0b3BDbGljayI6aWYoMj09PW4uYnV0dG9uKXJldHVybiBudWxsO2Nhc2UidG9wRG91YmxlQ2xpY2siOmNhc2UidG9wTW91c2VEb3duIjpjYXNlInRvcE1vdXNlTW92ZSI6Y2FzZSJ0b3BNb3VzZVVwIjpjYXNlInRvcE1vdXNlT3V0IjpjYXNlInRvcE1vdXNlT3ZlciI6Y2FzZSJ0b3BDb250ZXh0TWVudSI6aT1oO2JyZWFrO2Nhc2UidG9wRHJhZyI6Y2FzZSJ0b3BEcmFnRW5kIjpjYXNlInRvcERyYWdFbnRlciI6Y2FzZSJ0b3BEcmFnRXhpdCI6Y2FzZSJ0b3BEcmFnTGVhdmUiOmNhc2UidG9wRHJhZ092ZXIiOmNhc2UidG9wRHJhZ1N0YXJ0IjpjYXNlInRvcERyb3AiOmk9bTticmVhaztjYXNlInRvcFRvdWNoQ2FuY2VsIjpjYXNlInRvcFRvdWNoRW5kIjpjYXNlInRvcFRvdWNoTW92ZSI6Y2FzZSJ0b3BUb3VjaFN0YXJ0IjppPXY7YnJlYWs7Y2FzZSJ0b3BBbmltYXRpb25FbmQiOmNhc2UidG9wQW5pbWF0aW9uSXRlcmF0aW9uIjpjYXNlInRvcEFuaW1hdGlvblN0YXJ0IjppPWw7YnJlYWs7Y2FzZSJ0b3BUcmFuc2l0aW9uRW5kIjppPWc7YnJlYWs7Y2FzZSJ0b3BTY3JvbGwiOmk9eTticmVhaztjYXNlInRvcFdoZWVsIjppPV87YnJlYWs7Y2FzZSJ0b3BDb3B5IjpjYXNlInRvcEN1dCI6Y2FzZSJ0b3BQYXN0ZSI6aT1jfWl8fGEoIjg2IixlKTt2YXIgdT1pLmdldFBvb2xlZChvLHQsbixyKTtyZXR1cm4gcy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKHUpLHV9LGRpZFB1dExpc3RlbmVyOmZ1bmN0aW9uKGUsdCxuKXtpZigib25DbGljayI9PT10JiYhbyhlLl90YWcpKXt2YXIgYT1yKGUpLHM9dS5nZXROb2RlRnJvbUluc3RhbmNlKGUpO1RbYV18fChUW2FdPWkubGlzdGVuKHMsImNsaWNrIixDKSl9fSx3aWxsRGVsZXRlTGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXtpZigib25DbGljayI9PT10JiYhbyhlLl90YWcpKXt2YXIgbj1yKGUpO1Rbbl0ucmVtb3ZlKCksZGVsZXRlIFRbbl19fX07dC5leHBvcnRzPXd9LHsxMTI6MTEyLDEyMjoxMjIsMTI5OjEyOSwxMzc6MTM3LDE5OjE5LDMzOjMzLDc2Ojc2LDc3Ojc3LDc5Ojc5LDgwOjgwLDgxOjgxLDgzOjgzLDg0Ojg0LDg1Ojg1LDg2Ojg2LDg3Ojg3LDg4Ojg4LDk5Ojk5fV0sNzY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1cm4gby5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89ZSg4MCksYT17YW5pbWF0aW9uTmFtZTpudWxsLGVsYXBzZWRUaW1lOm51bGwscHNldWRvRWxlbWVudDpudWxsfTtvLmF1Z21lbnRDbGFzcyhyLGEpLHQuZXhwb3J0cz1yfSx7ODA6ODB9XSw3NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDgwKSxhPXtjbGlwYm9hcmREYXRhOmZ1bmN0aW9uKGUpe3JldHVybiJjbGlwYm9hcmREYXRhImluIGU/ZS5jbGlwYm9hcmREYXRhOndpbmRvdy5jbGlwYm9hcmREYXRhfX07by5hdWdtZW50Q2xhc3MocixhKSx0LmV4cG9ydHM9cn0sezgwOjgwfV0sNzg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1cm4gby5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89ZSg4MCksYT17ZGF0YTpudWxsfTtvLmF1Z21lbnRDbGFzcyhyLGEpLHQuZXhwb3J0cz1yfSx7ODA6ODB9XSw3OTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDg0KSxhPXtkYXRhVHJhbnNmZXI6bnVsbH07by5hdWdtZW50Q2xhc3MocixhKSx0LmV4cG9ydHM9cn0sezg0Ojg0fV0sODA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXt0aGlzLmRpc3BhdGNoQ29uZmlnPWUsdGhpcy5fdGFyZ2V0SW5zdD10LHRoaXMubmF0aXZlRXZlbnQ9bjt2YXIgbz10aGlzLmNvbnN0cnVjdG9yLkludGVyZmFjZTtmb3IodmFyIGEgaW4gbylpZihvLmhhc093blByb3BlcnR5KGEpKXt2YXIgcz1vW2FdO3M/dGhpc1thXT1zKG4pOiJ0YXJnZXQiPT09YT90aGlzLnRhcmdldD1yOnRoaXNbYV09blthXX12YXIgdT1udWxsIT1uLmRlZmF1bHRQcmV2ZW50ZWQ/bi5kZWZhdWx0UHJldmVudGVkOiExPT09bi5yZXR1cm5WYWx1ZTtyZXR1cm4gdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9dT9pLnRoYXRSZXR1cm5zVHJ1ZTppLnRoYXRSZXR1cm5zRmFsc2UsdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1pLnRoYXRSZXR1cm5zRmFsc2UsdGhpc312YXIgbz1lKDE0MyksYT1lKDI0KSxpPWUoMTI5KSxzPShlKDE0MiksWyJkaXNwYXRjaENvbmZpZyIsIl90YXJnZXRJbnN0IiwibmF0aXZlRXZlbnQiLCJpc0RlZmF1bHRQcmV2ZW50ZWQiLCJpc1Byb3BhZ2F0aW9uU3RvcHBlZCIsIl9kaXNwYXRjaExpc3RlbmVycyIsIl9kaXNwYXRjaEluc3RhbmNlcyJdKSx1PXt0eXBlOm51bGwsdGFyZ2V0Om51bGwsY3VycmVudFRhcmdldDppLnRoYXRSZXR1cm5zTnVsbCxldmVudFBoYXNlOm51bGwsYnViYmxlczpudWxsLGNhbmNlbGFibGU6bnVsbCx0aW1lU3RhbXA6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGltZVN0YW1wfHxEYXRlLm5vdygpfSxkZWZhdWx0UHJldmVudGVkOm51bGwsaXNUcnVzdGVkOm51bGx9O28oci5wcm90b3R5cGUse3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwO3ZhciBlPXRoaXMubmF0aXZlRXZlbnQ7ZSYmKGUucHJldmVudERlZmF1bHQ/ZS5wcmV2ZW50RGVmYXVsdCgpOiJ1bmtub3duIiE9dHlwZW9mIGUucmV0dXJuVmFsdWUmJihlLnJldHVyblZhbHVlPSExKSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1pLnRoYXRSZXR1cm5zVHJ1ZSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMubmF0aXZlRXZlbnQ7ZSYmKGUuc3RvcFByb3BhZ2F0aW9uP2Uuc3RvcFByb3BhZ2F0aW9uKCk6InVua25vd24iIT10eXBlb2YgZS5jYW5jZWxCdWJibGUmJihlLmNhbmNlbEJ1YmJsZT0hMCksdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1pLnRoYXRSZXR1cm5zVHJ1ZSl9LHBlcnNpc3Q6ZnVuY3Rpb24oKXt0aGlzLmlzUGVyc2lzdGVudD1pLnRoYXRSZXR1cm5zVHJ1ZX0saXNQZXJzaXN0ZW50OmkudGhhdFJldHVybnNGYWxzZSxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5jb25zdHJ1Y3Rvci5JbnRlcmZhY2U7Zm9yKHZhciB0IGluIGUpdGhpc1t0XT1udWxsO2Zvcih2YXIgbj0wO248cy5sZW5ndGg7bisrKXRoaXNbc1tuXV09bnVsbH19KSxyLkludGVyZmFjZT11LHIuYXVnbWVudENsYXNzPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxyPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1uLnByb3RvdHlwZTt2YXIgaT1uZXcgcjtvKGksZS5wcm90b3R5cGUpLGUucHJvdG90eXBlPWksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLkludGVyZmFjZT1vKHt9LG4uSW50ZXJmYWNlLHQpLGUuYXVnbWVudENsYXNzPW4uYXVnbWVudENsYXNzLGEuYWRkUG9vbGluZ1RvKGUsYS5mb3VyQXJndW1lbnRQb29sZXIpfSxhLmFkZFBvb2xpbmdUbyhyLGEuZm91ckFyZ3VtZW50UG9vbGVyKSx0LmV4cG9ydHM9cn0sezEyOToxMjksMTQyOjE0MiwxNDM6MTQzLDI0OjI0fV0sODE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1cm4gby5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89ZSg4NyksYT17cmVsYXRlZFRhcmdldDpudWxsfTtvLmF1Z21lbnRDbGFzcyhyLGEpLHQuZXhwb3J0cz1yfSx7ODc6ODd9XSw4MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDgwKSxhPXtkYXRhOm51bGx9O28uYXVnbWVudENsYXNzKHIsYSksdC5leHBvcnRzPXJ9LHs4MDo4MH1dLDgzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoODcpLGE9ZSg5OSksaT1lKDEwMCkscz1lKDEwMSksdT17a2V5OmksbG9jYXRpb246bnVsbCxjdHJsS2V5Om51bGwsc2hpZnRLZXk6bnVsbCxhbHRLZXk6bnVsbCxtZXRhS2V5Om51bGwscmVwZWF0Om51bGwsbG9jYWxlOm51bGwsZ2V0TW9kaWZpZXJTdGF0ZTpzLGNoYXJDb2RlOmZ1bmN0aW9uKGUpe3JldHVybiJrZXlwcmVzcyI9PT1lLnR5cGU/YShlKTowfSxrZXlDb2RlOmZ1bmN0aW9uKGUpe3JldHVybiJrZXlkb3duIj09PWUudHlwZXx8ImtleXVwIj09PWUudHlwZT9lLmtleUNvZGU6MH0sd2hpY2g6ZnVuY3Rpb24oZSl7cmV0dXJuImtleXByZXNzIj09PWUudHlwZT9hKGUpOiJrZXlkb3duIj09PWUudHlwZXx8ImtleXVwIj09PWUudHlwZT9lLmtleUNvZGU6MH19O28uYXVnbWVudENsYXNzKHIsdSksdC5leHBvcnRzPXJ9LHsxMDA6MTAwLDEwMToxMDEsODc6ODcsOTk6OTl9XSw4NDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDg3KSxhPWUoOTApLGk9ZSgxMDEpLHM9e3NjcmVlblg6bnVsbCxzY3JlZW5ZOm51bGwsY2xpZW50WDpudWxsLGNsaWVudFk6bnVsbCxjdHJsS2V5Om51bGwsc2hpZnRLZXk6bnVsbCxhbHRLZXk6bnVsbCxtZXRhS2V5Om51bGwsZ2V0TW9kaWZpZXJTdGF0ZTppLGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLmJ1dHRvbjtyZXR1cm4id2hpY2giaW4gZT90OjI9PT10PzI6ND09PXQ/MTowfSxidXR0b25zOm51bGwscmVsYXRlZFRhcmdldDpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWxhdGVkVGFyZ2V0fHwoZS5mcm9tRWxlbWVudD09PWUuc3JjRWxlbWVudD9lLnRvRWxlbWVudDplLmZyb21FbGVtZW50KX0scGFnZVg6ZnVuY3Rpb24oZSl7cmV0dXJuInBhZ2VYImluIGU/ZS5wYWdlWDplLmNsaWVudFgrYS5jdXJyZW50U2Nyb2xsTGVmdH0scGFnZVk6ZnVuY3Rpb24oZSl7cmV0dXJuInBhZ2VZImluIGU/ZS5wYWdlWTplLmNsaWVudFkrYS5jdXJyZW50U2Nyb2xsVG9wfX07by5hdWdtZW50Q2xhc3MocixzKSx0LmV4cG9ydHM9cn0sezEwMToxMDEsODc6ODcsOTA6OTB9XSw4NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDg3KSxhPWUoMTAxKSxpPXt0b3VjaGVzOm51bGwsdGFyZ2V0VG91Y2hlczpudWxsLGNoYW5nZWRUb3VjaGVzOm51bGwsYWx0S2V5Om51bGwsbWV0YUtleTpudWxsLGN0cmxLZXk6bnVsbCxzaGlmdEtleTpudWxsLGdldE1vZGlmaWVyU3RhdGU6YX07by5hdWdtZW50Q2xhc3MocixpKSx0LmV4cG9ydHM9cn0sezEwMToxMDEsODc6ODd9XSw4NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDgwKSxhPXtwcm9wZXJ0eU5hbWU6bnVsbCxlbGFwc2VkVGltZTpudWxsLHBzZXVkb0VsZW1lbnQ6bnVsbH07by5hdWdtZW50Q2xhc3MocixhKSx0LmV4cG9ydHM9cn0sezgwOjgwfV0sODc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1cm4gby5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89ZSg4MCksYT1lKDEwMiksaT17dmlldzpmdW5jdGlvbihlKXtpZihlLnZpZXcpcmV0dXJuIGUudmlldzt2YXIgdD1hKGUpO2lmKHQud2luZG93PT09dClyZXR1cm4gdDt2YXIgbj10Lm93bmVyRG9jdW1lbnQ7cmV0dXJuIG4/bi5kZWZhdWx0Vmlld3x8bi5wYXJlbnRXaW5kb3c6d2luZG93fSxkZXRhaWw6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGV0YWlsfHwwfX07by5hdWdtZW50Q2xhc3MocixpKSx0LmV4cG9ydHM9cn0sezEwMjoxMDIsODA6ODB9XSw4ODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDg0KSxhPXtkZWx0YVg6ZnVuY3Rpb24oZSl7cmV0dXJuImRlbHRhWCJpbiBlP2UuZGVsdGFYOiJ3aGVlbERlbHRhWCJpbiBlPy1lLndoZWVsRGVsdGFYOjB9LGRlbHRhWTpmdW5jdGlvbihlKXtyZXR1cm4iZGVsdGFZImluIGU/ZS5kZWx0YVk6IndoZWVsRGVsdGFZImluIGU/LWUud2hlZWxEZWx0YVk6IndoZWVsRGVsdGEiaW4gZT8tZS53aGVlbERlbHRhOjB9LGRlbHRhWjpudWxsLGRlbHRhTW9kZTpudWxsfTtvLmF1Z21lbnRDbGFzcyhyLGEpLHQuZXhwb3J0cz1yfSx7ODQ6ODR9XSw4OTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDExMiksbz0oZSgxMzcpLHt9KSxhPXtyZWluaXRpYWxpemVUcmFuc2FjdGlvbjpmdW5jdGlvbigpe3RoaXMudHJhbnNhY3Rpb25XcmFwcGVycz10aGlzLmdldFRyYW5zYWN0aW9uV3JhcHBlcnMoKSx0aGlzLndyYXBwZXJJbml0RGF0YT90aGlzLndyYXBwZXJJbml0RGF0YS5sZW5ndGg9MDp0aGlzLndyYXBwZXJJbml0RGF0YT1bXSx0aGlzLl9pc0luVHJhbnNhY3Rpb249ITF9LF9pc0luVHJhbnNhY3Rpb246ITEsZ2V0VHJhbnNhY3Rpb25XcmFwcGVyczpudWxsLGlzSW5UcmFuc2FjdGlvbjpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5faXNJblRyYW5zYWN0aW9ufSxwZXJmb3JtOmZ1bmN0aW9uKGUsdCxuLG8sYSxpLHMsdSl7dGhpcy5pc0luVHJhbnNhY3Rpb24oKSYmcigiMjciKTt2YXIgbCxjO3RyeXt0aGlzLl9pc0luVHJhbnNhY3Rpb249ITAsbD0hMCx0aGlzLmluaXRpYWxpemVBbGwoMCksYz1lLmNhbGwodCxuLG8sYSxpLHMsdSksbD0hMX1maW5hbGx5e3RyeXtpZihsKXRyeXt0aGlzLmNsb3NlQWxsKDApfWNhdGNoKGUpe31lbHNlIHRoaXMuY2xvc2VBbGwoMCl9ZmluYWxseXt0aGlzLl9pc0luVHJhbnNhY3Rpb249ITF9fXJldHVybiBjfSxpbml0aWFsaXplQWxsOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLnRyYW5zYWN0aW9uV3JhcHBlcnMsbj1lO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3RyeXt0aGlzLndyYXBwZXJJbml0RGF0YVtuXT1vLHRoaXMud3JhcHBlckluaXREYXRhW25dPXIuaW5pdGlhbGl6ZT9yLmluaXRpYWxpemUuY2FsbCh0aGlzKTpudWxsfWZpbmFsbHl7aWYodGhpcy53cmFwcGVySW5pdERhdGFbbl09PT1vKXRyeXt0aGlzLmluaXRpYWxpemVBbGwobisxKX1jYXRjaChlKXt9fX19LGNsb3NlQWxsOmZ1bmN0aW9uKGUpe3RoaXMuaXNJblRyYW5zYWN0aW9uKCl8fHIoIjI4Iik7Zm9yKHZhciB0PXRoaXMudHJhbnNhY3Rpb25XcmFwcGVycyxuPWU7bjx0Lmxlbmd0aDtuKyspe3ZhciBhLGk9dFtuXSxzPXRoaXMud3JhcHBlckluaXREYXRhW25dO3RyeXthPSEwLHMhPT1vJiZpLmNsb3NlJiZpLmNsb3NlLmNhbGwodGhpcyxzKSxhPSExfWZpbmFsbHl7aWYoYSl0cnl7dGhpcy5jbG9zZUFsbChuKzEpfWNhdGNoKGUpe319fXRoaXMud3JhcHBlckluaXREYXRhLmxlbmd0aD0wfX07dC5leHBvcnRzPWF9LHsxMTI6MTEyLDEzNzoxMzd9XSw5MDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17Y3VycmVudFNjcm9sbExlZnQ6MCxjdXJyZW50U2Nyb2xsVG9wOjAscmVmcmVzaFNjcm9sbFZhbHVlczpmdW5jdGlvbihlKXtyLmN1cnJlbnRTY3JvbGxMZWZ0PWUueCxyLmN1cnJlbnRTY3JvbGxUb3A9ZS55fX07dC5leHBvcnRzPXJ9LHt9XSw5MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIG51bGw9PXQmJm8oIjMwIiksbnVsbD09ZT90OkFycmF5LmlzQXJyYXkoZSk/QXJyYXkuaXNBcnJheSh0KT8oZS5wdXNoLmFwcGx5KGUsdCksZSk6KGUucHVzaCh0KSxlKTpBcnJheS5pc0FycmF5KHQpP1tlXS5jb25jYXQodCk6W2UsdF19dmFyIG89ZSgxMTIpO2UoMTM3KTt0LmV4cG9ydHM9cn0sezExMjoxMTIsMTM3OjEzN31dLDkyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7Zm9yKHZhciB0PTEsbj0wLHI9MCxhPWUubGVuZ3RoLGk9LTQmYTtyPGk7KXtmb3IodmFyIHM9TWF0aC5taW4ocis0MDk2LGkpO3I8cztyKz00KW4rPSh0Kz1lLmNoYXJDb2RlQXQocikpKyh0Kz1lLmNoYXJDb2RlQXQocisxKSkrKHQrPWUuY2hhckNvZGVBdChyKzIpKSsodCs9ZS5jaGFyQ29kZUF0KHIrMykpO3QlPW8sbiU9b31mb3IoO3I8YTtyKyspbis9dCs9ZS5jaGFyQ29kZUF0KHIpO3JldHVybiB0JT1vLG4lPW8sdHxuPDwxNn12YXIgbz02NTUyMTt0LmV4cG9ydHM9cn0se31dLDkzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgTVNBcHAmJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKHQsbixyLG8pe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIGUodCxuLHIsbyl9KX06ZX07dC5leHBvcnRzPXJ9LHt9XSw5NDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuKXtyZXR1cm4gbnVsbD09dHx8ImJvb2xlYW4iPT10eXBlb2YgdHx8IiI9PT10PyIiOmlzTmFOKHQpfHwwPT09dHx8YS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXT8iIit0Oigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQudHJpbSgpKSx0KyJweCIpfXZhciBvPWUoNCksYT0oZSgxNDIpLG8uaXNVbml0bGVzc051bWJlcik7dC5leHBvcnRzPXJ9LHsxNDI6MTQyLDQ6NH1dLDk1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9IiIrZSxuPWEuZXhlYyh0KTtpZighbilyZXR1cm4gdDt2YXIgcixvPSIiLGk9MCxzPTA7Zm9yKGk9bi5pbmRleDtpPHQubGVuZ3RoO2krKyl7c3dpdGNoKHQuY2hhckNvZGVBdChpKSl7Y2FzZSAzNDpyPSImcXVvdDsiO2JyZWFrO2Nhc2UgMzg6cj0iJmFtcDsiO2JyZWFrO2Nhc2UgMzk6cj0iJiN4Mjc7IjticmVhaztjYXNlIDYwOnI9IiZsdDsiO2JyZWFrO2Nhc2UgNjI6cj0iJmd0OyI7YnJlYWs7ZGVmYXVsdDpjb250aW51ZX1zIT09aSYmKG8rPXQuc3Vic3RyaW5nKHMsaSkpLHM9aSsxLG8rPXJ9cmV0dXJuIHMhPT1pP28rdC5zdWJzdHJpbmcocyxpKTpvfWZ1bmN0aW9uIG8oZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZXx8Im51bWJlciI9PXR5cGVvZiBlPyIiK2U6cihlKX12YXIgYT0vWyInJjw+XS87dC5leHBvcnRzPW99LHt9XSw5NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2lmKG51bGw9PWUpcmV0dXJuIG51bGw7aWYoMT09PWUubm9kZVR5cGUpcmV0dXJuIGU7dmFyIHQ9aS5nZXQoZSk7aWYodClyZXR1cm4gdD1zKHQpLHQ/YS5nZXROb2RlRnJvbUluc3RhbmNlKHQpOm51bGw7ImZ1bmN0aW9uIj09dHlwZW9mIGUucmVuZGVyP28oIjQ0Iik6bygiNDUiLE9iamVjdC5rZXlzKGUpKX12YXIgbz1lKDExMiksYT0oZSgxMTkpLGUoMzMpKSxpPWUoNTcpLHM9ZSgxMDMpO2UoMTM3KSxlKDE0Mik7dC5leHBvcnRzPXJ9LHsxMDM6MTAzLDExMjoxMTIsMTE5OjExOSwxMzc6MTM3LDE0MjoxNDIsMzM6MzMsNTc6NTd9XSw5NzpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtpZihlJiYib2JqZWN0Ij09dHlwZW9mIGUpe3ZhciBvPWU7dm9pZCAwPT09b1tuXSYmbnVsbCE9dCYmKG9bbl09dCl9fWZ1bmN0aW9uIG8oZSx0KXtpZihudWxsPT1lKXJldHVybiBlO3ZhciBuPXt9O3JldHVybiBhKGUscixuKSxufXZhciBhPShlKDIyKSxlKDExNykpO2UoMTQyKTt2b2lkIDAhPT1uJiZuLmVudix0LmV4cG9ydHM9b30pLmNhbGwodGhpcyx2b2lkIDApfSx7MTE3OjExNywxNDI6MTQyLDIyOjIyfV0sOTg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbil7QXJyYXkuaXNBcnJheShlKT9lLmZvckVhY2godCxuKTplJiZ0LmNhbGwobixlKX10LmV4cG9ydHM9cn0se31dLDk5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQsbj1lLmtleUNvZGU7cmV0dXJuImNoYXJDb2RlImluIGU/MD09PSh0PWUuY2hhckNvZGUpJiYxMz09PW4mJih0PTEzKTp0PW4sdD49MzJ8fDEzPT09dD90OjB9dC5leHBvcnRzPXJ9LHt9XSwxMDA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtpZihlLmtleSl7dmFyIHQ9YVtlLmtleV18fGUua2V5O2lmKCJVbmlkZW50aWZpZWQiIT09dClyZXR1cm4gdH1pZigia2V5cHJlc3MiPT09ZS50eXBlKXt2YXIgbj1vKGUpO3JldHVybiAxMz09PW4/IkVudGVyIjpTdHJpbmcuZnJvbUNoYXJDb2RlKG4pfXJldHVybiJrZXlkb3duIj09PWUudHlwZXx8ImtleXVwIj09PWUudHlwZT9pW2Uua2V5Q29kZV18fCJVbmlkZW50aWZpZWQiOiIifXZhciBvPWUoOTkpLGE9e0VzYzoiRXNjYXBlIixTcGFjZWJhcjoiICIsTGVmdDoiQXJyb3dMZWZ0IixVcDoiQXJyb3dVcCIsUmlnaHQ6IkFycm93UmlnaHQiLERvd246IkFycm93RG93biIsRGVsOiJEZWxldGUiLFdpbjoiT1MiLE1lbnU6IkNvbnRleHRNZW51IixBcHBzOiJDb250ZXh0TWVudSIsU2Nyb2xsOiJTY3JvbGxMb2NrIixNb3pQcmludGFibGVLZXk6IlVuaWRlbnRpZmllZCJ9LGk9ezg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMjoiQ2xlYXIiLDEzOiJFbnRlciIsMTY6IlNoaWZ0IiwxNzoiQ29udHJvbCIsMTg6IkFsdCIsMTk6IlBhdXNlIiwyMDoiQ2Fwc0xvY2siLDI3OiJFc2NhcGUiLDMyOiIgIiwzMzoiUGFnZVVwIiwzNDoiUGFnZURvd24iLDM1OiJFbmQiLDM2OiJIb21lIiwzNzoiQXJyb3dMZWZ0IiwzODoiQXJyb3dVcCIsMzk6IkFycm93UmlnaHQiLDQwOiJBcnJvd0Rvd24iLDQ1OiJJbnNlcnQiLDQ2OiJEZWxldGUiLDExMjoiRjEiLDExMzoiRjIiLDExNDoiRjMiLDExNToiRjQiLDExNjoiRjUiLDExNzoiRjYiLDExODoiRjciLDExOToiRjgiLDEyMDoiRjkiLDEyMToiRjEwIiwxMjI6IkYxMSIsMTIzOiJGMTIiLDE0NDoiTnVtTG9jayIsMTQ1OiJTY3JvbGxMb2NrIiwyMjQ6Ik1ldGEifTt0LmV4cG9ydHM9cn0sezk5Ojk5fV0sMTAxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9dGhpcyxuPXQubmF0aXZlRXZlbnQ7aWYobi5nZXRNb2RpZmllclN0YXRlKXJldHVybiBuLmdldE1vZGlmaWVyU3RhdGUoZSk7dmFyIHI9YVtlXTtyZXR1cm4hIXImJiEhbltyXX1mdW5jdGlvbiBvKGUpe3JldHVybiByfXZhciBhPXtBbHQ6ImFsdEtleSIsQ29udHJvbDoiY3RybEtleSIsTWV0YToibWV0YUtleSIsU2hpZnQ6InNoaWZ0S2V5In07dC5leHBvcnRzPW99LHt9XSwxMDI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgdD1lLnRhcmdldHx8ZS5zcmNFbGVtZW50fHx3aW5kb3c7cmV0dXJuIHQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQmJih0PXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpLDM9PT10Lm5vZGVUeXBlP3QucGFyZW50Tm9kZTp0fXQuZXhwb3J0cz1yfSx7fV0sMTAzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7Zm9yKHZhciB0Oyh0PWUuX3JlbmRlcmVkTm9kZVR5cGUpPT09by5DT01QT1NJVEU7KWU9ZS5fcmVuZGVyZWRDb21wb25lbnQ7cmV0dXJuIHQ9PT1vLkhPU1Q/ZS5fcmVuZGVyZWRDb21wb25lbnQ6dD09PW8uRU1QVFk/bnVsbDp2b2lkIDB9dmFyIG89ZSg2Mik7dC5leHBvcnRzPXJ9LHs2Mjo2Mn1dLDEwNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUmJihvJiZlW29dfHxlW2FdKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gdH12YXIgbz0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3IsYT0iQEBpdGVyYXRvciI7dC5leHBvcnRzPXJ9LHt9XSwxMDU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IoO2UmJmUuZmlyc3RDaGlsZDspZT1lLmZpcnN0Q2hpbGQ7cmV0dXJuIGV9ZnVuY3Rpb24gbyhlKXtmb3IoO2U7KXtpZihlLm5leHRTaWJsaW5nKXJldHVybiBlLm5leHRTaWJsaW5nO2U9ZS5wYXJlbnROb2RlfX1mdW5jdGlvbiBhKGUsdCl7Zm9yKHZhciBuPXIoZSksYT0wLGk9MDtuOyl7aWYoMz09PW4ubm9kZVR5cGUpe2lmKGk9YStuLnRleHRDb250ZW50Lmxlbmd0aCxhPD10JiZpPj10KXJldHVybntub2RlOm4sb2Zmc2V0OnQtYX07YT1pfW49cihvKG4pKX19dC5leHBvcnRzPWF9LHt9XSwxMDY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe3JldHVybiFhJiZvLmNhblVzZURPTSYmKGE9InRleHRDb250ZW50ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudD8idGV4dENvbnRlbnQiOiJpbm5lclRleHQiKSxhfXZhciBvPWUoMTIzKSxhPW51bGw7dC5leHBvcnRzPXJ9LHsxMjM6MTIzfV0sMTA3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj17fTtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldPXQudG9Mb3dlckNhc2UoKSxuWyJXZWJraXQiK2VdPSJ3ZWJraXQiK3QsblsiTW96IitlXT0ibW96Iit0LG5bIm1zIitlXT0iTVMiK3QsblsiTyIrZV09Im8iK3QudG9Mb3dlckNhc2UoKSxufWZ1bmN0aW9uIG8oZSl7aWYoc1tlXSlyZXR1cm4gc1tlXTtpZighaVtlXSlyZXR1cm4gZTt2YXIgdD1pW2VdO2Zvcih2YXIgbiBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkobikmJm4gaW4gdSlyZXR1cm4gc1tlXT10W25dO3JldHVybiIifXZhciBhPWUoMTIzKSxpPXthbmltYXRpb25lbmQ6cigiQW5pbWF0aW9uIiwiQW5pbWF0aW9uRW5kIiksYW5pbWF0aW9uaXRlcmF0aW9uOnIoIkFuaW1hdGlvbiIsIkFuaW1hdGlvbkl0ZXJhdGlvbiIpLGFuaW1hdGlvbnN0YXJ0OnIoIkFuaW1hdGlvbiIsIkFuaW1hdGlvblN0YXJ0IiksdHJhbnNpdGlvbmVuZDpyKCJUcmFuc2l0aW9uIiwiVHJhbnNpdGlvbkVuZCIpfSxzPXt9LHU9e307YS5jYW5Vc2VET00mJih1PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLCJBbmltYXRpb25FdmVudCJpbiB3aW5kb3d8fChkZWxldGUgaS5hbmltYXRpb25lbmQuYW5pbWF0aW9uLGRlbGV0ZSBpLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb24sZGVsZXRlIGkuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uKSwiVHJhbnNpdGlvbkV2ZW50ImluIHdpbmRvd3x8ZGVsZXRlIGkudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uKSx0LmV4cG9ydHM9b30sezEyMzoxMjN9XSwxMDg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtpZihlKXt2YXIgdD1lLmdldE5hbWUoKTtpZih0KXJldHVybiIgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCIrdCsiYC4ifXJldHVybiIifWZ1bmN0aW9uIG8oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJnZvaWQgMCE9PWUucHJvdG90eXBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5wcm90b3R5cGUubW91bnRDb21wb25lbnQmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnByb3RvdHlwZS5yZWNlaXZlQ29tcG9uZW50fWZ1bmN0aW9uIGEoZSx0KXt2YXIgbjtpZihudWxsPT09ZXx8ITE9PT1lKW49bC5jcmVhdGUoYSk7ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIGUpe3ZhciBzPWUsdT1zLnR5cGU7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHUmJiJzdHJpbmciIT10eXBlb2YgdSl7dmFyIGQ9IiI7ZCs9cihzLl9vd25lciksaSgiMTMwIixudWxsPT11P3U6dHlwZW9mIHUsZCl9InN0cmluZyI9PXR5cGVvZiBzLnR5cGU/bj1jLmNyZWF0ZUludGVybmFsQ29tcG9uZW50KHMpOm8ocy50eXBlKT8obj1uZXcgcy50eXBlKHMpLG4uZ2V0SG9zdE5vZGV8fChuLmdldEhvc3ROb2RlPW4uZ2V0TmF0aXZlTm9kZSkpOm49bmV3IHAocyl9ZWxzZSJzdHJpbmciPT10eXBlb2YgZXx8Im51bWJlciI9PXR5cGVvZiBlP249Yy5jcmVhdGVJbnN0YW5jZUZvclRleHQoZSk6aSgiMTMxIix0eXBlb2YgZSk7cmV0dXJuIG4uX21vdW50SW5kZXg9MCxuLl9tb3VudEltYWdlPW51bGwsbn12YXIgaT1lKDExMikscz1lKDE0MyksdT1lKDI5KSxsPWUoNDkpLGM9ZSg1NCkscD0oZSgxMjEpLGUoMTM3KSxlKDE0MiksZnVuY3Rpb24oZSl7dGhpcy5jb25zdHJ1Y3QoZSl9KTtzKHAucHJvdG90eXBlLHUse19pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50OmF9KSx0LmV4cG9ydHM9YX0sezExMjoxMTIsMTIxOjEyMSwxMzc6MTM3LDE0MjoxNDIsMTQzOjE0MywyOToyOSw0OTo0OSw1NDo1NH1dLDEwOTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7aWYoIWEuY2FuVXNlRE9NfHx0JiYhKCJhZGRFdmVudExpc3RlbmVyImluIGRvY3VtZW50KSlyZXR1cm4hMTt2YXIgbj0ib24iK2Uscj1uIGluIGRvY3VtZW50O2lmKCFyKXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpLnNldEF0dHJpYnV0ZShuLCJyZXR1cm47Iikscj0iZnVuY3Rpb24iPT10eXBlb2YgaVtuXX1yZXR1cm4hciYmbyYmIndoZWVsIj09PWUmJihyPWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoIkV2ZW50cy53aGVlbCIsIjMuMCIpKSxyfXZhciBvLGE9ZSgxMjMpO2EuY2FuVXNlRE9NJiYobz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbiYmZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSYmITAhPT1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCIiLCIiKSksdC5leHBvcnRzPXJ9LHsxMjM6MTIzfV0sMTEwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9ZSYmZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT10PyEhb1tlLnR5cGVdOiJ0ZXh0YXJlYSI9PT10fXZhciBvPXtjb2xvcjohMCxkYXRlOiEwLGRhdGV0aW1lOiEwLCJkYXRldGltZS1sb2NhbCI6ITAsZW1haWw6ITAsbW9udGg6ITAsbnVtYmVyOiEwLHBhc3N3b3JkOiEwLHJhbmdlOiEwLHNlYXJjaDohMCx0ZWw6ITAsdGV4dDohMCx0aW1lOiEwLHVybDohMCx3ZWVrOiEwfTt0LmV4cG9ydHM9cn0se31dLDExMTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiciJytvKGUpKyciJ312YXIgbz1lKDk1KTt0LmV4cG9ydHM9cn0sezk1Ojk1fV0sMTEyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgtMSxuPSJNaW5pZmllZCBSZWFjdCBlcnJvciAjIitlKyI7IHZpc2l0IGh0dHA6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PSIrZSxyPTA7cjx0O3IrKyluKz0iJmFyZ3NbXT0iK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbcisxXSk7bis9IiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIjt2YXIgbz1uZXcgRXJyb3Iobik7dGhyb3cgby5uYW1lPSJJbnZhcmlhbnQgVmlvbGF0aW9uIixvLmZyYW1lc1RvUG9wPTEsb310LmV4cG9ydHM9cn0se31dLDExMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDYwKTt0LmV4cG9ydHM9ci5yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcn0sezYwOjYwfV0sMTE0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByLG89ZSgxMjMpLGE9ZSgxMCksaT0vXlsgXHJcblx0XGZdLyxzPS88KCEtLXxsaW5rfG5vc2NyaXB0fG1ldGF8c2NyaXB0fHN0eWxlKVsgXHJcblx0XGZcLz5dLyx1PWUoOTMpLGw9dShmdW5jdGlvbihlLHQpe2lmKGUubmFtZXNwYWNlVVJJIT09YS5zdmd8fCJpbm5lckhUTUwiaW4gZSllLmlubmVySFRNTD10O2Vsc2V7cj1yfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxyLmlubmVySFRNTD0iPHN2Zz4iK3QrIjwvc3ZnPiI7Zm9yKHZhciBuPXIuZmlyc3RDaGlsZDtuLmZpcnN0Q2hpbGQ7KWUuYXBwZW5kQ2hpbGQobi5maXJzdENoaWxkKX19KTtpZihvLmNhblVzZURPTSl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pbm5lckhUTUw9IiAiLCIiPT09Yy5pbm5lckhUTUwmJihsPWZ1bmN0aW9uKGUsdCl7aWYoZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsZSksaS50ZXN0KHQpfHwiPCI9PT10WzBdJiZzLnRlc3QodCkpe2UuaW5uZXJIVE1MPVN0cmluZy5mcm9tQ2hhckNvZGUoNjUyNzkpK3Q7dmFyIG49ZS5maXJzdENoaWxkOzE9PT1uLmRhdGEubGVuZ3RoP2UucmVtb3ZlQ2hpbGQobik6bi5kZWxldGVEYXRhKDAsMSl9ZWxzZSBlLmlubmVySFRNTD10fSksYz1udWxsfXQuZXhwb3J0cz1sfSx7MTA6MTAsMTIzOjEyMyw5Mzo5M31dLDExNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDEyMyksbz1lKDk1KSxhPWUoMTE0KSxpPWZ1bmN0aW9uKGUsdCl7aWYodCl7dmFyIG49ZS5maXJzdENoaWxkO2lmKG4mJm49PT1lLmxhc3RDaGlsZCYmMz09PW4ubm9kZVR5cGUpcmV0dXJuIHZvaWQobi5ub2RlVmFsdWU9dCl9ZS50ZXh0Q29udGVudD10fTtyLmNhblVzZURPTSYmKCJ0ZXh0Q29udGVudCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fChpPWZ1bmN0aW9uKGUsdCl7aWYoMz09PWUubm9kZVR5cGUpcmV0dXJuIHZvaWQoZS5ub2RlVmFsdWU9dCk7YShlLG8odCkpfSkpLHQuZXhwb3J0cz1pfSx7MTE0OjExNCwxMjM6MTIzLDk1Ojk1fV0sMTE2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj1udWxsPT09ZXx8ITE9PT1lLHI9bnVsbD09PXR8fCExPT09dDtpZihufHxyKXJldHVybiBuPT09cjt2YXIgbz10eXBlb2YgZSxhPXR5cGVvZiB0O3JldHVybiJzdHJpbmciPT09b3x8Im51bWJlciI9PT1vPyJzdHJpbmciPT09YXx8Im51bWJlciI9PT1hOiJvYmplY3QiPT09YSYmZS50eXBlPT09dC50eXBlJiZlLmtleT09PXQua2V5fXQuZXhwb3J0cz1yfSx7fV0sMTE3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gZSYmIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lLmtleT9sLmVzY2FwZShlLmtleSk6dC50b1N0cmluZygzNil9ZnVuY3Rpb24gbyhlLHQsbixhKXt2YXIgZD10eXBlb2YgZTtpZigidW5kZWZpbmVkIiE9PWQmJiJib29sZWFuIiE9PWR8fChlPW51bGwpLG51bGw9PT1lfHwic3RyaW5nIj09PWR8fCJudW1iZXIiPT09ZHx8Im9iamVjdCI9PT1kJiZlLiQkdHlwZW9mPT09cylyZXR1cm4gbihhLGUsIiI9PT10P2MrcihlLDApOnQpLDE7dmFyIGYsaCxtPTAsdj0iIj09PXQ/Yzp0K3A7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIGc9MDtnPGUubGVuZ3RoO2crKylmPWVbZ10saD12K3IoZixnKSxtKz1vKGYsaCxuLGEpO2Vsc2V7dmFyIHk9dShlKTtpZih5KXt2YXIgXyxDPXkuY2FsbChlKTtpZih5IT09ZS5lbnRyaWVzKWZvcih2YXIgYj0wOyEoXz1DLm5leHQoKSkuZG9uZTspZj1fLnZhbHVlLGg9dityKGYsYisrKSxtKz1vKGYsaCxuLGEpO2Vsc2UgZm9yKDshKF89Qy5uZXh0KCkpLmRvbmU7KXt2YXIgRT1fLnZhbHVlO0UmJihmPUVbMV0saD12K2wuZXNjYXBlKEVbMF0pK3ArcihmLDApLG0rPW8oZixoLG4sYSkpfX1lbHNlIGlmKCJvYmplY3QiPT09ZCl7dmFyIHg9U3RyaW5nKGUpO2koIjMxIiwiW29iamVjdCBPYmplY3RdIj09PXg/Im9iamVjdCB3aXRoIGtleXMgeyIrT2JqZWN0LmtleXMoZSkuam9pbigiLCAiKSsifSI6eCwiIil9fXJldHVybiBtfWZ1bmN0aW9uIGEoZSx0LG4pe3JldHVybiBudWxsPT1lPzA6byhlLCIiLHQsbil9dmFyIGk9ZSgxMTIpLHM9KGUoMTE5KSxlKDQ4KSksdT1lKDEwNCksbD0oZSgxMzcpLGUoMjIpKSxjPShlKDE0MiksIi4iKSxwPSI6Ijt0LmV4cG9ydHM9YX0sezEwNDoxMDQsMTEyOjExMiwxMTk6MTE5LDEzNzoxMzcsMTQyOjE0MiwyMjoyMiw0ODo0OH1dLDExODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj0oZSgxNDMpLGUoMTI5KSksbz0oZSgxNDIpLHIpO3QuZXhwb3J0cz1vfSx7MTI5OjEyOSwxNDI6MTQyLDE0MzoxNDN9XSwxMTk6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIG89ZS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtuLmV4cG9ydHM9by5SZWFjdEN1cnJlbnRPd25lcn0se31dLDEyMDpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0IjtuLmV4cG9ydHM9ZX0se31dLDEyMTpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbz1lLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO24uZXhwb3J0cz1vLmdldE5leHREZWJ1Z0lEfSx7fV0sMTIyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTI5KSxvPXtsaXN0ZW46ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLmFkZEV2ZW50TGlzdGVuZXI/KGUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITEpLHtyZW1vdmU6ZnVuY3Rpb24oKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLCExKX19KTplLmF0dGFjaEV2ZW50PyhlLmF0dGFjaEV2ZW50KCJvbiIrdCxuKSx7cmVtb3ZlOmZ1bmN0aW9uKCl7ZS5kZXRhY2hFdmVudCgib24iK3Qsbil9fSk6dm9pZCAwfSxjYXB0dXJlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5hZGRFdmVudExpc3RlbmVyPyhlLmFkZEV2ZW50TGlzdGVuZXIodCxuLCEwKSx7cmVtb3ZlOmZ1bmN0aW9uKCl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMCl9fSk6e3JlbW92ZTpyfX0scmVnaXN0ZXJEZWZhdWx0OmZ1bmN0aW9uKCl7fX07dC5leHBvcnRzPW99LHsxMjk6MTI5fV0sMTIzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSEoInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3d8fCF3aW5kb3cuZG9jdW1lbnR8fCF3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCksbz17Y2FuVXNlRE9NOnIsY2FuVXNlV29ya2VyczoidW5kZWZpbmVkIiE9dHlwZW9mIFdvcmtlcixjYW5Vc2VFdmVudExpc3RlbmVyczpyJiYhKCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciYmIXdpbmRvdy5hdHRhY2hFdmVudCksY2FuVXNlVmlld3BvcnQ6ciYmISF3aW5kb3cuc2NyZWVuLGlzSW5Xb3JrZXI6IXJ9O3QuZXhwb3J0cz1vfSx7fV0sMTI0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUucmVwbGFjZShvLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX0pfXZhciBvPS8tKC4pL2c7dC5leHBvcnRzPXJ9LHt9XSwxMjU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gbyhlLnJlcGxhY2UoYSwibXMtIikpfXZhciBvPWUoMTI0KSxhPS9eLW1zLS87dC5leHBvcnRzPXJ9LHsxMjQ6MTI0fV0sMTI2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4hKCFlfHwhdCkmJihlPT09dHx8IW8oZSkmJihvKHQpP3IoZSx0LnBhcmVudE5vZGUpOiJjb250YWlucyJpbiBlP2UuY29udGFpbnModCk6ISFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYhISgxNiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpKSkpfXZhciBvPWUoMTM5KTt0LmV4cG9ydHM9cn0sezEzOToxMzl9XSwxMjc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgdD1lLmxlbmd0aDtpZigoQXJyYXkuaXNBcnJheShlKXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZSkmJmkoITEpLCJudW1iZXIiIT10eXBlb2YgdCYmaSghMSksMD09PXR8fHQtMSBpbiBlfHxpKCExKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5jYWxsZWUmJmkoITEpLGUuaGFzT3duUHJvcGVydHkpdHJ5e3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKX1jYXRjaChlKXt9Zm9yKHZhciBuPUFycmF5KHQpLHI9MDtyPHQ7cisrKW5bcl09ZVtyXTtyZXR1cm4gbn1mdW5jdGlvbiBvKGUpe3JldHVybiEhZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpJiYibGVuZ3RoImluIGUmJiEoInNldEludGVydmFsImluIGUpJiYibnVtYmVyIiE9dHlwZW9mIGUubm9kZVR5cGUmJihBcnJheS5pc0FycmF5KGUpfHwiY2FsbGVlImluIGV8fCJpdGVtImluIGUpfWZ1bmN0aW9uIGEoZSl7cmV0dXJuIG8oZSk/QXJyYXkuaXNBcnJheShlKT9lLnNsaWNlKCk6cihlKTpbZV19dmFyIGk9ZSgxMzcpO3QuZXhwb3J0cz1hfSx7MTM3OjEzN31dLDEyODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUubWF0Y2goYyk7cmV0dXJuIHQmJnRbMV0udG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBvKGUsdCl7dmFyIG49bDtsfHx1KCExKTt2YXIgbz1yKGUpLGE9byYmcyhvKTtpZihhKXtuLmlubmVySFRNTD1hWzFdK2UrYVsyXTtmb3IodmFyIGM9YVswXTtjLS07KW49bi5sYXN0Q2hpbGR9ZWxzZSBuLmlubmVySFRNTD1lO3ZhciBwPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO3AubGVuZ3RoJiYodHx8dSghMSksaShwKS5mb3JFYWNoKHQpKTtmb3IodmFyIGQ9QXJyYXkuZnJvbShuLmNoaWxkTm9kZXMpO24ubGFzdENoaWxkOyluLnJlbW92ZUNoaWxkKG4ubGFzdENoaWxkKTtyZXR1cm4gZH12YXIgYT1lKDEyMyksaT1lKDEyNykscz1lKDEzMyksdT1lKDEzNyksbD1hLmNhblVzZURPTT9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTpudWxsLGM9L15ccyo8KFx3KykvO3QuZXhwb3J0cz1vfSx7MTIzOjEyMywxMjc6MTI3LDEzMzoxMzMsMTM3OjEzN31dLDEyOTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlfX12YXIgbz1mdW5jdGlvbigpe307by50aGF0UmV0dXJucz1yLG8udGhhdFJldHVybnNGYWxzZT1yKCExKSxvLnRoYXRSZXR1cm5zVHJ1ZT1yKCEwKSxvLnRoYXRSZXR1cm5zTnVsbD1yKG51bGwpLG8udGhhdFJldHVybnNUaGlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LG8udGhhdFJldHVybnNBcmd1bWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZX0sdC5leHBvcnRzPW99LHt9XSwxMzA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e307dC5leHBvcnRzPXJ9LHt9XSwxMzE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt0cnl7ZS5mb2N1cygpfWNhdGNoKGUpe319dC5leHBvcnRzPXJ9LHt9XSwxMzI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtpZih2b2lkIDA9PT0oZT1lfHwoInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudD9kb2N1bWVudDp2b2lkIDApKSlyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIGUuYWN0aXZlRWxlbWVudHx8ZS5ib2R5fWNhdGNoKHQpe3JldHVybiBlLmJvZHl9fXQuZXhwb3J0cz1yfSx7fV0sMTMzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGl8fGEoITEpLGQuaGFzT3duUHJvcGVydHkoZSl8fChlPSIqIikscy5oYXNPd25Qcm9wZXJ0eShlKXx8KGkuaW5uZXJIVE1MPSIqIj09PWU/IjxsaW5rIC8+IjoiPCIrZSsiPjwvIitlKyI+IixzW2VdPSFpLmZpcnN0Q2hpbGQpLHNbZV0/ZFtlXTpudWxsfXZhciBvPWUoMTIzKSxhPWUoMTM3KSxpPW8uY2FuVXNlRE9NP2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOm51bGwscz17fSx1PVsxLCc8c2VsZWN0IG11bHRpcGxlPSJ0cnVlIj4nLCI8L3NlbGVjdD4iXSxsPVsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjPVszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxwPVsxLCc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+JywiPC9zdmc+Il0sZD17IioiOlsxLCI/PGRpdj4iLCI8L2Rpdj4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLGNvbDpbMiwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSxwYXJhbTpbMSwiPG9iamVjdD4iLCI8L29iamVjdD4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sb3B0Z3JvdXA6dSxvcHRpb246dSxjYXB0aW9uOmwsY29sZ3JvdXA6bCx0Ym9keTpsLHRmb290OmwsdGhlYWQ6bCx0ZDpjLHRoOmN9O1siY2lyY2xlIiwiY2xpcFBhdGgiLCJkZWZzIiwiZWxsaXBzZSIsImciLCJpbWFnZSIsImxpbmUiLCJsaW5lYXJHcmFkaWVudCIsIm1hc2siLCJwYXRoIiwicGF0dGVybiIsInBvbHlnb24iLCJwb2x5bGluZSIsInJhZGlhbEdyYWRpZW50IiwicmVjdCIsInN0b3AiLCJ0ZXh0IiwidHNwYW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2RbZV09cCxzW2VdPSEwfSksdC5leHBvcnRzPXJ9LHsxMjM6MTIzLDEzNzoxMzd9XSwxMzQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZS5XaW5kb3cmJmUgaW5zdGFuY2VvZiBlLldpbmRvdz97eDplLnBhZ2VYT2Zmc2V0fHxlLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LHk6ZS5wYWdlWU9mZnNldHx8ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wfTp7eDplLnNjcm9sbExlZnQseTplLnNjcm9sbFRvcH19dC5leHBvcnRzPXJ9LHt9XSwxMzU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZS5yZXBsYWNlKG8sIi0kMSIpLnRvTG93ZXJDYXNlKCl9dmFyIG89LyhbQS1aXSkvZzt0LmV4cG9ydHM9cn0se31dLDEzNjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBvKGUpLnJlcGxhY2UoYSwiLW1zLSIpfXZhciBvPWUoMTM1KSxhPS9ebXMtLzt0LmV4cG9ydHM9cn0sezEzNToxMzV9XSwxMzc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyLGEsaSxzLHUpe2lmKG8odCksIWUpe3ZhciBsO2lmKHZvaWQgMD09PXQpbD1uZXcgRXJyb3IoIk1pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIik7ZWxzZXt2YXIgYz1bbixyLGEsaSxzLHVdLHA9MDtsPW5ldyBFcnJvcih0LnJlcGxhY2UoLyVzL2csZnVuY3Rpb24oKXtyZXR1cm4gY1twKytdfSkpLGwubmFtZT0iSW52YXJpYW50IFZpb2xhdGlvbiJ9dGhyb3cgbC5mcmFtZXNUb1BvcD0xLGx9fXZhciBvPWZ1bmN0aW9uKGUpe307dC5leHBvcnRzPXJ9LHt9XSwxMzg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgdD1lP2Uub3duZXJEb2N1bWVudHx8ZTpkb2N1bWVudCxuPXQuZGVmYXVsdFZpZXd8fHdpbmRvdztyZXR1cm4hKCFlfHwhKCJmdW5jdGlvbiI9PXR5cGVvZiBuLk5vZGU/ZSBpbnN0YW5jZW9mIG4uTm9kZToib2JqZWN0Ij09dHlwZW9mIGUmJiJudW1iZXIiPT10eXBlb2YgZS5ub2RlVHlwZSYmInN0cmluZyI9PXR5cGVvZiBlLm5vZGVOYW1lKSl9dC5leHBvcnRzPXJ9LHt9XSwxMzk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gbyhlKSYmMz09ZS5ub2RlVHlwZX12YXIgbz1lKDEzOCk7dC5leHBvcnRzPXJ9LHsxMzg6MTM4fV0sMTQwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9e307cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0Lmhhc093blByb3BlcnR5KG4pfHwodFtuXT1lLmNhbGwodGhpcyxuKSksdFtuXX19dC5leHBvcnRzPXJ9LHt9XSwxNDE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiBlPT09dD8wIT09ZXx8MCE9PXR8fDEvZT09MS90OmUhPT1lJiZ0IT09dH1mdW5jdGlvbiBvKGUsdCl7aWYocihlLHQpKXJldHVybiEwO2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWV8fCJvYmplY3QiIT10eXBlb2YgdHx8bnVsbD09PXQpcmV0dXJuITE7dmFyIG49T2JqZWN0LmtleXMoZSksbz1PYmplY3Qua2V5cyh0KTtpZihuLmxlbmd0aCE9PW8ubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKWlmKCFhLmNhbGwodCxuW2ldKXx8IXIoZVtuW2ldXSx0W25baV1dKSlyZXR1cm4hMTtyZXR1cm4hMH12YXIgYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1vfSx7fV0sMTQyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTI5KSxvPXI7dC5leHBvcnRzPW99LHsxMjk6MTI5fV0sMTQzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7aWYobnVsbD09PWV8fHZvaWQgMD09PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQiKTtyZXR1cm4gT2JqZWN0KGUpfXZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGk9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt0cnl7aWYoIU9iamVjdC5hc3NpZ24pcmV0dXJuITE7dmFyIGU9bmV3IFN0cmluZygiYWJjIik7aWYoZVs1XT0iZGUiLCI1Ij09PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpWzBdKXJldHVybiExO2Zvcih2YXIgdD17fSxuPTA7bjwxMDtuKyspdFsiXyIrU3RyaW5nLmZyb21DaGFyQ29kZShuKV09bjtpZigiMDEyMzQ1Njc4OSIhPT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KS5qb2luKCIiKSlyZXR1cm4hMTt2YXIgcj17fTtyZXR1cm4iYWJjZGVmZ2hpamtsbW5vcHFyc3QiLnNwbGl0KCIiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JbZV09ZX0pLCJhYmNkZWZnaGlqa2xtbm9wcXJzdCI9PT1PYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LHIpKS5qb2luKCIiKX1jYXRjaChlKXtyZXR1cm4hMX19KCk/T2JqZWN0LmFzc2lnbjpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbixzLHU9cihlKSxsPTE7bDxhcmd1bWVudHMubGVuZ3RoO2wrKyl7bj1PYmplY3QoYXJndW1lbnRzW2xdKTtmb3IodmFyIGMgaW4gbilhLmNhbGwobixjKSYmKHVbY109bltjXSk7aWYobyl7cz1vKG4pO2Zvcih2YXIgcD0wO3A8cy5sZW5ndGg7cCsrKWkuY2FsbChuLHNbcF0pJiYodVtzW3BdXT1uW3NbcF1dKX19cmV0dXJuIHV9fSx7fV0sMTQ0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scixvKXt9ZSgxMzcpLGUoMTQyKSxlKDE0Nik7dC5leHBvcnRzPXJ9LHsxMzc6MTM3LDE0MjoxNDIsMTQ2OjE0Nn1dLDE0NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj0oZSgxMjkpLGUoMTM3KSksbz0oZSgxNDIpLGUoMTQ2KSxlKDE0NCkpO3QuZXhwb3J0cz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3RoaXMubWVzc2FnZT1lLHRoaXMuc3RhY2s9IiJ9dmFyIG4sYT0oImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yLGZ1bmN0aW9uKCl7cighMSwiUmVhY3QuUHJvcFR5cGVzIHR5cGUgY2hlY2tpbmcgY29kZSBpcyBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLiIpfSk7YS5pc1JlcXVpcmVkPWE7dmFyIGk9ZnVuY3Rpb24oKXtyZXR1cm4gYX07cmV0dXJuIG49e2FycmF5OmEsYm9vbDphLGZ1bmM6YSxudW1iZXI6YSxvYmplY3Q6YSxzdHJpbmc6YSxzeW1ib2w6YSxhbnk6YSxhcnJheU9mOmksZWxlbWVudDphLGluc3RhbmNlT2Y6aSxub2RlOmEsb2JqZWN0T2Y6aSxvbmVPZjppLG9uZU9mVHlwZTppLHNoYXBlOml9LHQucHJvdG90eXBlPUVycm9yLnByb3RvdHlwZSxuLmNoZWNrUHJvcFR5cGVzPW8sbi5Qcm9wVHlwZXM9bixufX0sezEyOToxMjksMTM3OjEzNywxNDI6MTQyLDE0NDoxNDQsMTQ2OjE0Nn1dLDE0NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9IlNFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEIn0se31dfSx7fSxbNDVdKSg0NSl9KCl9KCl9KTs="></script>
<link href="data:text/css;charset=utf-8,%0A%2EReactVirtualized%5F%5FCollection%20%7B%0A%7D%0A%2EReactVirtualized%5F%5FCollection%5F%5FinnerScrollContainer%20%7B%0A%7D%0A%0A%2EReactVirtualized%5F%5FGrid%20%7B%0A%7D%0A%2EReactVirtualized%5F%5FGrid%5F%5FinnerScrollContainer%20%7B%0A%7D%0A%0A%2EReactVirtualized%5F%5FTable%20%7B%0A%7D%0A%2EReactVirtualized%5F%5FTable%5F%5FGrid%20%7B%0A%7D%0A%2EReactVirtualized%5F%5FTable%5F%5FheaderRow%20%7B%0Afont%2Dweight%3A%20700%3B%0Atext%2Dtransform%3A%20uppercase%3B%0Adisplay%3A%20%2Dwebkit%2Dflex%3B%0Adisplay%3A%20%2Dmoz%2Dbox%3B%0Adisplay%3A%20%2Dms%2Dflexbox%3B%0Adisplay%3A%20flex%3B%0A%2Dwebkit%2Dflex%2Ddirection%3A%20row%3B%0A%2Dmoz%2Dbox%2Dorient%3A%20horizontal%3B%0A%2Dmoz%2Dbox%2Ddirection%3A%20normal%3B%0A%2Dms%2Dflex%2Ddirection%3A%20row%3B%0Aflex%2Ddirection%3A%20row%3B%0A%2Dwebkit%2Dalign%2Ditems%3A%20center%3B%0A%2Dmoz%2Dbox%2Dalign%3A%20center%3B%0A%2Dms%2Dflex%2Dalign%3A%20center%3B%0Aalign%2Ditems%3A%20center%3B%0A%7D%0A%2EReactVirtualized%5F%5FTable%5F%5Frow%20%7B%0Adisplay%3A%20%2Dwebkit%2Dflex%3B%0Adisplay%3A%20%2Dmoz%2Dbox%3B%0Adisplay%3A%20%2Dms%2Dflexbox%3B%0Adisplay%3A%20flex%3B%0A%2Dwebkit%2Dflex%2Ddirection%3A%20row%3B%0A%2Dmoz%2Dbox%2Dorient%3A%20horizontal%3B%0A%2Dmoz%2Dbox%2Ddirection%3A%20normal%3B%0A%2Dms%2Dflex%2Ddirection%3A%20row%3B%0Aflex%2Ddirection%3A%20row%3B%0A%2Dwebkit%2Dalign%2Ditems%3A%20center%3B%0A%2Dmoz%2Dbox%2Dalign%3A%20center%3B%0A%2Dms%2Dflex%2Dalign%3A%20center%3B%0Aalign%2Ditems%3A%20center%3B%0A%7D%0A%2EReactVirtualized%5F%5FTable%5F%5FheaderTruncatedText%20%7B%0Adisplay%3A%20inline%2Dblock%3B%0Amax%2Dwidth%3A%20100%25%3B%0Awhite%2Dspace%3A%20nowrap%3B%0Atext%2Doverflow%3A%20ellipsis%3B%0Aoverflow%3A%20hidden%3B%0A%7D%0A%2EReactVirtualized%5F%5FTable%5F%5FheaderColumn%2C%0A%2EReactVirtualized%5F%5FTable%5F%5FrowColumn%20%7B%0Amargin%2Dright%3A%2010px%3B%0Amin%2Dwidth%3A%200px%3B%0A%7D%0A%2EReactVirtualized%5F%5FTable%5F%5FrowColumn%20%7B%0Atext%2Doverflow%3A%20ellipsis%3B%0Awhite%2Dspace%3A%20nowrap%3B%0A%7D%0A%2EReactVirtualized%5F%5FTable%5F%5FheaderColumn%3Afirst%2Dof%2Dtype%2C%0A%2EReactVirtualized%5F%5FTable%5F%5FrowColumn%3Afirst%2Dof%2Dtype%20%7B%0Amargin%2Dleft%3A%2010px%3B%0A%7D%0A%2EReactVirtualized%5F%5FTable%5F%5FsortableHeaderColumn%20%7B%0Acursor%3A%20pointer%3B%0A%7D%0A%2EReactVirtualized%5F%5FTable%5F%5FsortableHeaderIconContainer%20%7B%0Adisplay%3A%20%2Dwebkit%2Dflex%3B%0Adisplay%3A%20%2Dmoz%2Dbox%3B%0Adisplay%3A%20%2Dms%2Dflexbox%3B%0Adisplay%3A%20flex%3B%0A%2Dwebkit%2Dalign%2Ditems%3A%20center%3B%0A%2Dmoz%2Dbox%2Dalign%3A%20center%3B%0A%2Dms%2Dflex%2Dalign%3A%20center%3B%0Aalign%2Ditems%3A%20center%3B%0A%7D%0A%2EReactVirtualized%5F%5FTable%5F%5FsortableHeaderIcon%20%7B%0A%2Dwebkit%2Dflex%3A%200%200%2024px%3B%0A%2Dmoz%2Dbox%2Dflex%3A%200%3B%0A%2Dms%2Dflex%3A%200%200%2024px%3B%0Aflex%3A%200%200%2024px%3B%0Aheight%3A%201em%3B%0Awidth%3A%201em%3B%0Afill%3A%20currentColor%3B%0A%7D%0A%0A%2EReactVirtualized%5F%5FList%20%7B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/javascript;base64,IWZ1bmN0aW9uKHJvb3QsIGZhY3RvcnkpIHsKICAgICJvYmplY3QiID09IHR5cGVvZiBleHBvcnRzICYmICJvYmplY3QiID09IHR5cGVvZiBtb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgiUmVhY3QiKSwgcmVxdWlyZSgiUmVhY3RET00iKSkgOiAiZnVuY3Rpb24iID09IHR5cGVvZiBkZWZpbmUgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbICJSZWFjdCIsICJSZWFjdERPTSIgXSwgZmFjdG9yeSkgOiAib2JqZWN0IiA9PSB0eXBlb2YgZXhwb3J0cyA/IGV4cG9ydHMuUmVhY3RWaXJ0dWFsaXplZCA9IGZhY3RvcnkocmVxdWlyZSgiUmVhY3QiKSwgcmVxdWlyZSgiUmVhY3RET00iKSkgOiByb290LlJlYWN0VmlydHVhbGl6ZWQgPSBmYWN0b3J5KHJvb3QuUmVhY3QsIHJvb3QuUmVhY3RET00pOwp9KHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfOTdfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8xMDNfXykgewogICAgLyoqKioqKi8KICAgIHJldHVybiBmdW5jdGlvbihtb2R1bGVzKSB7CiAgICAgICAgLyoqKioqKi8KICAgICAgICAvKioqKioqLwogICAgICAgIC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uCiAgICAgICAgLyoqKioqKi8KICAgICAgICBmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7CiAgICAgICAgICAgIC8qKioqKiovCiAgICAgICAgICAgIC8qKioqKiovCiAgICAgICAgICAgIC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZQogICAgICAgICAgICAvKioqKioqLwogICAgICAgICAgICBpZiAoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIC8qKioqKiovCiAgICAgICAgICAgIHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOwogICAgICAgICAgICAvKioqKioqLwogICAgICAgICAgICAvKioqKioqLwogICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQogICAgICAgICAgICAvKioqKioqLwogICAgICAgICAgICB2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7CiAgICAgICAgICAgICAgICAvKioqKioqLwogICAgICAgICAgICAgICAgZXhwb3J0czoge30sCiAgICAgICAgICAgICAgICAvKioqKioqLwogICAgICAgICAgICAgICAgaWQ6IG1vZHVsZUlkLAogICAgICAgICAgICAgICAgLyoqKioqKi8KICAgICAgICAgICAgICAgIGxvYWRlZDogITEKICAgICAgICAgICAgfTsKICAgICAgICAgICAgLyoqKioqKi8KICAgICAgICAgICAgLyoqKioqKi8KICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGUKICAgICAgICAgICAgLyoqKioqKi8KICAgICAgICAgICAgLyoqKioqKi8KICAgICAgICAgICAgLyoqKioqKi8KICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uCiAgICAgICAgICAgIC8qKioqKiovCiAgICAgICAgICAgIC8qKioqKiovCiAgICAgICAgICAgIC8qKioqKiovCiAgICAgICAgICAgIC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWQKICAgICAgICAgICAgLyoqKioqKi8KICAgICAgICAgICAgcmV0dXJuIG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pLCAKICAgICAgICAgICAgbW9kdWxlLmxvYWRlZCA9ICEwLCBtb2R1bGUuZXhwb3J0czsKICAgICAgICB9CiAgICAgICAgLy8gd2VicGFja0Jvb3RzdHJhcAogICAgICAgIC8qKioqKiovCiAgICAgICAgLy8gVGhlIG1vZHVsZSBjYWNoZQogICAgICAgIC8qKioqKiovCiAgICAgICAgdmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTsKICAgICAgICAvKioqKioqLwogICAgICAgIC8qKioqKiovCiAgICAgICAgLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCiAgICAgICAgLyoqKioqKi8KICAgICAgICAvKioqKioqLwogICAgICAgIC8qKioqKiovCiAgICAgICAgLyoqKioqKi8KICAgICAgICAvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKQogICAgICAgIC8qKioqKiovCiAgICAgICAgLyoqKioqKi8KICAgICAgICAvKioqKioqLwogICAgICAgIC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlCiAgICAgICAgLyoqKioqKi8KICAgICAgICAvKioqKioqLwogICAgICAgIC8qKioqKiovCiAgICAgICAgLy8gX193ZWJwYWNrX3B1YmxpY19wYXRoX18KICAgICAgICAvKioqKioqLwogICAgICAgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzLCBfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzLCAKICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSAiIiwgX193ZWJwYWNrX3JlcXVpcmVfXygwKTsKICAgIH0oWyAvKiAwICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSk7CiAgICAgICAgdmFyIF9BcnJvd0tleVN0ZXBwZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiQXJyb3dLZXlTdGVwcGVyIiwgewogICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfQXJyb3dLZXlTdGVwcGVyLkFycm93S2V5U3RlcHBlcjsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHZhciBfQXV0b1NpemVyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5OCk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJBdXRvU2l6ZXIiLCB7CiAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9BdXRvU2l6ZXIuQXV0b1NpemVyOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdmFyIF9DZWxsTWVhc3VyZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJDZWxsTWVhc3VyZXIiLCB7CiAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9DZWxsTWVhc3VyZXIuQ2VsbE1lYXN1cmVyOwogICAgICAgICAgICB9CiAgICAgICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiQ2VsbE1lYXN1cmVyQ2FjaGUiLCB7CiAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9DZWxsTWVhc3VyZXIuQ2VsbE1lYXN1cmVyQ2FjaGU7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICB2YXIgX0NvbGxlY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJDb2xsZWN0aW9uIiwgewogICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfQ29sbGVjdGlvbi5Db2xsZWN0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdmFyIF9Db2x1bW5TaXplciA9IF9fd2VicGFja19yZXF1aXJlX18oMTI1KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIkNvbHVtblNpemVyIiwgewogICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfQ29sdW1uU2l6ZXIuQ29sdW1uU2l6ZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICB2YXIgX0dyaWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNyk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJhY2Nlc3NpYmlsaXR5T3ZlcnNjYW5JbmRpY2VzR2V0dGVyIiwgewogICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfR3JpZC5hY2Nlc3NpYmlsaXR5T3ZlcnNjYW5JbmRpY2VzR2V0dGVyOwogICAgICAgICAgICB9CiAgICAgICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiZGVmYXVsdENlbGxSYW5nZVJlbmRlcmVyIiwgewogICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfR3JpZC5kZWZhdWx0Q2VsbFJhbmdlUmVuZGVyZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJkZWZhdWx0T3ZlcnNjYW5JbmRpY2VzR2V0dGVyIiwgewogICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfR3JpZC5kZWZhdWx0T3ZlcnNjYW5JbmRpY2VzR2V0dGVyOwogICAgICAgICAgICB9CiAgICAgICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiR3JpZCIsIHsKICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX0dyaWQuR3JpZDsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHZhciBfSW5maW5pdGVMb2FkZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzNik7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJJbmZpbml0ZUxvYWRlciIsIHsKICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX0luZmluaXRlTG9hZGVyLkluZmluaXRlTG9hZGVyOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdmFyIF9MaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzgpOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiTGlzdCIsIHsKICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX0xpc3QuTGlzdDsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHZhciBfTWFzb25yeSA9IF9fd2VicGFja19yZXF1aXJlX18oMTQzKTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgImNyZWF0ZU1hc29ucnlDZWxsUG9zaXRpb25lciIsIHsKICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX01hc29ucnkuY3JlYXRlQ2VsbFBvc2l0aW9uZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJNYXNvbnJ5IiwgewogICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfTWFzb25yeS5NYXNvbnJ5OwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdmFyIF9NdWx0aUdyaWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1OCk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJNdWx0aUdyaWQiLCB7CiAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9NdWx0aUdyaWQuTXVsdGlHcmlkOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdmFyIF9TY3JvbGxTeW5jID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjApOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiU2Nyb2xsU3luYyIsIHsKICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX1Njcm9sbFN5bmMuU2Nyb2xsU3luYzsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHZhciBfVGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2Mik7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJkZWZhdWx0VGFibGVDZWxsRGF0YUdldHRlciIsIHsKICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX1RhYmxlLmRlZmF1bHRDZWxsRGF0YUdldHRlcjsKICAgICAgICAgICAgfQogICAgICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgImRlZmF1bHRUYWJsZUNlbGxSZW5kZXJlciIsIHsKICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX1RhYmxlLmRlZmF1bHRDZWxsUmVuZGVyZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJkZWZhdWx0VGFibGVIZWFkZXJSZW5kZXJlciIsIHsKICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX1RhYmxlLmRlZmF1bHRIZWFkZXJSZW5kZXJlcjsKICAgICAgICAgICAgfQogICAgICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgImRlZmF1bHRUYWJsZUhlYWRlclJvd1JlbmRlcmVyIiwgewogICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfVGFibGUuZGVmYXVsdEhlYWRlclJvd1JlbmRlcmVyOwogICAgICAgICAgICB9CiAgICAgICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiZGVmYXVsdFRhYmxlUm93UmVuZGVyZXIiLCB7CiAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9UYWJsZS5kZWZhdWx0Um93UmVuZGVyZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJUYWJsZSIsIHsKICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX1RhYmxlLlRhYmxlOwogICAgICAgICAgICB9CiAgICAgICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiQ29sdW1uIiwgewogICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfVGFibGUuQ29sdW1uOwogICAgICAgICAgICB9CiAgICAgICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiU29ydERpcmVjdGlvbiIsIHsKICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX1RhYmxlLlNvcnREaXJlY3Rpb247CiAgICAgICAgICAgIH0KICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJTb3J0SW5kaWNhdG9yIiwgewogICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfVGFibGUuU29ydEluZGljYXRvcjsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHZhciBfV2luZG93U2Nyb2xsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Mik7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJXaW5kb3dTY3JvbGxlciIsIHsKICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX1dpbmRvd1Njcm9sbGVyLldpbmRvd1Njcm9sbGVyOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9LCAvKiAxICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvYmoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KSwgZXhwb3J0cy5BcnJvd0tleVN0ZXBwZXIgPSBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7CiAgICAgICAgdmFyIF9BcnJvd0tleVN0ZXBwZXIyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKSwgX0Fycm93S2V5U3RlcHBlcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9BcnJvd0tleVN0ZXBwZXIyKTsKICAgICAgICBleHBvcnRzLmRlZmF1bHQgPSBfQXJyb3dLZXlTdGVwcGVyMy5kZWZhdWx0LCBleHBvcnRzLkFycm93S2V5U3RlcHBlciA9IF9BcnJvd0tleVN0ZXBwZXIzLmRlZmF1bHQ7CiAgICB9LCAvKiAyICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvYmoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KTsKICAgICAgICB2YXIgX2dldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKSwgX2dldFByb3RvdHlwZU9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldFByb3RvdHlwZU9mKSwgX2NsYXNzQ2FsbENoZWNrMiA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpLCBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKSwgX2NyZWF0ZUNsYXNzMiA9IF9fd2VicGFja19yZXF1aXJlX18oMzApLCBfY3JlYXRlQ2xhc3MzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2xhc3MyKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNCksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKSwgX2luaGVyaXRzMiA9IF9fd2VicGFja19yZXF1aXJlX18oODEpLCBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKSwgX3Byb3BUeXBlcyA9IF9fd2VicGFja19yZXF1aXJlX18oODkpLCBfcmVhY3QgPSAoX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKSwgCiAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXyg5NykpLCBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpLCBBcnJvd0tleVN0ZXBwZXIgPSBmdW5jdGlvbihfUHVyZUNvbXBvbmVudCkgewogICAgICAgICAgICBmdW5jdGlvbiBBcnJvd0tleVN0ZXBwZXIocHJvcHMsIGNvbnRleHQpIHsKICAgICAgICAgICAgICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szLmRlZmF1bHQpKHRoaXMsIEFycm93S2V5U3RlcHBlcik7CiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zLmRlZmF1bHQpKHRoaXMsIChBcnJvd0tleVN0ZXBwZXIuX19wcm90b19fIHx8ICgwLCAKICAgICAgICAgICAgICAgIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoQXJyb3dLZXlTdGVwcGVyKSkuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpOwogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnN0YXRlID0gewogICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvQ29sdW1uOiBwcm9wcy5zY3JvbGxUb0NvbHVtbiwKICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb1JvdzogcHJvcHMuc2Nyb2xsVG9Sb3cKICAgICAgICAgICAgICAgIH0sIF90aGlzLl9jb2x1bW5TdGFydEluZGV4ID0gMCwgX3RoaXMuX2NvbHVtblN0b3BJbmRleCA9IDAsIF90aGlzLl9yb3dTdGFydEluZGV4ID0gMCwgCiAgICAgICAgICAgICAgICBfdGhpcy5fcm93U3RvcEluZGV4ID0gMCwgX3RoaXMuX29uS2V5RG93biA9IF90aGlzLl9vbktleURvd24uYmluZChfdGhpcyksIF90aGlzLl9vblNlY3Rpb25SZW5kZXJlZCA9IF90aGlzLl9vblNlY3Rpb25SZW5kZXJlZC5iaW5kKF90aGlzKSwgCiAgICAgICAgICAgICAgICBfdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKDAsIF9pbmhlcml0czMuZGVmYXVsdCkoQXJyb3dLZXlTdGVwcGVyLCBfUHVyZUNvbXBvbmVudCksICgwLCBfY3JlYXRlQ2xhc3MzLmRlZmF1bHQpKEFycm93S2V5U3RlcHBlciwgWyB7CiAgICAgICAgICAgICAgICBrZXk6ICJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihuZXh0UHJvcHMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9Db2x1bW4gPSBuZXh0UHJvcHMuc2Nyb2xsVG9Db2x1bW4sIHNjcm9sbFRvUm93ID0gbmV4dFByb3BzLnNjcm9sbFRvUm93LCBfcHJvcHMgPSB0aGlzLnByb3BzLCBwcmV2U2Nyb2xsVG9Db2x1bW4gPSBfcHJvcHMuc2Nyb2xsVG9Db2x1bW4sIHByZXZTY3JvbGxUb1JvdyA9IF9wcm9wcy5zY3JvbGxUb1JvdzsKICAgICAgICAgICAgICAgICAgICBwcmV2U2Nyb2xsVG9Db2x1bW4gIT09IHNjcm9sbFRvQ29sdW1uICYmIHByZXZTY3JvbGxUb1JvdyAhPT0gc2Nyb2xsVG9Sb3cgPyB0aGlzLnNldFN0YXRlKHsKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9Db2x1bW46IHNjcm9sbFRvQ29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb1Jvdzogc2Nyb2xsVG9Sb3cKICAgICAgICAgICAgICAgICAgICB9KSA6IHByZXZTY3JvbGxUb0NvbHVtbiAhPT0gc2Nyb2xsVG9Db2x1bW4gPyB0aGlzLnNldFN0YXRlKHsKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9Db2x1bW46IHNjcm9sbFRvQ29sdW1uCiAgICAgICAgICAgICAgICAgICAgfSkgOiBwcmV2U2Nyb2xsVG9Sb3cgIT09IHNjcm9sbFRvUm93ICYmIHRoaXMuc2V0U3RhdGUoewogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb1Jvdzogc2Nyb2xsVG9Sb3cKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAic2V0U2Nyb2xsSW5kZXhlcyIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oX3JlZikgewogICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxUb0NvbHVtbiA9IF9yZWYuc2Nyb2xsVG9Db2x1bW4sIHNjcm9sbFRvUm93ID0gX3JlZi5zY3JvbGxUb1JvdzsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9Sb3c6IHNjcm9sbFRvUm93LAogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb0NvbHVtbjogc2Nyb2xsVG9Db2x1bW4KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAicmVuZGVyIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHMsIGNsYXNzTmFtZSA9IF9wcm9wczIuY2xhc3NOYW1lLCBjaGlsZHJlbiA9IF9wcm9wczIuY2hpbGRyZW4sIF9zdGF0ZSA9IHRoaXMuc3RhdGUsIHNjcm9sbFRvQ29sdW1uID0gX3N0YXRlLnNjcm9sbFRvQ29sdW1uLCBzY3JvbGxUb1JvdyA9IF9zdGF0ZS5zY3JvbGxUb1JvdzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIG9uS2V5RG93bjogdGhpcy5fb25LZXlEb3duCiAgICAgICAgICAgICAgICAgICAgfSwgY2hpbGRyZW4oewogICAgICAgICAgICAgICAgICAgICAgICBvblNlY3Rpb25SZW5kZXJlZDogdGhpcy5fb25TZWN0aW9uUmVuZGVyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvQ29sdW1uOiBzY3JvbGxUb0NvbHVtbiwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9Sb3c6IHNjcm9sbFRvUm93CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfb25LZXlEb3duIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgIHZhciBfcHJvcHMzID0gdGhpcy5wcm9wcywgY29sdW1uQ291bnQgPSBfcHJvcHMzLmNvbHVtbkNvdW50LCBkaXNhYmxlZCA9IF9wcm9wczMuZGlzYWJsZWQsIG1vZGUgPSBfcHJvcHMzLm1vZGUsIHJvd0NvdW50ID0gX3Byb3BzMy5yb3dDb3VudDsKICAgICAgICAgICAgICAgICAgICBpZiAoIWRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfc3RhdGUyID0gdGhpcy5zdGF0ZSwgc2Nyb2xsVG9Db2x1bW5QcmV2aW91cyA9IF9zdGF0ZTIuc2Nyb2xsVG9Db2x1bW4sIHNjcm9sbFRvUm93UHJldmlvdXMgPSBfc3RhdGUyLnNjcm9sbFRvUm93LCBfc3RhdGUzID0gdGhpcy5zdGF0ZSwgc2Nyb2xsVG9Db2x1bW4gPSBfc3RhdGUzLnNjcm9sbFRvQ29sdW1uLCBzY3JvbGxUb1JvdyA9IF9zdGF0ZTMuc2Nyb2xsVG9Sb3c7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiQXJyb3dEb3duIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvUm93ID0gImNlbGxzIiA9PT0gbW9kZSA/IE1hdGgubWluKHNjcm9sbFRvUm93ICsgMSwgcm93Q291bnQgLSAxKSA6IE1hdGgubWluKHRoaXMuX3Jvd1N0b3BJbmRleCArIDEsIHJvd0NvdW50IC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiQXJyb3dMZWZ0IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvQ29sdW1uID0gImNlbGxzIiA9PT0gbW9kZSA/IE1hdGgubWF4KHNjcm9sbFRvQ29sdW1uIC0gMSwgMCkgOiBNYXRoLm1heCh0aGlzLl9jb2x1bW5TdGFydEluZGV4IC0gMSwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiQXJyb3dSaWdodCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb0NvbHVtbiA9ICJjZWxscyIgPT09IG1vZGUgPyBNYXRoLm1pbihzY3JvbGxUb0NvbHVtbiArIDEsIGNvbHVtbkNvdW50IC0gMSkgOiBNYXRoLm1pbih0aGlzLl9jb2x1bW5TdG9wSW5kZXggKyAxLCBjb2x1bW5Db3VudCAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIkFycm93VXAiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9Sb3cgPSAiY2VsbHMiID09PSBtb2RlID8gTWF0aC5tYXgoc2Nyb2xsVG9Sb3cgLSAxLCAwKSA6IE1hdGgubWF4KHRoaXMuX3Jvd1N0YXJ0SW5kZXggLSAxLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb0NvbHVtbiA9PT0gc2Nyb2xsVG9Db2x1bW5QcmV2aW91cyAmJiBzY3JvbGxUb1JvdyA9PT0gc2Nyb2xsVG9Sb3dQcmV2aW91cyB8fCAoZXZlbnQucHJldmVudERlZmF1bHQoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9Db2x1bW46IHNjcm9sbFRvQ29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9Sb3c6IHNjcm9sbFRvUm93CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9vblNlY3Rpb25SZW5kZXJlZCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oX3JlZjIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uU3RhcnRJbmRleCA9IF9yZWYyLmNvbHVtblN0YXJ0SW5kZXgsIGNvbHVtblN0b3BJbmRleCA9IF9yZWYyLmNvbHVtblN0b3BJbmRleCwgcm93U3RhcnRJbmRleCA9IF9yZWYyLnJvd1N0YXJ0SW5kZXgsIHJvd1N0b3BJbmRleCA9IF9yZWYyLnJvd1N0b3BJbmRleDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb2x1bW5TdGFydEluZGV4ID0gY29sdW1uU3RhcnRJbmRleCwgdGhpcy5fY29sdW1uU3RvcEluZGV4ID0gY29sdW1uU3RvcEluZGV4LCAKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yb3dTdGFydEluZGV4ID0gcm93U3RhcnRJbmRleCwgdGhpcy5fcm93U3RvcEluZGV4ID0gcm93U3RvcEluZGV4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IF0pLCBBcnJvd0tleVN0ZXBwZXI7CiAgICAgICAgfShfcmVhY3QuUHVyZUNvbXBvbmVudCk7CiAgICAgICAgQXJyb3dLZXlTdGVwcGVyLmRlZmF1bHRQcm9wcyA9IHsKICAgICAgICAgICAgZGlzYWJsZWQ6ICExLAogICAgICAgICAgICBtb2RlOiAiZWRnZXMiLAogICAgICAgICAgICBzY3JvbGxUb0NvbHVtbjogMCwKICAgICAgICAgICAgc2Nyb2xsVG9Sb3c6IDAKICAgICAgICB9LCBleHBvcnRzLmRlZmF1bHQgPSBBcnJvd0tleVN0ZXBwZXI7CiAgICB9LCAvKiAzICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7CiAgICAgICAgICAgIGRlZmF1bHQ6IF9fd2VicGFja19yZXF1aXJlX18oNCksCiAgICAgICAgICAgIF9fZXNNb2R1bGU6ICEwCiAgICAgICAgfTsKICAgIH0sIC8qIDQgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpLCBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpLk9iamVjdC5nZXRQcm90b3R5cGVPZjsKICAgIH0sIC8qIDUgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAvLyAxOS4xLjIuOSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTykKICAgICAgICB2YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpLCAkZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpOwogICAgICAgIF9fd2VicGFja19yZXF1aXJlX18oMTQpKCJnZXRQcm90b3R5cGVPZiIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oaXQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkZ2V0UHJvdG90eXBlT2YodG9PYmplY3QoaXQpKTsKICAgICAgICAgICAgfTsKICAgICAgICB9KTsKICAgIH0sIC8qIDYgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpCiAgICAgICAgdmFyIGRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpOwogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7CiAgICAgICAgfTsKICAgIH0sIC8qIDcgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICAvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpIHsKICAgICAgICAgICAgaWYgKHZvaWQgMCA9PSBpdCkgdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgIiArIGl0KTsKICAgICAgICAgICAgcmV0dXJuIGl0OwogICAgICAgIH07CiAgICB9LCAvKiA4ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTykKICAgICAgICB2YXIgaGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KSwgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpLCBJRV9QUk9UTyA9IF9fd2VicGFja19yZXF1aXJlX18oMTApKCJJRV9QUk9UTyIpLCBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24oTykgewogICAgICAgICAgICByZXR1cm4gTyA9IHRvT2JqZWN0KE8pLCBoYXMoTywgSUVfUFJPVE8pID8gT1tJRV9QUk9UT10gOiAiZnVuY3Rpb24iID09IHR5cGVvZiBPLmNvbnN0cnVjdG9yICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yID8gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgOiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsOwogICAgICAgIH07CiAgICB9LCAvKiA5ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CiAgICAgICAgdmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwga2V5KSB7CiAgICAgICAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpOwogICAgICAgIH07CiAgICB9LCAvKiAxMCAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIHZhciBzaGFyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKSgia2V5cyIpLCB1aWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSkgewogICAgICAgICAgICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpOwogICAgICAgIH07CiAgICB9LCAvKiAxMSAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIHZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKSwgU0hBUkVEID0gIl9fY29yZS1qc19zaGFyZWRfXyIsIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pOwogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0ge30pOwogICAgICAgIH07CiAgICB9LCAvKiAxMiAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewogICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4CiAgICAgICAgdmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gInVuZGVmaW5lZCIgIT0gdHlwZW9mIHdpbmRvdyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoID8gd2luZG93IDogInVuZGVmaW5lZCIgIT0gdHlwZW9mIHNlbGYgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmIDogRnVuY3Rpb24oInJldHVybiB0aGlzIikoKTsKICAgICAgICAibnVtYmVyIiA9PSB0eXBlb2YgX19nICYmIChfX2cgPSBnbG9iYWwpOwogICAgfSwgLyogMTMgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICB2YXIgaWQgPSAwLCBweCA9IE1hdGgucmFuZG9tKCk7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpIHsKICAgICAgICAgICAgcmV0dXJuICJTeW1ib2woIi5jb25jYXQodm9pZCAwID09PSBrZXkgPyAiIiA6IGtleSwgIilfIiwgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTsKICAgICAgICB9OwogICAgfSwgLyogMTQgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAvLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXMKICAgICAgICB2YXIgJGV4cG9ydCA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpLCBjb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNiksIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVksIGV4ZWMpIHsKICAgICAgICAgICAgdmFyIGZuID0gKGNvcmUuT2JqZWN0IHx8IHt9KVtLRVldIHx8IE9iamVjdFtLRVldLCBleHAgPSB7fTsKICAgICAgICAgICAgZXhwW0tFWV0gPSBleGVjKGZuKSwgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGZuKDEpOwogICAgICAgICAgICB9KSwgIk9iamVjdCIsIGV4cCk7CiAgICAgICAgfTsKICAgIH0sIC8qIDE1ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpLCBjb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNiksIGN0eCA9IF9fd2VicGFja19yZXF1aXJlX18oMTcpLCBoaWRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSksIFBST1RPVFlQRSA9ICJwcm90b3R5cGUiLCAkZXhwb3J0ID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgc291cmNlKSB7CiAgICAgICAgICAgIHZhciBrZXksIG93biwgb3V0LCBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GLCBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HLCBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TLCBJU19QUk9UTyA9IHR5cGUgJiAkZXhwb3J0LlAsIElTX0JJTkQgPSB0eXBlICYgJGV4cG9ydC5CLCBJU19XUkFQID0gdHlwZSAmICRleHBvcnQuVywgZXhwb3J0cyA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pLCBleHBQcm90byA9IGV4cG9ydHNbUFJPVE9UWVBFXSwgdGFyZ2V0ID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXTsKICAgICAgICAgICAgSVNfR0xPQkFMICYmIChzb3VyY2UgPSBuYW1lKTsKICAgICAgICAgICAgZm9yIChrZXkgaW4gc291cmNlKSAvLyBjb250YWlucyBpbiBuYXRpdmUKICAgICAgICAgICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdm9pZCAwICE9PSB0YXJnZXRba2V5XSwgb3duICYmIGtleSBpbiBleHBvcnRzIHx8ICgvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZAogICAgICAgICAgICBvdXQgPSBvd24gPyB0YXJnZXRba2V5XSA6IHNvdXJjZVtrZXldLCAvLyBwcmV2ZW50IGdsb2JhbCBwb2xsdXRpb24gZm9yIG5hbWVzcGFjZXMKICAgICAgICAgICAgZXhwb3J0c1trZXldID0gSVNfR0xPQkFMICYmICJmdW5jdGlvbiIgIT0gdHlwZW9mIHRhcmdldFtrZXldID8gc291cmNlW2tleV0gOiBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbCkgOiBJU19XUkFQICYmIHRhcmdldFtrZXldID09IG91dCA/IGZ1bmN0aW9uKEMpIHsKICAgICAgICAgICAgICAgIHZhciBGID0gZnVuY3Rpb24oYSwgYiwgYykgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQykgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEMoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDKGEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEMoYSwgYik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDKGEsIGIsIGMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gQy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBGW1BST1RPVFlQRV0gPSBDW1BST1RPVFlQRV0sIEY7CiAgICAgICAgICAgIH0ob3V0KSA6IElTX1BST1RPICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIG91dCA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0LCAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUubWV0aG9kcy4lTkFNRSUKICAgICAgICAgICAgSVNfUFJPVE8gJiYgKChleHBvcnRzLnZpcnR1YWwgfHwgKGV4cG9ydHMudmlydHVhbCA9IHt9KSlba2V5XSA9IG91dCwgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLnByb3RvdHlwZS4lTkFNRSUKICAgICAgICAgICAgdHlwZSAmICRleHBvcnQuUiAmJiBleHBQcm90byAmJiAhZXhwUHJvdG9ba2V5XSAmJiBoaWRlKGV4cFByb3RvLCBrZXksIG91dCkpKTsKICAgICAgICB9OwogICAgICAgIC8vIHR5cGUgYml0bWFwCiAgICAgICAgJGV4cG9ydC5GID0gMSwgLy8gZm9yY2VkCiAgICAgICAgJGV4cG9ydC5HID0gMiwgLy8gZ2xvYmFsCiAgICAgICAgJGV4cG9ydC5TID0gNCwgLy8gc3RhdGljCiAgICAgICAgJGV4cG9ydC5QID0gOCwgLy8gcHJvdG8KICAgICAgICAkZXhwb3J0LkIgPSAxNiwgLy8gYmluZAogICAgICAgICRleHBvcnQuVyA9IDMyLCAvLyB3cmFwCiAgICAgICAgJGV4cG9ydC5VID0gNjQsIC8vIHNhZmUKICAgICAgICAkZXhwb3J0LlIgPSAxMjgsIC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWAgCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0OwogICAgfSwgLyogMTYgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICB2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0gewogICAgICAgICAgICB2ZXJzaW9uOiAiMi40LjAiCiAgICAgICAgfTsKICAgICAgICAibnVtYmVyIiA9PSB0eXBlb2YgX19lICYmIChfX2UgPSBjb3JlKTsKICAgIH0sIC8qIDE3ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nCiAgICAgICAgdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpOwogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIHRoYXQsIGxlbmd0aCkgewogICAgICAgICAgICBpZiAoYUZ1bmN0aW9uKGZuKSwgdm9pZCAwID09PSB0aGF0KSByZXR1cm4gZm47CiAgICAgICAgICAgIHN3aXRjaCAobGVuZ3RoKSB7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oYSwgYiwgYykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgfSwgLyogMTggKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KSB7CiAgICAgICAgICAgIGlmICgiZnVuY3Rpb24iICE9IHR5cGVvZiBpdCkgdGhyb3cgVHlwZUVycm9yKGl0ICsgIiBpcyBub3QgYSBmdW5jdGlvbiEiKTsKICAgICAgICAgICAgcmV0dXJuIGl0OwogICAgICAgIH07CiAgICB9LCAvKiAxOSAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIHZhciBkUCA9IF9fd2VicGFja19yZXF1aXJlX18oMjApLCBjcmVhdGVEZXNjID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOCk7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KSA/IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gZFAuZihvYmplY3QsIGtleSwgY3JlYXRlRGVzYygxLCB2YWx1ZSkpOwogICAgICAgIH0gOiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIG9iamVjdFtrZXldID0gdmFsdWUsIG9iamVjdDsKICAgICAgICB9OwogICAgfSwgLyogMjAgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICB2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKSwgSUU4X0RPTV9ERUZJTkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKSwgdG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KSwgZFAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CiAgICAgICAgZXhwb3J0cy5mID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbihPLCBQLCBBdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgIGlmIChhbk9iamVjdChPKSwgUCA9IHRvUHJpbWl0aXZlKFAsICEwKSwgYW5PYmplY3QoQXR0cmlidXRlcyksIElFOF9ET01fREVGSU5FKSB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRQKE8sIFAsIEF0dHJpYnV0ZXMpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICBpZiAoImdldCIgaW4gQXR0cmlidXRlcyB8fCAic2V0IiBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkISIpOwogICAgICAgICAgICByZXR1cm4gInZhbHVlIiBpbiBBdHRyaWJ1dGVzICYmIChPW1BdID0gQXR0cmlidXRlcy52YWx1ZSksIE87CiAgICAgICAgfTsKICAgIH0sIC8qIDIxICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMik7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCkgewogICAgICAgICAgICBpZiAoIWlzT2JqZWN0KGl0KSkgdGhyb3cgVHlwZUVycm9yKGl0ICsgIiBpcyBub3QgYW4gb2JqZWN0ISIpOwogICAgICAgICAgICByZXR1cm4gaXQ7CiAgICAgICAgfTsKICAgIH0sIC8qIDIyICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCkgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCIgPT0gdHlwZW9mIGl0ID8gbnVsbCAhPT0gaXQgOiAiZnVuY3Rpb24iID09IHR5cGVvZiBpdDsKICAgICAgICB9OwogICAgfSwgLyogMjMgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9ICFfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXygyNSkoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiA3ICE9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KSgiZGl2IiksICJhIiwgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkuYTsKICAgICAgICB9KTsKICAgIH0sIC8qIDI0ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gIV9fd2VicGFja19yZXF1aXJlX18oMjUpKGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gNyAhPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICJhIiwgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkuYTsKICAgICAgICB9KTsKICAgIH0sIC8qIDI1ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gISFleGVjKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9LCAvKiAyNiAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIHZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpLCBkb2N1bWVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpLmRvY3VtZW50LCBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KSB7CiAgICAgICAgICAgIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307CiAgICAgICAgfTsKICAgIH0sIC8qIDI3ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pCiAgICAgICAgdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMik7CiAgICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2UKICAgICAgICAvLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZwogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIFMpIHsKICAgICAgICAgICAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiBpdDsKICAgICAgICAgICAgdmFyIGZuLCB2YWw7CiAgICAgICAgICAgIGlmIChTICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsOwogICAgICAgICAgICBpZiAoImZ1bmN0aW9uIiA9PSB0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDsKICAgICAgICAgICAgaWYgKCFTICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsOwogICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpOwogICAgICAgIH07CiAgICB9LCAvKiAyOCAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYml0bWFwLCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgZW51bWVyYWJsZTogISgxICYgYml0bWFwKSwKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogISgyICYgYml0bWFwKSwKICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhKDQgJiBiaXRtYXApLAogICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlCiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgIH0sIC8qIDI5ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGV4cG9ydHMuX19lc01vZHVsZSA9ICEwLCBleHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbihpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgICAgICAgICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgICAgIH07CiAgICB9LCAvKiAzMCAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGV4cG9ydHMuX19lc01vZHVsZSA9ICEwOwogICAgICAgIHZhciBfZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMxKSwgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZmluZVByb3BlcnR5KTsKICAgICAgICBleHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgITEsIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gITAsIAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgaW4gZGVzY3JpcHRvciAmJiAoZGVzY3JpcHRvci53cml0YWJsZSA9ICEwKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvUHJvcHMgJiYgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpLCBzdGF0aWNQcm9wcyAmJiBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyksIAogICAgICAgICAgICAgICAgQ29uc3RydWN0b3I7CiAgICAgICAgICAgIH07CiAgICAgICAgfSgpOwogICAgfSwgLyogMzEgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgZGVmYXVsdDogX193ZWJwYWNrX3JlcXVpcmVfXygzMiksCiAgICAgICAgICAgIF9fZXNNb2R1bGU6ICEwCiAgICAgICAgfTsKICAgIH0sIC8qIDMyICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXygzMyk7CiAgICAgICAgdmFyICRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KS5PYmplY3Q7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwga2V5LCBkZXNjKSB7CiAgICAgICAgICAgIHJldHVybiAkT2JqZWN0LmRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2MpOwogICAgICAgIH07CiAgICB9LCAvKiAzMyAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIHZhciAkZXhwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSk7CiAgICAgICAgLy8gMTkuMS4yLjQgLyAxNS4yLjMuNiBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykKICAgICAgICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KSwgIk9iamVjdCIsIHsKICAgICAgICAgICAgZGVmaW5lUHJvcGVydHk6IF9fd2VicGFja19yZXF1aXJlX18oMjApLmYKICAgICAgICB9KTsKICAgIH0sIC8qIDM0ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvYmoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5fX2VzTW9kdWxlID0gITA7CiAgICAgICAgdmFyIF90eXBlb2YyID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNSksIF90eXBlb2YzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdHlwZW9mMik7CiAgICAgICAgZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24oc2VsZiwgY2FsbCkgewogICAgICAgICAgICBpZiAoIXNlbGYpIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgICAgICAgICAgIHJldHVybiAhY2FsbCB8fCAib2JqZWN0IiAhPT0gKCJ1bmRlZmluZWQiID09IHR5cGVvZiBjYWxsID8gInVuZGVmaW5lZCIgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkoY2FsbCkpICYmICJmdW5jdGlvbiIgIT0gdHlwZW9mIGNhbGwgPyBzZWxmIDogY2FsbDsKICAgICAgICB9OwogICAgfSwgLyogMzUgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsKICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG9iagogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBleHBvcnRzLl9fZXNNb2R1bGUgPSAhMDsKICAgICAgICB2YXIgX2l0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNiksIF9pdGVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pdGVyYXRvciksIF9zeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KSwgX3N5bWJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1ib2wpLCBfdHlwZW9mID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgX2l0ZXJhdG9yMi5kZWZhdWx0ID8gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiB0eXBlb2Ygb2JqOwogICAgICAgIH0gOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiAiZnVuY3Rpb24iID09IHR5cGVvZiBfc3ltYm9sMi5kZWZhdWx0ICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX3N5bWJvbDIuZGVmYXVsdCAmJiBvYmogIT09IF9zeW1ib2wyLmRlZmF1bHQucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOwogICAgICAgIH07CiAgICAgICAgZXhwb3J0cy5kZWZhdWx0ID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCAmJiAic3ltYm9sIiA9PT0gX3R5cGVvZihfaXRlcmF0b3IyLmRlZmF1bHQpID8gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAidW5kZWZpbmVkIiA9PSB0eXBlb2Ygb2JqID8gInVuZGVmaW5lZCIgOiBfdHlwZW9mKG9iaik7CiAgICAgICAgfSA6IGZ1bmN0aW9uKG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBfc3ltYm9sMi5kZWZhdWx0ICYmIG9iaiAhPT0gX3N5bWJvbDIuZGVmYXVsdC5wcm90b3R5cGUgPyAic3ltYm9sIiA6ICJ1bmRlZmluZWQiID09IHR5cGVvZiBvYmogPyAidW5kZWZpbmVkIiA6IF90eXBlb2Yob2JqKTsKICAgICAgICB9OwogICAgfSwgLyogMzYgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgZGVmYXVsdDogX193ZWJwYWNrX3JlcXVpcmVfXygzNyksCiAgICAgICAgICAgIF9fZXNNb2R1bGU6ICEwCiAgICAgICAgfTsKICAgIH0sIC8qIDM3ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXygzOCksIF9fd2VicGFja19yZXF1aXJlX18oNjApLCBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNjQpLmYoIml0ZXJhdG9yIik7CiAgICB9LCAvKiAzOCAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICB2YXIgJGF0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzOSkoITApOwogICAgICAgIC8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKCkKICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fKDQxKShTdHJpbmcsICJTdHJpbmciLCBmdW5jdGlvbihpdGVyYXRlZCkgewogICAgICAgICAgICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKSwgLy8gdGFyZ2V0CiAgICAgICAgICAgIHRoaXMuX2kgPSAwOwogICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcG9pbnQsIE8gPSB0aGlzLl90LCBpbmRleCA9IHRoaXMuX2k7CiAgICAgICAgICAgIHJldHVybiBpbmRleCA+PSBPLmxlbmd0aCA/IHsKICAgICAgICAgICAgICAgIHZhbHVlOiB2b2lkIDAsCiAgICAgICAgICAgICAgICBkb25lOiAhMAogICAgICAgICAgICB9IDogKHBvaW50ID0gJGF0KE8sIGluZGV4KSwgdGhpcy5faSArPSBwb2ludC5sZW5ndGgsIHsKICAgICAgICAgICAgICAgIHZhbHVlOiBwb2ludCwKICAgICAgICAgICAgICAgIGRvbmU6ICExCiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfSwgLyogMzkgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICB2YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MCksIGRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpOwogICAgICAgIC8vIHRydWUgIC0+IFN0cmluZyNhdAogICAgICAgIC8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdAogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVE9fU1RSSU5HKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0aGF0LCBwb3MpIHsKICAgICAgICAgICAgICAgIHZhciBhLCBiLCBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpLCBpID0gdG9JbnRlZ2VyKHBvcyksIGwgPSBzLmxlbmd0aDsKICAgICAgICAgICAgICAgIHJldHVybiBpIDwgMCB8fCBpID49IGwgPyBUT19TVFJJTkcgPyAiIiA6IHZvaWQgMCA6IChhID0gcy5jaGFyQ29kZUF0KGkpLCBhIDwgNTUyOTYgfHwgYSA+IDU2MzE5IHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCA1NjMyMCB8fCBiID4gNTczNDMgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGEgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gNTUyOTYgPDwgMTApICsgKGIgLSA1NjMyMCkgKyA2NTUzNik7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgIH0sIC8qIDQwICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CiAgICAgICAgLy8gNy4xLjQgVG9JbnRlZ2VyCiAgICAgICAgdmFyIGNlaWwgPSBNYXRoLmNlaWwsIGZsb29yID0gTWF0aC5mbG9vcjsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KSB7CiAgICAgICAgICAgIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpOwogICAgICAgIH07CiAgICB9LCAvKiA0MSAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICB2YXIgTElCUkFSWSA9IF9fd2VicGFja19yZXF1aXJlX18oNDIpLCAkZXhwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSksIHJlZGVmaW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MyksIGhpZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KSwgaGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KSwgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NCksICRpdGVyQ3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NSksIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1OCksIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KSwgSVRFUkFUT1IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU5KSgiaXRlcmF0b3IiKSwgQlVHR1kgPSAhKFtdLmtleXMgJiYgIm5leHQiIGluIFtdLmtleXMoKSksIEZGX0lURVJBVE9SID0gIkBAaXRlcmF0b3IiLCBLRVlTID0gImtleXMiLCBWQUxVRVMgPSAidmFsdWVzIiwgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQmFzZSwgTkFNRSwgQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7CiAgICAgICAgICAgICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTsKICAgICAgICAgICAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGUsIGdldE1ldGhvZCA9IGZ1bmN0aW9uKGtpbmQpIHsKICAgICAgICAgICAgICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdOwogICAgICAgICAgICAgICAgc3dpdGNoIChraW5kKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgS0VZUzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGNhc2UgVkFMVUVTOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LCBUQUcgPSBOQU1FICsgIiBJdGVyYXRvciIsIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFUywgVkFMVUVTX0JVRyA9ICExLCBwcm90byA9IEJhc2UucHJvdG90eXBlLCAkbmF0aXZlID0gcHJvdG9bSVRFUkFUT1JdIHx8IHByb3RvW0ZGX0lURVJBVE9SXSB8fCBERUZBVUxUICYmIHByb3RvW0RFRkFVTFRdLCAkZGVmYXVsdCA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpLCAkZW50cmllcyA9IERFRkFVTFQgPyBERUZfVkFMVUVTID8gZ2V0TWV0aG9kKCJlbnRyaWVzIikgOiAkZGVmYXVsdCA6IHZvaWQgMCwgJGFueU5hdGl2ZSA9ICJBcnJheSIgPT0gTkFNRSA/IHByb3RvLmVudHJpZXMgfHwgJG5hdGl2ZSA6ICRuYXRpdmU7CiAgICAgICAgICAgIGlmICgvLyBGaXggbmF0aXZlCiAgICAgICAgICAgICRhbnlOYXRpdmUgJiYgKEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKCkpKSwgCiAgICAgICAgICAgIEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmICgvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzCiAgICAgICAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsICEwKSwgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzCiAgICAgICAgICAgIExJQlJBUlkgfHwgaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikgfHwgaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpKSksIAogICAgICAgICAgICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGCiAgICAgICAgICAgIERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUyAmJiAoVkFMVUVTX0JVRyA9ICEwLCAkZGVmYXVsdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsKICAgICAgICAgICAgfSksIC8vIERlZmluZSBpdGVyYXRvcgogICAgICAgICAgICBMSUJSQVJZICYmICFGT1JDRUQgfHwgIUJVR0dZICYmICFWQUxVRVNfQlVHICYmIHByb3RvW0lURVJBVE9SXSB8fCBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpLCAKICAgICAgICAgICAgLy8gUGx1ZyBmb3IgbGlicmFyeQogICAgICAgICAgICBJdGVyYXRvcnNbTkFNRV0gPSAkZGVmYXVsdCwgSXRlcmF0b3JzW1RBR10gPSByZXR1cm5UaGlzLCBERUZBVUxUKSBpZiAobWV0aG9kcyA9IHsKICAgICAgICAgICAgICAgIHZhbHVlczogREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksCiAgICAgICAgICAgICAgICBrZXlzOiBJU19TRVQgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChLRVlTKSwKICAgICAgICAgICAgICAgIGVudHJpZXM6ICRlbnRyaWVzCiAgICAgICAgICAgIH0sIEZPUkNFRCkgZm9yIChrZXkgaW4gbWV0aG9kcykga2V5IGluIHByb3RvIHx8IHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7IGVsc2UgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoQlVHR1kgfHwgVkFMVUVTX0JVRyksIE5BTUUsIG1ldGhvZHMpOwogICAgICAgICAgICByZXR1cm4gbWV0aG9kczsKICAgICAgICB9OwogICAgfSwgLyogNDIgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9ICEwOwogICAgfSwgLyogNDMgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpOwogICAgfSwgLyogNDQgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHt9OwogICAgfSwgLyogNDUgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgdmFyIGNyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDYpLCBkZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOCksIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1OCksIEl0ZXJhdG9yUHJvdG90eXBlID0ge307CiAgICAgICAgLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKCkKICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KShJdGVyYXRvclByb3RvdHlwZSwgX193ZWJwYWNrX3JlcXVpcmVfXyg1OSkoIml0ZXJhdG9yIiksIGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9KSwgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCkgewogICAgICAgICAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsKICAgICAgICAgICAgICAgIG5leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCkKICAgICAgICAgICAgfSksIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgIiBJdGVyYXRvciIpOwogICAgICAgIH07CiAgICB9LCAvKiA0NiAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIC8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKQogICAgICAgIHZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjEpLCBkUHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3KSwgZW51bUJ1Z0tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU2KSwgSUVfUFJPVE8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKSgiSUVfUFJPVE8iKSwgRW1wdHkgPSBmdW5jdGlvbigpIHt9LCBQUk9UT1RZUEUgPSAicHJvdG90eXBlIiwgY3JlYXRlRGljdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1ZwogICAgICAgICAgICB2YXIgaWZyYW1lRG9jdW1lbnQsIGlmcmFtZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjYpKCJpZnJhbWUiKSwgaSA9IGVudW1CdWdLZXlzLmxlbmd0aCwgbHQgPSAiPCIsIGd0ID0gIj4iOwogICAgICAgICAgICBmb3IgKGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3KS5hcHBlbmRDaGlsZChpZnJhbWUpLCAKICAgICAgICAgICAgaWZyYW1lLnNyYyA9ICJqYXZhc2NyaXB0OiIsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybAogICAgICAgICAgICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0OwogICAgICAgICAgICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7CiAgICAgICAgICAgIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQsIGlmcmFtZURvY3VtZW50Lm9wZW4oKSwgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAic2NyaXB0IiArIGd0ICsgImRvY3VtZW50LkY9T2JqZWN0IiArIGx0ICsgIi9zY3JpcHQiICsgZ3QpLCAKICAgICAgICAgICAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKSwgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7IGktLTsgKSBkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTsKICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZURpY3QoKTsKICAgICAgICB9OwogICAgICAgIG1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbihPLCBQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgICAgIC8vIGFkZCAiX19wcm90b19fIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsCiAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBPID8gKEVtcHR5W1BST1RPVFlQRV0gPSBhbk9iamVjdChPKSwgcmVzdWx0ID0gbmV3IEVtcHR5KCksIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsLCAKICAgICAgICAgICAgcmVzdWx0W0lFX1BST1RPXSA9IE8pIDogcmVzdWx0ID0gY3JlYXRlRGljdCgpLCB2b2lkIDAgPT09IFByb3BlcnRpZXMgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTsKICAgICAgICB9OwogICAgfSwgLyogNDcgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICB2YXIgZFAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKSwgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKSwgZ2V0S2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oNDgpOwogICAgICAgIG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uKE8sIFByb3BlcnRpZXMpIHsKICAgICAgICAgICAgYW5PYmplY3QoTyk7CiAgICAgICAgICAgIGZvciAodmFyIFAsIGtleXMgPSBnZXRLZXlzKFByb3BlcnRpZXMpLCBsZW5ndGggPSBrZXlzLmxlbmd0aCwgaSA9IDA7IGxlbmd0aCA+IGk7ICkgZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTsKICAgICAgICAgICAgcmV0dXJuIE87CiAgICAgICAgfTsKICAgIH0sIC8qIDQ4ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pCiAgICAgICAgdmFyICRrZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OSksIGVudW1CdWdLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Nik7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbihPKSB7CiAgICAgICAgICAgIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7CiAgICAgICAgfTsKICAgIH0sIC8qIDQ5ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgdmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oOSksIHRvSU9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNTApLCBhcnJheUluZGV4T2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUzKSghMSksIElFX1BST1RPID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCkoIklFX1BST1RPIik7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIG5hbWVzKSB7CiAgICAgICAgICAgIHZhciBrZXksIE8gPSB0b0lPYmplY3Qob2JqZWN0KSwgaSA9IDAsIHJlc3VsdCA9IFtdOwogICAgICAgICAgICBmb3IgKGtleSBpbiBPKSBrZXkgIT0gSUVfUFJPVE8gJiYgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTsKICAgICAgICAgICAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5cwogICAgICAgICAgICBmb3IgKDtuYW1lcy5sZW5ndGggPiBpOyApIGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSAmJiAofmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfTsKICAgIH0sIC8qIDUwICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzCiAgICAgICAgdmFyIElPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUxKSwgZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oNyk7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCkgewogICAgICAgICAgICByZXR1cm4gSU9iamVjdChkZWZpbmVkKGl0KSk7CiAgICAgICAgfTsKICAgIH0sIC8qIDUxICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3MKICAgICAgICB2YXIgY29mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Mik7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uKGl0KSB7CiAgICAgICAgICAgIHJldHVybiAiU3RyaW5nIiA9PSBjb2YoaXQpID8gaXQuc3BsaXQoIiIpIDogT2JqZWN0KGl0KTsKICAgICAgICB9OwogICAgfSwgLyogNTIgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICB2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZzsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KSB7CiAgICAgICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7CiAgICAgICAgfTsKICAgIH0sIC8qIDUzICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZgogICAgICAgIC8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzCiAgICAgICAgdmFyIHRvSU9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNTApLCB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oNTQpLCB0b0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NSk7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihJU19JTkNMVURFUykgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSwgTyA9IHRvSU9iamVjdCgkdGhpcyksIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKSwgaW5kZXggPSB0b0luZGV4KGZyb21JbmRleCwgbGVuZ3RoKTsKICAgICAgICAgICAgICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG0KICAgICAgICAgICAgICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgewogICAgICAgICAgICAgICAgICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyApIGlmICh2YWx1ZSA9IE9baW5kZXgrK10sIHZhbHVlICE9IHZhbHVlKSByZXR1cm4gITA7CiAgICAgICAgICAgICAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmICgoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykgJiYgT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDsKICAgICAgICAgICAgICAgIHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgIH0sIC8qIDU0ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgLy8gNy4xLjE1IFRvTGVuZ3RoCiAgICAgICAgdmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oNDApLCBtaW4gPSBNYXRoLm1pbjsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KSB7CiAgICAgICAgICAgIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgOTAwNzE5OTI1NDc0MDk5MSkgOiAwOwogICAgICAgIH07CiAgICB9LCAvKiA1NSAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIHZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQwKSwgbWF4ID0gTWF0aC5tYXgsIG1pbiA9IE1hdGgubWluOwogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaW5kZXgsIGxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpLCBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpOwogICAgICAgIH07CiAgICB9LCAvKiA1NiAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewogICAgICAgIC8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9ICJjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YiLnNwbGl0KCIsIik7CiAgICB9LCAvKiA1NyAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMikuZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgfSwgLyogNTggKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICB2YXIgZGVmID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMCkuZiwgaGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KSwgVEFHID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1OSkoInRvU3RyaW5nVGFnIik7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgdGFnLCBzdGF0KSB7CiAgICAgICAgICAgIGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykgJiYgZGVmKGl0LCBUQUcsIHsKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICB2YWx1ZTogdGFnCiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICB9LCAvKiA1OSAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIHZhciBzdG9yZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpKCJ3a3MiKSwgdWlkID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyksIFN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpLlN5bWJvbCwgVVNFX1NZTUJPTCA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCwgJGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9IFVTRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdIHx8IChVU0VfU1lNQk9MID8gU3ltYm9sIDogdWlkKSgiU3ltYm9sLiIgKyBuYW1lKSk7CiAgICAgICAgfTsKICAgICAgICAkZXhwb3J0cy5zdG9yZSA9IHN0b3JlOwogICAgfSwgLyogNjAgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fKDYxKTsKICAgICAgICBmb3IgKHZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKSwgaGlkZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpLCBJdGVyYXRvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KSwgVE9fU1RSSU5HX1RBRyA9IF9fd2VicGFja19yZXF1aXJlX18oNTkpKCJ0b1N0cmluZ1RhZyIpLCBjb2xsZWN0aW9ucyA9IFsgIk5vZGVMaXN0IiwgIkRPTVRva2VuTGlzdCIsICJNZWRpYUxpc3QiLCAiU3R5bGVTaGVldExpc3QiLCAiQ1NTUnVsZUxpc3QiIF0sIGkgPSAwOyBpIDwgNTsgaSsrKSB7CiAgICAgICAgICAgIHZhciBOQU1FID0gY29sbGVjdGlvbnNbaV0sIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV0sIHByb3RvID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTsKICAgICAgICAgICAgcHJvdG8gJiYgIXByb3RvW1RPX1NUUklOR19UQUddICYmIGhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpLCBJdGVyYXRvcnNbTkFNRV0gPSBJdGVyYXRvcnMuQXJyYXk7CiAgICAgICAgfQogICAgfSwgLyogNjEgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgdmFyIGFkZFRvVW5zY29wYWJsZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYyKSwgc3RlcCA9IF9fd2VicGFja19yZXF1aXJlX18oNjMpLCBJdGVyYXRvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KSwgdG9JT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MCk7CiAgICAgICAgLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKQogICAgICAgIC8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUua2V5cygpCiAgICAgICAgLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKQogICAgICAgIC8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MSkoQXJyYXksICJBcnJheSIsIGZ1bmN0aW9uKGl0ZXJhdGVkLCBraW5kKSB7CiAgICAgICAgICAgIHRoaXMuX3QgPSB0b0lPYmplY3QoaXRlcmF0ZWQpLCAvLyB0YXJnZXQKICAgICAgICAgICAgdGhpcy5faSA9IDAsIC8vIG5leHQgaW5kZXgKICAgICAgICAgICAgdGhpcy5fayA9IGtpbmQ7CiAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBPID0gdGhpcy5fdCwga2luZCA9IHRoaXMuX2ssIGluZGV4ID0gdGhpcy5faSsrOwogICAgICAgICAgICByZXR1cm4gIU8gfHwgaW5kZXggPj0gTy5sZW5ndGggPyAodGhpcy5fdCA9IHZvaWQgMCwgc3RlcCgxKSkgOiAia2V5cyIgPT0ga2luZCA/IHN0ZXAoMCwgaW5kZXgpIDogInZhbHVlcyIgPT0ga2luZCA/IHN0ZXAoMCwgT1tpbmRleF0pIDogc3RlcCgwLCBbIGluZGV4LCBPW2luZGV4XSBdKTsKICAgICAgICB9LCAidmFsdWVzIiksIC8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNykKICAgICAgICBJdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5LCBhZGRUb1Vuc2NvcGFibGVzKCJrZXlzIiksIGFkZFRvVW5zY29wYWJsZXMoInZhbHVlcyIpLCAKICAgICAgICBhZGRUb1Vuc2NvcGFibGVzKCJlbnRyaWVzIik7CiAgICB9LCAvKiA2MiAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7fTsKICAgIH0sIC8qIDYzICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkb25lLCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICAgICAgZG9uZTogISFkb25lCiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgIH0sIC8qIDY0ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgZXhwb3J0cy5mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1OSk7CiAgICB9LCAvKiA2NSAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIG1vZHVsZS5leHBvcnRzID0gewogICAgICAgICAgICBkZWZhdWx0OiBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2KSwKICAgICAgICAgICAgX19lc01vZHVsZTogITAKICAgICAgICB9OwogICAgfSwgLyogNjYgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fKDY3KSwgX193ZWJwYWNrX3JlcXVpcmVfXyg3OCksIF9fd2VicGFja19yZXF1aXJlX18oNzkpLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwKSwgCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KS5TeW1ib2w7CiAgICB9LCAvKiA2NyAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICAvLyBFQ01BU2NyaXB0IDYgc3ltYm9scyBzaGltCiAgICAgICAgdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpLCBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpLCBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oMjQpLCAkZXhwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSksIHJlZGVmaW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MyksIE1FVEEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4KS5LRVksICRmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oMjUpLCBzaGFyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKSwgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU4KSwgdWlkID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyksIHdrcyA9IF9fd2VicGFja19yZXF1aXJlX18oNTkpLCB3a3NFeHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY0KSwgd2tzRGVmaW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OSksIGtleU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MCksIGVudW1LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MSksIGlzQXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc0KSwgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKSwgdG9JT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MCksIHRvUHJpbWl0aXZlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNyksIGNyZWF0ZURlc2MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4KSwgX2NyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDYpLCBnT1BORXh0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NSksICRHT1BEID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NyksICREUCA9IF9fd2VicGFja19yZXF1aXJlX18oMjApLCAka2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oNDgpLCBnT1BEID0gJEdPUEQuZiwgZFAgPSAkRFAuZiwgZ09QTiA9IGdPUE5FeHQuZiwgJFN5bWJvbCA9IGdsb2JhbC5TeW1ib2wsICRKU09OID0gZ2xvYmFsLkpTT04sIF9zdHJpbmdpZnkgPSAkSlNPTiAmJiAkSlNPTi5zdHJpbmdpZnksIFBST1RPVFlQRSA9ICJwcm90b3R5cGUiLCBISURERU4gPSB3a3MoIl9oaWRkZW4iKSwgVE9fUFJJTUlUSVZFID0gd2tzKCJ0b1ByaW1pdGl2ZSIpLCBpc0VudW0gPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSwgU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoInN5bWJvbC1yZWdpc3RyeSIpLCBBbGxTeW1ib2xzID0gc2hhcmVkKCJzeW1ib2xzIiksIE9QU3ltYm9scyA9IHNoYXJlZCgib3Atc3ltYm9scyIpLCBPYmplY3RQcm90byA9IE9iamVjdFtQUk9UT1RZUEVdLCBVU0VfTkFUSVZFID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgJFN5bWJvbCwgUU9iamVjdCA9IGdsb2JhbC5RT2JqZWN0LCBzZXR0ZXIgPSAhUU9iamVjdCB8fCAhUU9iamVjdFtQUk9UT1RZUEVdIHx8ICFRT2JqZWN0W1BST1RPVFlQRV0uZmluZENoaWxkLCBzZXRTeW1ib2xEZXNjID0gREVTQ1JJUFRPUlMgJiYgJGZhaWxzKGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gNyAhPSBfY3JlYXRlKGRQKHt9LCAiYSIsIHsKICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRQKHRoaXMsICJhIiwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogNwogICAgICAgICAgICAgICAgICAgIH0pLmE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKS5hOwogICAgICAgIH0pID8gZnVuY3Rpb24oaXQsIGtleSwgRCkgewogICAgICAgICAgICB2YXIgcHJvdG9EZXNjID0gZ09QRChPYmplY3RQcm90bywga2V5KTsKICAgICAgICAgICAgcHJvdG9EZXNjICYmIGRlbGV0ZSBPYmplY3RQcm90b1trZXldLCBkUChpdCwga2V5LCBEKSwgcHJvdG9EZXNjICYmIGl0ICE9PSBPYmplY3RQcm90byAmJiBkUChPYmplY3RQcm90bywga2V5LCBwcm90b0Rlc2MpOwogICAgICAgIH0gOiBkUCwgd3JhcCA9IGZ1bmN0aW9uKHRhZykgewogICAgICAgICAgICB2YXIgc3ltID0gQWxsU3ltYm9sc1t0YWddID0gX2NyZWF0ZSgkU3ltYm9sW1BST1RPVFlQRV0pOwogICAgICAgICAgICByZXR1cm4gc3ltLl9rID0gdGFnLCBzeW07CiAgICAgICAgfSwgaXNTeW1ib2wgPSBVU0VfTkFUSVZFICYmICJzeW1ib2wiID09IHR5cGVvZiAkU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24oaXQpIHsKICAgICAgICAgICAgcmV0dXJuICJzeW1ib2wiID09IHR5cGVvZiBpdDsKICAgICAgICB9IDogZnVuY3Rpb24oaXQpIHsKICAgICAgICAgICAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDsKICAgICAgICB9LCAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbihpdCwga2V5LCBEKSB7CiAgICAgICAgICAgIHJldHVybiBpdCA9PT0gT2JqZWN0UHJvdG8gJiYgJGRlZmluZVByb3BlcnR5KE9QU3ltYm9scywga2V5LCBEKSwgYW5PYmplY3QoaXQpLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksICEwKSwgCiAgICAgICAgICAgIGFuT2JqZWN0KEQpLCBoYXMoQWxsU3ltYm9scywga2V5KSA/IChELmVudW1lcmFibGUgPyAoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSAmJiAoaXRbSElEREVOXVtrZXldID0gITEpLCAKICAgICAgICAgICAgRCA9IF9jcmVhdGUoRCwgewogICAgICAgICAgICAgICAgZW51bWVyYWJsZTogY3JlYXRlRGVzYygwLCAhMSkKICAgICAgICAgICAgfSkpIDogKGhhcyhpdCwgSElEREVOKSB8fCBkUChpdCwgSElEREVOLCBjcmVhdGVEZXNjKDEsIHt9KSksIGl0W0hJRERFTl1ba2V5XSA9ICEwKSwgCiAgICAgICAgICAgIHNldFN5bWJvbERlc2MoaXQsIGtleSwgRCkpIDogZFAoaXQsIGtleSwgRCk7CiAgICAgICAgfSwgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbihpdCwgUCkgewogICAgICAgICAgICBhbk9iamVjdChpdCk7CiAgICAgICAgICAgIGZvciAodmFyIGtleSwga2V5cyA9IGVudW1LZXlzKFAgPSB0b0lPYmplY3QoUCkpLCBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBsID4gaTsgKSAkZGVmaW5lUHJvcGVydHkoaXQsIGtleSA9IGtleXNbaSsrXSwgUFtrZXldKTsKICAgICAgICAgICAgcmV0dXJuIGl0OwogICAgICAgIH0sICRjcmVhdGUgPSBmdW5jdGlvbihpdCwgUCkgewogICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBQID8gX2NyZWF0ZShpdCkgOiAkZGVmaW5lUHJvcGVydGllcyhfY3JlYXRlKGl0KSwgUCk7CiAgICAgICAgfSwgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgIHZhciBFID0gaXNFbnVtLmNhbGwodGhpcywga2V5ID0gdG9QcmltaXRpdmUoa2V5LCAhMCkpOwogICAgICAgICAgICByZXR1cm4gISh0aGlzID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSkgJiYgKCEoRSB8fCAhaGFzKHRoaXMsIGtleSkgfHwgIWhhcyhBbGxTeW1ib2xzLCBrZXkpIHx8IGhhcyh0aGlzLCBISURERU4pICYmIHRoaXNbSElEREVOXVtrZXldKSB8fCBFKTsKICAgICAgICB9LCAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24oaXQsIGtleSkgewogICAgICAgICAgICBpZiAoaXQgPSB0b0lPYmplY3QoaXQpLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksICEwKSwgaXQgIT09IE9iamVjdFByb3RvIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXMoT1BTeW1ib2xzLCBrZXkpKSB7CiAgICAgICAgICAgICAgICB2YXIgRCA9IGdPUEQoaXQsIGtleSk7CiAgICAgICAgICAgICAgICByZXR1cm4gIUQgfHwgIWhhcyhBbGxTeW1ib2xzLCBrZXkpIHx8IGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0gfHwgKEQuZW51bWVyYWJsZSA9ICEwKSwgCiAgICAgICAgICAgICAgICBEOwogICAgICAgICAgICB9CiAgICAgICAgfSwgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbihpdCkgewogICAgICAgICAgICBmb3IgKHZhciBrZXksIG5hbWVzID0gZ09QTih0b0lPYmplY3QoaXQpKSwgcmVzdWx0ID0gW10sIGkgPSAwOyBuYW1lcy5sZW5ndGggPiBpOyApIGhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSB8fCBrZXkgPT0gSElEREVOIHx8IGtleSA9PSBNRVRBIHx8IHJlc3VsdC5wdXNoKGtleSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uKGl0KSB7CiAgICAgICAgICAgIGZvciAodmFyIGtleSwgSVNfT1AgPSBpdCA9PT0gT2JqZWN0UHJvdG8sIG5hbWVzID0gZ09QTihJU19PUCA/IE9QU3ltYm9scyA6IHRvSU9iamVjdChpdCkpLCByZXN1bHQgPSBbXSwgaSA9IDA7IG5hbWVzLmxlbmd0aCA+IGk7ICkgIWhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSB8fCBJU19PUCAmJiAhaGFzKE9iamVjdFByb3RvLCBrZXkpIHx8IHJlc3VsdC5wdXNoKEFsbFN5bWJvbHNba2V5XSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfTsKICAgICAgICAvLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSkKICAgICAgICBVU0VfTkFUSVZFIHx8ICgkU3ltYm9sID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgJFN5bWJvbCkgdGhyb3cgVHlwZUVycm9yKCJTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhIik7CiAgICAgICAgICAgIHZhciB0YWcgPSB1aWQoYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB2b2lkIDApLCAkc2V0ID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXMgPT09IE9iamVjdFByb3RvICYmICRzZXQuY2FsbChPUFN5bWJvbHMsIHZhbHVlKSwgaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSAmJiAodGhpc1tISURERU5dW3RhZ10gPSAhMSksIAogICAgICAgICAgICAgICAgc2V0U3ltYm9sRGVzYyh0aGlzLCB0YWcsIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIERFU0NSSVBUT1JTICYmIHNldHRlciAmJiBzZXRTeW1ib2xEZXNjKE9iamVjdFByb3RvLCB0YWcsIHsKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICBzZXQ6ICRzZXQKICAgICAgICAgICAgfSksIHdyYXAodGFnKTsKICAgICAgICB9LCByZWRlZmluZSgkU3ltYm9sW1BST1RPVFlQRV0sICJ0b1N0cmluZyIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fazsKICAgICAgICB9KSwgJEdPUEQuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsICREUC5mID0gJGRlZmluZVByb3BlcnR5LCBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2KS5mID0gZ09QTkV4dC5mID0gJGdldE93blByb3BlcnR5TmFtZXMsIAogICAgICAgIF9fd2VicGFja19yZXF1aXJlX18oNzMpLmYgPSAkcHJvcGVydHlJc0VudW1lcmFibGUsIF9fd2VicGFja19yZXF1aXJlX18oNzIpLmYgPSAkZ2V0T3duUHJvcGVydHlTeW1ib2xzLCAKICAgICAgICBERVNDUklQVE9SUyAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXyg0MikgJiYgcmVkZWZpbmUoT2JqZWN0UHJvdG8sICJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgITApLCAKICAgICAgICB3a3NFeHQuZiA9IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHdyYXAod2tzKG5hbWUpKTsKICAgICAgICB9KSwgJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgewogICAgICAgICAgICBTeW1ib2w6ICRTeW1ib2wKICAgICAgICB9KTsKICAgICAgICBmb3IgKHZhciBzeW1ib2xzID0gImhhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzIi5zcGxpdCgiLCIpLCBpID0gMDsgc3ltYm9scy5sZW5ndGggPiBpOyApIHdrcyhzeW1ib2xzW2krK10pOwogICAgICAgIGZvciAodmFyIHN5bWJvbHMgPSAka2V5cyh3a3Muc3RvcmUpLCBpID0gMDsgc3ltYm9scy5sZW5ndGggPiBpOyApIHdrc0RlZmluZShzeW1ib2xzW2krK10pOwogICAgICAgICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICJTeW1ib2wiLCB7CiAgICAgICAgICAgIC8vIDE5LjQuMi4xIFN5bWJvbC5mb3Ioa2V5KQogICAgICAgICAgICBmb3I6IGZ1bmN0aW9uKGtleSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGhhcyhTeW1ib2xSZWdpc3RyeSwga2V5ICs9ICIiKSA/IFN5bWJvbFJlZ2lzdHJ5W2tleV0gOiBTeW1ib2xSZWdpc3RyeVtrZXldID0gJFN5bWJvbChrZXkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSkKICAgICAgICAgICAga2V5Rm9yOiBmdW5jdGlvbihrZXkpIHsKICAgICAgICAgICAgICAgIGlmIChpc1N5bWJvbChrZXkpKSByZXR1cm4ga2V5T2YoU3ltYm9sUmVnaXN0cnksIGtleSk7CiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3Ioa2V5ICsgIiBpcyBub3QgYSBzeW1ib2whIik7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHVzZVNldHRlcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBzZXR0ZXIgPSAhMDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdXNlU2ltcGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHNldHRlciA9ICExOwogICAgICAgICAgICB9CiAgICAgICAgfSksICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICJPYmplY3QiLCB7CiAgICAgICAgICAgIC8vIDE5LjEuMi4yIE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSkKICAgICAgICAgICAgY3JlYXRlOiAkY3JlYXRlLAogICAgICAgICAgICAvLyAxOS4xLjIuNCBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykKICAgICAgICAgICAgZGVmaW5lUHJvcGVydHk6ICRkZWZpbmVQcm9wZXJ0eSwKICAgICAgICAgICAgLy8gMTkuMS4yLjMgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykKICAgICAgICAgICAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsCiAgICAgICAgICAgIC8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkKICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLAogICAgICAgICAgICAvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKQogICAgICAgICAgICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkZ2V0T3duUHJvcGVydHlOYW1lcywKICAgICAgICAgICAgLy8gMTkuMS4yLjggT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPKQogICAgICAgICAgICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMKICAgICAgICB9KSwgLy8gMjQuMy4yIEpTT04uc3RyaW5naWZ5KHZhbHVlIFssIHJlcGxhY2VyIFssIHNwYWNlXV0pCiAgICAgICAgJEpTT04gJiYgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoIVVTRV9OQVRJVkUgfHwgJGZhaWxzKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgUyA9ICRTeW1ib2woKTsKICAgICAgICAgICAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge30KICAgICAgICAgICAgLy8gV2ViS2l0IGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyBudWxsCiAgICAgICAgICAgIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzCiAgICAgICAgICAgIHJldHVybiAiW251bGxdIiAhPSBfc3RyaW5naWZ5KFsgUyBdKSB8fCAie30iICE9IF9zdHJpbmdpZnkoewogICAgICAgICAgICAgICAgYTogUwogICAgICAgICAgICB9KSB8fCAie30iICE9IF9zdHJpbmdpZnkoT2JqZWN0KFMpKTsKICAgICAgICB9KSksICJKU09OIiwgewogICAgICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uKGl0KSB7CiAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBpdCAmJiAhaXNTeW1ib2woaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICgvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcGxhY2VyLCAkcmVwbGFjZXIsIGFyZ3MgPSBbIGl0IF0sIGkgPSAxOyBhcmd1bWVudHMubGVuZ3RoID4gaTsgKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXBsYWNlciA9IGFyZ3NbMV0sICJmdW5jdGlvbiIgPT0gdHlwZW9mIHJlcGxhY2VyICYmICgkcmVwbGFjZXIgPSByZXBsYWNlciksIAogICAgICAgICAgICAgICAgICAgICEkcmVwbGFjZXIgJiYgaXNBcnJheShyZXBsYWNlcikgfHwgKHJlcGxhY2VyID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJlcGxhY2VyICYmICh2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpKSwgIWlzU3ltYm9sKHZhbHVlKSkgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0pLCBhcmdzWzFdID0gcmVwbGFjZXIsIF9zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSksIC8vIDE5LjQuMy40IFN5bWJvbC5wcm90b3R5cGVbQEB0b1ByaW1pdGl2ZV0oaGludCkKICAgICAgICAkU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSB8fCBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KSgkU3ltYm9sW1BST1RPVFlQRV0sIFRPX1BSSU1JVElWRSwgJFN5bWJvbFtQUk9UT1RZUEVdLnZhbHVlT2YpLCAKICAgICAgICAvLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddCiAgICAgICAgc2V0VG9TdHJpbmdUYWcoJFN5bWJvbCwgIlN5bWJvbCIpLCAvLyAyMC4yLjEuOSBNYXRoW0BAdG9TdHJpbmdUYWddCiAgICAgICAgc2V0VG9TdHJpbmdUYWcoTWF0aCwgIk1hdGgiLCAhMCksIC8vIDI0LjMuMyBKU09OW0BAdG9TdHJpbmdUYWddCiAgICAgICAgc2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICJKU09OIiwgITApOwogICAgfSwgLyogNjggKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICB2YXIgTUVUQSA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpKCJtZXRhIiksIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMiksIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oOSksIHNldERlc2MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKS5mLCBpZCA9IDAsIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICB9LCBGUkVFWkUgPSAhX193ZWJwYWNrX3JlcXVpcmVfXygyNSkoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBpc0V4dGVuc2libGUoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KSk7CiAgICAgICAgfSksIHNldE1ldGEgPSBmdW5jdGlvbihpdCkgewogICAgICAgICAgICBzZXREZXNjKGl0LCBNRVRBLCB7CiAgICAgICAgICAgICAgICB2YWx1ZTogewogICAgICAgICAgICAgICAgICAgIGk6ICJPIiArICsraWQsCiAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0IElECiAgICAgICAgICAgICAgICAgICAgdzoge30KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgZmFzdEtleSA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpIHsKICAgICAgICAgICAgLy8gcmV0dXJuIHByaW1pdGl2ZSB3aXRoIHByZWZpeAogICAgICAgICAgICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuICJzeW1ib2wiID09IHR5cGVvZiBpdCA/IGl0IDogKCJzdHJpbmciID09IHR5cGVvZiBpdCA/ICJTIiA6ICJQIikgKyBpdDsKICAgICAgICAgICAgaWYgKCFoYXMoaXQsIE1FVEEpKSB7CiAgICAgICAgICAgICAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdAogICAgICAgICAgICAgICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gIkYiOwogICAgICAgICAgICAgICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGEKICAgICAgICAgICAgICAgIGlmICghY3JlYXRlKSByZXR1cm4gIkUiOwogICAgICAgICAgICAgICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGEKICAgICAgICAgICAgICAgIHNldE1ldGEoaXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpdFtNRVRBXS5pOwogICAgICAgIH0sIGdldFdlYWsgPSBmdW5jdGlvbihpdCwgY3JlYXRlKSB7CiAgICAgICAgICAgIGlmICghaGFzKGl0LCBNRVRBKSkgewogICAgICAgICAgICAgICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3QKICAgICAgICAgICAgICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGEKICAgICAgICAgICAgICAgIGlmICghY3JlYXRlKSByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YQogICAgICAgICAgICAgICAgc2V0TWV0YShpdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGl0W01FVEFdLnc7CiAgICAgICAgfSwgb25GcmVlemUgPSBmdW5jdGlvbihpdCkgewogICAgICAgICAgICByZXR1cm4gRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEEpICYmIHNldE1ldGEoaXQpLCAKICAgICAgICAgICAgaXQ7CiAgICAgICAgfSwgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0gewogICAgICAgICAgICBLRVk6IE1FVEEsCiAgICAgICAgICAgIE5FRUQ6ICExLAogICAgICAgICAgICBmYXN0S2V5OiBmYXN0S2V5LAogICAgICAgICAgICBnZXRXZWFrOiBnZXRXZWFrLAogICAgICAgICAgICBvbkZyZWV6ZTogb25GcmVlemUKICAgICAgICB9OwogICAgfSwgLyogNjkgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICB2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMiksIGNvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KSwgTElCUkFSWSA9IF9fd2VicGFja19yZXF1aXJlX18oNDIpLCB3a3NFeHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY0KSwgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKS5mOwogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obmFtZSkgewogICAgICAgICAgICB2YXIgJFN5bWJvbCA9IGNvcmUuU3ltYm9sIHx8IChjb3JlLlN5bWJvbCA9IExJQlJBUlkgPyB7fSA6IGdsb2JhbC5TeW1ib2wgfHwge30pOwogICAgICAgICAgICAiXyIgPT0gbmFtZS5jaGFyQXQoMCkgfHwgbmFtZSBpbiAkU3ltYm9sIHx8IGRlZmluZVByb3BlcnR5KCRTeW1ib2wsIG5hbWUsIHsKICAgICAgICAgICAgICAgIHZhbHVlOiB3a3NFeHQuZihuYW1lKQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgfSwgLyogNzAgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICB2YXIgZ2V0S2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oNDgpLCB0b0lPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwKTsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgZWwpIHsKICAgICAgICAgICAgZm9yICh2YXIga2V5LCBPID0gdG9JT2JqZWN0KG9iamVjdCksIGtleXMgPSBnZXRLZXlzKE8pLCBsZW5ndGggPSBrZXlzLmxlbmd0aCwgaW5kZXggPSAwOyBsZW5ndGggPiBpbmRleDsgKSBpZiAoT1trZXkgPSBrZXlzW2luZGV4KytdXSA9PT0gZWwpIHJldHVybiBrZXk7CiAgICAgICAgfTsKICAgIH0sIC8qIDcxICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgLy8gYWxsIGVudW1lcmFibGUgb2JqZWN0IGtleXMsIGluY2x1ZGVzIHN5bWJvbHMKICAgICAgICB2YXIgZ2V0S2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oNDgpLCBnT1BTID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MiksIHBJRSA9IF9fd2VicGFja19yZXF1aXJlX18oNzMpOwogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpIHsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGdldEtleXMoaXQpLCBnZXRTeW1ib2xzID0gZ09QUy5mOwogICAgICAgICAgICBpZiAoZ2V0U3ltYm9scykgZm9yICh2YXIga2V5LCBzeW1ib2xzID0gZ2V0U3ltYm9scyhpdCksIGlzRW51bSA9IHBJRS5mLCBpID0gMDsgc3ltYm9scy5sZW5ndGggPiBpOyApIGlzRW51bS5jYWxsKGl0LCBrZXkgPSBzeW1ib2xzW2krK10pICYmIHJlc3VsdC5wdXNoKGtleSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfTsKICAgIH0sIC8qIDcyICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CiAgICAgICAgZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sczsKICAgIH0sIC8qIDczICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CiAgICAgICAgZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7CiAgICB9LCAvKiA3NCAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIC8vIDcuMi4yIElzQXJyYXkoYXJndW1lbnQpCiAgICAgICAgdmFyIGNvZiA9IF9fd2VicGFja19yZXF1aXJlX18oNTIpOwogICAgICAgIG1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbihhcmcpIHsKICAgICAgICAgICAgcmV0dXJuICJBcnJheSIgPT0gY29mKGFyZyk7CiAgICAgICAgfTsKICAgIH0sIC8qIDc1ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvdwogICAgICAgIHZhciB0b0lPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwKSwgZ09QTiA9IF9fd2VicGFja19yZXF1aXJlX18oNzYpLmYsIHRvU3RyaW5nID0ge30udG9TdHJpbmcsIHdpbmRvd05hbWVzID0gIm9iamVjdCIgPT0gdHlwZW9mIHdpbmRvdyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW10sIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24oaXQpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBnT1BOKGl0KTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIG1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbihpdCkgewogICAgICAgICAgICByZXR1cm4gd2luZG93TmFtZXMgJiYgIltvYmplY3QgV2luZG93XSIgPT0gdG9TdHJpbmcuY2FsbChpdCkgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpOwogICAgICAgIH07CiAgICB9LCAvKiA3NiAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIC8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTykKICAgICAgICB2YXIgJGtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5KSwgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oNTYpLmNvbmNhdCgibGVuZ3RoIiwgInByb3RvdHlwZSIpOwogICAgICAgIGV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uKE8pIHsKICAgICAgICAgICAgcmV0dXJuICRrZXlzKE8sIGhpZGRlbktleXMpOwogICAgICAgIH07CiAgICB9LCAvKiA3NyAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIHZhciBwSUUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDczKSwgY3JlYXRlRGVzYyA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpLCB0b0lPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwKSwgdG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KSwgaGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KSwgSUU4X0RPTV9ERUZJTkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKSwgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICAgICAgZXhwb3J0cy5mID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCkgPyBnT1BEIDogZnVuY3Rpb24oTywgUCkgewogICAgICAgICAgICBpZiAoTyA9IHRvSU9iamVjdChPKSwgUCA9IHRvUHJpbWl0aXZlKFAsICEwKSwgSUU4X0RPTV9ERUZJTkUpIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ09QRChPLCBQKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgICAgICAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZURlc2MoIXBJRS5mLmNhbGwoTywgUCksIE9bUF0pOwogICAgICAgIH07CiAgICB9LCAvKiA3OCAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge30sIC8qIDc5ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXyg2OSkoImFzeW5jSXRlcmF0b3IiKTsKICAgIH0sIC8qIDgwICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXyg2OSkoIm9ic2VydmFibGUiKTsKICAgIH0sIC8qIDgxICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvYmoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5fX2VzTW9kdWxlID0gITA7CiAgICAgICAgdmFyIF9zZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oODIpLCBfc2V0UHJvdG90eXBlT2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2V0UHJvdG90eXBlT2YpLCBfY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NiksIF9jcmVhdGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlKSwgX3R5cGVvZjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM1KSwgX3R5cGVvZjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90eXBlb2YyKTsKICAgICAgICBleHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbihzdWJDbGFzcywgc3VwZXJDbGFzcykgewogICAgICAgICAgICBpZiAoImZ1bmN0aW9uIiAhPSB0eXBlb2Ygc3VwZXJDbGFzcyAmJiBudWxsICE9PSBzdXBlckNsYXNzKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIgKyAoInVuZGVmaW5lZCIgPT0gdHlwZW9mIHN1cGVyQ2xhc3MgPyAidW5kZWZpbmVkIiA6ICgwLCAKICAgICAgICAgICAgX3R5cGVvZjMuZGVmYXVsdCkoc3VwZXJDbGFzcykpKTsKICAgICAgICAgICAgc3ViQ2xhc3MucHJvdG90eXBlID0gKDAsIF9jcmVhdGUyLmRlZmF1bHQpKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsKICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHN1YkNsYXNzLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICExLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pLCBzdXBlckNsYXNzICYmIChfc2V0UHJvdG90eXBlT2YyLmRlZmF1bHQgPyAoMCwgX3NldFByb3RvdHlwZU9mMi5kZWZhdWx0KShzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzKTsKICAgICAgICB9OwogICAgfSwgLyogODIgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgZGVmYXVsdDogX193ZWJwYWNrX3JlcXVpcmVfXyg4MyksCiAgICAgICAgICAgIF9fZXNNb2R1bGU6ICEwCiAgICAgICAgfTsKICAgIH0sIC8qIDgzICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXyg4NCksIG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNikuT2JqZWN0LnNldFByb3RvdHlwZU9mOwogICAgfSwgLyogODQgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAvLyAxOS4xLjMuMTkgT2JqZWN0LnNldFByb3RvdHlwZU9mKE8sIHByb3RvKQogICAgICAgIHZhciAkZXhwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSk7CiAgICAgICAgJGV4cG9ydCgkZXhwb3J0LlMsICJPYmplY3QiLCB7CiAgICAgICAgICAgIHNldFByb3RvdHlwZU9mOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1KS5zZXQKICAgICAgICB9KTsKICAgIH0sIC8qIDg1ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuCiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi8KICAgICAgICB2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKSwgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKSwgY2hlY2sgPSBmdW5jdGlvbihPLCBwcm90bykgewogICAgICAgICAgICBpZiAoYW5PYmplY3QoTyksICFpc09iamVjdChwcm90bykgJiYgbnVsbCAhPT0gcHJvdG8pIHRocm93IFR5cGVFcnJvcihwcm90byArICI6IGNhbid0IHNldCBhcyBwcm90b3R5cGUhIik7CiAgICAgICAgfTsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgc2V0OiBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCJfX3Byb3RvX18iIGluIHt9ID8gLy8gZXNsaW50LWRpc2FibGUtbGluZQogICAgICAgICAgICBmdW5jdGlvbih0ZXN0LCBidWdneSwgc2V0KSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHNldCA9IF9fd2VicGFja19yZXF1aXJlX18oMTcpKEZ1bmN0aW9uLmNhbGwsIF9fd2VicGFja19yZXF1aXJlX18oNzcpLmYoT2JqZWN0LnByb3RvdHlwZSwgIl9fcHJvdG9fXyIpLnNldCwgMiksIAogICAgICAgICAgICAgICAgICAgIHNldCh0ZXN0LCBbXSksIGJ1Z2d5ID0gISh0ZXN0IGluc3RhbmNlb2YgQXJyYXkpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIGJ1Z2d5ID0gITA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oTywgcHJvdG8pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2soTywgcHJvdG8pLCBidWdneSA/IE8uX19wcm90b19fID0gcHJvdG8gOiBzZXQoTywgcHJvdG8pLCBPOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSh7fSwgITEpIDogdm9pZCAwKSwKICAgICAgICAgICAgY2hlY2s6IGNoZWNrCiAgICAgICAgfTsKICAgIH0sIC8qIDg2ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7CiAgICAgICAgICAgIGRlZmF1bHQ6IF9fd2VicGFja19yZXF1aXJlX18oODcpLAogICAgICAgICAgICBfX2VzTW9kdWxlOiAhMAogICAgICAgIH07CiAgICB9LCAvKiA4NyAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIF9fd2VicGFja19yZXF1aXJlX18oODgpOwogICAgICAgIHZhciAkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNikuT2JqZWN0OwogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oUCwgRCkgewogICAgICAgICAgICByZXR1cm4gJE9iamVjdC5jcmVhdGUoUCwgRCk7CiAgICAgICAgfTsKICAgIH0sIC8qIDg4ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgdmFyICRleHBvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KTsKICAgICAgICAvLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSkKICAgICAgICAkZXhwb3J0KCRleHBvcnQuUywgIk9iamVjdCIsIHsKICAgICAgICAgICAgY3JlYXRlOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ2KQogICAgICAgIH0pOwogICAgfSwgLyogODkgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICBmdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiID09IHR5cGVvZiBvYmplY3QgJiYgbnVsbCAhPT0gb2JqZWN0ICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFOwogICAgICAgIH0KICAgICAgICAvKioKCSAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCgkgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgoJICoKCSAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQoJICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CgkgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KCSAqLwogICAgICAgIHZhciBmYWN0b3J5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MCksIFJFQUNUX0VMRU1FTlRfVFlQRSA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wuZm9yICYmIFN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKSB8fCA2MDEwMzsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoaXNWYWxpZEVsZW1lbnQpOwogICAgfSwgLyogOTAgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8KICAgICAgICAoZnVuY3Rpb24ocHJvY2VzcykgewogICAgICAgICAgICAvKioKCSAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCgkgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgoJICoKCSAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQoJICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CgkgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KCSAqLwogICAgICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgICAgIHZhciBlbXB0eUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MiksIGludmFyaWFudCA9IF9fd2VicGFja19yZXF1aXJlX18oOTMpLCB3YXJuaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NCksIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NSksIGNoZWNrUHJvcFR5cGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Nik7CiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXNWYWxpZEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIC8vIEJlZm9yZSBTeW1ib2wgc3BlYy4KICAgICAgICAgICAgICAgIC8qKgoJICAgKiBSZXR1cm5zIHRoZSBpdGVyYXRvciBtZXRob2QgZnVuY3Rpb24gY29udGFpbmVkIG9uIHRoZSBpdGVyYWJsZSBvYmplY3QuCgkgICAqCgkgICAqIEJlIHN1cmUgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBpdGVyYWJsZSBhcyBjb250ZXh0OgoJICAgKgoJICAgKiAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG15SXRlcmFibGUpOwoJICAgKiAgICAgaWYgKGl0ZXJhdG9yRm4pIHsKCSAgICogICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG15SXRlcmFibGUpOwoJICAgKiAgICAgICAuLi4KCSAgICogICAgIH0KCSAgICoKCSAgICogQHBhcmFtIHs/b2JqZWN0fSBtYXliZUl0ZXJhYmxlCgkgICAqIEByZXR1cm4gez9mdW5jdGlvbn0KCSAgICovCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlcmF0b3JGbiA9IG1heWJlSXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pOwogICAgICAgICAgICAgICAgICAgIGlmICgiZnVuY3Rpb24iID09IHR5cGVvZiBpdGVyYXRvckZuKSByZXR1cm4gaXRlcmF0b3JGbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKgoJICAgKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duCgkgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pcwoJICAgKi8KICAgICAgICAgICAgICAgIC8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlKi8KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGlzKHgsIHkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtCiAgICAgICAgICAgICAgICAgICAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobQogICAgICAgICAgICAgICAgICAgIHJldHVybiB4ID09PSB5ID8gMCAhPT0geCB8fCAxIC8geCA9PT0gMSAvIHkgOiB4ICE9PSB4ICYmIHkgIT09IHk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKmVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlKi8KICAgICAgICAgICAgICAgIC8qKgoJICAgKiBXZSB1c2UgYW4gRXJyb3ItbGlrZSBvYmplY3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYXMgcGVvcGxlIG1heSBjYWxsCgkgICAqIFByb3BUeXBlcyBkaXJlY3RseSBhbmQgaW5zcGVjdCB0aGVpciBvdXRwdXQuIEhvd2V2ZXIsIHdlIGRvbid0IHVzZSByZWFsCgkgICAqIEVycm9ycyBhbnltb3JlLiBXZSBkb24ndCBpbnNwZWN0IHRoZWlyIHN0YWNrIGFueXdheSwgYW5kIGNyZWF0aW5nIHRoZW0KCSAgICogaXMgcHJvaGliaXRpdmVseSBleHBlbnNpdmUgaWYgdGhleSBhcmUgY3JlYXRlZCB0b28gb2Z0ZW4sIHN1Y2ggYXMgd2hhdAoJICAgKiBoYXBwZW5zIGluIG9uZU9mVHlwZSgpIGZvciBhbnkgdHlwZSBiZWZvcmUgdGhlIG9uZSB0aGF0IG1hdGNoZWQuCgkgICAqLwogICAgICAgICAgICAgICAgZnVuY3Rpb24gUHJvcFR5cGVFcnJvcihtZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSwgdGhpcy5zdGFjayA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjaGVja1R5cGUoaXNSZXF1aXJlZCwgcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lIHx8IEFOT05ZTU9VUywgcHJvcEZ1bGxOYW1lID0gcHJvcEZ1bGxOYW1lIHx8IHByb3BOYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgInByb2R1Y3Rpb24iICE9PSBwcm9jZXNzLmVudi5OT0RFX0VOViAmJiBzZWNyZXQgIT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0ICYmICJ1bmRlZmluZWQiICE9IHR5cGVvZiBjb25zb2xlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBjb21wb25lbnROYW1lICsgIjoiICsgcHJvcE5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gfHwgKCJwcm9kdWN0aW9uIiAhPT0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPyB3YXJuaW5nKCExLCAiWW91IGFyZSBtYW51YWxseSBjYWxsaW5nIGEgUmVhY3QuUHJvcFR5cGVzIHZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgJXNgIHByb3Agb24gYCVzYC4gVGhpcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIG5vdCB3b3JrIGluIHByb2R1Y3Rpb24gd2l0aCB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uLiBZb3UgbWF5IGJlIHNlZWluZyB0aGlzIHdhcm5pbmcgZHVlIHRvIGEgdGhpcmQtcGFydHkgUHJvcFR5cGVzIGxpYnJhcnkuIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmctZG9udC1jYWxsLXByb3B0eXBlcyBmb3IgZGV0YWlscy4iLCBwcm9wRnVsbE5hbWUsIGNvbXBvbmVudE5hbWUpIDogdm9pZCAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBwcm9wc1twcm9wTmFtZV0gPyBpc1JlcXVpcmVkID8gbmV3IFByb3BUeXBlRXJyb3IobnVsbCA9PT0gcHJvcHNbcHJvcE5hbWVdID8gIlRoZSAiICsgbG9jYXRpb24gKyAiIGAiICsgcHJvcEZ1bGxOYW1lICsgImAgaXMgbWFya2VkIGFzIHJlcXVpcmVkICIgKyAoImluIGAiICsgY29tcG9uZW50TmFtZSArICJgLCBidXQgaXRzIHZhbHVlIGlzIGBudWxsYC4iKSA6ICJUaGUgIiArIGxvY2F0aW9uICsgIiBgIiArIHByb3BGdWxsTmFtZSArICJgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiAiICsgKCJgIiArIGNvbXBvbmVudE5hbWUgKyAiYCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC4iKSkgOiBudWxsIDogdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCJwcm9kdWN0aW9uIiAhPT0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYpIHZhciBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIHZhciBjaGFpbmVkQ2hlY2tUeXBlID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgITEpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFpbmVkQ2hlY2tUeXBlLmlzUmVxdWlyZWQgPSBjaGVja1R5cGUuYmluZChudWxsLCAhMCksIGNoYWluZWRDaGVja1R5cGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcihleHBlY3RlZFR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdLCBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wVHlwZSAhPT0gZXhwZWN0ZWRUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgcHJvcFZhbHVlYCBiZWluZyBpbnN0YW5jZSBvZiwgc2F5LCBkYXRlL3JlZ2V4cCwgcGFzcyB0aGUgJ29iamVjdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrLCBidXQgd2UgY2FuIG9mZmVyIGEgbW9yZSBwcmVjaXNlIGVycm9yIG1lc3NhZ2UgaGVyZSByYXRoZXIgdGhhbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ29mIHR5cGUgYG9iamVjdGAnLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZWNpc2VUeXBlID0gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcigiSW52YWxpZCAiICsgbG9jYXRpb24gKyAiIGAiICsgcHJvcEZ1bGxOYW1lICsgImAgb2YgdHlwZSAiICsgKCJgIiArIHByZWNpc2VUeXBlICsgImAgc3VwcGxpZWQgdG8gYCIgKyBjb21wb25lbnROYW1lICsgImAsIGV4cGVjdGVkICIpICsgKCJgIiArIGV4cGVjdGVkVHlwZSArICJgLiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUFueVR5cGVDaGVja2VyKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcihlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJmdW5jdGlvbiIgIT0gdHlwZW9mIHR5cGVDaGVja2VyKSByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoIlByb3BlcnR5IGAiICsgcHJvcEZ1bGxOYW1lICsgImAgb2YgY29tcG9uZW50IGAiICsgY29tcG9uZW50TmFtZSArICJgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBhcnJheU9mLiIpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcigiSW52YWxpZCAiICsgbG9jYXRpb24gKyAiIGAiICsgcHJvcEZ1bGxOYW1lICsgImAgb2YgdHlwZSAiICsgKCJgIiArIHByb3BUeXBlICsgImAgc3VwcGxpZWQgdG8gYCIgKyBjb21wb25lbnROYW1lICsgImAsIGV4cGVjdGVkIGFuIGFycmF5LiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BWYWx1ZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBpLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgIlsiICsgaSArICJdIiwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBlcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCJJbnZhbGlkICIgKyBsb2NhdGlvbiArICIgYCIgKyBwcm9wRnVsbE5hbWUgKyAiYCBvZiB0eXBlICIgKyAoImAiICsgcHJvcFR5cGUgKyAiYCBzdXBwbGllZCB0byBgIiArIGNvbXBvbmVudE5hbWUgKyAiYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50LiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIoZXhwZWN0ZWRDbGFzcykgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShwcm9wc1twcm9wTmFtZV0gaW5zdGFuY2VvZiBleHBlY3RlZENsYXNzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4cGVjdGVkQ2xhc3NOYW1lID0gZXhwZWN0ZWRDbGFzcy5uYW1lIHx8IEFOT05ZTU9VUywgYWN0dWFsQ2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKHByb3BzW3Byb3BOYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoIkludmFsaWQgIiArIGxvY2F0aW9uICsgIiBgIiArIHByb3BGdWxsTmFtZSArICJgIG9mIHR5cGUgIiArICgiYCIgKyBhY3R1YWxDbGFzc05hbWUgKyAiYCBzdXBwbGllZCB0byBgIiArIGNvbXBvbmVudE5hbWUgKyAiYCwgZXhwZWN0ZWQgIikgKyAoImluc3RhbmNlIG9mIGAiICsgZXhwZWN0ZWRDbGFzc05hbWUgKyAiYC4iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIoZXhwZWN0ZWRWYWx1ZXMpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdLCBpID0gMDsgaSA8IGV4cGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSBpZiAoaXMocHJvcFZhbHVlLCBleHBlY3RlZFZhbHVlc1tpXSkpIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWRWYWx1ZXMpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoIkludmFsaWQgIiArIGxvY2F0aW9uICsgIiBgIiArIHByb3BGdWxsTmFtZSArICJgIG9mIHZhbHVlIGAiICsgcHJvcFZhbHVlICsgImAgIiArICgic3VwcGxpZWQgdG8gYCIgKyBjb21wb25lbnROYW1lICsgImAsIGV4cGVjdGVkIG9uZSBvZiAiICsgdmFsdWVzU3RyaW5nICsgIi4iKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGV4cGVjdGVkVmFsdWVzKSA/IGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKSA6ICgicHJvZHVjdGlvbiIgIT09IHByb2Nlc3MuZW52Lk5PREVfRU5WID8gd2FybmluZyghMSwgIkludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LiIpIDogdm9pZCAwLCAKICAgICAgICAgICAgICAgICAgICBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgiZnVuY3Rpb24iICE9IHR5cGVvZiB0eXBlQ2hlY2tlcikgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCJQcm9wZXJ0eSBgIiArIHByb3BGdWxsTmFtZSArICJgIG9mIGNvbXBvbmVudCBgIiArIGNvbXBvbmVudE5hbWUgKyAiYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgb2JqZWN0T2YuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV0sIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJvYmplY3QiICE9PSBwcm9wVHlwZSkgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCJJbnZhbGlkICIgKyBsb2NhdGlvbiArICIgYCIgKyBwcm9wRnVsbE5hbWUgKyAiYCBvZiB0eXBlICIgKyAoImAiICsgcHJvcFR5cGUgKyAiYCBzdXBwbGllZCB0byBgIiArIGNvbXBvbmVudE5hbWUgKyAiYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHByb3BWYWx1ZSkgaWYgKHByb3BWYWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICIuIiArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBlcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIoYXJyYXlPZlR5cGVDaGVja2VycykgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGVja2VyID0gYXJyYXlPZlR5cGVDaGVja2Vyc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGNoZWNrZXIocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBSZWFjdFByb3BUeXBlc1NlY3JldCkpIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcigiSW52YWxpZCAiICsgbG9jYXRpb24gKyAiIGAiICsgcHJvcEZ1bGxOYW1lICsgImAgc3VwcGxpZWQgdG8gIiArICgiYCIgKyBjb21wb25lbnROYW1lICsgImAuIikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhcnJheU9mVHlwZUNoZWNrZXJzKSA/IGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKSA6ICgicHJvZHVjdGlvbiIgIT09IHByb2Nlc3MuZW52Lk5PREVfRU5WID8gd2FybmluZyghMSwgIkludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2ZUeXBlLCBleHBlY3RlZCBhbiBpbnN0YW5jZSBvZiBhcnJheS4iKSA6IHZvaWQgMCwgCiAgICAgICAgICAgICAgICAgICAgZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gY3JlYXRlTm9kZUNoZWNrZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc05vZGUocHJvcHNbcHJvcE5hbWVdKSA/IG51bGwgOiBuZXcgUHJvcFR5cGVFcnJvcigiSW52YWxpZCAiICsgbG9jYXRpb24gKyAiIGAiICsgcHJvcEZ1bGxOYW1lICsgImAgc3VwcGxpZWQgdG8gIiArICgiYCIgKyBjb21wb25lbnROYW1lICsgImAsIGV4cGVjdGVkIGEgUmVhY3ROb2RlLiIpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdLCBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgib2JqZWN0IiAhPT0gcHJvcFR5cGUpIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcigiSW52YWxpZCAiICsgbG9jYXRpb24gKyAiIGAiICsgcHJvcEZ1bGxOYW1lICsgImAgb2YgdHlwZSBgIiArIHByb3BUeXBlICsgImAgIiArICgic3VwcGxpZWQgdG8gYCIgKyBjb21wb25lbnROYW1lICsgImAsIGV4cGVjdGVkIGBvYmplY3RgLiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNoYXBlVHlwZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBjaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgIi4iICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpc05vZGUocHJvcFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgcHJvcFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICJudW1iZXIiOgogICAgICAgICAgICAgICAgICAgICAgY2FzZSAic3RyaW5nIjoKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInVuZGVmaW5lZCI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKCiAgICAgICAgICAgICAgICAgICAgICBjYXNlICJib29sZWFuIjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFwcm9wVmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgY2FzZSAib2JqZWN0IjoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkgcmV0dXJuIHByb3BWYWx1ZS5ldmVyeShpc05vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gcHJvcFZhbHVlIHx8IGlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKHByb3BWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXRlcmF0b3JGbikgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcCwgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwocHJvcFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IHByb3BWYWx1ZS5lbnRyaWVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDshKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7ICkgaWYgKCFpc05vZGUoc3RlcC52YWx1ZSkpIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0dXBsZXMgcmF0aGVyIHRoYW4gdmFsdWVzLgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDshKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSAmJiAhaXNOb2RlKGVudHJ5WzFdKSkgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKCiAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIC8vIE5hdGl2ZSBTeW1ib2wuCiAgICAgICAgICAgICAgICAgICAgLy8gTmF0aXZlIFN5bWJvbC4KICAgICAgICAgICAgICAgICAgICAvLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddID09PSAnU3ltYm9sJwogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3ltYm9sIiA9PT0gcHJvcFR5cGUgfHwgKCJTeW1ib2wiID09PSBwcm9wVmFsdWVbIkBAdG9TdHJpbmdUYWciXSB8fCAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgcHJvcFZhbHVlIGluc3RhbmNlb2YgU3ltYm9sKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEVxdWl2YWxlbnQgb2YgYHR5cGVvZmAgYnV0IHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgYXJyYXkgYW5kIHJlZ2V4cC4KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdldFByb3BUeXBlKHByb3BWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wVHlwZSA9IHR5cGVvZiBwcm9wVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSA/ICJhcnJheSIgOiBwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgPyAib2JqZWN0IiA6IGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpID8gInN5bWJvbCIgOiBwcm9wVHlwZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyBtb3JlIHR5cGVzIHRoYW4gYGdldFByb3BUeXBlYC4gT25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy4KICAgICAgICAgICAgICAgIC8vIFNlZSBgY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXJgLgogICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIm9iamVjdCIgPT09IHByb3BUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gImRhdGUiOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSByZXR1cm4gInJlZ2V4cCI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wVHlwZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFJldHVybnMgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0LCBpZiBhbnkuCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBnZXRDbGFzc05hbWUocHJvcFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BWYWx1ZS5jb25zdHJ1Y3RvciAmJiBwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZSA/IHByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIDogQU5PTllNT1VTOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogZ2xvYmFsIFN5bWJvbCAqLwogICAgICAgICAgICAgICAgdmFyIFJlYWN0UHJvcFR5cGVzLCBJVEVSQVRPUl9TWU1CT0wgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yLCBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICJAQGl0ZXJhdG9yIiwgQU5PTllNT1VTID0gIjw8YW5vbnltb3VzPj4iOwogICAgICAgICAgICAgICAgaWYgKCJwcm9kdWN0aW9uIiAhPT0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYpIC8vIEtlZXAgaW4gc3luYyB3aXRoIHByb2R1Y3Rpb24gdmVyc2lvbiBiZWxvdwogICAgICAgICAgICAgICAgUmVhY3RQcm9wVHlwZXMgPSB7CiAgICAgICAgICAgICAgICAgICAgYXJyYXk6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCJhcnJheSIpLAogICAgICAgICAgICAgICAgICAgIGJvb2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCJib29sZWFuIiksCiAgICAgICAgICAgICAgICAgICAgZnVuYzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoImZ1bmN0aW9uIiksCiAgICAgICAgICAgICAgICAgICAgbnVtYmVyOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcigibnVtYmVyIiksCiAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcigib2JqZWN0IiksCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcigic3RyaW5nIiksCiAgICAgICAgICAgICAgICAgICAgc3ltYm9sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcigic3ltYm9sIiksCiAgICAgICAgICAgICAgICAgICAgYW55OiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpLAogICAgICAgICAgICAgICAgICAgIGFycmF5T2Y6IGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlciwKICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSwKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZU9mOiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyLAogICAgICAgICAgICAgICAgICAgIG5vZGU6IGNyZWF0ZU5vZGVDaGVja2VyKCksCiAgICAgICAgICAgICAgICAgICAgb2JqZWN0T2Y6IGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIsCiAgICAgICAgICAgICAgICAgICAgb25lT2Y6IGNyZWF0ZUVudW1UeXBlQ2hlY2tlciwKICAgICAgICAgICAgICAgICAgICBvbmVPZlR5cGU6IGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIsCiAgICAgICAgICAgICAgICAgICAgc2hhcGU6IGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIKICAgICAgICAgICAgICAgIH07IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9kdWN0aW9uVHlwZUNoZWNrZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW52YXJpYW50KCExLCAiUmVhY3QuUHJvcFR5cGVzIHR5cGUgY2hlY2tpbmcgY29kZSBpcyBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLiIpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdGlvblR5cGVDaGVja2VyLmlzUmVxdWlyZWQgPSBwcm9kdWN0aW9uVHlwZUNoZWNrZXI7CiAgICAgICAgICAgICAgICAgICAgdmFyIGdldFByb2R1Y3Rpb25UeXBlQ2hlY2tlciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvZHVjdGlvblR5cGVDaGVja2VyOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgLy8gS2VlcCBpbiBzeW5jIHdpdGggZGV2ZWxvcG1lbnQgdmVyc2lvbiBhYm92ZQogICAgICAgICAgICAgICAgICAgIFJlYWN0UHJvcFR5cGVzID0gewogICAgICAgICAgICAgICAgICAgICAgICBhcnJheTogcHJvZHVjdGlvblR5cGVDaGVja2VyLAogICAgICAgICAgICAgICAgICAgICAgICBib29sOiBwcm9kdWN0aW9uVHlwZUNoZWNrZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmM6IHByb2R1Y3Rpb25UeXBlQ2hlY2tlciwKICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyOiBwcm9kdWN0aW9uVHlwZUNoZWNrZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogcHJvZHVjdGlvblR5cGVDaGVja2VyLAogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmc6IHByb2R1Y3Rpb25UeXBlQ2hlY2tlciwKICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sOiBwcm9kdWN0aW9uVHlwZUNoZWNrZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFueTogcHJvZHVjdGlvblR5cGVDaGVja2VyLAogICAgICAgICAgICAgICAgICAgICAgICBhcnJheU9mOiBnZXRQcm9kdWN0aW9uVHlwZUNoZWNrZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHByb2R1Y3Rpb25UeXBlQ2hlY2tlciwKICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VPZjogZ2V0UHJvZHVjdGlvblR5cGVDaGVja2VyLAogICAgICAgICAgICAgICAgICAgICAgICBub2RlOiBwcm9kdWN0aW9uVHlwZUNoZWNrZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdE9mOiBnZXRQcm9kdWN0aW9uVHlwZUNoZWNrZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIG9uZU9mOiBnZXRQcm9kdWN0aW9uVHlwZUNoZWNrZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIG9uZU9mVHlwZTogZ2V0UHJvZHVjdGlvblR5cGVDaGVja2VyLAogICAgICAgICAgICAgICAgICAgICAgICBzaGFwZTogZ2V0UHJvZHVjdGlvblR5cGVDaGVja2VyCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIE1ha2UgYGluc3RhbmNlb2YgRXJyb3JgIHN0aWxsIHdvcmsgZm9yIHJldHVybmVkIGVycm9ycy4KICAgICAgICAgICAgICAgIHJldHVybiBQcm9wVHlwZUVycm9yLnByb3RvdHlwZSA9IEVycm9yLnByb3RvdHlwZSwgUmVhY3RQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMgPSBjaGVja1Byb3BUeXBlcywgCiAgICAgICAgICAgICAgICBSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXMgPSBSZWFjdFByb3BUeXBlcywgUmVhY3RQcm9wVHlwZXM7CiAgICAgICAgICAgIH07CiAgICAgICAgfSkuY2FsbChleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDkxKSk7CiAgICB9LCAvKiA5MSAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewogICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0KCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikgewogICAgICAgICAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zCiAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7CiAgICAgICAgICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkCiAgICAgICAgICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0LCAKICAgICAgICAgICAgc2V0VGltZW91dChmdW4sIDApOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzcwogICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikgewogICAgICAgICAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9ucwogICAgICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7CiAgICAgICAgICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWQKICAgICAgICAgICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0LCAKICAgICAgICAgICAgY2xlYXJUaW1lb3V0KG1hcmtlcik7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzCiAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLgogICAgICAgICAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXQKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7CiAgICAgICAgICAgIGRyYWluaW5nICYmIGN1cnJlbnRRdWV1ZSAmJiAoZHJhaW5pbmcgPSAhMSwgY3VycmVudFF1ZXVlLmxlbmd0aCA/IHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSkgOiBxdWV1ZUluZGV4ID0gLTEsIAogICAgICAgICAgICBxdWV1ZS5sZW5ndGggJiYgZHJhaW5RdWV1ZSgpKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHsKICAgICAgICAgICAgaWYgKCFkcmFpbmluZykgewogICAgICAgICAgICAgICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7CiAgICAgICAgICAgICAgICBkcmFpbmluZyA9ICEwOwogICAgICAgICAgICAgICAgZm9yICh2YXIgbGVuID0gcXVldWUubGVuZ3RoOyBsZW47ICkgewogICAgICAgICAgICAgICAgICAgIGZvciAoY3VycmVudFF1ZXVlID0gcXVldWUsIHF1ZXVlID0gW107ICsrcXVldWVJbmRleCA8IGxlbjsgKSBjdXJyZW50UXVldWUgJiYgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpOwogICAgICAgICAgICAgICAgICAgIHF1ZXVlSW5kZXggPSAtMSwgbGVuID0gcXVldWUubGVuZ3RoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlID0gbnVsbCwgZHJhaW5pbmcgPSAhMSwgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHMKICAgICAgICBmdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHsKICAgICAgICAgICAgdGhpcy5mdW4gPSBmdW4sIHRoaXMuYXJyYXkgPSBhcnJheTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gbm9vcCgpIHt9CiAgICAgICAgLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyCiAgICAgICAgdmFyIGNhY2hlZFNldFRpbWVvdXQsIGNhY2hlZENsZWFyVGltZW91dCwgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307CiAgICAgICAgIWZ1bmN0aW9uKCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIHNldFRpbWVvdXQgPyBzZXRUaW1lb3V0IDogZGVmYXVsdFNldFRpbW91dDsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIGNsZWFyVGltZW91dCA/IGNsZWFyVGltZW91dCA6IGRlZmF1bHRDbGVhclRpbWVvdXQ7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9KCk7CiAgICAgICAgdmFyIGN1cnJlbnRRdWV1ZSwgcXVldWUgPSBbXSwgZHJhaW5pbmcgPSAhMSwgcXVldWVJbmRleCA9IC0xOwogICAgICAgIHByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbihmdW4pIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpOwogICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKSwgMSAhPT0gcXVldWUubGVuZ3RoIHx8IGRyYWluaW5nIHx8IHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7CiAgICAgICAgfSwgSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpOwogICAgICAgIH0sIHByb2Nlc3MudGl0bGUgPSAiYnJvd3NlciIsIHByb2Nlc3MuYnJvd3NlciA9ICEwLCBwcm9jZXNzLmVudiA9IHt9LCBwcm9jZXNzLmFyZ3YgPSBbXSwgCiAgICAgICAgcHJvY2Vzcy52ZXJzaW9uID0gIiIsIC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzCiAgICAgICAgcHJvY2Vzcy52ZXJzaW9ucyA9IHt9LCBwcm9jZXNzLm9uID0gbm9vcCwgcHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3AsIHByb2Nlc3Mub25jZSA9IG5vb3AsIAogICAgICAgIHByb2Nlc3Mub2ZmID0gbm9vcCwgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3AsIHByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcCwgCiAgICAgICAgcHJvY2Vzcy5lbWl0ID0gbm9vcCwgcHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24obmFtZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgfSwgcHJvY2Vzcy5jd2QgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICIvIjsKICAgICAgICB9LCBwcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24oZGlyKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgfSwgcHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9OwogICAgfSwgLyogOTIgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgLyoqCgkgKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KCSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgkgKgoJICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCgkgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKCSAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgoJICoKCSAqIAoJICovCiAgICAgICAgZnVuY3Rpb24gbWFrZUVtcHR5RnVuY3Rpb24oYXJnKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcmc7CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIC8qKgoJICogVGhpcyBmdW5jdGlvbiBhY2NlcHRzIGFuZCBkaXNjYXJkcyBpbnB1dHM7IGl0IGhhcyBubyBzaWRlIGVmZmVjdHMuIFRoaXMgaXMKCSAqIHByaW1hcmlseSB1c2VmdWwgaWRpb21hdGljYWxseSBmb3Igb3ZlcnJpZGFibGUgZnVuY3Rpb24gZW5kcG9pbnRzIHdoaWNoCgkgKiBhbHdheXMgbmVlZCB0byBiZSBjYWxsYWJsZSwgc2luY2UgSlMgbGFja3MgYSBudWxsLWNhbGwgaWRpb20gYWxhIENvY29hLgoJICovCiAgICAgICAgdmFyIGVtcHR5RnVuY3Rpb24gPSBmdW5jdGlvbigpIHt9OwogICAgICAgIGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnMgPSBtYWtlRW1wdHlGdW5jdGlvbiwgZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0ZhbHNlID0gbWFrZUVtcHR5RnVuY3Rpb24oITEpLCAKICAgICAgICBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVHJ1ZSA9IG1ha2VFbXB0eUZ1bmN0aW9uKCEwKSwgZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGwgPSBtYWtlRW1wdHlGdW5jdGlvbihudWxsKSwgCiAgICAgICAgZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RoaXMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwgZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0FyZ3VtZW50ID0gZnVuY3Rpb24oYXJnKSB7CiAgICAgICAgICAgIHJldHVybiBhcmc7CiAgICAgICAgfSwgbW9kdWxlLmV4cG9ydHMgPSBlbXB0eUZ1bmN0aW9uOwogICAgfSwgLyogOTMgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8KICAgICAgICAoZnVuY3Rpb24ocHJvY2VzcykgewogICAgICAgICAgICAvKioKCSAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgoJICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KCSAqCgkgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKCSAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAoJICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCgkgKgoJICovCiAgICAgICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICAgICAgZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbiwgZm9ybWF0LCBhLCBiLCBjLCBkLCBlLCBmKSB7CiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVGb3JtYXQoZm9ybWF0KSwgIWNvbmRpdGlvbikgewogICAgICAgICAgICAgICAgICAgIHZhciBlcnJvcjsKICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBmb3JtYXQpIGVycm9yID0gbmV3IEVycm9yKCJNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLiIpOyBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbIGEsIGIsIGMsIGQsIGUsIGYgXSwgYXJnSW5kZXggPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBlcnJvci5uYW1lID0gIkludmFyaWFudCBWaW9sYXRpb24iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGludmFyaWFudCdzIG93biBmcmFtZQogICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yLmZyYW1lc1RvUG9wID0gMSwgZXJyb3I7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqCgkgKiBVc2UgaW52YXJpYW50KCkgdG8gYXNzZXJ0IHN0YXRlIHdoaWNoIHlvdXIgcHJvZ3JhbSBhc3N1bWVzIHRvIGJlIHRydWUuCgkgKgoJICogUHJvdmlkZSBzcHJpbnRmLXN0eWxlIGZvcm1hdCAob25seSAlcyBpcyBzdXBwb3J0ZWQpIGFuZCBhcmd1bWVudHMKCSAqIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBicm9rZSBhbmQgd2hhdCB5b3Ugd2VyZQoJICogZXhwZWN0aW5nLgoJICoKCSAqIFRoZSBpbnZhcmlhbnQgbWVzc2FnZSB3aWxsIGJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgaW52YXJpYW50CgkgKiB3aWxsIHJlbWFpbiB0byBlbnN1cmUgbG9naWMgZG9lcyBub3QgZGlmZmVyIGluIHByb2R1Y3Rpb24uCgkgKi8KICAgICAgICAgICAgdmFyIHZhbGlkYXRlRm9ybWF0ID0gZnVuY3Rpb24oZm9ybWF0KSB7fTsKICAgICAgICAgICAgInByb2R1Y3Rpb24iICE9PSBwcm9jZXNzLmVudi5OT0RFX0VOViAmJiAodmFsaWRhdGVGb3JtYXQgPSBmdW5jdGlvbihmb3JtYXQpIHsKICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IGZvcm1hdCkgdGhyb3cgbmV3IEVycm9yKCJpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCIpOwogICAgICAgICAgICB9KSwgbW9kdWxlLmV4cG9ydHMgPSBpbnZhcmlhbnQ7CiAgICAgICAgfSkuY2FsbChleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDkxKSk7CiAgICB9LCAvKiA5NCAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIC8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqLwogICAgICAgIChmdW5jdGlvbihwcm9jZXNzKSB7CiAgICAgICAgICAgIC8qKgoJICogQ29weXJpZ2h0IDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy4KCSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgkgKgoJICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCgkgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKCSAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgoJICoKCSAqLwogICAgICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgICAgIHZhciBlbXB0eUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MiksIHdhcm5pbmcgPSBlbXB0eUZ1bmN0aW9uOwogICAgICAgICAgICAicHJvZHVjdGlvbiIgIT09IHByb2Nlc3MuZW52Lk5PREVfRU5WICYmICFmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbihmb3JtYXQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOwogICAgICAgICAgICAgICAgICAgIHZhciBhcmdJbmRleCA9IDAsIG1lc3NhZ2UgPSAiV2FybmluZzogIiArIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCIgIT0gdHlwZW9mIGNvbnNvbGUgJiYgY29uc29sZS5lcnJvcihtZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFjawogICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS4KICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHgpIHt9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgd2FybmluZyA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm9ybWF0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gZm9ybWF0KSB0aHJvdyBuZXcgRXJyb3IoImB3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nIG1lc3NhZ2UgYXJndW1lbnQiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoMCAhPT0gZm9ybWF0LmluZGV4T2YoIkZhaWxlZCBDb21wb3NpdGUgcHJvcFR5cGU6ICIpICYmICFjb25kaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIgPiAyID8gX2xlbjIgLSAyIDogMCksIF9rZXkyID0gMjsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykgYXJnc1tfa2V5MiAtIDJdID0gYXJndW1lbnRzW19rZXkyXTsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRXYXJuaW5nLmFwcGx5KHZvaWQgMCwgWyBmb3JtYXQgXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKSwgbW9kdWxlLmV4cG9ydHMgPSB3YXJuaW5nOwogICAgICAgIH0pLmNhbGwoZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyg5MSkpOwogICAgfSwgLyogOTUgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICAvKioKCSAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCgkgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgoJICoKCSAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQoJICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CgkgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KCSAqLwogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICB2YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAiU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQiOwogICAgICAgIG1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXNTZWNyZXQ7CiAgICB9LCAvKiA5NiAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIC8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqLwogICAgICAgIChmdW5jdGlvbihwcm9jZXNzKSB7CiAgICAgICAgICAgIC8qKgoJICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KCSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgkgKgoJICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCgkgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKCSAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgoJICovCiAgICAgICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICAgICAgLyoqCgkgKiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuCgkgKiBFcnJvciBtZXNzYWdlcyBhcmUgbWVtb3JpemVkIGFuZCB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQcm9wVHlwZQoJICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkCgkgKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiAicHJvcCIsICJjb250ZXh0IiwgImNoaWxkIGNvbnRleHQiCgkgKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50TmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgZm9yIGVycm9yIG1lc3NhZ2VzLgoJICogQHBhcmFtIHs/RnVuY3Rpb259IGdldFN0YWNrIFJldHVybnMgdGhlIGNvbXBvbmVudCBzdGFjay4KCSAqIEBwcml2YXRlCgkgKi8KICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBnZXRTdGFjaykgewogICAgICAgICAgICAgICAgaWYgKCJwcm9kdWN0aW9uIiAhPT0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYpIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIGlmICh0eXBlU3BlY3MuaGFzT3duUHJvcGVydHkodHlwZVNwZWNOYW1lKSkgewogICAgICAgICAgICAgICAgICAgIHZhciBlcnJvcjsKICAgICAgICAgICAgICAgICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0bwogICAgICAgICAgICAgICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC4KICAgICAgICAgICAgICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS4KICAgICAgICAgICAgICAgICAgICAgICAgaW52YXJpYW50KCJmdW5jdGlvbiIgPT0gdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdLCAiJXM6ICVzIHR5cGUgYCVzYCBpcyBpbnZhbGlkOyBpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSBSZWFjdC5Qcm9wVHlwZXMuIiwgY29tcG9uZW50TmFtZSB8fCAiUmVhY3QgY2xhc3MiLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBleDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCJwcm9kdWN0aW9uIiAhPT0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPyB3YXJuaW5nKCFlcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIEVycm9yLCAiJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuIFlvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyIGNyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLiIsIGNvbXBvbmVudE5hbWUgfHwgIlJlYWN0IGNsYXNzIiwgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yKSA6IHZvaWQgMCwgCiAgICAgICAgICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2FtZSBlcnJvci4KICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFjayA9IGdldFN0YWNrID8gZ2V0U3RhY2soKSA6ICIiOwogICAgICAgICAgICAgICAgICAgICAgICAicHJvZHVjdGlvbiIgIT09IHByb2Nlc3MuZW52Lk5PREVfRU5WID8gd2FybmluZyghMSwgIkZhaWxlZCAlcyB0eXBlOiAlcyVzIiwgbG9jYXRpb24sIGVycm9yLm1lc3NhZ2UsIG51bGwgIT0gc3RhY2sgPyBzdGFjayA6ICIiKSA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGludmFyaWFudCA9IF9fd2VicGFja19yZXF1aXJlX18oOTMpLCB3YXJuaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NCksIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NSksIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9OwogICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGNoZWNrUHJvcFR5cGVzOwogICAgICAgIH0pLmNhbGwoZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyg5MSkpOwogICAgfSwgLyogOTcgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfOTdfXzsKICAgIH0sIC8qIDk4ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvYmoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KSwgZXhwb3J0cy5BdXRvU2l6ZXIgPSBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7CiAgICAgICAgdmFyIF9BdXRvU2l6ZXIyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5OSksIF9BdXRvU2l6ZXIzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQXV0b1NpemVyMik7CiAgICAgICAgZXhwb3J0cy5kZWZhdWx0ID0gX0F1dG9TaXplcjMuZGVmYXVsdCwgZXhwb3J0cy5BdXRvU2l6ZXIgPSBfQXV0b1NpemVyMy5kZWZhdWx0OwogICAgfSwgLyogOTkgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsKICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG9iagogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgICAgICAgICAgIHZhbHVlOiAhMAogICAgICAgIH0pOwogICAgICAgIHZhciBfZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpLCBfZ2V0UHJvdG90eXBlT2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0UHJvdG90eXBlT2YpLCBfY2xhc3NDYWxsQ2hlY2syID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSksIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpLCBfY3JlYXRlQ2xhc3MyID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMCksIF9jcmVhdGVDbGFzczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDbGFzczIpLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpLCBfaW5oZXJpdHMyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MSksIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpLCBfcHJvcFR5cGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OSksIF9yZWFjdCA9IChfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpLCAKICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3KSksIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCksIF9kZXRlY3RFbGVtZW50UmVzaXplID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDApLCBfZGV0ZWN0RWxlbWVudFJlc2l6ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZXRlY3RFbGVtZW50UmVzaXplKSwgQXV0b1NpemVyID0gZnVuY3Rpb24oX1B1cmVDb21wb25lbnQpIHsKICAgICAgICAgICAgZnVuY3Rpb24gQXV0b1NpemVyKHByb3BzKSB7CiAgICAgICAgICAgICAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBBdXRvU2l6ZXIpOwogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMy5kZWZhdWx0KSh0aGlzLCAoQXV0b1NpemVyLl9fcHJvdG9fXyB8fCAoMCwgCiAgICAgICAgICAgICAgICBfZ2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKEF1dG9TaXplcikpLmNhbGwodGhpcywgcHJvcHMpKTsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5zdGF0ZSA9IHsKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDAsCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDAKICAgICAgICAgICAgICAgIH0sIF90aGlzLl9vblJlc2l6ZSA9IF90aGlzLl9vblJlc2l6ZS5iaW5kKF90aGlzKSwgX3RoaXMuX3NldFJlZiA9IF90aGlzLl9zZXRSZWYuYmluZChfdGhpcyksIAogICAgICAgICAgICAgICAgX3RoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICgwLCBfaW5oZXJpdHMzLmRlZmF1bHQpKEF1dG9TaXplciwgX1B1cmVDb21wb25lbnQpLCAoMCwgX2NyZWF0ZUNsYXNzMy5kZWZhdWx0KShBdXRvU2l6ZXIsIFsgewogICAgICAgICAgICAgICAga2V5OiAiY29tcG9uZW50RGlkTW91bnQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudE5vZGUgPSB0aGlzLl9hdXRvU2l6ZXIucGFyZW50Tm9kZSwgdGhpcy5fZGV0ZWN0RWxlbWVudFJlc2l6ZSA9ICgwLCBfZGV0ZWN0RWxlbWVudFJlc2l6ZTIuZGVmYXVsdCkoKSwgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGV0ZWN0RWxlbWVudFJlc2l6ZS5hZGRSZXNpemVMaXN0ZW5lcih0aGlzLl9wYXJlbnROb2RlLCB0aGlzLl9vblJlc2l6ZSksIHRoaXMuX29uUmVzaXplKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImNvbXBvbmVudFdpbGxVbm1vdW50IiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZXRlY3RFbGVtZW50UmVzaXplICYmIHRoaXMuX2RldGVjdEVsZW1lbnRSZXNpemUucmVtb3ZlUmVzaXplTGlzdGVuZXIodGhpcy5fcGFyZW50Tm9kZSwgdGhpcy5fb25SZXNpemUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJyZW5kZXIiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLCBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbiwgZGlzYWJsZUhlaWdodCA9IF9wcm9wcy5kaXNhYmxlSGVpZ2h0LCBkaXNhYmxlV2lkdGggPSBfcHJvcHMuZGlzYWJsZVdpZHRoLCBfc3RhdGUgPSB0aGlzLnN0YXRlLCBoZWlnaHQgPSBfc3RhdGUuaGVpZ2h0LCB3aWR0aCA9IF9zdGF0ZS53aWR0aCwgb3V0ZXJTdHlsZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6ICJ2aXNpYmxlIgogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpc2FibGVIZWlnaHQgfHwgKG91dGVyU3R5bGUuaGVpZ2h0ID0gMCksIGRpc2FibGVXaWR0aCB8fCAob3V0ZXJTdHlsZS53aWR0aCA9IDApLCAKICAgICAgICAgICAgICAgICAgICBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2IiwgewogICAgICAgICAgICAgICAgICAgICAgICByZWY6IHRoaXMuX3NldFJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IG91dGVyU3R5bGUKICAgICAgICAgICAgICAgICAgICB9LCBjaGlsZHJlbih7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9vblJlc2l6ZSIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9wcm9wczIgPSB0aGlzLnByb3BzLCBkaXNhYmxlSGVpZ2h0ID0gX3Byb3BzMi5kaXNhYmxlSGVpZ2h0LCBkaXNhYmxlV2lkdGggPSBfcHJvcHMyLmRpc2FibGVXaWR0aCwgb25SZXNpemUgPSBfcHJvcHMyLm9uUmVzaXplLCBoZWlnaHQgPSB0aGlzLl9wYXJlbnROb2RlLm9mZnNldEhlaWdodCB8fCAwLCB3aWR0aCA9IHRoaXMuX3BhcmVudE5vZGUub2Zmc2V0V2lkdGggfHwgMCwgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9wYXJlbnROb2RlKSB8fCB7fSwgcGFkZGluZ0xlZnQgPSBwYXJzZUludChzdHlsZS5wYWRkaW5nTGVmdCwgMTApIHx8IDAsIHBhZGRpbmdSaWdodCA9IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdSaWdodCwgMTApIHx8IDAsIHBhZGRpbmdUb3AgPSBwYXJzZUludChzdHlsZS5wYWRkaW5nVG9wLCAxMCkgfHwgMCwgcGFkZGluZ0JvdHRvbSA9IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdCb3R0b20sIDEwKSB8fCAwLCBuZXdIZWlnaHQgPSBoZWlnaHQgLSBwYWRkaW5nVG9wIC0gcGFkZGluZ0JvdHRvbSwgbmV3V2lkdGggPSB3aWR0aCAtIHBhZGRpbmdMZWZ0IC0gcGFkZGluZ1JpZ2h0OwogICAgICAgICAgICAgICAgICAgICghZGlzYWJsZUhlaWdodCAmJiB0aGlzLnN0YXRlLmhlaWdodCAhPT0gbmV3SGVpZ2h0IHx8ICFkaXNhYmxlV2lkdGggJiYgdGhpcy5zdGF0ZS53aWR0aCAhPT0gbmV3V2lkdGgpICYmICh0aGlzLnNldFN0YXRlKHsKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSBwYWRkaW5nVG9wIC0gcGFkZGluZ0JvdHRvbSwKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoIC0gcGFkZGluZ0xlZnQgLSBwYWRkaW5nUmlnaHQKICAgICAgICAgICAgICAgICAgICB9KSwgb25SZXNpemUoewogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoCiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfc2V0UmVmIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihhdXRvU2l6ZXIpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZXIgPSBhdXRvU2l6ZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gXSksIEF1dG9TaXplcjsKICAgICAgICB9KF9yZWFjdC5QdXJlQ29tcG9uZW50KTsKICAgICAgICBBdXRvU2l6ZXIuZGVmYXVsdFByb3BzID0gewogICAgICAgICAgICBvblJlc2l6ZTogZnVuY3Rpb24oKSB7fQogICAgICAgIH0sIGV4cG9ydHMuZGVmYXVsdCA9IEF1dG9TaXplcjsKICAgIH0sIC8qIDEwMCAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBjcmVhdGVEZXRlY3RFbGVtZW50UmVzaXplKCkgewogICAgICAgICAgICB2YXIgX3dpbmRvdzsKICAgICAgICAgICAgX3dpbmRvdyA9ICJ1bmRlZmluZWQiICE9IHR5cGVvZiB3aW5kb3cgPyB3aW5kb3cgOiAidW5kZWZpbmVkIiAhPSB0eXBlb2Ygc2VsZiA/IHNlbGYgOiB0aGlzOwogICAgICAgICAgICB2YXIgYXR0YWNoRXZlbnQgPSAidW5kZWZpbmVkIiAhPSB0eXBlb2YgZG9jdW1lbnQgJiYgZG9jdW1lbnQuYXR0YWNoRXZlbnQ7CiAgICAgICAgICAgIGlmICghYXR0YWNoRXZlbnQpIHsKICAgICAgICAgICAgICAgIHZhciByZXF1ZXN0RnJhbWUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmFmID0gX3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgX3dpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgX3dpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgZnVuY3Rpb24oZm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF93aW5kb3cuc2V0VGltZW91dChmbiwgMjApOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByYWYoZm4pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KCksIGNhbmNlbEZyYW1lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhbmNlbCA9IF93aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgfHwgX3dpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZSB8fCBfd2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IF93aW5kb3cuY2xlYXJUaW1lb3V0OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihpZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FuY2VsKGlkKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSgpLCByZXNldFRyaWdnZXJzID0gZnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VycyA9IGVsZW1lbnQuX19yZXNpemVUcmlnZ2Vyc19fLCBleHBhbmQgPSB0cmlnZ2Vycy5maXJzdEVsZW1lbnRDaGlsZCwgY29udHJhY3QgPSB0cmlnZ2Vycy5sYXN0RWxlbWVudENoaWxkLCBleHBhbmRDaGlsZCA9IGV4cGFuZC5maXJzdEVsZW1lbnRDaGlsZDsKICAgICAgICAgICAgICAgICAgICBjb250cmFjdC5zY3JvbGxMZWZ0ID0gY29udHJhY3Quc2Nyb2xsV2lkdGgsIGNvbnRyYWN0LnNjcm9sbFRvcCA9IGNvbnRyYWN0LnNjcm9sbEhlaWdodCwgCiAgICAgICAgICAgICAgICAgICAgZXhwYW5kQ2hpbGQuc3R5bGUud2lkdGggPSBleHBhbmQub2Zmc2V0V2lkdGggKyAxICsgInB4IiwgZXhwYW5kQ2hpbGQuc3R5bGUuaGVpZ2h0ID0gZXhwYW5kLm9mZnNldEhlaWdodCArIDEgKyAicHgiLCAKICAgICAgICAgICAgICAgICAgICBleHBhbmQuc2Nyb2xsTGVmdCA9IGV4cGFuZC5zY3JvbGxXaWR0aCwgZXhwYW5kLnNjcm9sbFRvcCA9IGV4cGFuZC5zY3JvbGxIZWlnaHQ7CiAgICAgICAgICAgICAgICB9LCBjaGVja1RyaWdnZXJzID0gZnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lm9mZnNldFdpZHRoICE9IGVsZW1lbnQuX19yZXNpemVMYXN0X18ud2lkdGggfHwgZWxlbWVudC5vZmZzZXRIZWlnaHQgIT0gZWxlbWVudC5fX3Jlc2l6ZUxhc3RfXy5oZWlnaHQ7CiAgICAgICAgICAgICAgICB9LCBzY3JvbGxMaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIShlLnRhcmdldC5jbGFzc05hbWUuaW5kZXhPZigiY29udHJhY3QtdHJpZ2dlciIpIDwgMCAmJiBlLnRhcmdldC5jbGFzc05hbWUuaW5kZXhPZigiZXhwYW5kLXRyaWdnZXIiKSA8IDApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRUcmlnZ2Vycyh0aGlzKSwgdGhpcy5fX3Jlc2l6ZVJBRl9fICYmIGNhbmNlbEZyYW1lKHRoaXMuX19yZXNpemVSQUZfXyksIHRoaXMuX19yZXNpemVSQUZfXyA9IHJlcXVlc3RGcmFtZShmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrVHJpZ2dlcnMoZWxlbWVudCkgJiYgKGVsZW1lbnQuX19yZXNpemVMYXN0X18ud2lkdGggPSBlbGVtZW50Lm9mZnNldFdpZHRoLCBlbGVtZW50Ll9fcmVzaXplTGFzdF9fLmhlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuX19yZXNpemVMaXN0ZW5lcnNfXy5mb3JFYWNoKGZ1bmN0aW9uKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4uY2FsbChlbGVtZW50LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgYW5pbWF0aW9uID0gITEsIGFuaW1hdGlvbnN0cmluZyA9ICJhbmltYXRpb24iLCBrZXlmcmFtZXByZWZpeCA9ICIiLCBhbmltYXRpb25zdGFydGV2ZW50ID0gImFuaW1hdGlvbnN0YXJ0IiwgZG9tUHJlZml4ZXMgPSAiV2Via2l0IE1veiBPIG1zIi5zcGxpdCgiICIpLCBzdGFydEV2ZW50cyA9ICJ3ZWJraXRBbmltYXRpb25TdGFydCBhbmltYXRpb25zdGFydCBvQW5pbWF0aW9uU3RhcnQgTVNBbmltYXRpb25TdGFydCIuc3BsaXQoIiAiKSwgcGZ4ID0gIiIsIGVsbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImZha2VlbGVtZW50Iik7CiAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBlbG0uc3R5bGUuYW5pbWF0aW9uTmFtZSAmJiAoYW5pbWF0aW9uID0gITApLCBhbmltYXRpb24gPT09ICExKSBmb3IgKHZhciBpID0gMDsgaSA8IGRvbVByZWZpeGVzLmxlbmd0aDsgaSsrKSBpZiAodm9pZCAwICE9PSBlbG0uc3R5bGVbZG9tUHJlZml4ZXNbaV0gKyAiQW5pbWF0aW9uTmFtZSJdKSB7CiAgICAgICAgICAgICAgICAgICAgcGZ4ID0gZG9tUHJlZml4ZXNbaV0sIGFuaW1hdGlvbnN0cmluZyA9IHBmeCArICJBbmltYXRpb24iLCBrZXlmcmFtZXByZWZpeCA9ICItIiArIHBmeC50b0xvd2VyQ2FzZSgpICsgIi0iLCAKICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25zdGFydGV2ZW50ID0gc3RhcnRFdmVudHNbaV0sIGFuaW1hdGlvbiA9ICEwOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGFuaW1hdGlvbk5hbWUgPSAicmVzaXplYW5pbSIsIGFuaW1hdGlvbktleWZyYW1lcyA9ICJAIiArIGtleWZyYW1lcHJlZml4ICsgImtleWZyYW1lcyAiICsgYW5pbWF0aW9uTmFtZSArICIgeyBmcm9tIHsgb3BhY2l0eTogMDsgfSB0byB7IG9wYWNpdHk6IDA7IH0gfSAiLCBhbmltYXRpb25TdHlsZSA9IGtleWZyYW1lcHJlZml4ICsgImFuaW1hdGlvbjogMW1zICIgKyBhbmltYXRpb25OYW1lICsgIjsgIjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY3JlYXRlU3R5bGVzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZXRlY3RFbGVtZW50UmVzaXplIikpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY3NzID0gKGFuaW1hdGlvbktleWZyYW1lcyA/IGFuaW1hdGlvbktleWZyYW1lcyA6ICIiKSArICIucmVzaXplLXRyaWdnZXJzIHsgIiArIChhbmltYXRpb25TdHlsZSA/IGFuaW1hdGlvblN0eWxlIDogIiIpICsgJ3Zpc2liaWxpdHk6IGhpZGRlbjsgb3BhY2l0eTogMDsgfSAucmVzaXplLXRyaWdnZXJzLCAucmVzaXplLXRyaWdnZXJzID4gZGl2LCAuY29udHJhY3QtdHJpZ2dlcjpiZWZvcmUgeyBjb250ZW50OiAiICI7IGRpc3BsYXk6IGJsb2NrOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTsgb3ZlcmZsb3c6IGhpZGRlbjsgei1pbmRleDogLTE7IH0gLnJlc2l6ZS10cmlnZ2VycyA+IGRpdiB7IGJhY2tncm91bmQ6ICNlZWU7IG92ZXJmbG93OiBhdXRvOyB9IC5jb250cmFjdC10cmlnZ2VyOmJlZm9yZSB7IHdpZHRoOiAyMDAlOyBoZWlnaHQ6IDIwMCU7IH0nLCBoZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgICAgICAgICAgICAgc3R5bGUuaWQgPSAiZGV0ZWN0RWxlbWVudFJlc2l6ZSIsIHN0eWxlLnR5cGUgPSAidGV4dC9jc3MiLCBzdHlsZS5zdHlsZVNoZWV0ID8gc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzIDogc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSksIAogICAgICAgICAgICAgICAgICAgIGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCBhZGRSZXNpemVMaXN0ZW5lciA9IGZ1bmN0aW9uKGVsZW1lbnQsIGZuKSB7CiAgICAgICAgICAgICAgICBpZiAoYXR0YWNoRXZlbnQpIGVsZW1lbnQuYXR0YWNoRXZlbnQoIm9ucmVzaXplIiwgZm4pOyBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQuX19yZXNpemVUcmlnZ2Vyc19fKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50U3R5bGUgPSBfd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTdHlsZSAmJiAic3RhdGljIiA9PSBlbGVtZW50U3R5bGUucG9zaXRpb24gJiYgKGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN0eWxlcygpLCBlbGVtZW50Ll9fcmVzaXplTGFzdF9fID0ge30sIGVsZW1lbnQuX19yZXNpemVMaXN0ZW5lcnNfXyA9IFtdLCAoZWxlbWVudC5fX3Jlc2l6ZVRyaWdnZXJzX18gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuY2xhc3NOYW1lID0gInJlc2l6ZS10cmlnZ2VycyIsIAogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Ll9fcmVzaXplVHJpZ2dlcnNfXy5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0iZXhwYW5kLXRyaWdnZXIiPjxkaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY29udHJhY3QtdHJpZ2dlciI+PC9kaXY+JywgCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudC5fX3Jlc2l6ZVRyaWdnZXJzX18pLCByZXNldFRyaWdnZXJzKGVsZW1lbnQpLCBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIHNjcm9sbExpc3RlbmVyLCAhMCksIAogICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25zdGFydGV2ZW50ICYmIChlbGVtZW50Ll9fcmVzaXplVHJpZ2dlcnNfXy5fX2FuaW1hdGlvbkxpc3RlbmVyX18gPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFuaW1hdGlvbk5hbWUgPT0gYW5pbWF0aW9uTmFtZSAmJiByZXNldFRyaWdnZXJzKGVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlbGVtZW50Ll9fcmVzaXplVHJpZ2dlcnNfXy5hZGRFdmVudExpc3RlbmVyKGFuaW1hdGlvbnN0YXJ0ZXZlbnQsIGVsZW1lbnQuX19yZXNpemVUcmlnZ2Vyc19fLl9fYW5pbWF0aW9uTGlzdGVuZXJfXykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbGVtZW50Ll9fcmVzaXplTGlzdGVuZXJzX18ucHVzaChmbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHJlbW92ZVJlc2l6ZUxpc3RlbmVyID0gZnVuY3Rpb24oZWxlbWVudCwgZm4pIHsKICAgICAgICAgICAgICAgIGlmIChhdHRhY2hFdmVudCkgZWxlbWVudC5kZXRhY2hFdmVudCgib25yZXNpemUiLCBmbik7IGVsc2UgaWYgKGVsZW1lbnQuX19yZXNpemVMaXN0ZW5lcnNfXy5zcGxpY2UoZWxlbWVudC5fX3Jlc2l6ZUxpc3RlbmVyc19fLmluZGV4T2YoZm4pLCAxKSwgCiAgICAgICAgICAgICAgICAhZWxlbWVudC5fX3Jlc2l6ZUxpc3RlbmVyc19fLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgc2Nyb2xsTGlzdGVuZXIsICEwKSwgZWxlbWVudC5fX3Jlc2l6ZVRyaWdnZXJzX18uX19hbmltYXRpb25MaXN0ZW5lcl9fICYmIChlbGVtZW50Ll9fcmVzaXplVHJpZ2dlcnNfXy5yZW1vdmVFdmVudExpc3RlbmVyKGFuaW1hdGlvbnN0YXJ0ZXZlbnQsIGVsZW1lbnQuX19yZXNpemVUcmlnZ2Vyc19fLl9fYW5pbWF0aW9uTGlzdGVuZXJfXyksIAogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuX19yZXNpemVUcmlnZ2Vyc19fLl9fYW5pbWF0aW9uTGlzdGVuZXJfXyA9IG51bGwpOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuX19yZXNpemVUcmlnZ2Vyc19fID0gIWVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5fX3Jlc2l6ZVRyaWdnZXJzX18pOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBhZGRSZXNpemVMaXN0ZW5lcjogYWRkUmVzaXplTGlzdGVuZXIsCiAgICAgICAgICAgICAgICByZW1vdmVSZXNpemVMaXN0ZW5lcjogcmVtb3ZlUmVzaXplTGlzdGVuZXIKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KSwgZXhwb3J0cy5kZWZhdWx0ID0gY3JlYXRlRGV0ZWN0RWxlbWVudFJlc2l6ZTsKICAgIH0sIC8qIDEwMSAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSksIGV4cG9ydHMuQ2VsbE1lYXN1cmVyQ2FjaGUgPSBleHBvcnRzLkNlbGxNZWFzdXJlciA9IGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDsKICAgICAgICB2YXIgX0NlbGxNZWFzdXJlcjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMiksIF9DZWxsTWVhc3VyZXIzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2VsbE1lYXN1cmVyMiksIF9DZWxsTWVhc3VyZXJDYWNoZTIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNCksIF9DZWxsTWVhc3VyZXJDYWNoZTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9DZWxsTWVhc3VyZXJDYWNoZTIpOwogICAgICAgIGV4cG9ydHMuZGVmYXVsdCA9IF9DZWxsTWVhc3VyZXIzLmRlZmF1bHQsIGV4cG9ydHMuQ2VsbE1lYXN1cmVyID0gX0NlbGxNZWFzdXJlcjMuZGVmYXVsdCwgCiAgICAgICAgZXhwb3J0cy5DZWxsTWVhc3VyZXJDYWNoZSA9IF9DZWxsTWVhc3VyZXJDYWNoZTMuZGVmYXVsdDsKICAgIH0sIC8qIDEwMiAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIC8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqLwogICAgICAgIChmdW5jdGlvbihwcm9jZXNzKSB7CiAgICAgICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgICAgIHZhbHVlOiAhMAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIF9nZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oMyksIF9nZXRQcm90b3R5cGVPZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRQcm90b3R5cGVPZiksIF9jbGFzc0NhbGxDaGVjazIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KSwgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMiksIF9jcmVhdGVDbGFzczIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKSwgX2NyZWF0ZUNsYXNzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNsYXNzMiksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiksIF9pbmhlcml0czIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxKSwgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMiksIF9yZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oOTcpLCBfcmVhY3REb20gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMyksIENlbGxNZWFzdXJlciA9IGZ1bmN0aW9uKF9QdXJlQ29tcG9uZW50KSB7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBDZWxsTWVhc3VyZXIocHJvcHMsIGNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBDZWxsTWVhc3VyZXIpOwogICAgICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMuZGVmYXVsdCkodGhpcywgKENlbGxNZWFzdXJlci5fX3Byb3RvX18gfHwgKDAsIAogICAgICAgICAgICAgICAgICAgIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoQ2VsbE1lYXN1cmVyKSkuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fbWVhc3VyZSA9IF90aGlzLl9tZWFzdXJlLmJpbmQoX3RoaXMpLCBfdGhpczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAoMCwgX2luaGVyaXRzMy5kZWZhdWx0KShDZWxsTWVhc3VyZXIsIF9QdXJlQ29tcG9uZW50KSwgKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoQ2VsbE1lYXN1cmVyLCBbIHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICJjb21wb25lbnREaWRNb3VudCIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXliZU1lYXN1cmVDZWxsKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIGtleTogImNvbXBvbmVudERpZFVwZGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHByZXZQcm9wcywgcHJldlN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21heWJlTWVhc3VyZUNlbGwoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAga2V5OiAicmVuZGVyIiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucHJvcHMuY2hpbGRyZW47CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZnVuY3Rpb24iID09IHR5cGVvZiBjaGlsZHJlbiA/IGNoaWxkcmVuKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmU6IHRoaXMuX21lYXN1cmUKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBjaGlsZHJlbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAga2V5OiAiX21heWJlTWVhc3VyZUNlbGwiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsIGNhY2hlID0gX3Byb3BzLmNhY2hlLCBfcHJvcHMkY29sdW1uSW5kZXggPSBfcHJvcHMuY29sdW1uSW5kZXgsIGNvbHVtbkluZGV4ID0gdm9pZCAwID09PSBfcHJvcHMkY29sdW1uSW5kZXggPyAwIDogX3Byb3BzJGNvbHVtbkluZGV4LCBwYXJlbnQgPSBfcHJvcHMucGFyZW50LCBfcHJvcHMkcm93SW5kZXggPSBfcHJvcHMucm93SW5kZXgsIHJvd0luZGV4ID0gdm9pZCAwID09PSBfcHJvcHMkcm93SW5kZXggPyB0aGlzLnByb3BzLmluZGV4IDogX3Byb3BzJHJvd0luZGV4OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhY2hlLmhhcyhyb3dJbmRleCwgY29sdW1uSW5kZXgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9ICgwLCBfcmVhY3REb20uZmluZERPTU5vZGUpKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuaGFzRml4ZWRXaWR0aCgpIHx8IChub2RlLnN0eWxlLndpZHRoID0gImF1dG8iKSwgY2FjaGUuaGFzRml4ZWRIZWlnaHQoKSB8fCAobm9kZS5zdHlsZS5oZWlnaHQgPSAiYXV0byIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IE1hdGguY2VpbChub2RlLm9mZnNldEhlaWdodCksIHdpZHRoID0gTWF0aC5jZWlsKG5vZGUub2Zmc2V0V2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuc2V0KHJvd0luZGV4LCBjb2x1bW5JbmRleCwgd2lkdGgsIGhlaWdodCksIHBhcmVudCAmJiAiZnVuY3Rpb24iID09IHR5cGVvZiBwYXJlbnQuaW52YWxpZGF0ZUNlbGxTaXplQWZ0ZXJSZW5kZXIgJiYgcGFyZW50LmludmFsaWRhdGVDZWxsU2l6ZUFmdGVyUmVuZGVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleDogY29sdW1uSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IHJvd0luZGV4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICJfbWVhc3VyZSIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHMsIGNhY2hlID0gX3Byb3BzMi5jYWNoZSwgX3Byb3BzMiRjb2x1bW5JbmRleCA9IF9wcm9wczIuY29sdW1uSW5kZXgsIGNvbHVtbkluZGV4ID0gdm9pZCAwID09PSBfcHJvcHMyJGNvbHVtbkluZGV4ID8gMCA6IF9wcm9wczIkY29sdW1uSW5kZXgsIHBhcmVudCA9IF9wcm9wczIucGFyZW50LCBfcHJvcHMyJHJvd0luZGV4ID0gX3Byb3BzMi5yb3dJbmRleCwgcm93SW5kZXggPSB2b2lkIDAgPT09IF9wcm9wczIkcm93SW5kZXggPyB0aGlzLnByb3BzLmluZGV4IDogX3Byb3BzMiRyb3dJbmRleCwgbm9kZSA9ICgwLCAKICAgICAgICAgICAgICAgICAgICAgICAgX3JlYWN0RG9tLmZpbmRET01Ob2RlKSh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuaGFzRml4ZWRXaWR0aCgpIHx8IChub2RlLnN0eWxlLndpZHRoID0gImF1dG8iKSwgY2FjaGUuaGFzRml4ZWRIZWlnaHQoKSB8fCAobm9kZS5zdHlsZS5oZWlnaHQgPSAiYXV0byIpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gTWF0aC5jZWlsKG5vZGUub2Zmc2V0SGVpZ2h0KSwgd2lkdGggPSBNYXRoLmNlaWwobm9kZS5vZmZzZXRXaWR0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9PT0gY2FjaGUuZ2V0SGVpZ2h0KHJvd0luZGV4LCBjb2x1bW5JbmRleCkgJiYgd2lkdGggPT09IGNhY2hlLmdldFdpZHRoKHJvd0luZGV4LCBjb2x1bW5JbmRleCkgfHwgKGNhY2hlLnNldChyb3dJbmRleCwgY29sdW1uSW5kZXgsIHdpZHRoLCBoZWlnaHQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIHBhcmVudC5yZWNvbXB1dGVHcmlkU2l6ZSAmJiBwYXJlbnQucmVjb21wdXRlR3JpZFNpemUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXg6IGNvbHVtbkluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IHJvd0luZGV4CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IF0pLCBDZWxsTWVhc3VyZXI7CiAgICAgICAgICAgIH0oX3JlYWN0LlB1cmVDb21wb25lbnQpOwogICAgICAgICAgICBleHBvcnRzLmRlZmF1bHQgPSBDZWxsTWVhc3VyZXIsICJwcm9kdWN0aW9uIiAhPT0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgJiYgKENlbGxNZWFzdXJlci5fX2ludGVybmFsQ2VsbE1lYXN1cmVyRmxhZyA9ICEwKTsKICAgICAgICB9KS5jYWxsKGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oOTEpKTsKICAgIH0sIC8qIDEwMyAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewogICAgICAgIG1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8xMDNfXzsKICAgIH0sIC8qIDEwNCAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIC8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqLwogICAgICAgIChmdW5jdGlvbihwcm9jZXNzKSB7CiAgICAgICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRLZXlNYXBwZXIocm93SW5kZXgsIGNvbHVtbkluZGV4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm93SW5kZXggKyAiLSIgKyBjb2x1bW5JbmRleDsKICAgICAgICAgICAgfQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgICAgICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICAgICAgfSksIGV4cG9ydHMuREVGQVVMVF9XSURUSCA9IGV4cG9ydHMuREVGQVVMVF9IRUlHSFQgPSB2b2lkIDA7CiAgICAgICAgICAgIHZhciBfY2xhc3NDYWxsQ2hlY2syID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSksIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpLCBfY3JlYXRlQ2xhc3MyID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMCksIF9jcmVhdGVDbGFzczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDbGFzczIpLCBERUZBVUxUX0hFSUdIVCA9IGV4cG9ydHMuREVGQVVMVF9IRUlHSFQgPSAzMCwgREVGQVVMVF9XSURUSCA9IGV4cG9ydHMuREVGQVVMVF9XSURUSCA9IDEwMCwgQ2VsbE1lYXN1cmVyQ2FjaGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIENlbGxNZWFzdXJlckNhY2hlKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXMsIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDoge307CiAgICAgICAgICAgICAgICAgICAgKDAsIF9jbGFzc0NhbGxDaGVjazMuZGVmYXVsdCkodGhpcywgQ2VsbE1lYXN1cmVyQ2FjaGUpLCB0aGlzLmNvbHVtbldpZHRoID0gZnVuY3Rpb24oX3JlZikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBfcmVmLmluZGV4LCBrZXkgPSBfdGhpcy5fa2V5TWFwcGVyKDAsIGluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9jb2x1bW5XaWR0aENhY2hlLmhhc093blByb3BlcnR5KGtleSkgPyBfdGhpcy5fY29sdW1uV2lkdGhDYWNoZVtrZXldIDogX3RoaXMuX2RlZmF1bHRXaWR0aDsKICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnJvd0hlaWdodCA9IGZ1bmN0aW9uKF9yZWYyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IF9yZWYyLmluZGV4LCBrZXkgPSBfdGhpcy5fa2V5TWFwcGVyKGluZGV4LCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9yb3dIZWlnaHRDYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpID8gX3RoaXMuX3Jvd0hlaWdodENhY2hlW2tleV0gOiBfdGhpcy5fZGVmYXVsdEhlaWdodDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0SGVpZ2h0ID0gcGFyYW1zLmRlZmF1bHRIZWlnaHQsIGRlZmF1bHRXaWR0aCA9IHBhcmFtcy5kZWZhdWx0V2lkdGgsIGZpeGVkSGVpZ2h0ID0gcGFyYW1zLmZpeGVkSGVpZ2h0LCBmaXhlZFdpZHRoID0gcGFyYW1zLmZpeGVkV2lkdGgsIGtleU1hcHBlciA9IHBhcmFtcy5rZXlNYXBwZXIsIG1pbkhlaWdodCA9IHBhcmFtcy5taW5IZWlnaHQsIG1pbldpZHRoID0gcGFyYW1zLm1pbldpZHRoOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc0ZpeGVkSGVpZ2h0ID0gZml4ZWRIZWlnaHQgPT09ICEwLCB0aGlzLl9oYXNGaXhlZFdpZHRoID0gZml4ZWRXaWR0aCA9PT0gITAsIAogICAgICAgICAgICAgICAgICAgIHRoaXMuX21pbkhlaWdodCA9IG1pbkhlaWdodCB8fCAwLCB0aGlzLl9taW5XaWR0aCA9IG1pbldpZHRoIHx8IDAsIHRoaXMuX2tleU1hcHBlciA9IGtleU1hcHBlciB8fCBkZWZhdWx0S2V5TWFwcGVyLCAKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWZhdWx0SGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5fbWluSGVpZ2h0LCAibnVtYmVyIiA9PSB0eXBlb2YgZGVmYXVsdEhlaWdodCA/IGRlZmF1bHRIZWlnaHQgOiBERUZBVUxUX0hFSUdIVCksIAogICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRXaWR0aCA9IE1hdGgubWF4KHRoaXMuX21pbldpZHRoLCAibnVtYmVyIiA9PSB0eXBlb2YgZGVmYXVsdFdpZHRoID8gZGVmYXVsdFdpZHRoIDogREVGQVVMVF9XSURUSCksIAogICAgICAgICAgICAgICAgICAgICJwcm9kdWN0aW9uIiAhPT0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgJiYgKHRoaXMuX2hhc0ZpeGVkSGVpZ2h0ID09PSAhMSAmJiB0aGlzLl9oYXNGaXhlZFdpZHRoID09PSAhMSAmJiBjb25zb2xlLndhcm4oIkNlbGxNZWFzdXJlckNhY2hlIHNob3VsZCBvbmx5IG1lYXN1cmUgYSBjZWxsJ3Mgd2lkdGggb3IgaGVpZ2h0LiBZb3UgaGF2ZSBjb25maWd1cmVkIENlbGxNZWFzdXJlckNhY2hlIHRvIG1lYXN1cmUgYm90aC4gVGhpcyB3aWxsIHJlc3VsdCBpbiBwb29yIHBlcmZvcm1hbmNlLiIpLCAKICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYXNGaXhlZEhlaWdodCA9PT0gITEgJiYgMCA9PT0gdGhpcy5fZGVmYXVsdEhlaWdodCAmJiBjb25zb2xlLndhcm4oIkZpeGVkIGhlaWdodCBDZWxsTWVhc3VyZXJDYWNoZSBzaG91bGQgc3BlY2lmeSBhIDpkZWZhdWx0SGVpZ2h0IGdyZWF0ZXIgdGhhbiAwLiBGYWlsaW5nIHRvIGRvIHNvIHdpbGwgbGVhZCB0byB1bm5lY2Vzc2FyeSBsYXlvdXQgYW5kIHBvb3IgcGVyZm9ybWFuY2UuIiksIAogICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc0ZpeGVkV2lkdGggPT09ICExICYmIDAgPT09IHRoaXMuX2RlZmF1bHRXaWR0aCAmJiBjb25zb2xlLndhcm4oIkZpeGVkIHdpZHRoIENlbGxNZWFzdXJlckNhY2hlIHNob3VsZCBzcGVjaWZ5IGEgOmRlZmF1bHRXaWR0aCBncmVhdGVyIHRoYW4gMC4gRmFpbGluZyB0byBkbyBzbyB3aWxsIGxlYWQgdG8gdW5uZWNlc3NhcnkgbGF5b3V0IGFuZCBwb29yIHBlcmZvcm1hbmNlLiIpKSwgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29sdW1uQ291bnQgPSAwLCB0aGlzLl9yb3dDb3VudCA9IDAsIHRoaXMuX2NlbGxIZWlnaHRDYWNoZSA9IHt9LCB0aGlzLl9jZWxsV2lkdGhDYWNoZSA9IHt9LCAKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb2x1bW5XaWR0aENhY2hlID0ge30sIHRoaXMuX3Jvd0hlaWdodENhY2hlID0ge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoQ2VsbE1lYXN1cmVyQ2FjaGUsIFsgewogICAgICAgICAgICAgICAgICAgIGtleTogImNsZWFyIiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24ocm93SW5kZXgsIGNvbHVtbkluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSB0aGlzLl9rZXlNYXBwZXIocm93SW5kZXgsIGNvbHVtbkluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NlbGxIZWlnaHRDYWNoZVtrZXldLCBkZWxldGUgdGhpcy5fY2VsbFdpZHRoQ2FjaGVba2V5XSwgdGhpcy5fdXBkYXRlQ2FjaGVkQ29sdW1uQW5kUm93U2l6ZXMocm93SW5kZXgsIGNvbHVtbkluZGV4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAga2V5OiAiY2xlYXJBbGwiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2VsbEhlaWdodENhY2hlID0ge30sIHRoaXMuX2NlbGxXaWR0aENhY2hlID0ge30sIHRoaXMuX2NvbHVtbldpZHRoQ2FjaGUgPSB7fSwgCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jvd0hlaWdodENhY2hlID0ge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIGtleTogImhhc0ZpeGVkSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYXNGaXhlZEhlaWdodDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAga2V5OiAiaGFzRml4ZWRXaWR0aCIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFzRml4ZWRXaWR0aDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAga2V5OiAiZ2V0SGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24ocm93SW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHVtbkluZGV4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiAwLCBrZXkgPSB0aGlzLl9rZXlNYXBwZXIocm93SW5kZXgsIGNvbHVtbkluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NlbGxIZWlnaHRDYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpID8gTWF0aC5tYXgodGhpcy5fbWluSGVpZ2h0LCB0aGlzLl9jZWxsSGVpZ2h0Q2FjaGVba2V5XSkgOiB0aGlzLl9kZWZhdWx0SGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICJnZXRXaWR0aCIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHJvd0luZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5JbmRleCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogMCwga2V5ID0gdGhpcy5fa2V5TWFwcGVyKHJvd0luZGV4LCBjb2x1bW5JbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jZWxsV2lkdGhDYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpID8gTWF0aC5tYXgodGhpcy5fbWluV2lkdGgsIHRoaXMuX2NlbGxXaWR0aENhY2hlW2tleV0pIDogdGhpcy5fZGVmYXVsdFdpZHRoOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICJoYXMiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihyb3dJbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uSW5kZXggPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IDAsIGtleSA9IHRoaXMuX2tleU1hcHBlcihyb3dJbmRleCwgY29sdW1uSW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2VsbEhlaWdodENhY2hlLmhhc093blByb3BlcnR5KGtleSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIGtleTogInNldCIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHJvd0luZGV4LCBjb2x1bW5JbmRleCwgd2lkdGgsIGhlaWdodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5fa2V5TWFwcGVyKHJvd0luZGV4LCBjb2x1bW5JbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4ID49IHRoaXMuX2NvbHVtbkNvdW50ICYmICh0aGlzLl9jb2x1bW5Db3VudCA9IGNvbHVtbkluZGV4ICsgMSksIHJvd0luZGV4ID49IHRoaXMuX3Jvd0NvdW50ICYmICh0aGlzLl9yb3dDb3VudCA9IHJvd0luZGV4ICsgMSksIAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jZWxsSGVpZ2h0Q2FjaGVba2V5XSA9IGhlaWdodCwgdGhpcy5fY2VsbFdpZHRoQ2FjaGVba2V5XSA9IHdpZHRoLCB0aGlzLl91cGRhdGVDYWNoZWRDb2x1bW5BbmRSb3dTaXplcyhyb3dJbmRleCwgY29sdW1uSW5kZXgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICJfdXBkYXRlQ2FjaGVkQ29sdW1uQW5kUm93U2l6ZXMiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihyb3dJbmRleCwgY29sdW1uSW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgY29sdW1uV2lkdGggPSAwLCBpID0gMDsgaSA8IHRoaXMuX3Jvd0NvdW50OyBpKyspIGNvbHVtbldpZHRoID0gTWF0aC5tYXgoY29sdW1uV2lkdGgsIHRoaXMuZ2V0V2lkdGgoaSwgY29sdW1uSW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcm93SGVpZ2h0ID0gMCwgX2kgPSAwOyBfaSA8IHRoaXMuX2NvbHVtbkNvdW50OyBfaSsrKSByb3dIZWlnaHQgPSBNYXRoLm1heChyb3dIZWlnaHQsIHRoaXMuZ2V0SGVpZ2h0KHJvd0luZGV4LCBfaSkpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uS2V5ID0gdGhpcy5fa2V5TWFwcGVyKDAsIGNvbHVtbkluZGV4KSwgcm93S2V5ID0gdGhpcy5fa2V5TWFwcGVyKHJvd0luZGV4LCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29sdW1uV2lkdGhDYWNoZVtjb2x1bW5LZXldID0gY29sdW1uV2lkdGgsIHRoaXMuX3Jvd0hlaWdodENhY2hlW3Jvd0tleV0gPSByb3dIZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIGtleTogImRlZmF1bHRIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0SGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICJkZWZhdWx0V2lkdGgiLAogICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0V2lkdGg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBdKSwgQ2VsbE1lYXN1cmVyQ2FjaGU7CiAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgZXhwb3J0cy5kZWZhdWx0ID0gQ2VsbE1lYXN1cmVyQ2FjaGU7CiAgICAgICAgfSkuY2FsbChleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDkxKSk7CiAgICB9LCAvKiAxMDUgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsKICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG9iagogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgICAgICAgICAgIHZhbHVlOiAhMAogICAgICAgIH0pLCBleHBvcnRzLkNvbGxlY3Rpb24gPSBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7CiAgICAgICAgdmFyIF9Db2xsZWN0aW9uMiA9IF9fd2VicGFja19yZXF1aXJlX18oMTA2KSwgX0NvbGxlY3Rpb24zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ29sbGVjdGlvbjIpOwogICAgICAgIGV4cG9ydHMuZGVmYXVsdCA9IF9Db2xsZWN0aW9uMy5kZWZhdWx0LCBleHBvcnRzLkNvbGxlY3Rpb24gPSBfQ29sbGVjdGlvbjMuZGVmYXVsdDsKICAgIH0sIC8qIDEwNiAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRDZWxsR3JvdXBSZW5kZXJlcihfcmVmNCkgewogICAgICAgICAgICB2YXIgY2VsbENhY2hlID0gX3JlZjQuY2VsbENhY2hlLCBjZWxsUmVuZGVyZXIgPSBfcmVmNC5jZWxsUmVuZGVyZXIsIGNlbGxTaXplQW5kUG9zaXRpb25HZXR0ZXIgPSBfcmVmNC5jZWxsU2l6ZUFuZFBvc2l0aW9uR2V0dGVyLCBpbmRpY2VzID0gX3JlZjQuaW5kaWNlcywgaXNTY3JvbGxpbmcgPSBfcmVmNC5pc1Njcm9sbGluZzsKICAgICAgICAgICAgcmV0dXJuIGluZGljZXMubWFwKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICB2YXIgY2VsbE1ldGFkYXRhID0gY2VsbFNpemVBbmRQb3NpdGlvbkdldHRlcih7CiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4CiAgICAgICAgICAgICAgICB9KSwgY2VsbFJlbmRlcmVyUHJvcHMgPSB7CiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LAogICAgICAgICAgICAgICAgICAgIGlzU2Nyb2xsaW5nOiBpc1Njcm9sbGluZywKICAgICAgICAgICAgICAgICAgICBrZXk6IGluZGV4LAogICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogY2VsbE1ldGFkYXRhLmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogY2VsbE1ldGFkYXRhLngsCiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAiYWJzb2x1dGUiLAogICAgICAgICAgICAgICAgICAgICAgICB0b3A6IGNlbGxNZXRhZGF0YS55LAogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogY2VsbE1ldGFkYXRhLndpZHRoCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBpc1Njcm9sbGluZyA/IChpbmRleCBpbiBjZWxsQ2FjaGUgfHwgKGNlbGxDYWNoZVtpbmRleF0gPSBjZWxsUmVuZGVyZXIoY2VsbFJlbmRlcmVyUHJvcHMpKSwgCiAgICAgICAgICAgICAgICBjZWxsQ2FjaGVbaW5kZXhdKSA6IGNlbGxSZW5kZXJlcihjZWxsUmVuZGVyZXJQcm9wcyk7CiAgICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbihyZW5kZXJlZENlbGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiAhIXJlbmRlcmVkQ2VsbDsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSk7CiAgICAgICAgdmFyIF9leHRlbmRzMiA9IF9fd2VicGFja19yZXF1aXJlX18oMTA3KSwgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTIpLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKSwgX2dldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKSwgX2dldFByb3RvdHlwZU9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldFByb3RvdHlwZU9mKSwgX2NsYXNzQ2FsbENoZWNrMiA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpLCBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKSwgX2NyZWF0ZUNsYXNzMiA9IF9fd2VicGFja19yZXF1aXJlX18oMzApLCBfY3JlYXRlQ2xhc3MzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2xhc3MyKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNCksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKSwgX2luaGVyaXRzMiA9IF9fd2VicGFja19yZXF1aXJlX18oODEpLCBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKSwgX3Byb3BUeXBlcyA9IF9fd2VicGFja19yZXF1aXJlX18oODkpLCBfcmVhY3QgPSAoX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKSwgCiAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXyg5NykpLCBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpLCBfQ29sbGVjdGlvblZpZXcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMyksIF9Db2xsZWN0aW9uVmlldzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Db2xsZWN0aW9uVmlldyksIF9jYWxjdWxhdGVTaXplQW5kUG9zaXRpb25EYXRhMiA9IF9fd2VicGFja19yZXF1aXJlX18oMTIxKSwgX2NhbGN1bGF0ZVNpemVBbmRQb3NpdGlvbkRhdGEzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2FsY3VsYXRlU2l6ZUFuZFBvc2l0aW9uRGF0YTIpLCBfZ2V0VXBkYXRlZE9mZnNldEZvckluZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjQpLCBfZ2V0VXBkYXRlZE9mZnNldEZvckluZGV4MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldFVwZGF0ZWRPZmZzZXRGb3JJbmRleCksIENvbGxlY3Rpb24gPSBmdW5jdGlvbihfUHVyZUNvbXBvbmVudCkgewogICAgICAgICAgICBmdW5jdGlvbiBDb2xsZWN0aW9uKHByb3BzLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBDb2xsZWN0aW9uKTsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMuZGVmYXVsdCkodGhpcywgKENvbGxlY3Rpb24uX19wcm90b19fIHx8ICgwLCAKICAgICAgICAgICAgICAgIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoQ29sbGVjdGlvbikpLmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fY2VsbE1ldGFkYXRhID0gW10sIF90aGlzLl9sYXN0UmVuZGVyZWRDZWxsSW5kaWNlcyA9IFtdLCBfdGhpcy5fY2VsbENhY2hlID0gW10sIAogICAgICAgICAgICAgICAgX3RoaXMuX2lzU2Nyb2xsaW5nQ2hhbmdlID0gX3RoaXMuX2lzU2Nyb2xsaW5nQ2hhbmdlLmJpbmQoX3RoaXMpLCBfdGhpcy5fc2V0Q29sbGVjdGlvblZpZXdSZWYgPSBfdGhpcy5fc2V0Q29sbGVjdGlvblZpZXdSZWYuYmluZChfdGhpcyksIAogICAgICAgICAgICAgICAgX3RoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICgwLCBfaW5oZXJpdHMzLmRlZmF1bHQpKENvbGxlY3Rpb24sIF9QdXJlQ29tcG9uZW50KSwgKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoQ29sbGVjdGlvbiwgWyB7CiAgICAgICAgICAgICAgICBrZXk6ICJmb3JjZVVwZGF0ZSIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdm9pZCAwICE9PSB0aGlzLl9jb2xsZWN0aW9uVmlldyAmJiB0aGlzLl9jb2xsZWN0aW9uVmlldy5mb3JjZVVwZGF0ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJyZWNvbXB1dGVDZWxsU2l6ZXNBbmRQb3NpdGlvbnMiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NlbGxDYWNoZSA9IFtdLCB0aGlzLl9jb2xsZWN0aW9uVmlldy5yZWNvbXB1dGVDZWxsU2l6ZXNBbmRQb3NpdGlvbnMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAicmVuZGVyIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMy5kZWZhdWx0KSh0aGlzLnByb3BzLCBbXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9Db2xsZWN0aW9uVmlldzIuZGVmYXVsdCwgKDAsIF9leHRlbmRzMy5kZWZhdWx0KSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxMYXlvdXRNYW5hZ2VyOiB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICBpc1Njcm9sbGluZ0NoYW5nZTogdGhpcy5faXNTY3JvbGxpbmdDaGFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZjogdGhpcy5fc2V0Q29sbGVjdGlvblZpZXdSZWYKICAgICAgICAgICAgICAgICAgICB9LCBwcm9wcykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJjYWxjdWxhdGVTaXplQW5kUG9zaXRpb25EYXRhIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcywgY2VsbENvdW50ID0gX3Byb3BzLmNlbGxDb3VudCwgY2VsbFNpemVBbmRQb3NpdGlvbkdldHRlciA9IF9wcm9wcy5jZWxsU2l6ZUFuZFBvc2l0aW9uR2V0dGVyLCBzZWN0aW9uU2l6ZSA9IF9wcm9wcy5zZWN0aW9uU2l6ZSwgZGF0YSA9ICgwLCAKICAgICAgICAgICAgICAgICAgICBfY2FsY3VsYXRlU2l6ZUFuZFBvc2l0aW9uRGF0YTMuZGVmYXVsdCkoewogICAgICAgICAgICAgICAgICAgICAgICBjZWxsQ291bnQ6IGNlbGxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFNpemVBbmRQb3NpdGlvbkdldHRlcjogY2VsbFNpemVBbmRQb3NpdGlvbkdldHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvblNpemU6IHNlY3Rpb25TaXplCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2VsbE1ldGFkYXRhID0gZGF0YS5jZWxsTWV0YWRhdGEsIHRoaXMuX3NlY3Rpb25NYW5hZ2VyID0gZGF0YS5zZWN0aW9uTWFuYWdlciwgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGVpZ2h0ID0gZGF0YS5oZWlnaHQsIHRoaXMuX3dpZHRoID0gZGF0YS53aWR0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiZ2V0TGFzdFJlbmRlcmVkSW5kaWNlcyIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZW5kZXJlZENlbGxJbmRpY2VzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJnZXRTY3JvbGxQb3NpdGlvbkZvckNlbGwiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKF9yZWYpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYWxpZ24gPSBfcmVmLmFsaWduLCBjZWxsSW5kZXggPSBfcmVmLmNlbGxJbmRleCwgaGVpZ2h0ID0gX3JlZi5oZWlnaHQsIHNjcm9sbExlZnQgPSBfcmVmLnNjcm9sbExlZnQsIHNjcm9sbFRvcCA9IF9yZWYuc2Nyb2xsVG9wLCB3aWR0aCA9IF9yZWYud2lkdGgsIGNlbGxDb3VudCA9IHRoaXMucHJvcHMuY2VsbENvdW50OwogICAgICAgICAgICAgICAgICAgIGlmIChjZWxsSW5kZXggPj0gMCAmJiBjZWxsSW5kZXggPCBjZWxsQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGxNZXRhZGF0YSA9IHRoaXMuX2NlbGxNZXRhZGF0YVtjZWxsSW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0ID0gKDAsIF9nZXRVcGRhdGVkT2Zmc2V0Rm9ySW5kZXgyLmRlZmF1bHQpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiBhbGlnbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxPZmZzZXQ6IGNlbGxNZXRhZGF0YS54LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFNpemU6IGNlbGxNZXRhZGF0YS53aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNpemU6IHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9mZnNldDogc2Nyb2xsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4OiBjZWxsSW5kZXgKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHNjcm9sbFRvcCA9ICgwLCBfZ2V0VXBkYXRlZE9mZnNldEZvckluZGV4Mi5kZWZhdWx0KSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogYWxpZ24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsT2Zmc2V0OiBjZWxsTWV0YWRhdGEueSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxTaXplOiBjZWxsTWV0YWRhdGEuaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyU2l6ZTogaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9mZnNldDogc2Nyb2xsVG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXg6IGNlbGxJbmRleAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3AKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJnZXRUb3RhbFNpemUiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5faGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5fd2lkdGgKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJjZWxsUmVuZGVyZXJzIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihfcmVmMikgewogICAgICAgICAgICAgICAgICAgIHZhciBfdGhpczIgPSB0aGlzLCBoZWlnaHQgPSBfcmVmMi5oZWlnaHQsIGlzU2Nyb2xsaW5nID0gX3JlZjIuaXNTY3JvbGxpbmcsIHdpZHRoID0gX3JlZjIud2lkdGgsIHggPSBfcmVmMi54LCB5ID0gX3JlZjIueSwgX3Byb3BzMiA9IHRoaXMucHJvcHMsIGNlbGxHcm91cFJlbmRlcmVyID0gX3Byb3BzMi5jZWxsR3JvdXBSZW5kZXJlciwgY2VsbFJlbmRlcmVyID0gX3Byb3BzMi5jZWxsUmVuZGVyZXI7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZW5kZXJlZENlbGxJbmRpY2VzID0gdGhpcy5fc2VjdGlvbk1hbmFnZXIuZ2V0Q2VsbEluZGljZXMoewogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICB4OiB4LAogICAgICAgICAgICAgICAgICAgICAgICB5OiB5CiAgICAgICAgICAgICAgICAgICAgfSksIGNlbGxHcm91cFJlbmRlcmVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgY2VsbENhY2hlOiB0aGlzLl9jZWxsQ2FjaGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlcjogY2VsbFJlbmRlcmVyLAogICAgICAgICAgICAgICAgICAgICAgICBjZWxsU2l6ZUFuZFBvc2l0aW9uR2V0dGVyOiBmdW5jdGlvbihfcmVmMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gX3JlZjMuaW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9zZWN0aW9uTWFuYWdlci5nZXRDZWxsTWV0YWRhdGEoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXM6IHRoaXMuX2xhc3RSZW5kZXJlZENlbGxJbmRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICBpc1Njcm9sbGluZzogaXNTY3JvbGxpbmcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX2lzU2Nyb2xsaW5nQ2hhbmdlIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihpc1Njcm9sbGluZykgewogICAgICAgICAgICAgICAgICAgIGlzU2Nyb2xsaW5nIHx8ICh0aGlzLl9jZWxsQ2FjaGUgPSBbXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9zZXRDb2xsZWN0aW9uVmlld1JlZiIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24ocmVmKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29sbGVjdGlvblZpZXcgPSByZWY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gXSksIENvbGxlY3Rpb247CiAgICAgICAgfShfcmVhY3QuUHVyZUNvbXBvbmVudCk7CiAgICAgICAgQ29sbGVjdGlvbi5kZWZhdWx0UHJvcHMgPSB7CiAgICAgICAgICAgICJhcmlhLWxhYmVsIjogImdyaWQiLAogICAgICAgICAgICBjZWxsR3JvdXBSZW5kZXJlcjogZGVmYXVsdENlbGxHcm91cFJlbmRlcmVyCiAgICAgICAgfSwgZXhwb3J0cy5kZWZhdWx0ID0gQ29sbGVjdGlvbjsKICAgIH0sIC8qIDEwNyAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGV4cG9ydHMuX19lc01vZHVsZSA9ICEwOwogICAgICAgIHZhciBfYXNzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDgpLCBfYXNzaWduMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Fzc2lnbik7CiAgICAgICAgZXhwb3J0cy5kZWZhdWx0ID0gX2Fzc2lnbjIuZGVmYXVsdCB8fCBmdW5jdGlvbih0YXJnZXQpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpICYmICh0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH07CiAgICB9LCAvKiAxMDggKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgZGVmYXVsdDogX193ZWJwYWNrX3JlcXVpcmVfXygxMDkpLAogICAgICAgICAgICBfX2VzTW9kdWxlOiAhMAogICAgICAgIH07CiAgICB9LCAvKiAxMDkgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMCksIG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNikuT2JqZWN0LmFzc2lnbjsKICAgIH0sIC8qIDExMCAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIC8vIDE5LjEuMy4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UpCiAgICAgICAgdmFyICRleHBvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KTsKICAgICAgICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiwgIk9iamVjdCIsIHsKICAgICAgICAgICAgYXNzaWduOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMSkKICAgICAgICB9KTsKICAgIH0sIC8qIDExMSAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICAvLyAxOS4xLjIuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlLCAuLi4pCiAgICAgICAgdmFyIGdldEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KSwgZ09QUyA9IF9fd2VicGFja19yZXF1aXJlX18oNzIpLCBwSUUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDczKSwgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpLCBJT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MSksICRhc3NpZ24gPSBPYmplY3QuYXNzaWduOwogICAgICAgIC8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgX193ZWJwYWNrX3JlcXVpcmVfXygyNSkoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBBID0ge30sIEIgPSB7fSwgUyA9IFN5bWJvbCgpLCBLID0gImFiY2RlZmdoaWprbG1ub3BxcnN0IjsKICAgICAgICAgICAgcmV0dXJuIEFbU10gPSA3LCBLLnNwbGl0KCIiKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHsKICAgICAgICAgICAgICAgIEJba10gPSBrOwogICAgICAgICAgICB9KSwgNyAhPSAkYXNzaWduKHt9LCBBKVtTXSB8fCBPYmplY3Qua2V5cygkYXNzaWduKHt9LCBCKSkuam9pbigiIikgIT0gSzsKICAgICAgICB9KSA/IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CiAgICAgICAgICAgIGZvciAoLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgICAgICB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCksIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBpbmRleCA9IDEsIGdldFN5bWJvbHMgPSBnT1BTLmYsIGlzRW51bSA9IHBJRS5mOyBhTGVuID4gaW5kZXg7ICkgZm9yICh2YXIga2V5LCBTID0gSU9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pLCBrZXlzID0gZ2V0U3ltYm9scyA/IGdldEtleXMoUykuY29uY2F0KGdldFN5bWJvbHMoUykpIDogZ2V0S2V5cyhTKSwgbGVuZ3RoID0ga2V5cy5sZW5ndGgsIGogPSAwOyBsZW5ndGggPiBqOyApIGlzRW51bS5jYWxsKFMsIGtleSA9IGtleXNbaisrXSkgJiYgKFRba2V5XSA9IFNba2V5XSk7CiAgICAgICAgICAgIHJldHVybiBUOwogICAgICAgIH0gOiAkYXNzaWduOwogICAgfSwgLyogMTEyICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGV4cG9ydHMuX19lc01vZHVsZSA9ICEwLCBleHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbihvYmosIGtleXMpIHsKICAgICAgICAgICAgdmFyIHRhcmdldCA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpIGluIG9iaikga2V5cy5pbmRleE9mKGkpID49IDAgfHwgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkgJiYgKHRhcmdldFtpXSA9IG9ialtpXSk7CiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgfTsKICAgIH0sIC8qIDExMyAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSk7CiAgICAgICAgdmFyIF9leHRlbmRzMiA9IF9fd2VicGFja19yZXF1aXJlX18oMTA3KSwgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpLCBfZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpLCBfZ2V0UHJvdG90eXBlT2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0UHJvdG90eXBlT2YpLCBfY2xhc3NDYWxsQ2hlY2syID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSksIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpLCBfY3JlYXRlQ2xhc3MyID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMCksIF9jcmVhdGVDbGFzczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDbGFzczIpLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpLCBfaW5oZXJpdHMyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MSksIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpLCBfcHJvcFR5cGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OSksIF9yZWFjdCA9IChfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpLCAKICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3KSksIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCksIF9jbGFzc25hbWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTQpLCBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKSwgX2NyZWF0ZUNhbGxiYWNrTWVtb2l6ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExNSksIF9jcmVhdGVDYWxsYmFja01lbW9pemVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNhbGxiYWNrTWVtb2l6ZXIpLCBfc2Nyb2xsYmFyU2l6ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTE5KSwgX3Njcm9sbGJhclNpemUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2Nyb2xsYmFyU2l6ZSksIElTX1NDUk9MTElOR19USU1FT1VUID0gMTUwLCBTQ1JPTExfUE9TSVRJT05fQ0hBTkdFX1JFQVNPTlMgPSB7CiAgICAgICAgICAgIE9CU0VSVkVEOiAib2JzZXJ2ZWQiLAogICAgICAgICAgICBSRVFVRVNURUQ6ICJyZXF1ZXN0ZWQiCiAgICAgICAgfSwgQ29sbGVjdGlvblZpZXcgPSBmdW5jdGlvbihfUHVyZUNvbXBvbmVudCkgewogICAgICAgICAgICBmdW5jdGlvbiBDb2xsZWN0aW9uVmlldyhwcm9wcywgY29udGV4dCkgewogICAgICAgICAgICAgICAgKDAsIF9jbGFzc0NhbGxDaGVjazMuZGVmYXVsdCkodGhpcywgQ29sbGVjdGlvblZpZXcpOwogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMy5kZWZhdWx0KSh0aGlzLCAoQ29sbGVjdGlvblZpZXcuX19wcm90b19fIHx8ICgwLCAKICAgICAgICAgICAgICAgIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoQ29sbGVjdGlvblZpZXcpKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuc3RhdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgaXNTY3JvbGxpbmc6ICExLAogICAgICAgICAgICAgICAgICAgIHNjcm9sbExlZnQ6IDAsCiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiAwCiAgICAgICAgICAgICAgICB9LCBfdGhpcy5fY2FsY3VsYXRlU2l6ZUFuZFBvc2l0aW9uRGF0YU9uTmV4dFVwZGF0ZSA9ICExLCBfdGhpcy5fb25TZWN0aW9uUmVuZGVyZWRNZW1vaXplciA9ICgwLCAKICAgICAgICAgICAgICAgIF9jcmVhdGVDYWxsYmFja01lbW9pemVyMi5kZWZhdWx0KSgpLCBfdGhpcy5fb25TY3JvbGxNZW1vaXplciA9ICgwLCBfY3JlYXRlQ2FsbGJhY2tNZW1vaXplcjIuZGVmYXVsdCkoITEpLCAKICAgICAgICAgICAgICAgIF90aGlzLl9pbnZva2VPblNlY3Rpb25SZW5kZXJlZEhlbHBlciA9IF90aGlzLl9pbnZva2VPblNlY3Rpb25SZW5kZXJlZEhlbHBlci5iaW5kKF90aGlzKSwgCiAgICAgICAgICAgICAgICBfdGhpcy5fb25TY3JvbGwgPSBfdGhpcy5fb25TY3JvbGwuYmluZChfdGhpcyksIF90aGlzLl9zZXRTY3JvbGxpbmdDb250YWluZXJSZWYgPSBfdGhpcy5fc2V0U2Nyb2xsaW5nQ29udGFpbmVyUmVmLmJpbmQoX3RoaXMpLCAKICAgICAgICAgICAgICAgIF90aGlzLl91cGRhdGVTY3JvbGxQb3NpdGlvbkZvclNjcm9sbFRvQ2VsbCA9IF90aGlzLl91cGRhdGVTY3JvbGxQb3NpdGlvbkZvclNjcm9sbFRvQ2VsbC5iaW5kKF90aGlzKSwgCiAgICAgICAgICAgICAgICBfdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKDAsIF9pbmhlcml0czMuZGVmYXVsdCkoQ29sbGVjdGlvblZpZXcsIF9QdXJlQ29tcG9uZW50KSwgKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoQ29sbGVjdGlvblZpZXcsIFsgewogICAgICAgICAgICAgICAga2V5OiAicmVjb21wdXRlQ2VsbFNpemVzQW5kUG9zaXRpb25zIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxjdWxhdGVTaXplQW5kUG9zaXRpb25EYXRhT25OZXh0VXBkYXRlID0gITAsIHRoaXMuZm9yY2VVcGRhdGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiY29tcG9uZW50RGlkTW91bnQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLCBjZWxsTGF5b3V0TWFuYWdlciA9IF9wcm9wcy5jZWxsTGF5b3V0TWFuYWdlciwgc2Nyb2xsTGVmdCA9IF9wcm9wcy5zY3JvbGxMZWZ0LCBzY3JvbGxUb0NlbGwgPSBfcHJvcHMuc2Nyb2xsVG9DZWxsLCBzY3JvbGxUb3AgPSBfcHJvcHMuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbGJhclNpemVNZWFzdXJlZCB8fCAodGhpcy5fc2Nyb2xsYmFyU2l6ZSA9ICgwLCBfc2Nyb2xsYmFyU2l6ZTIuZGVmYXVsdCkoKSwgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsYmFyU2l6ZU1lYXN1cmVkID0gITAsIHRoaXMuc2V0U3RhdGUoe30pKSwgc2Nyb2xsVG9DZWxsID49IDAgPyB0aGlzLl91cGRhdGVTY3JvbGxQb3NpdGlvbkZvclNjcm9sbFRvQ2VsbCgpIDogKHNjcm9sbExlZnQgPj0gMCB8fCBzY3JvbGxUb3AgPj0gMCkgJiYgdGhpcy5fc2V0U2Nyb2xsUG9zaXRpb24oewogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0OiBzY3JvbGxMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3A6IHNjcm9sbFRvcAogICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl9pbnZva2VPblNlY3Rpb25SZW5kZXJlZEhlbHBlcigpOwogICAgICAgICAgICAgICAgICAgIHZhciBfY2VsbExheW91dE1hbmFnZXIkZ2UgPSBjZWxsTGF5b3V0TWFuYWdlci5nZXRUb3RhbFNpemUoKSwgdG90YWxIZWlnaHQgPSBfY2VsbExheW91dE1hbmFnZXIkZ2UuaGVpZ2h0LCB0b3RhbFdpZHRoID0gX2NlbGxMYXlvdXRNYW5hZ2VyJGdlLndpZHRoOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZU9uU2Nyb2xsTWVtb2l6ZXIoewogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0OiBzY3JvbGxMZWZ0IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsSGVpZ2h0OiB0b3RhbEhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxXaWR0aDogdG90YWxXaWR0aAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJjb21wb25lbnREaWRVcGRhdGUiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHByZXZQcm9wcywgcHJldlN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9wcm9wczIgPSB0aGlzLnByb3BzLCBoZWlnaHQgPSBfcHJvcHMyLmhlaWdodCwgc2Nyb2xsVG9BbGlnbm1lbnQgPSBfcHJvcHMyLnNjcm9sbFRvQWxpZ25tZW50LCBzY3JvbGxUb0NlbGwgPSBfcHJvcHMyLnNjcm9sbFRvQ2VsbCwgd2lkdGggPSBfcHJvcHMyLndpZHRoLCBfc3RhdGUgPSB0aGlzLnN0YXRlLCBzY3JvbGxMZWZ0ID0gX3N0YXRlLnNjcm9sbExlZnQsIHNjcm9sbFBvc2l0aW9uQ2hhbmdlUmVhc29uID0gX3N0YXRlLnNjcm9sbFBvc2l0aW9uQ2hhbmdlUmVhc29uLCBzY3JvbGxUb3AgPSBfc3RhdGUuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uQ2hhbmdlUmVhc29uID09PSBTQ1JPTExfUE9TSVRJT05fQ0hBTkdFX1JFQVNPTlMuUkVRVUVTVEVEICYmIChzY3JvbGxMZWZ0ID49IDAgJiYgc2Nyb2xsTGVmdCAhPT0gcHJldlN0YXRlLnNjcm9sbExlZnQgJiYgc2Nyb2xsTGVmdCAhPT0gdGhpcy5fc2Nyb2xsaW5nQ29udGFpbmVyLnNjcm9sbExlZnQgJiYgKHRoaXMuX3Njcm9sbGluZ0NvbnRhaW5lci5zY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdCksIAogICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcCA+PSAwICYmIHNjcm9sbFRvcCAhPT0gcHJldlN0YXRlLnNjcm9sbFRvcCAmJiBzY3JvbGxUb3AgIT09IHRoaXMuX3Njcm9sbGluZ0NvbnRhaW5lci5zY3JvbGxUb3AgJiYgKHRoaXMuX3Njcm9sbGluZ0NvbnRhaW5lci5zY3JvbGxUb3AgPSBzY3JvbGxUb3ApKSwgCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID09PSBwcmV2UHJvcHMuaGVpZ2h0ICYmIHNjcm9sbFRvQWxpZ25tZW50ID09PSBwcmV2UHJvcHMuc2Nyb2xsVG9BbGlnbm1lbnQgJiYgc2Nyb2xsVG9DZWxsID09PSBwcmV2UHJvcHMuc2Nyb2xsVG9DZWxsICYmIHdpZHRoID09PSBwcmV2UHJvcHMud2lkdGggfHwgdGhpcy5fdXBkYXRlU2Nyb2xsUG9zaXRpb25Gb3JTY3JvbGxUb0NlbGwoKSwgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52b2tlT25TZWN0aW9uUmVuZGVyZWRIZWxwZXIoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiY29tcG9uZW50V2lsbE1vdW50IiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbExheW91dE1hbmFnZXIgPSB0aGlzLnByb3BzLmNlbGxMYXlvdXRNYW5hZ2VyOwogICAgICAgICAgICAgICAgICAgIGNlbGxMYXlvdXRNYW5hZ2VyLmNhbGN1bGF0ZVNpemVBbmRQb3NpdGlvbkRhdGEoKSwgdGhpcy5fc2Nyb2xsYmFyU2l6ZSA9ICgwLCBfc2Nyb2xsYmFyU2l6ZTIuZGVmYXVsdCkoKSwgCiAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSB0aGlzLl9zY3JvbGxiYXJTaXplID8gKHRoaXMuX3Njcm9sbGJhclNpemVNZWFzdXJlZCA9ICExLCB0aGlzLl9zY3JvbGxiYXJTaXplID0gMCkgOiB0aGlzLl9zY3JvbGxiYXJTaXplTWVhc3VyZWQgPSAhMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiY29tcG9uZW50V2lsbFVubW91bnQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVQb2ludGVyRXZlbnRzVGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aGlzLl9kaXNhYmxlUG9pbnRlckV2ZW50c1RpbWVvdXRJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKG5leHRQcm9wcykgewogICAgICAgICAgICAgICAgICAgIHZhciBfc3RhdGUyID0gdGhpcy5zdGF0ZSwgc2Nyb2xsTGVmdCA9IF9zdGF0ZTIuc2Nyb2xsTGVmdCwgc2Nyb2xsVG9wID0gX3N0YXRlMi5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICAgICAgMCAhPT0gbmV4dFByb3BzLmNlbGxDb3VudCB8fCAwID09PSBzY3JvbGxMZWZ0ICYmIDAgPT09IHNjcm9sbFRvcCA/IG5leHRQcm9wcy5zY3JvbGxMZWZ0ID09PSB0aGlzLnByb3BzLnNjcm9sbExlZnQgJiYgbmV4dFByb3BzLnNjcm9sbFRvcCA9PT0gdGhpcy5wcm9wcy5zY3JvbGxUb3AgfHwgdGhpcy5fc2V0U2Nyb2xsUG9zaXRpb24oewogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0OiBuZXh0UHJvcHMuc2Nyb2xsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBuZXh0UHJvcHMuc2Nyb2xsVG9wCiAgICAgICAgICAgICAgICAgICAgfSkgOiB0aGlzLl9zZXRTY3JvbGxQb3NpdGlvbih7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbExlZnQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogMAogICAgICAgICAgICAgICAgICAgIH0pLCAobmV4dFByb3BzLmNlbGxDb3VudCAhPT0gdGhpcy5wcm9wcy5jZWxsQ291bnQgfHwgbmV4dFByb3BzLmNlbGxMYXlvdXRNYW5hZ2VyICE9PSB0aGlzLnByb3BzLmNlbGxMYXlvdXRNYW5hZ2VyIHx8IHRoaXMuX2NhbGN1bGF0ZVNpemVBbmRQb3NpdGlvbkRhdGFPbk5leHRVcGRhdGUpICYmIG5leHRQcm9wcy5jZWxsTGF5b3V0TWFuYWdlci5jYWxjdWxhdGVTaXplQW5kUG9zaXRpb25EYXRhKCksIAogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGN1bGF0ZVNpemVBbmRQb3NpdGlvbkRhdGFPbk5leHRVcGRhdGUgJiYgKHRoaXMuX2NhbGN1bGF0ZVNpemVBbmRQb3NpdGlvbkRhdGFPbk5leHRVcGRhdGUgPSAhMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogInJlbmRlciIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9wcm9wczMgPSB0aGlzLnByb3BzLCBhdXRvSGVpZ2h0ID0gX3Byb3BzMy5hdXRvSGVpZ2h0LCBjZWxsQ291bnQgPSBfcHJvcHMzLmNlbGxDb3VudCwgY2VsbExheW91dE1hbmFnZXIgPSBfcHJvcHMzLmNlbGxMYXlvdXRNYW5hZ2VyLCBjbGFzc05hbWUgPSBfcHJvcHMzLmNsYXNzTmFtZSwgaGVpZ2h0ID0gX3Byb3BzMy5oZWlnaHQsIGhvcml6b250YWxPdmVyc2NhblNpemUgPSBfcHJvcHMzLmhvcml6b250YWxPdmVyc2NhblNpemUsIGlkID0gX3Byb3BzMy5pZCwgbm9Db250ZW50UmVuZGVyZXIgPSBfcHJvcHMzLm5vQ29udGVudFJlbmRlcmVyLCBzdHlsZSA9IF9wcm9wczMuc3R5bGUsIHZlcnRpY2FsT3ZlcnNjYW5TaXplID0gX3Byb3BzMy52ZXJ0aWNhbE92ZXJzY2FuU2l6ZSwgd2lkdGggPSBfcHJvcHMzLndpZHRoLCBfc3RhdGUzID0gdGhpcy5zdGF0ZSwgaXNTY3JvbGxpbmcgPSBfc3RhdGUzLmlzU2Nyb2xsaW5nLCBzY3JvbGxMZWZ0ID0gX3N0YXRlMy5zY3JvbGxMZWZ0LCBzY3JvbGxUb3AgPSBfc3RhdGUzLnNjcm9sbFRvcCwgX2NlbGxMYXlvdXRNYW5hZ2VyJGdlMiA9IGNlbGxMYXlvdXRNYW5hZ2VyLmdldFRvdGFsU2l6ZSgpLCB0b3RhbEhlaWdodCA9IF9jZWxsTGF5b3V0TWFuYWdlciRnZTIuaGVpZ2h0LCB0b3RhbFdpZHRoID0gX2NlbGxMYXlvdXRNYW5hZ2VyJGdlMi53aWR0aCwgbGVmdCA9IE1hdGgubWF4KDAsIHNjcm9sbExlZnQgLSBob3Jpem9udGFsT3ZlcnNjYW5TaXplKSwgdG9wID0gTWF0aC5tYXgoMCwgc2Nyb2xsVG9wIC0gdmVydGljYWxPdmVyc2NhblNpemUpLCByaWdodCA9IE1hdGgubWluKHRvdGFsV2lkdGgsIHNjcm9sbExlZnQgKyB3aWR0aCArIGhvcml6b250YWxPdmVyc2NhblNpemUpLCBib3R0b20gPSBNYXRoLm1pbih0b3RhbEhlaWdodCwgc2Nyb2xsVG9wICsgaGVpZ2h0ICsgdmVydGljYWxPdmVyc2NhblNpemUpLCBjaGlsZHJlblRvRGlzcGxheSA9IGhlaWdodCA+IDAgJiYgd2lkdGggPiAwID8gY2VsbExheW91dE1hbmFnZXIuY2VsbFJlbmRlcmVycyh7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogYm90dG9tIC0gdG9wLAogICAgICAgICAgICAgICAgICAgICAgICBpc1Njcm9sbGluZzogaXNTY3JvbGxpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiByaWdodCAtIGxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHg6IGxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHRvcAogICAgICAgICAgICAgICAgICAgIH0pIDogW10sIGNvbGxlY3Rpb25TdHlsZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYm94U2l6aW5nOiAiYm9yZGVyLWJveCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogImx0ciIsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogYXV0b0hlaWdodCA/ICJhdXRvIiA6IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICJyZWxhdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIFdlYmtpdE92ZXJmbG93U2Nyb2xsaW5nOiAidG91Y2giLAogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGxDaGFuZ2U6ICJ0cmFuc2Zvcm0iCiAgICAgICAgICAgICAgICAgICAgfSwgdmVydGljYWxTY3JvbGxCYXJTaXplID0gdG90YWxIZWlnaHQgPiBoZWlnaHQgPyB0aGlzLl9zY3JvbGxiYXJTaXplIDogMCwgaG9yaXpvbnRhbFNjcm9sbEJhclNpemUgPSB0b3RhbFdpZHRoID4gd2lkdGggPyB0aGlzLl9zY3JvbGxiYXJTaXplIDogMDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvblN0eWxlLm92ZXJmbG93WCA9IHRvdGFsV2lkdGggKyB2ZXJ0aWNhbFNjcm9sbEJhclNpemUgPD0gd2lkdGggPyAiaGlkZGVuIiA6ICJhdXRvIiwgCiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvblN0eWxlLm92ZXJmbG93WSA9IHRvdGFsSGVpZ2h0ICsgaG9yaXpvbnRhbFNjcm9sbEJhclNpemUgPD0gaGVpZ2h0ID8gImhpZGRlbiIgOiAiYXV0byIsIAogICAgICAgICAgICAgICAgICAgIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZjogdGhpcy5fc2V0U2Nyb2xsaW5nQ29udGFpbmVyUmVmLAogICAgICAgICAgICAgICAgICAgICAgICAiYXJpYS1sYWJlbCI6IHRoaXMucHJvcHNbImFyaWEtbGFiZWwiXSwKICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyLmRlZmF1bHQpKCJSZWFjdFZpcnR1YWxpemVkX19Db2xsZWN0aW9uIiwgY2xhc3NOYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLAogICAgICAgICAgICAgICAgICAgICAgICBvblNjcm9sbDogdGhpcy5fb25TY3JvbGwsCiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU6ICJncmlkIiwKICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICgwLCBfZXh0ZW5kczMuZGVmYXVsdCkoe30sIGNvbGxlY3Rpb25TdHlsZSwgc3R5bGUpLAogICAgICAgICAgICAgICAgICAgICAgICB0YWJJbmRleDogMAogICAgICAgICAgICAgICAgICAgIH0sIGNlbGxDb3VudCA+IDAgJiYgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAiUmVhY3RWaXJ0dWFsaXplZF9fQ29sbGVjdGlvbl9faW5uZXJTY3JvbGxDb250YWluZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB0b3RhbEhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogdG90YWxIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogdG90YWxXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiAiaGlkZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6IGlzU2Nyb2xsaW5nID8gIm5vbmUiIDogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdG90YWxXaWR0aAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgY2hpbGRyZW5Ub0Rpc3BsYXkpLCAwID09PSBjZWxsQ291bnQgJiYgbm9Db250ZW50UmVuZGVyZXIoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9lbmFibGVQb2ludGVyRXZlbnRzQWZ0ZXJEZWxheSIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzYWJsZVBvaW50ZXJFdmVudHNUaW1lb3V0SWQgJiYgY2xlYXJUaW1lb3V0KHRoaXMuX2Rpc2FibGVQb2ludGVyRXZlbnRzVGltZW91dElkKSwgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzYWJsZVBvaW50ZXJFdmVudHNUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNTY3JvbGxpbmdDaGFuZ2UgPSBfdGhpczIucHJvcHMuaXNTY3JvbGxpbmdDaGFuZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2Nyb2xsaW5nQ2hhbmdlKCExKSwgX3RoaXMyLl9kaXNhYmxlUG9pbnRlckV2ZW50c1RpbWVvdXRJZCA9IG51bGwsIF90aGlzMi5zZXRTdGF0ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Njcm9sbGluZzogITEKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwgSVNfU0NST0xMSU5HX1RJTUVPVVQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfaW52b2tlT25TZWN0aW9uUmVuZGVyZWRIZWxwZXIiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBfcHJvcHM0ID0gdGhpcy5wcm9wcywgY2VsbExheW91dE1hbmFnZXIgPSBfcHJvcHM0LmNlbGxMYXlvdXRNYW5hZ2VyLCBvblNlY3Rpb25SZW5kZXJlZCA9IF9wcm9wczQub25TZWN0aW9uUmVuZGVyZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25TZWN0aW9uUmVuZGVyZWRNZW1vaXplcih7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBvblNlY3Rpb25SZW5kZXJlZCwKICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlczogY2VsbExheW91dE1hbmFnZXIuZ2V0TGFzdFJlbmRlcmVkSW5kaWNlcygpCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX2ludm9rZU9uU2Nyb2xsTWVtb2l6ZXIiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKF9yZWYpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX3RoaXMzID0gdGhpcywgc2Nyb2xsTGVmdCA9IF9yZWYuc2Nyb2xsTGVmdCwgc2Nyb2xsVG9wID0gX3JlZi5zY3JvbGxUb3AsIHRvdGFsSGVpZ2h0ID0gX3JlZi50b3RhbEhlaWdodCwgdG90YWxXaWR0aCA9IF9yZWYudG90YWxXaWR0aDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblNjcm9sbE1lbW9pemVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uKF9yZWYyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsTGVmdCA9IF9yZWYyLnNjcm9sbExlZnQsIHNjcm9sbFRvcCA9IF9yZWYyLnNjcm9sbFRvcCwgX3Byb3BzNSA9IF90aGlzMy5wcm9wcywgaGVpZ2h0ID0gX3Byb3BzNS5oZWlnaHQsIG9uU2Nyb2xsID0gX3Byb3BzNS5vblNjcm9sbCwgd2lkdGggPSBfcHJvcHM1LndpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TY3JvbGwoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEhlaWdodDogaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFdpZHRoOiB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxIZWlnaHQ6IHRvdGFsSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsV2lkdGg6IHRvdGFsV2lkdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0OiBzY3JvbGxMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3AKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfc2V0U2Nyb2xsaW5nQ29udGFpbmVyUmVmIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihyZWYpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxpbmdDb250YWluZXIgPSByZWY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9zZXRTY3JvbGxQb3NpdGlvbiIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oX3JlZjMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsTGVmdCA9IF9yZWYzLnNjcm9sbExlZnQsIHNjcm9sbFRvcCA9IF9yZWYzLnNjcm9sbFRvcCwgbmV3U3RhdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uQ2hhbmdlUmVhc29uOiBTQ1JPTExfUE9TSVRJT05fQ0hBTkdFX1JFQVNPTlMuUkVRVUVTVEVECiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0ID49IDAgJiYgKG5ld1N0YXRlLnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0KSwgc2Nyb2xsVG9wID49IDAgJiYgKG5ld1N0YXRlLnNjcm9sbFRvcCA9IHNjcm9sbFRvcCksIAogICAgICAgICAgICAgICAgICAgIChzY3JvbGxMZWZ0ID49IDAgJiYgc2Nyb2xsTGVmdCAhPT0gdGhpcy5zdGF0ZS5zY3JvbGxMZWZ0IHx8IHNjcm9sbFRvcCA+PSAwICYmIHNjcm9sbFRvcCAhPT0gdGhpcy5zdGF0ZS5zY3JvbGxUb3ApICYmIHRoaXMuc2V0U3RhdGUobmV3U3RhdGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfdXBkYXRlU2Nyb2xsUG9zaXRpb25Gb3JTY3JvbGxUb0NlbGwiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBfcHJvcHM2ID0gdGhpcy5wcm9wcywgY2VsbExheW91dE1hbmFnZXIgPSBfcHJvcHM2LmNlbGxMYXlvdXRNYW5hZ2VyLCBoZWlnaHQgPSBfcHJvcHM2LmhlaWdodCwgc2Nyb2xsVG9BbGlnbm1lbnQgPSBfcHJvcHM2LnNjcm9sbFRvQWxpZ25tZW50LCBzY3JvbGxUb0NlbGwgPSBfcHJvcHM2LnNjcm9sbFRvQ2VsbCwgd2lkdGggPSBfcHJvcHM2LndpZHRoLCBfc3RhdGU0ID0gdGhpcy5zdGF0ZSwgc2Nyb2xsTGVmdCA9IF9zdGF0ZTQuc2Nyb2xsTGVmdCwgc2Nyb2xsVG9wID0gX3N0YXRlNC5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjcm9sbFRvQ2VsbCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxQb3NpdGlvbiA9IGNlbGxMYXlvdXRNYW5hZ2VyLmdldFNjcm9sbFBvc2l0aW9uRm9yQ2VsbCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogc2Nyb2xsVG9BbGlnbm1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsSW5kZXg6IHNjcm9sbFRvQ2VsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxQb3NpdGlvbi5zY3JvbGxMZWZ0ID09PSBzY3JvbGxMZWZ0ICYmIHNjcm9sbFBvc2l0aW9uLnNjcm9sbFRvcCA9PT0gc2Nyb2xsVG9wIHx8IHRoaXMuX3NldFNjcm9sbFBvc2l0aW9uKHNjcm9sbFBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9vblNjcm9sbCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLl9zY3JvbGxpbmdDb250YWluZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5hYmxlUG9pbnRlckV2ZW50c0FmdGVyRGVsYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9wcm9wczcgPSB0aGlzLnByb3BzLCBjZWxsTGF5b3V0TWFuYWdlciA9IF9wcm9wczcuY2VsbExheW91dE1hbmFnZXIsIGhlaWdodCA9IF9wcm9wczcuaGVpZ2h0LCBpc1Njcm9sbGluZ0NoYW5nZSA9IF9wcm9wczcuaXNTY3JvbGxpbmdDaGFuZ2UsIHdpZHRoID0gX3Byb3BzNy53aWR0aCwgc2Nyb2xsYmFyU2l6ZSA9IHRoaXMuX3Njcm9sbGJhclNpemUsIF9jZWxsTGF5b3V0TWFuYWdlciRnZTMgPSBjZWxsTGF5b3V0TWFuYWdlci5nZXRUb3RhbFNpemUoKSwgdG90YWxIZWlnaHQgPSBfY2VsbExheW91dE1hbmFnZXIkZ2UzLmhlaWdodCwgdG90YWxXaWR0aCA9IF9jZWxsTGF5b3V0TWFuYWdlciRnZTMud2lkdGgsIHNjcm9sbExlZnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0b3RhbFdpZHRoIC0gd2lkdGggKyBzY3JvbGxiYXJTaXplLCBldmVudC50YXJnZXQuc2Nyb2xsTGVmdCkpLCBzY3JvbGxUb3AgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0b3RhbEhlaWdodCAtIGhlaWdodCArIHNjcm9sbGJhclNpemUsIGV2ZW50LnRhcmdldC5zY3JvbGxUb3ApKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2Nyb2xsTGVmdCAhPT0gc2Nyb2xsTGVmdCB8fCB0aGlzLnN0YXRlLnNjcm9sbFRvcCAhPT0gc2Nyb2xsVG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsUG9zaXRpb25DaGFuZ2VSZWFzb24gPSBldmVudC5jYW5jZWxhYmxlID8gU0NST0xMX1BPU0lUSU9OX0NIQU5HRV9SRUFTT05TLk9CU0VSVkVEIDogU0NST0xMX1BPU0lUSU9OX0NIQU5HRV9SRUFTT05TLlJFUVVFU1RFRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuaXNTY3JvbGxpbmcgfHwgaXNTY3JvbGxpbmdDaGFuZ2UoITApLCB0aGlzLnNldFN0YXRlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Njcm9sbGluZzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxQb3NpdGlvbkNoYW5nZVJlYXNvbjogc2Nyb2xsUG9zaXRpb25DaGFuZ2VSZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZU9uU2Nyb2xsTWVtb2l6ZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxXaWR0aDogdG90YWxXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsSGVpZ2h0OiB0b3RhbEhlaWdodAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gXSksIENvbGxlY3Rpb25WaWV3OwogICAgICAgIH0oX3JlYWN0LlB1cmVDb21wb25lbnQpOwogICAgICAgIENvbGxlY3Rpb25WaWV3LmRlZmF1bHRQcm9wcyA9IHsKICAgICAgICAgICAgImFyaWEtbGFiZWwiOiAiZ3JpZCIsCiAgICAgICAgICAgIGhvcml6b250YWxPdmVyc2NhblNpemU6IDAsCiAgICAgICAgICAgIG5vQ29udGVudFJlbmRlcmVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvblNjcm9sbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb25TZWN0aW9uUmVuZGVyZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNjcm9sbFRvQWxpZ25tZW50OiAiYXV0byIsCiAgICAgICAgICAgIHNjcm9sbFRvQ2VsbDogLTEsCiAgICAgICAgICAgIHN0eWxlOiB7fSwKICAgICAgICAgICAgdmVydGljYWxPdmVyc2NhblNpemU6IDAKICAgICAgICB9LCBleHBvcnRzLmRlZmF1bHQgPSBDb2xsZWN0aW9uVmlldzsKICAgIH0sIC8qIDExNCAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIHZhciBfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXzsKICAgICAgICAvKiEKCSAgQ29weXJpZ2h0IChjKSAyMDE2IEplZCBXYXRzb24uCgkgIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKSwgc2VlCgkgIGh0dHA6Ly9qZWR3YXRzb24uZ2l0aHViLmlvL2NsYXNzbmFtZXMKCSovCiAgICAgICAgLyogZ2xvYmFsIGRlZmluZSAqLwogICAgICAgICFmdW5jdGlvbigpIHsKICAgICAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgICAgICBmdW5jdGlvbiBjbGFzc05hbWVzKCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgY2xhc3NlcyA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBhcmcgPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJnVHlwZSA9IHR5cGVvZiBhcmc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgic3RyaW5nIiA9PT0gYXJnVHlwZSB8fCAibnVtYmVyIiA9PT0gYXJnVHlwZSkgY2xhc3Nlcy5wdXNoKGFyZyk7IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkgY2xhc3Nlcy5wdXNoKGNsYXNzTmFtZXMuYXBwbHkobnVsbCwgYXJnKSk7IGVsc2UgaWYgKCJvYmplY3QiID09PSBhcmdUeXBlKSBmb3IgKHZhciBrZXkgaW4gYXJnKSBoYXNPd24uY2FsbChhcmcsIGtleSkgJiYgYXJnW2tleV0gJiYgY2xhc3Nlcy5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzZXMuam9pbigiICIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBoYXNPd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTsKICAgICAgICAgICAgInVuZGVmaW5lZCIgIT0gdHlwZW9mIG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cyA/IG1vZHVsZS5leHBvcnRzID0gY2xhc3NOYW1lcyA6IChfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fID0gW10sIAogICAgICAgICAgICBfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZXM7CiAgICAgICAgICAgIH0uYXBwbHkoZXhwb3J0cywgX19XRUJQQUNLX0FNRF9ERUZJTkVfQVJSQVlfXyksIC8vIHJlZ2lzdGVyIGFzICdjbGFzc25hbWVzJywgY29uc2lzdGVudCB3aXRoIG5wbSBwYWNrYWdlIG5hbWUKICAgICAgICAgICAgISh2b2lkIDAgIT09IF9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fICYmIChtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fKSkpOwogICAgICAgIH0oKTsKICAgIH0sIC8qIDExNSAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUNhbGxiYWNrTWVtb2l6ZXIoKSB7CiAgICAgICAgICAgIHZhciByZXF1aXJlQWxsS2V5cyA9ICEoYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0pIHx8IGFyZ3VtZW50c1swXSwgY2FjaGVkSW5kaWNlcyA9IHt9OwogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX3JlZikgewogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gX3JlZi5jYWxsYmFjaywgaW5kaWNlcyA9IF9yZWYuaW5kaWNlcywga2V5cyA9ICgwLCBfa2V5czIuZGVmYXVsdCkoaW5kaWNlcyksIGFsbEluaXRpYWxpemVkID0gIXJlcXVpcmVBbGxLZXlzIHx8IGtleXMuZXZlcnkoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gaW5kaWNlc1trZXldOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLmxlbmd0aCA+IDAgOiB2YWx1ZSA+PSAwOwogICAgICAgICAgICAgICAgfSksIGluZGV4Q2hhbmdlZCA9IGtleXMubGVuZ3RoICE9PSAoMCwgX2tleXMyLmRlZmF1bHQpKGNhY2hlZEluZGljZXMpLmxlbmd0aCB8fCBrZXlzLnNvbWUoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZFZhbHVlID0gY2FjaGVkSW5kaWNlc1trZXldLCB2YWx1ZSA9IGluZGljZXNba2V5XTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBjYWNoZWRWYWx1ZS5qb2luKCIsIikgIT09IHZhbHVlLmpvaW4oIiwiKSA6IGNhY2hlZFZhbHVlICE9PSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY2FjaGVkSW5kaWNlcyA9IGluZGljZXMsIGFsbEluaXRpYWxpemVkICYmIGluZGV4Q2hhbmdlZCAmJiBjYWxsYmFjayhpbmRpY2VzKTsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KTsKICAgICAgICB2YXIgX2tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExNiksIF9rZXlzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2tleXMpOwogICAgICAgIGV4cG9ydHMuZGVmYXVsdCA9IGNyZWF0ZUNhbGxiYWNrTWVtb2l6ZXI7CiAgICB9LCAvKiAxMTYgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgZGVmYXVsdDogX193ZWJwYWNrX3JlcXVpcmVfXygxMTcpLAogICAgICAgICAgICBfX2VzTW9kdWxlOiAhMAogICAgICAgIH07CiAgICB9LCAvKiAxMTcgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fKDExOCksIG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNikuT2JqZWN0LmtleXM7CiAgICB9LCAvKiAxMTggKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAvLyAxOS4xLjIuMTQgT2JqZWN0LmtleXMoTykKICAgICAgICB2YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpLCAka2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oNDgpOwogICAgICAgIF9fd2VicGFja19yZXF1aXJlX18oMTQpKCJrZXlzIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihpdCkgewogICAgICAgICAgICAgICAgcmV0dXJuICRrZXlzKHRvT2JqZWN0KGl0KSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICB9LCAvKiAxMTkgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsKICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG9iagogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgICAgICAgICAgIHZhbHVlOiAhMAogICAgICAgIH0pLCBleHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbihyZWNhbGMpIHsKICAgICAgICAgICAgaWYgKCghc2l6ZSB8fCByZWNhbGMpICYmIF9pbkRPTTIuZGVmYXVsdCkgewogICAgICAgICAgICAgICAgdmFyIHNjcm9sbERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICAgICAgc2Nyb2xsRGl2LnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIiwgc2Nyb2xsRGl2LnN0eWxlLnRvcCA9ICItOTk5OXB4Iiwgc2Nyb2xsRGl2LnN0eWxlLndpZHRoID0gIjUwcHgiLCAKICAgICAgICAgICAgICAgIHNjcm9sbERpdi5zdHlsZS5oZWlnaHQgPSAiNTBweCIsIHNjcm9sbERpdi5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiLCBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcm9sbERpdiksIAogICAgICAgICAgICAgICAgc2l6ZSA9IHNjcm9sbERpdi5vZmZzZXRXaWR0aCAtIHNjcm9sbERpdi5jbGllbnRXaWR0aCwgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzY3JvbGxEaXYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzaXplOwogICAgICAgIH07CiAgICAgICAgdmFyIF9pbkRPTSA9IF9fd2VicGFja19yZXF1aXJlX18oMTIwKSwgX2luRE9NMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luRE9NKSwgc2l6ZSA9IHZvaWQgMDsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMuZGVmYXVsdDsKICAgIH0sIC8qIDEyMCAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgICAgICAgICAgIHZhbHVlOiAhMAogICAgICAgIH0pLCBleHBvcnRzLmRlZmF1bHQgPSAhKCJ1bmRlZmluZWQiID09IHR5cGVvZiB3aW5kb3cgfHwgIXdpbmRvdy5kb2N1bWVudCB8fCAhd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpLCAKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMuZGVmYXVsdDsKICAgIH0sIC8qIDEyMSAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZVNpemVBbmRQb3NpdGlvbkRhdGEoX3JlZikgewogICAgICAgICAgICBmb3IgKHZhciBjZWxsQ291bnQgPSBfcmVmLmNlbGxDb3VudCwgY2VsbFNpemVBbmRQb3NpdGlvbkdldHRlciA9IF9yZWYuY2VsbFNpemVBbmRQb3NpdGlvbkdldHRlciwgc2VjdGlvblNpemUgPSBfcmVmLnNlY3Rpb25TaXplLCBjZWxsTWV0YWRhdGEgPSBbXSwgc2VjdGlvbk1hbmFnZXIgPSBuZXcgX1NlY3Rpb25NYW5hZ2VyMi5kZWZhdWx0KHNlY3Rpb25TaXplKSwgaGVpZ2h0ID0gMCwgd2lkdGggPSAwLCBpbmRleCA9IDA7IGluZGV4IDwgY2VsbENvdW50OyBpbmRleCsrKSB7CiAgICAgICAgICAgICAgICB2YXIgY2VsbE1ldGFkYXR1bSA9IGNlbGxTaXplQW5kUG9zaXRpb25HZXR0ZXIoewogICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBjZWxsTWV0YWRhdHVtLmhlaWdodCB8fCBpc05hTihjZWxsTWV0YWRhdHVtLmhlaWdodCkgfHwgbnVsbCA9PSBjZWxsTWV0YWRhdHVtLndpZHRoIHx8IGlzTmFOKGNlbGxNZXRhZGF0dW0ud2lkdGgpIHx8IG51bGwgPT0gY2VsbE1ldGFkYXR1bS54IHx8IGlzTmFOKGNlbGxNZXRhZGF0dW0ueCkgfHwgbnVsbCA9PSBjZWxsTWV0YWRhdHVtLnkgfHwgaXNOYU4oY2VsbE1ldGFkYXR1bS55KSkgdGhyb3cgRXJyb3IoIkludmFsaWQgbWV0YWRhdGEgcmV0dXJuZWQgZm9yIGNlbGwgIiArIGluZGV4ICsgIjpcbiAgICAgICAgeDoiICsgY2VsbE1ldGFkYXR1bS54ICsgIiwgeToiICsgY2VsbE1ldGFkYXR1bS55ICsgIiwgd2lkdGg6IiArIGNlbGxNZXRhZGF0dW0ud2lkdGggKyAiLCBoZWlnaHQ6IiArIGNlbGxNZXRhZGF0dW0uaGVpZ2h0KTsKICAgICAgICAgICAgICAgIGhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgY2VsbE1ldGFkYXR1bS55ICsgY2VsbE1ldGFkYXR1bS5oZWlnaHQpLCB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjZWxsTWV0YWRhdHVtLnggKyBjZWxsTWV0YWRhdHVtLndpZHRoKSwgCiAgICAgICAgICAgICAgICBjZWxsTWV0YWRhdGFbaW5kZXhdID0gY2VsbE1ldGFkYXR1bSwgc2VjdGlvbk1hbmFnZXIucmVnaXN0ZXJDZWxsKHsKICAgICAgICAgICAgICAgICAgICBjZWxsTWV0YWRhdHVtOiBjZWxsTWV0YWRhdHVtLAogICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGNlbGxNZXRhZGF0YTogY2VsbE1ldGFkYXRhLAogICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsCiAgICAgICAgICAgICAgICBzZWN0aW9uTWFuYWdlcjogc2VjdGlvbk1hbmFnZXIsCiAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KSwgZXhwb3J0cy5kZWZhdWx0ID0gY2FsY3VsYXRlU2l6ZUFuZFBvc2l0aW9uRGF0YTsKICAgICAgICB2YXIgX1NlY3Rpb25NYW5hZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjIpLCBfU2VjdGlvbk1hbmFnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU2VjdGlvbk1hbmFnZXIpOwogICAgfSwgLyogMTIyICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvYmoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KTsKICAgICAgICB2YXIgX2tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExNiksIF9rZXlzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2tleXMpLCBfY2xhc3NDYWxsQ2hlY2syID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSksIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpLCBfY3JlYXRlQ2xhc3MyID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMCksIF9jcmVhdGVDbGFzczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDbGFzczIpLCBfU2VjdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTIzKSwgX1NlY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU2VjdGlvbiksIFNFQ1RJT05fU0laRSA9IDEwMCwgU2VjdGlvbk1hbmFnZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZnVuY3Rpb24gU2VjdGlvbk1hbmFnZXIoKSB7CiAgICAgICAgICAgICAgICB2YXIgc2VjdGlvblNpemUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IFNFQ1RJT05fU0laRTsKICAgICAgICAgICAgICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szLmRlZmF1bHQpKHRoaXMsIFNlY3Rpb25NYW5hZ2VyKSwgdGhpcy5fc2VjdGlvblNpemUgPSBzZWN0aW9uU2l6ZSwgCiAgICAgICAgICAgICAgICB0aGlzLl9jZWxsTWV0YWRhdGEgPSBbXSwgdGhpcy5fc2VjdGlvbnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoU2VjdGlvbk1hbmFnZXIsIFsgewogICAgICAgICAgICAgICAga2V5OiAiZ2V0Q2VsbEluZGljZXMiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKF9yZWYpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gX3JlZi5oZWlnaHQsIHdpZHRoID0gX3JlZi53aWR0aCwgeCA9IF9yZWYueCwgeSA9IF9yZWYueSwgaW5kaWNlcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFNlY3Rpb25zKHsKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgeDogeCwKICAgICAgICAgICAgICAgICAgICAgICAgeTogeQogICAgICAgICAgICAgICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24oc2VjdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VjdGlvbi5nZXRDZWxsSW5kaWNlcygpLmZvckVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbaW5kZXhdID0gaW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pLCAoMCwgX2tleXMyLmRlZmF1bHQpKGluZGljZXMpLm1hcChmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kaWNlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImdldENlbGxNZXRhZGF0YSIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oX3JlZjIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBfcmVmMi5pbmRleDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2VsbE1ldGFkYXRhW2luZGV4XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiZ2V0U2VjdGlvbnMiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKF9yZWYzKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaGVpZ2h0ID0gX3JlZjMuaGVpZ2h0LCB3aWR0aCA9IF9yZWYzLndpZHRoLCB4ID0gX3JlZjMueCwgeSA9IF9yZWYzLnksIHNlY3Rpb25YU3RhcnQgPSBNYXRoLmZsb29yKHggLyB0aGlzLl9zZWN0aW9uU2l6ZSksIHNlY3Rpb25YU3RvcCA9IE1hdGguZmxvb3IoKHggKyB3aWR0aCAtIDEpIC8gdGhpcy5fc2VjdGlvblNpemUpLCBzZWN0aW9uWVN0YXJ0ID0gTWF0aC5mbG9vcih5IC8gdGhpcy5fc2VjdGlvblNpemUpLCBzZWN0aW9uWVN0b3AgPSBNYXRoLmZsb29yKCh5ICsgaGVpZ2h0IC0gMSkgLyB0aGlzLl9zZWN0aW9uU2l6ZSksIHNlY3Rpb25zID0gW10sIHNlY3Rpb25YID0gc2VjdGlvblhTdGFydDsgc2VjdGlvblggPD0gc2VjdGlvblhTdG9wOyBzZWN0aW9uWCsrKSBmb3IgKHZhciBzZWN0aW9uWSA9IHNlY3Rpb25ZU3RhcnQ7IHNlY3Rpb25ZIDw9IHNlY3Rpb25ZU3RvcDsgc2VjdGlvblkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gc2VjdGlvblggKyAiLiIgKyBzZWN0aW9uWTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VjdGlvbnNba2V5XSB8fCAodGhpcy5fc2VjdGlvbnNba2V5XSA9IG5ldyBfU2VjdGlvbjIuZGVmYXVsdCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuX3NlY3Rpb25TaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMuX3NlY3Rpb25TaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogc2VjdGlvblggKiB0aGlzLl9zZWN0aW9uU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHNlY3Rpb25ZICogdGhpcy5fc2VjdGlvblNpemUKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBzZWN0aW9ucy5wdXNoKHRoaXMuX3NlY3Rpb25zW2tleV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VjdGlvbnM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImdldFRvdGFsU2VjdGlvbkNvdW50IiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIF9rZXlzMi5kZWZhdWx0KSh0aGlzLl9zZWN0aW9ucykubGVuZ3RoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJ0b1N0cmluZyIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIF9rZXlzMi5kZWZhdWx0KSh0aGlzLl9zZWN0aW9ucykubWFwKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fc2VjdGlvbnNbaW5kZXhdLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogInJlZ2lzdGVyQ2VsbCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oX3JlZjQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbE1ldGFkYXR1bSA9IF9yZWY0LmNlbGxNZXRhZGF0dW0sIGluZGV4ID0gX3JlZjQuaW5kZXg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2VsbE1ldGFkYXRhW2luZGV4XSA9IGNlbGxNZXRhZGF0dW0sIHRoaXMuZ2V0U2VjdGlvbnMoY2VsbE1ldGFkYXR1bSkuZm9yRWFjaChmdW5jdGlvbihzZWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWN0aW9uLmFkZENlbGxJbmRleCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gXSksIFNlY3Rpb25NYW5hZ2VyOwogICAgICAgIH0oKTsKICAgICAgICBleHBvcnRzLmRlZmF1bHQgPSBTZWN0aW9uTWFuYWdlcjsKICAgIH0sIC8qIDEyMyAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSk7CiAgICAgICAgdmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KSwgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMiksIF9jcmVhdGVDbGFzczIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKSwgX2NyZWF0ZUNsYXNzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNsYXNzMiksIFNlY3Rpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZnVuY3Rpb24gU2VjdGlvbihfcmVmKSB7CiAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gX3JlZi5oZWlnaHQsIHdpZHRoID0gX3JlZi53aWR0aCwgeCA9IF9yZWYueCwgeSA9IF9yZWYueTsKICAgICAgICAgICAgICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szLmRlZmF1bHQpKHRoaXMsIFNlY3Rpb24pLCB0aGlzLmhlaWdodCA9IGhlaWdodCwgdGhpcy53aWR0aCA9IHdpZHRoLCAKICAgICAgICAgICAgICAgIHRoaXMueCA9IHgsIHRoaXMueSA9IHksIHRoaXMuX2luZGV4TWFwID0ge30sIHRoaXMuX2luZGljZXMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoU2VjdGlvbiwgWyB7CiAgICAgICAgICAgICAgICBrZXk6ICJhZGRDZWxsSW5kZXgiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKF9yZWYyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gX3JlZjIuaW5kZXg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXhNYXBbaW5kZXhdIHx8ICh0aGlzLl9pbmRleE1hcFtpbmRleF0gPSAhMCwgdGhpcy5faW5kaWNlcy5wdXNoKGluZGV4KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImdldENlbGxJbmRpY2VzIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW5kaWNlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAidG9TdHJpbmciLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnggKyAiLCIgKyB0aGlzLnkgKyAiICIgKyB0aGlzLndpZHRoICsgIngiICsgdGhpcy5oZWlnaHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gXSksIFNlY3Rpb247CiAgICAgICAgfSgpOwogICAgICAgIGV4cG9ydHMuZGVmYXVsdCA9IFNlY3Rpb247CiAgICB9LCAvKiAxMjQgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgZnVuY3Rpb24gZ2V0VXBkYXRlZE9mZnNldEZvckluZGV4KF9yZWYpIHsKICAgICAgICAgICAgdmFyIF9yZWYkYWxpZ24gPSBfcmVmLmFsaWduLCBhbGlnbiA9IHZvaWQgMCA9PT0gX3JlZiRhbGlnbiA/ICJhdXRvIiA6IF9yZWYkYWxpZ24sIGNlbGxPZmZzZXQgPSBfcmVmLmNlbGxPZmZzZXQsIGNlbGxTaXplID0gX3JlZi5jZWxsU2l6ZSwgY29udGFpbmVyU2l6ZSA9IF9yZWYuY29udGFpbmVyU2l6ZSwgY3VycmVudE9mZnNldCA9IF9yZWYuY3VycmVudE9mZnNldCwgbWF4T2Zmc2V0ID0gY2VsbE9mZnNldCwgbWluT2Zmc2V0ID0gbWF4T2Zmc2V0IC0gY29udGFpbmVyU2l6ZSArIGNlbGxTaXplOwogICAgICAgICAgICBzd2l0Y2ggKGFsaWduKSB7CiAgICAgICAgICAgICAgY2FzZSAic3RhcnQiOgogICAgICAgICAgICAgICAgcmV0dXJuIG1heE9mZnNldDsKCiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBtaW5PZmZzZXQ7CgogICAgICAgICAgICAgIGNhc2UgImNlbnRlciI6CiAgICAgICAgICAgICAgICByZXR1cm4gbWF4T2Zmc2V0IC0gKGNvbnRhaW5lclNpemUgLSBjZWxsU2l6ZSkgLyAyOwoKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KG1pbk9mZnNldCwgTWF0aC5taW4obWF4T2Zmc2V0LCBjdXJyZW50T2Zmc2V0KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KSwgZXhwb3J0cy5kZWZhdWx0ID0gZ2V0VXBkYXRlZE9mZnNldEZvckluZGV4OwogICAgfSwgLyogMTI1ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvYmoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KSwgZXhwb3J0cy5Db2x1bW5TaXplciA9IGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDsKICAgICAgICB2YXIgX0NvbHVtblNpemVyMiA9IF9fd2VicGFja19yZXF1aXJlX18oMTI2KSwgX0NvbHVtblNpemVyMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NvbHVtblNpemVyMik7CiAgICAgICAgZXhwb3J0cy5kZWZhdWx0ID0gX0NvbHVtblNpemVyMy5kZWZhdWx0LCBleHBvcnRzLkNvbHVtblNpemVyID0gX0NvbHVtblNpemVyMy5kZWZhdWx0OwogICAgfSwgLyogMTI2ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvYmoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KTsKICAgICAgICB2YXIgX2dldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKSwgX2dldFByb3RvdHlwZU9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldFByb3RvdHlwZU9mKSwgX2NsYXNzQ2FsbENoZWNrMiA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpLCBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKSwgX2NyZWF0ZUNsYXNzMiA9IF9fd2VicGFja19yZXF1aXJlX18oMzApLCBfY3JlYXRlQ2xhc3MzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2xhc3MyKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNCksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKSwgX2luaGVyaXRzMiA9IF9fd2VicGFja19yZXF1aXJlX18oODEpLCBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKSwgX3Byb3BUeXBlcyA9IF9fd2VicGFja19yZXF1aXJlX18oODkpLCBfcmVhY3QgPSAoX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKSwgCiAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXyg5NykpLCBDb2x1bW5TaXplciA9IGZ1bmN0aW9uKF9QdXJlQ29tcG9uZW50KSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIENvbHVtblNpemVyKHByb3BzLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBDb2x1bW5TaXplcik7CiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zLmRlZmF1bHQpKHRoaXMsIChDb2x1bW5TaXplci5fX3Byb3RvX18gfHwgKDAsIAogICAgICAgICAgICAgICAgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KShDb2x1bW5TaXplcikpLmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fcmVnaXN0ZXJDaGlsZCA9IF90aGlzLl9yZWdpc3RlckNoaWxkLmJpbmQoX3RoaXMpLCBfdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKDAsIF9pbmhlcml0czMuZGVmYXVsdCkoQ29sdW1uU2l6ZXIsIF9QdXJlQ29tcG9uZW50KSwgKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoQ29sdW1uU2l6ZXIsIFsgewogICAgICAgICAgICAgICAga2V5OiAiY29tcG9uZW50RGlkVXBkYXRlIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihwcmV2UHJvcHMsIHByZXZTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLCBjb2x1bW5NYXhXaWR0aCA9IF9wcm9wcy5jb2x1bW5NYXhXaWR0aCwgY29sdW1uTWluV2lkdGggPSBfcHJvcHMuY29sdW1uTWluV2lkdGgsIGNvbHVtbkNvdW50ID0gX3Byb3BzLmNvbHVtbkNvdW50LCB3aWR0aCA9IF9wcm9wcy53aWR0aDsKICAgICAgICAgICAgICAgICAgICBjb2x1bW5NYXhXaWR0aCA9PT0gcHJldlByb3BzLmNvbHVtbk1heFdpZHRoICYmIGNvbHVtbk1pbldpZHRoID09PSBwcmV2UHJvcHMuY29sdW1uTWluV2lkdGggJiYgY29sdW1uQ291bnQgPT09IHByZXZQcm9wcy5jb2x1bW5Db3VudCAmJiB3aWR0aCA9PT0gcHJldlByb3BzLndpZHRoIHx8IHRoaXMuX3JlZ2lzdGVyZWRDaGlsZCAmJiB0aGlzLl9yZWdpc3RlcmVkQ2hpbGQucmVjb21wdXRlR3JpZFNpemUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAicmVuZGVyIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHMsIGNoaWxkcmVuID0gX3Byb3BzMi5jaGlsZHJlbiwgY29sdW1uTWF4V2lkdGggPSBfcHJvcHMyLmNvbHVtbk1heFdpZHRoLCBjb2x1bW5NaW5XaWR0aCA9IF9wcm9wczIuY29sdW1uTWluV2lkdGgsIGNvbHVtbkNvdW50ID0gX3Byb3BzMi5jb2x1bW5Db3VudCwgd2lkdGggPSBfcHJvcHMyLndpZHRoLCBzYWZlQ29sdW1uTWluV2lkdGggPSBjb2x1bW5NaW5XaWR0aCB8fCAxLCBzYWZlQ29sdW1uTWF4V2lkdGggPSBjb2x1bW5NYXhXaWR0aCA/IE1hdGgubWluKGNvbHVtbk1heFdpZHRoLCB3aWR0aCkgOiB3aWR0aCwgY29sdW1uV2lkdGggPSB3aWR0aCAvIGNvbHVtbkNvdW50OwogICAgICAgICAgICAgICAgICAgIGNvbHVtbldpZHRoID0gTWF0aC5tYXgoc2FmZUNvbHVtbk1pbldpZHRoLCBjb2x1bW5XaWR0aCksIGNvbHVtbldpZHRoID0gTWF0aC5taW4oc2FmZUNvbHVtbk1heFdpZHRoLCBjb2x1bW5XaWR0aCksIAogICAgICAgICAgICAgICAgICAgIGNvbHVtbldpZHRoID0gTWF0aC5mbG9vcihjb2x1bW5XaWR0aCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFkanVzdGVkV2lkdGggPSBNYXRoLm1pbih3aWR0aCwgY29sdW1uV2lkdGggKiBjb2x1bW5Db3VudCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuKHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRXaWR0aDogYWRqdXN0ZWRXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uV2lkdGg6IGNvbHVtbldpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICBnZXRDb2x1bW5XaWR0aDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uV2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ2hpbGQ6IHRoaXMuX3JlZ2lzdGVyQ2hpbGQKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX3JlZ2lzdGVyQ2hpbGQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKGNoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkICYmICJmdW5jdGlvbiIgIT0gdHlwZW9mIGNoaWxkLnJlY29tcHV0ZUdyaWRTaXplKSB0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBjaGlsZCB0eXBlIHJlZ2lzdGVyZWQ7IG9ubHkgR3JpZC9NdWx0aUdyaWQgY2hpbGRyZW4gYXJlIHN1cHBvcnRlZC4iKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQ2hpbGQgPSBjaGlsZCwgdGhpcy5fcmVnaXN0ZXJlZENoaWxkICYmIHRoaXMuX3JlZ2lzdGVyZWRDaGlsZC5yZWNvbXB1dGVHcmlkU2l6ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IF0pLCBDb2x1bW5TaXplcjsKICAgICAgICB9KF9yZWFjdC5QdXJlQ29tcG9uZW50KTsKICAgICAgICBleHBvcnRzLmRlZmF1bHQgPSBDb2x1bW5TaXplcjsKICAgIH0sIC8qIDEyNyAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSksIGV4cG9ydHMuZGVmYXVsdE92ZXJzY2FuSW5kaWNlc0dldHRlciA9IGV4cG9ydHMuZGVmYXVsdENlbGxSYW5nZVJlbmRlcmVyID0gZXhwb3J0cy5hY2Nlc3NpYmlsaXR5T3ZlcnNjYW5JbmRpY2VzR2V0dGVyID0gZXhwb3J0cy5HcmlkID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwOwogICAgICAgIHZhciBfR3JpZDIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyOCksIF9HcmlkMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0dyaWQyKSwgX2FjY2Vzc2liaWxpdHlPdmVyc2NhbkluZGljZXNHZXR0ZXIyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzUpLCBfYWNjZXNzaWJpbGl0eU92ZXJzY2FuSW5kaWNlc0dldHRlcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hY2Nlc3NpYmlsaXR5T3ZlcnNjYW5JbmRpY2VzR2V0dGVyMiksIF9kZWZhdWx0Q2VsbFJhbmdlUmVuZGVyZXIyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzQpLCBfZGVmYXVsdENlbGxSYW5nZVJlbmRlcmVyMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZmF1bHRDZWxsUmFuZ2VSZW5kZXJlcjIpLCBfZGVmYXVsdE92ZXJzY2FuSW5kaWNlc0dldHRlcjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzMiksIF9kZWZhdWx0T3ZlcnNjYW5JbmRpY2VzR2V0dGVyMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZmF1bHRPdmVyc2NhbkluZGljZXNHZXR0ZXIyKTsKICAgICAgICBleHBvcnRzLmRlZmF1bHQgPSBfR3JpZDMuZGVmYXVsdCwgZXhwb3J0cy5HcmlkID0gX0dyaWQzLmRlZmF1bHQsIGV4cG9ydHMuYWNjZXNzaWJpbGl0eU92ZXJzY2FuSW5kaWNlc0dldHRlciA9IF9hY2Nlc3NpYmlsaXR5T3ZlcnNjYW5JbmRpY2VzR2V0dGVyMy5kZWZhdWx0LCAKICAgICAgICBleHBvcnRzLmRlZmF1bHRDZWxsUmFuZ2VSZW5kZXJlciA9IF9kZWZhdWx0Q2VsbFJhbmdlUmVuZGVyZXIzLmRlZmF1bHQsIGV4cG9ydHMuZGVmYXVsdE92ZXJzY2FuSW5kaWNlc0dldHRlciA9IF9kZWZhdWx0T3ZlcnNjYW5JbmRpY2VzR2V0dGVyMy5kZWZhdWx0OwogICAgfSwgLyogMTI4ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvYmoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KSwgZXhwb3J0cy5ERUZBVUxUX1NDUk9MTElOR19SRVNFVF9USU1FX0lOVEVSVkFMID0gdm9pZCAwOwogICAgICAgIHZhciBfZXh0ZW5kczIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNyksIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKSwgX2dldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKSwgX2dldFByb3RvdHlwZU9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldFByb3RvdHlwZU9mKSwgX2NsYXNzQ2FsbENoZWNrMiA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpLCBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKSwgX2NyZWF0ZUNsYXNzMiA9IF9fd2VicGFja19yZXF1aXJlX18oMzApLCBfY3JlYXRlQ2xhc3MzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2xhc3MyKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNCksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKSwgX2luaGVyaXRzMiA9IF9fd2VicGFja19yZXF1aXJlX18oODEpLCBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKSwgX3JlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NyksIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCksIF9wcm9wVHlwZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg5KSwgX2NsYXNzbmFtZXMgPSAoX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKSwgCiAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXygxMTQpKSwgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyksIF9jYWxjdWxhdGVTaXplQW5kUG9zaXRpb25EYXRhQW5kVXBkYXRlU2Nyb2xsT2Zmc2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjkpLCBfY2FsY3VsYXRlU2l6ZUFuZFBvc2l0aW9uRGF0YUFuZFVwZGF0ZVNjcm9sbE9mZnNldDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jYWxjdWxhdGVTaXplQW5kUG9zaXRpb25EYXRhQW5kVXBkYXRlU2Nyb2xsT2Zmc2V0KSwgX1NjYWxpbmdDZWxsU2l6ZUFuZFBvc2l0aW9uTWFuYWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTMwKSwgX1NjYWxpbmdDZWxsU2l6ZUFuZFBvc2l0aW9uTWFuYWdlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TY2FsaW5nQ2VsbFNpemVBbmRQb3NpdGlvbk1hbmFnZXIpLCBfY3JlYXRlQ2FsbGJhY2tNZW1vaXplciA9IF9fd2VicGFja19yZXF1aXJlX18oMTE1KSwgX2NyZWF0ZUNhbGxiYWNrTWVtb2l6ZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2FsbGJhY2tNZW1vaXplciksIF9kZWZhdWx0T3ZlcnNjYW5JbmRpY2VzR2V0dGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzIpLCBfZGVmYXVsdE92ZXJzY2FuSW5kaWNlc0dldHRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZWZhdWx0T3ZlcnNjYW5JbmRpY2VzR2V0dGVyKSwgX3VwZGF0ZVNjcm9sbEluZGV4SGVscGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzMpLCBfdXBkYXRlU2Nyb2xsSW5kZXhIZWxwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXBkYXRlU2Nyb2xsSW5kZXhIZWxwZXIpLCBfZGVmYXVsdENlbGxSYW5nZVJlbmRlcmVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzQpLCBfZGVmYXVsdENlbGxSYW5nZVJlbmRlcmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZmF1bHRDZWxsUmFuZ2VSZW5kZXJlciksIF9zY3JvbGxiYXJTaXplID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTkpLCBfc2Nyb2xsYmFyU2l6ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zY3JvbGxiYXJTaXplKSwgREVGQVVMVF9TQ1JPTExJTkdfUkVTRVRfVElNRV9JTlRFUlZBTCA9IGV4cG9ydHMuREVGQVVMVF9TQ1JPTExJTkdfUkVTRVRfVElNRV9JTlRFUlZBTCA9IDE1MCwgU0NST0xMX1BPU0lUSU9OX0NIQU5HRV9SRUFTT05TID0gewogICAgICAgICAgICBPQlNFUlZFRDogIm9ic2VydmVkIiwKICAgICAgICAgICAgUkVRVUVTVEVEOiAicmVxdWVzdGVkIgogICAgICAgIH0sIEdyaWQgPSBmdW5jdGlvbihfUHVyZUNvbXBvbmVudCkgewogICAgICAgICAgICBmdW5jdGlvbiBHcmlkKHByb3BzLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBHcmlkKTsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMuZGVmYXVsdCkodGhpcywgKEdyaWQuX19wcm90b19fIHx8ICgwLCAKICAgICAgICAgICAgICAgIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoR3JpZCkpLmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTsKICAgICAgICAgICAgICAgIF90aGlzLnN0YXRlID0gewogICAgICAgICAgICAgICAgICAgIGlzU2Nyb2xsaW5nOiAhMSwKICAgICAgICAgICAgICAgICAgICBzY3JvbGxEaXJlY3Rpb25Ib3Jpem9udGFsOiBfZGVmYXVsdE92ZXJzY2FuSW5kaWNlc0dldHRlci5TQ1JPTExfRElSRUNUSU9OX0ZPUldBUkQsCiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsRGlyZWN0aW9uVmVydGljYWw6IF9kZWZhdWx0T3ZlcnNjYW5JbmRpY2VzR2V0dGVyLlNDUk9MTF9ESVJFQ1RJT05fRk9SV0FSRCwKICAgICAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0OiAwLAogICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogMAogICAgICAgICAgICAgICAgfSwgX3RoaXMuX29uR3JpZFJlbmRlcmVkTWVtb2l6ZXIgPSAoMCwgX2NyZWF0ZUNhbGxiYWNrTWVtb2l6ZXIyLmRlZmF1bHQpKCksIF90aGlzLl9vblNjcm9sbE1lbW9pemVyID0gKDAsIAogICAgICAgICAgICAgICAgX2NyZWF0ZUNhbGxiYWNrTWVtb2l6ZXIyLmRlZmF1bHQpKCExKSwgX3RoaXMuX2RlYm91bmNlU2Nyb2xsRW5kZWRDYWxsYmFjayA9IF90aGlzLl9kZWJvdW5jZVNjcm9sbEVuZGVkQ2FsbGJhY2suYmluZChfdGhpcyksIAogICAgICAgICAgICAgICAgX3RoaXMuX2ludm9rZU9uR3JpZFJlbmRlcmVkSGVscGVyID0gX3RoaXMuX2ludm9rZU9uR3JpZFJlbmRlcmVkSGVscGVyLmJpbmQoX3RoaXMpLCAKICAgICAgICAgICAgICAgIF90aGlzLl9vblNjcm9sbCA9IF90aGlzLl9vblNjcm9sbC5iaW5kKF90aGlzKSwgX3RoaXMuX3NldFNjcm9sbGluZ0NvbnRhaW5lclJlZiA9IF90aGlzLl9zZXRTY3JvbGxpbmdDb250YWluZXJSZWYuYmluZChfdGhpcyksIAogICAgICAgICAgICAgICAgX3RoaXMuX2NvbHVtbldpZHRoR2V0dGVyID0gX3RoaXMuX3dyYXBTaXplR2V0dGVyKHByb3BzLmNvbHVtbldpZHRoKSwgX3RoaXMuX3Jvd0hlaWdodEdldHRlciA9IF90aGlzLl93cmFwU2l6ZUdldHRlcihwcm9wcy5yb3dIZWlnaHQpLCAKICAgICAgICAgICAgICAgIF90aGlzLl9kZWZlcnJlZEludmFsaWRhdGVDb2x1bW5JbmRleCA9IG51bGwsIF90aGlzLl9kZWZlcnJlZEludmFsaWRhdGVSb3dJbmRleCA9IG51bGwsIAogICAgICAgICAgICAgICAgX3RoaXMuX3JlY29tcHV0ZVNjcm9sbExlZnRGbGFnID0gITEsIF90aGlzLl9yZWNvbXB1dGVTY3JvbGxUb3BGbGFnID0gITE7CiAgICAgICAgICAgICAgICB2YXIgZGVmZXJyZWRNZWFzdXJlbWVudENhY2hlID0gcHJvcHMuZGVmZXJyZWRNZWFzdXJlbWVudENhY2hlLCBkZWZlcnJlZE1vZGUgPSAidW5kZWZpbmVkIiAhPSB0eXBlb2YgZGVmZXJyZWRNZWFzdXJlbWVudENhY2hlOwogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9jb2x1bW5TaXplQW5kUG9zaXRpb25NYW5hZ2VyID0gbmV3IF9TY2FsaW5nQ2VsbFNpemVBbmRQb3NpdGlvbk1hbmFnZXIyLmRlZmF1bHQoewogICAgICAgICAgICAgICAgICAgIGJhdGNoQWxsQ2VsbHM6IGRlZmVycmVkTW9kZSAmJiAhZGVmZXJyZWRNZWFzdXJlbWVudENhY2hlLmhhc0ZpeGVkSGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgICAgY2VsbENvdW50OiBwcm9wcy5jb2x1bW5Db3VudCwKICAgICAgICAgICAgICAgICAgICBjZWxsU2l6ZUdldHRlcjogZnVuY3Rpb24ocGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fY29sdW1uV2lkdGhHZXR0ZXIocGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVzdGltYXRlZENlbGxTaXplOiBfdGhpcy5fZ2V0RXN0aW1hdGVkQ29sdW1uU2l6ZShwcm9wcykKICAgICAgICAgICAgICAgIH0pLCBfdGhpcy5fcm93U2l6ZUFuZFBvc2l0aW9uTWFuYWdlciA9IG5ldyBfU2NhbGluZ0NlbGxTaXplQW5kUG9zaXRpb25NYW5hZ2VyMi5kZWZhdWx0KHsKICAgICAgICAgICAgICAgICAgICBiYXRjaEFsbENlbGxzOiBkZWZlcnJlZE1vZGUgJiYgIWRlZmVycmVkTWVhc3VyZW1lbnRDYWNoZS5oYXNGaXhlZFdpZHRoKCksCiAgICAgICAgICAgICAgICAgICAgY2VsbENvdW50OiBwcm9wcy5yb3dDb3VudCwKICAgICAgICAgICAgICAgICAgICBjZWxsU2l6ZUdldHRlcjogZnVuY3Rpb24ocGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fcm93SGVpZ2h0R2V0dGVyKHBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWRDZWxsU2l6ZTogX3RoaXMuX2dldEVzdGltYXRlZFJvd1NpemUocHJvcHMpCiAgICAgICAgICAgICAgICB9KSwgX3RoaXMuX2NlbGxDYWNoZSA9IHt9LCBfdGhpcy5fc3R5bGVDYWNoZSA9IHt9LCBfdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKDAsIF9pbmhlcml0czMuZGVmYXVsdCkoR3JpZCwgX1B1cmVDb21wb25lbnQpLCAoMCwgX2NyZWF0ZUNsYXNzMy5kZWZhdWx0KShHcmlkLCBbIHsKICAgICAgICAgICAgICAgIGtleTogImdldE9mZnNldEZvckNlbGwiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB7fSwgX3JlZiRhbGlnbm1lbnQgPSBfcmVmLmFsaWdubWVudCwgYWxpZ25tZW50ID0gdm9pZCAwID09PSBfcmVmJGFsaWdubWVudCA/IHRoaXMucHJvcHMuc2Nyb2xsVG9BbGlnbm1lbnQgOiBfcmVmJGFsaWdubWVudCwgX3JlZiRjb2x1bW5JbmRleCA9IF9yZWYuY29sdW1uSW5kZXgsIGNvbHVtbkluZGV4ID0gdm9pZCAwID09PSBfcmVmJGNvbHVtbkluZGV4ID8gdGhpcy5wcm9wcy5zY3JvbGxUb0NvbHVtbiA6IF9yZWYkY29sdW1uSW5kZXgsIF9yZWYkcm93SW5kZXggPSBfcmVmLnJvd0luZGV4LCByb3dJbmRleCA9IHZvaWQgMCA9PT0gX3JlZiRyb3dJbmRleCA/IHRoaXMucHJvcHMuc2Nyb2xsVG9Sb3cgOiBfcmVmJHJvd0luZGV4LCBvZmZzZXRQcm9wcyA9ICgwLCAKICAgICAgICAgICAgICAgICAgICBfZXh0ZW5kczMuZGVmYXVsdCkoe30sIHRoaXMucHJvcHMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9BbGlnbm1lbnQ6IGFsaWdubWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9Db2x1bW46IGNvbHVtbkluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb1Jvdzogcm93SW5kZXgKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0OiB0aGlzLl9nZXRDYWxjdWxhdGVkU2Nyb2xsTGVmdChvZmZzZXRQcm9wcyksCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogdGhpcy5fZ2V0Q2FsY3VsYXRlZFNjcm9sbFRvcChvZmZzZXRQcm9wcykKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJpbnZhbGlkYXRlQ2VsbFNpemVBZnRlclJlbmRlciIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oX3JlZjIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uSW5kZXggPSBfcmVmMi5jb2x1bW5JbmRleCwgcm93SW5kZXggPSBfcmVmMi5yb3dJbmRleDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWZlcnJlZEludmFsaWRhdGVDb2x1bW5JbmRleCA9ICJudW1iZXIiID09IHR5cGVvZiB0aGlzLl9kZWZlcnJlZEludmFsaWRhdGVDb2x1bW5JbmRleCA/IE1hdGgubWluKHRoaXMuX2RlZmVycmVkSW52YWxpZGF0ZUNvbHVtbkluZGV4LCBjb2x1bW5JbmRleCkgOiBjb2x1bW5JbmRleCwgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVmZXJyZWRJbnZhbGlkYXRlUm93SW5kZXggPSAibnVtYmVyIiA9PSB0eXBlb2YgdGhpcy5fZGVmZXJyZWRJbnZhbGlkYXRlUm93SW5kZXggPyBNYXRoLm1pbih0aGlzLl9kZWZlcnJlZEludmFsaWRhdGVSb3dJbmRleCwgcm93SW5kZXgpIDogcm93SW5kZXg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIm1lYXN1cmVBbGxDZWxscyIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsIGNvbHVtbkNvdW50ID0gX3Byb3BzLmNvbHVtbkNvdW50LCByb3dDb3VudCA9IF9wcm9wcy5yb3dDb3VudDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb2x1bW5TaXplQW5kUG9zaXRpb25NYW5hZ2VyLmdldFNpemVBbmRQb3NpdGlvbk9mQ2VsbChjb2x1bW5Db3VudCAtIDEpLCB0aGlzLl9yb3dTaXplQW5kUG9zaXRpb25NYW5hZ2VyLmdldFNpemVBbmRQb3NpdGlvbk9mQ2VsbChyb3dDb3VudCAtIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJyZWNvbXB1dGVHcmlkU2l6ZSIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9yZWYzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB7fSwgX3JlZjMkY29sdW1uSW5kZXggPSBfcmVmMy5jb2x1bW5JbmRleCwgY29sdW1uSW5kZXggPSB2b2lkIDAgPT09IF9yZWYzJGNvbHVtbkluZGV4ID8gMCA6IF9yZWYzJGNvbHVtbkluZGV4LCBfcmVmMyRyb3dJbmRleCA9IF9yZWYzLnJvd0luZGV4LCByb3dJbmRleCA9IHZvaWQgMCA9PT0gX3JlZjMkcm93SW5kZXggPyAwIDogX3JlZjMkcm93SW5kZXgsIF9wcm9wczIgPSB0aGlzLnByb3BzLCBzY3JvbGxUb0NvbHVtbiA9IF9wcm9wczIuc2Nyb2xsVG9Db2x1bW4sIHNjcm9sbFRvUm93ID0gX3Byb3BzMi5zY3JvbGxUb1JvdzsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb2x1bW5TaXplQW5kUG9zaXRpb25NYW5hZ2VyLnJlc2V0Q2VsbChjb2x1bW5JbmRleCksIHRoaXMuX3Jvd1NpemVBbmRQb3NpdGlvbk1hbmFnZXIucmVzZXRDZWxsKHJvd0luZGV4KSwgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVjb21wdXRlU2Nyb2xsTGVmdEZsYWcgPSBzY3JvbGxUb0NvbHVtbiA+PSAwICYmIGNvbHVtbkluZGV4IDw9IHNjcm9sbFRvQ29sdW1uLCAKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWNvbXB1dGVTY3JvbGxUb3BGbGFnID0gc2Nyb2xsVG9Sb3cgPj0gMCAmJiByb3dJbmRleCA8PSBzY3JvbGxUb1JvdywgdGhpcy5fY2VsbENhY2hlID0ge30sIAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0eWxlQ2FjaGUgPSB7fSwgdGhpcy5mb3JjZVVwZGF0ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJzY3JvbGxUb0NlbGwiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKF9yZWY0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHVtbkluZGV4ID0gX3JlZjQuY29sdW1uSW5kZXgsIHJvd0luZGV4ID0gX3JlZjQucm93SW5kZXgsIGNvbHVtbkNvdW50ID0gdGhpcy5wcm9wcy5jb2x1bW5Db3VudCwgcHJvcHMgPSB0aGlzLnByb3BzOwogICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvdW50ID4gMSAmJiB0aGlzLl91cGRhdGVTY3JvbGxMZWZ0Rm9yU2Nyb2xsVG9Db2x1bW4oKDAsIF9leHRlbmRzMy5kZWZhdWx0KSh7fSwgcHJvcHMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9Db2x1bW46IGNvbHVtbkluZGV4CiAgICAgICAgICAgICAgICAgICAgfSkpLCB0aGlzLl91cGRhdGVTY3JvbGxUb3BGb3JTY3JvbGxUb1JvdygoMCwgX2V4dGVuZHMzLmRlZmF1bHQpKHt9LCBwcm9wcywgewogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb1Jvdzogcm93SW5kZXgKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogInNjcm9sbFRvUG9zaXRpb24iLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBfcmVmNSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDoge30sIHNjcm9sbExlZnQgPSBfcmVmNS5zY3JvbGxMZWZ0LCBzY3JvbGxUb3AgPSBfcmVmNS5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0U2Nyb2xsUG9zaXRpb24oewogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0OiBzY3JvbGxMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3A6IHNjcm9sbFRvcAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJjb21wb25lbnREaWRNb3VudCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9wcm9wczMgPSB0aGlzLnByb3BzLCBnZXRTY3JvbGxiYXJTaXplID0gX3Byb3BzMy5nZXRTY3JvbGxiYXJTaXplLCBzY3JvbGxMZWZ0ID0gX3Byb3BzMy5zY3JvbGxMZWZ0LCBzY3JvbGxUb0NvbHVtbiA9IF9wcm9wczMuc2Nyb2xsVG9Db2x1bW4sIHNjcm9sbFRvcCA9IF9wcm9wczMuc2Nyb2xsVG9wLCBzY3JvbGxUb1JvdyA9IF9wcm9wczMuc2Nyb2xsVG9Sb3c7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlSW52YWxpZGF0ZWRHcmlkU2l6ZSgpLCB0aGlzLl9zY3JvbGxiYXJTaXplTWVhc3VyZWQgfHwgKHRoaXMuX3Njcm9sbGJhclNpemUgPSBnZXRTY3JvbGxiYXJTaXplKCksIAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbGJhclNpemVNZWFzdXJlZCA9ICEwLCB0aGlzLnNldFN0YXRlKHt9KSksIChzY3JvbGxMZWZ0ID49IDAgfHwgc2Nyb2xsVG9wID49IDApICYmIHRoaXMuX3NldFNjcm9sbFBvc2l0aW9uKHsKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3AKICAgICAgICAgICAgICAgICAgICB9KSwgKHNjcm9sbFRvQ29sdW1uID49IDAgfHwgc2Nyb2xsVG9Sb3cgPj0gMCkgJiYgKHRoaXMuX3VwZGF0ZVNjcm9sbExlZnRGb3JTY3JvbGxUb0NvbHVtbigpLCAKICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVTY3JvbGxUb3BGb3JTY3JvbGxUb1JvdygpKSwgdGhpcy5faW52b2tlT25HcmlkUmVuZGVyZWRIZWxwZXIoKSwgdGhpcy5faW52b2tlT25TY3JvbGxNZW1vaXplcih7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQgfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3AgfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxDb2x1bW5zV2lkdGg6IHRoaXMuX2NvbHVtblNpemVBbmRQb3NpdGlvbk1hbmFnZXIuZ2V0VG90YWxTaXplKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUm93c0hlaWdodDogdGhpcy5fcm93U2l6ZUFuZFBvc2l0aW9uTWFuYWdlci5nZXRUb3RhbFNpemUoKQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJjb21wb25lbnREaWRVcGRhdGUiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHByZXZQcm9wcywgcHJldlN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXMsIF9wcm9wczQgPSB0aGlzLnByb3BzLCBhdXRvSGVpZ2h0ID0gX3Byb3BzNC5hdXRvSGVpZ2h0LCBhdXRvV2lkdGggPSBfcHJvcHM0LmF1dG9XaWR0aCwgY29sdW1uQ291bnQgPSBfcHJvcHM0LmNvbHVtbkNvdW50LCBoZWlnaHQgPSBfcHJvcHM0LmhlaWdodCwgcm93Q291bnQgPSBfcHJvcHM0LnJvd0NvdW50LCBzY3JvbGxUb0FsaWdubWVudCA9IF9wcm9wczQuc2Nyb2xsVG9BbGlnbm1lbnQsIHNjcm9sbFRvQ29sdW1uID0gX3Byb3BzNC5zY3JvbGxUb0NvbHVtbiwgc2Nyb2xsVG9Sb3cgPSBfcHJvcHM0LnNjcm9sbFRvUm93LCB3aWR0aCA9IF9wcm9wczQud2lkdGgsIF9zdGF0ZSA9IHRoaXMuc3RhdGUsIHNjcm9sbExlZnQgPSBfc3RhdGUuc2Nyb2xsTGVmdCwgc2Nyb2xsUG9zaXRpb25DaGFuZ2VSZWFzb24gPSBfc3RhdGUuc2Nyb2xsUG9zaXRpb25DaGFuZ2VSZWFzb24sIHNjcm9sbFRvcCA9IF9zdGF0ZS5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlSW52YWxpZGF0ZWRHcmlkU2l6ZSgpOwogICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5PclJvd0NvdW50SnVzdEluY3JlYXNlZEZyb21aZXJvID0gY29sdW1uQ291bnQgPiAwICYmIDAgPT09IHByZXZQcm9wcy5jb2x1bW5Db3VudCB8fCByb3dDb3VudCA+IDAgJiYgMCA9PT0gcHJldlByb3BzLnJvd0NvdW50OwogICAgICAgICAgICAgICAgICAgIGlmIChzY3JvbGxQb3NpdGlvbkNoYW5nZVJlYXNvbiA9PT0gU0NST0xMX1BPU0lUSU9OX0NIQU5HRV9SRUFTT05TLlJFUVVFU1RFRCAmJiAoIWF1dG9XaWR0aCAmJiBzY3JvbGxMZWZ0ID49IDAgJiYgKHNjcm9sbExlZnQgIT09IHByZXZTdGF0ZS5zY3JvbGxMZWZ0ICYmIHNjcm9sbExlZnQgIT09IHRoaXMuX3Njcm9sbGluZ0NvbnRhaW5lci5zY3JvbGxMZWZ0IHx8IGNvbHVtbk9yUm93Q291bnRKdXN0SW5jcmVhc2VkRnJvbVplcm8pICYmICh0aGlzLl9zY3JvbGxpbmdDb250YWluZXIuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQpLCAKICAgICAgICAgICAgICAgICAgICAhYXV0b0hlaWdodCAmJiBzY3JvbGxUb3AgPj0gMCAmJiAoc2Nyb2xsVG9wICE9PSBwcmV2U3RhdGUuc2Nyb2xsVG9wICYmIHNjcm9sbFRvcCAhPT0gdGhpcy5fc2Nyb2xsaW5nQ29udGFpbmVyLnNjcm9sbFRvcCB8fCBjb2x1bW5PclJvd0NvdW50SnVzdEluY3JlYXNlZEZyb21aZXJvKSAmJiAodGhpcy5fc2Nyb2xsaW5nQ29udGFpbmVyLnNjcm9sbFRvcCA9IHNjcm9sbFRvcCkpLCAKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWNvbXB1dGVTY3JvbGxMZWZ0RmxhZyA/ICh0aGlzLl9yZWNvbXB1dGVTY3JvbGxMZWZ0RmxhZyA9ICExLCB0aGlzLl91cGRhdGVTY3JvbGxMZWZ0Rm9yU2Nyb2xsVG9Db2x1bW4odGhpcy5wcm9wcykpIDogKDAsIAogICAgICAgICAgICAgICAgICAgIF91cGRhdGVTY3JvbGxJbmRleEhlbHBlcjIuZGVmYXVsdCkoewogICAgICAgICAgICAgICAgICAgICAgICBjZWxsU2l6ZUFuZFBvc2l0aW9uTWFuYWdlcjogdGhpcy5fY29sdW1uU2l6ZUFuZFBvc2l0aW9uTWFuYWdlciwKICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNDZWxsc0NvdW50OiBwcmV2UHJvcHMuY29sdW1uQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQ2VsbFNpemU6IHByZXZQcm9wcy5jb2x1bW5XaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNTY3JvbGxUb0FsaWdubWVudDogcHJldlByb3BzLnNjcm9sbFRvQWxpZ25tZW50LAogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1Njcm9sbFRvSW5kZXg6IHByZXZQcm9wcy5zY3JvbGxUb0NvbHVtbiwKICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNTaXplOiBwcmV2UHJvcHMud2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbE9mZnNldDogc2Nyb2xsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9BbGlnbm1lbnQ6IHNjcm9sbFRvQWxpZ25tZW50LAogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb0luZGV4OiBzY3JvbGxUb0NvbHVtbiwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNjcm9sbEluZGV4Q2FsbGJhY2s6IGZ1bmN0aW9uKHNjcm9sbFRvQ29sdW1uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl91cGRhdGVTY3JvbGxMZWZ0Rm9yU2Nyb2xsVG9Db2x1bW4oX3RoaXMyLnByb3BzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl9yZWNvbXB1dGVTY3JvbGxUb3BGbGFnID8gKHRoaXMuX3JlY29tcHV0ZVNjcm9sbFRvcEZsYWcgPSAhMSwgdGhpcy5fdXBkYXRlU2Nyb2xsVG9wRm9yU2Nyb2xsVG9Sb3codGhpcy5wcm9wcykpIDogKDAsIAogICAgICAgICAgICAgICAgICAgIF91cGRhdGVTY3JvbGxJbmRleEhlbHBlcjIuZGVmYXVsdCkoewogICAgICAgICAgICAgICAgICAgICAgICBjZWxsU2l6ZUFuZFBvc2l0aW9uTWFuYWdlcjogdGhpcy5fcm93U2l6ZUFuZFBvc2l0aW9uTWFuYWdlciwKICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNDZWxsc0NvdW50OiBwcmV2UHJvcHMucm93Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQ2VsbFNpemU6IHByZXZQcm9wcy5yb3dIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzU2Nyb2xsVG9BbGlnbm1lbnQ6IHByZXZQcm9wcy5zY3JvbGxUb0FsaWdubWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNTY3JvbGxUb0luZGV4OiBwcmV2UHJvcHMuc2Nyb2xsVG9Sb3csCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzU2l6ZTogcHJldlByb3BzLmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsT2Zmc2V0OiBzY3JvbGxUb3AsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvQWxpZ25tZW50OiBzY3JvbGxUb0FsaWdubWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9JbmRleDogc2Nyb2xsVG9Sb3csCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2Nyb2xsSW5kZXhDYWxsYmFjazogZnVuY3Rpb24oc2Nyb2xsVG9Sb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX3VwZGF0ZVNjcm9sbFRvcEZvclNjcm9sbFRvUm93KF90aGlzMi5wcm9wcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5faW52b2tlT25HcmlkUmVuZGVyZWRIZWxwZXIoKSwgc2Nyb2xsTGVmdCAhPT0gcHJldlN0YXRlLnNjcm9sbExlZnQgfHwgc2Nyb2xsVG9wICE9PSBwcmV2U3RhdGUuc2Nyb2xsVG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b3RhbFJvd3NIZWlnaHQgPSB0aGlzLl9yb3dTaXplQW5kUG9zaXRpb25NYW5hZ2VyLmdldFRvdGFsU2l6ZSgpLCB0b3RhbENvbHVtbnNXaWR0aCA9IHRoaXMuX2NvbHVtblNpemVBbmRQb3NpdGlvbk1hbmFnZXIuZ2V0VG90YWxTaXplKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZU9uU2Nyb2xsTWVtb2l6ZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxDb2x1bW5zV2lkdGg6IHRvdGFsQ29sdW1uc1dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxSb3dzSGVpZ2h0OiB0b3RhbFJvd3NIZWlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJjb21wb25lbnRXaWxsTW91bnQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBnZXRTY3JvbGxiYXJTaXplID0gdGhpcy5wcm9wcy5nZXRTY3JvbGxiYXJTaXplOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbGJhclNpemUgPSBnZXRTY3JvbGxiYXJTaXplKCksIHZvaWQgMCA9PT0gdGhpcy5fc2Nyb2xsYmFyU2l6ZSA/ICh0aGlzLl9zY3JvbGxiYXJTaXplTWVhc3VyZWQgPSAhMSwgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsYmFyU2l6ZSA9IDApIDogdGhpcy5fc2Nyb2xsYmFyU2l6ZU1lYXN1cmVkID0gITAsIHRoaXMuX2NhbGN1bGF0ZUNoaWxkcmVuVG9SZW5kZXIoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiY29tcG9uZW50V2lsbFVubW91bnQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVQb2ludGVyRXZlbnRzVGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aGlzLl9kaXNhYmxlUG9pbnRlckV2ZW50c1RpbWVvdXRJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKG5leHRQcm9wcykgewogICAgICAgICAgICAgICAgICAgIHZhciBfdGhpczMgPSB0aGlzLCBfc3RhdGUyID0gdGhpcy5zdGF0ZSwgc2Nyb2xsTGVmdCA9IF9zdGF0ZTIuc2Nyb2xsTGVmdCwgc2Nyb2xsVG9wID0gX3N0YXRlMi5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IG5leHRQcm9wcy5jb2x1bW5Db3VudCAmJiAwICE9PSBzY3JvbGxMZWZ0IHx8IDAgPT09IG5leHRQcm9wcy5yb3dDb3VudCAmJiAwICE9PSBzY3JvbGxUb3ApIHRoaXMuX3NldFNjcm9sbFBvc2l0aW9uKHsKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiAwCiAgICAgICAgICAgICAgICAgICAgfSk7IGVsc2UgaWYgKG5leHRQcm9wcy5zY3JvbGxMZWZ0ICE9PSB0aGlzLnByb3BzLnNjcm9sbExlZnQgfHwgbmV4dFByb3BzLnNjcm9sbFRvcCAhPT0gdGhpcy5wcm9wcy5zY3JvbGxUb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1N0YXRlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gbmV4dFByb3BzLnNjcm9sbExlZnQgJiYgKG5ld1N0YXRlLnNjcm9sbExlZnQgPSBuZXh0UHJvcHMuc2Nyb2xsTGVmdCksIG51bGwgIT0gbmV4dFByb3BzLnNjcm9sbFRvcCAmJiAobmV3U3RhdGUuc2Nyb2xsVG9wID0gbmV4dFByb3BzLnNjcm9sbFRvcCksIAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXRTY3JvbGxQb3NpdGlvbihuZXdTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5leHRQcm9wcy5jb2x1bW5XaWR0aCA9PT0gdGhpcy5wcm9wcy5jb2x1bW5XaWR0aCAmJiBuZXh0UHJvcHMucm93SGVpZ2h0ID09PSB0aGlzLnByb3BzLnJvd0hlaWdodCB8fCAodGhpcy5fc3R5bGVDYWNoZSA9IHt9KSwgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29sdW1uV2lkdGhHZXR0ZXIgPSB0aGlzLl93cmFwU2l6ZUdldHRlcihuZXh0UHJvcHMuY29sdW1uV2lkdGgpLCB0aGlzLl9yb3dIZWlnaHRHZXR0ZXIgPSB0aGlzLl93cmFwU2l6ZUdldHRlcihuZXh0UHJvcHMucm93SGVpZ2h0KSwgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29sdW1uU2l6ZUFuZFBvc2l0aW9uTWFuYWdlci5jb25maWd1cmUoewogICAgICAgICAgICAgICAgICAgICAgICBjZWxsQ291bnQ6IG5leHRQcm9wcy5jb2x1bW5Db3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVkQ2VsbFNpemU6IHRoaXMuX2dldEVzdGltYXRlZENvbHVtblNpemUobmV4dFByb3BzKQogICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl9yb3dTaXplQW5kUG9zaXRpb25NYW5hZ2VyLmNvbmZpZ3VyZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxDb3VudDogbmV4dFByb3BzLnJvd0NvdW50LAogICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWRDZWxsU2l6ZTogdGhpcy5fZ2V0RXN0aW1hdGVkUm93U2l6ZShuZXh0UHJvcHMpCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9wcm9wczUgPSB0aGlzLnByb3BzLCBjb2x1bW5Db3VudCA9IF9wcm9wczUuY29sdW1uQ291bnQsIHJvd0NvdW50ID0gX3Byb3BzNS5yb3dDb3VudDsKICAgICAgICAgICAgICAgICAgICAwICE9PSBjb2x1bW5Db3VudCAmJiAwICE9PSByb3dDb3VudCB8fCAoY29sdW1uQ291bnQgPSAwLCByb3dDb3VudCA9IDApLCBuZXh0UHJvcHMuYXV0b0hlaWdodCAmJiBuZXh0UHJvcHMuaXNTY3JvbGxpbmcgPT09ICExICYmIHRoaXMucHJvcHMuaXNTY3JvbGxpbmcgPT09ICEwICYmIHRoaXMuX3Jlc2V0U3R5bGVDYWNoZSgpLCAKICAgICAgICAgICAgICAgICAgICAoMCwgX2NhbGN1bGF0ZVNpemVBbmRQb3NpdGlvbkRhdGFBbmRVcGRhdGVTY3JvbGxPZmZzZXQyLmRlZmF1bHQpKHsKICAgICAgICAgICAgICAgICAgICAgICAgY2VsbENvdW50OiBjb2x1bW5Db3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFNpemU6IHRoaXMucHJvcHMuY29sdW1uV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVNZXRhZGF0YUNhbGxiYWNrOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczMuX2NvbHVtblNpemVBbmRQb3NpdGlvbk1hbmFnZXIucmVzZXRDZWxsKDApOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlTWV0YWRhdGFDYWxsYmFja1Byb3BzOiBuZXh0UHJvcHMsCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRDZWxsc0NvdW50OiBuZXh0UHJvcHMuY29sdW1uQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRDZWxsU2l6ZTogbmV4dFByb3BzLmNvbHVtbldpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2Nyb2xsVG9JbmRleDogbmV4dFByb3BzLnNjcm9sbFRvQ29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb0luZGV4OiB0aGlzLnByb3BzLnNjcm9sbFRvQ29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTY3JvbGxPZmZzZXRGb3JTY3JvbGxUb0luZGV4OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczMuX3VwZGF0ZVNjcm9sbExlZnRGb3JTY3JvbGxUb0NvbHVtbihuZXh0UHJvcHMsIF90aGlzMy5zdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwgKDAsIF9jYWxjdWxhdGVTaXplQW5kUG9zaXRpb25EYXRhQW5kVXBkYXRlU2Nyb2xsT2Zmc2V0Mi5kZWZhdWx0KSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxDb3VudDogcm93Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxTaXplOiB0aGlzLnByb3BzLnJvd0hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZU1ldGFkYXRhQ2FsbGJhY2s6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5fcm93U2l6ZUFuZFBvc2l0aW9uTWFuYWdlci5yZXNldENlbGwoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVNZXRhZGF0YUNhbGxiYWNrUHJvcHM6IG5leHRQcm9wcywKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dENlbGxzQ291bnQ6IG5leHRQcm9wcy5yb3dDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dENlbGxTaXplOiBuZXh0UHJvcHMucm93SGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2Nyb2xsVG9JbmRleDogbmV4dFByb3BzLnNjcm9sbFRvUm93LAogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb0luZGV4OiB0aGlzLnByb3BzLnNjcm9sbFRvUm93LAogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTY3JvbGxPZmZzZXRGb3JTY3JvbGxUb0luZGV4OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczMuX3VwZGF0ZVNjcm9sbFRvcEZvclNjcm9sbFRvUm93KG5leHRQcm9wcywgX3RoaXMzLnN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJjb21wb25lbnRXaWxsVXBkYXRlIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihuZXh0UHJvcHMsIG5leHRTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGN1bGF0ZUNoaWxkcmVuVG9SZW5kZXIobmV4dFByb3BzLCBuZXh0U3RhdGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJyZW5kZXIiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBfcHJvcHM2ID0gdGhpcy5wcm9wcywgYXV0b0NvbnRhaW5lcldpZHRoID0gX3Byb3BzNi5hdXRvQ29udGFpbmVyV2lkdGgsIGF1dG9IZWlnaHQgPSBfcHJvcHM2LmF1dG9IZWlnaHQsIGF1dG9XaWR0aCA9IF9wcm9wczYuYXV0b1dpZHRoLCBjbGFzc05hbWUgPSBfcHJvcHM2LmNsYXNzTmFtZSwgY29udGFpbmVyU3R5bGUgPSBfcHJvcHM2LmNvbnRhaW5lclN0eWxlLCBoZWlnaHQgPSBfcHJvcHM2LmhlaWdodCwgaWQgPSBfcHJvcHM2LmlkLCBub0NvbnRlbnRSZW5kZXJlciA9IF9wcm9wczYubm9Db250ZW50UmVuZGVyZXIsIHJvbGUgPSBfcHJvcHM2LnJvbGUsIHN0eWxlID0gX3Byb3BzNi5zdHlsZSwgdGFiSW5kZXggPSBfcHJvcHM2LnRhYkluZGV4LCB3aWR0aCA9IF9wcm9wczYud2lkdGgsIGlzU2Nyb2xsaW5nID0gdGhpcy5faXNTY3JvbGxpbmcoKSwgZ3JpZFN0eWxlID0gewogICAgICAgICAgICAgICAgICAgICAgICBib3hTaXppbmc6ICJib3JkZXItYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAibHRyIiwKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBhdXRvSGVpZ2h0ID8gImF1dG8iIDogaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogInJlbGF0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGF1dG9XaWR0aCA/ICJhdXRvIiA6IHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICBXZWJraXRPdmVyZmxvd1Njcm9sbGluZzogInRvdWNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgd2lsbENoYW5nZTogInRyYW5zZm9ybSIKICAgICAgICAgICAgICAgICAgICB9LCB0b3RhbENvbHVtbnNXaWR0aCA9IHRoaXMuX2NvbHVtblNpemVBbmRQb3NpdGlvbk1hbmFnZXIuZ2V0VG90YWxTaXplKCksIHRvdGFsUm93c0hlaWdodCA9IHRoaXMuX3Jvd1NpemVBbmRQb3NpdGlvbk1hbmFnZXIuZ2V0VG90YWxTaXplKCksIHZlcnRpY2FsU2Nyb2xsQmFyU2l6ZSA9IHRvdGFsUm93c0hlaWdodCA+IGhlaWdodCA/IHRoaXMuX3Njcm9sbGJhclNpemUgOiAwLCBob3Jpem9udGFsU2Nyb2xsQmFyU2l6ZSA9IHRvdGFsQ29sdW1uc1dpZHRoID4gd2lkdGggPyB0aGlzLl9zY3JvbGxiYXJTaXplIDogMDsKICAgICAgICAgICAgICAgICAgICBncmlkU3R5bGUub3ZlcmZsb3dYID0gdG90YWxDb2x1bW5zV2lkdGggKyB2ZXJ0aWNhbFNjcm9sbEJhclNpemUgPD0gd2lkdGggPyAiaGlkZGVuIiA6ICJhdXRvIiwgCiAgICAgICAgICAgICAgICAgICAgZ3JpZFN0eWxlLm92ZXJmbG93WSA9IHRvdGFsUm93c0hlaWdodCArIGhvcml6b250YWxTY3JvbGxCYXJTaXplIDw9IGhlaWdodCA/ICJoaWRkZW4iIDogImF1dG8iOwogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlblRvRGlzcGxheSA9IHRoaXMuX2NoaWxkcmVuVG9EaXNwbGF5LCBzaG93Tm9Db250ZW50UmVuZGVyZXIgPSAwID09PSBjaGlsZHJlblRvRGlzcGxheS5sZW5ndGggJiYgaGVpZ2h0ID4gMCAmJiB3aWR0aCA+IDA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZjogdGhpcy5fc2V0U2Nyb2xsaW5nQ29udGFpbmVyUmVmLAogICAgICAgICAgICAgICAgICAgICAgICAiYXJpYS1sYWJlbCI6IHRoaXMucHJvcHNbImFyaWEtbGFiZWwiXSwKICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyLmRlZmF1bHQpKCJSZWFjdFZpcnR1YWxpemVkX19HcmlkIiwgY2xhc3NOYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLAogICAgICAgICAgICAgICAgICAgICAgICBvblNjcm9sbDogdGhpcy5fb25TY3JvbGwsCiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU6IHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiAoMCwgX2V4dGVuZHMzLmRlZmF1bHQpKHt9LCBncmlkU3R5bGUsIHN0eWxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgdGFiSW5kZXg6IHRhYkluZGV4CiAgICAgICAgICAgICAgICAgICAgfSwgY2hpbGRyZW5Ub0Rpc3BsYXkubGVuZ3RoID4gMCAmJiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2IiwgewogICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICJSZWFjdFZpcnR1YWxpemVkX19HcmlkX19pbm5lclNjcm9sbENvbnRhaW5lciIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiAoMCwgX2V4dGVuZHMzLmRlZmF1bHQpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBhdXRvQ29udGFpbmVyV2lkdGggPyAiYXV0byIgOiB0b3RhbENvbHVtbnNXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdG90YWxSb3dzSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IHRvdGFsQ29sdW1uc1dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiB0b3RhbFJvd3NIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogImhpZGRlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyRXZlbnRzOiBpc1Njcm9sbGluZyA/ICJub25lIiA6ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICJyZWxhdGl2ZSIKICAgICAgICAgICAgICAgICAgICAgICAgfSwgY29udGFpbmVyU3R5bGUpCiAgICAgICAgICAgICAgICAgICAgfSwgY2hpbGRyZW5Ub0Rpc3BsYXkpLCBzaG93Tm9Db250ZW50UmVuZGVyZXIgJiYgbm9Db250ZW50UmVuZGVyZXIoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9jYWxjdWxhdGVDaGlsZHJlblRvUmVuZGVyIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHRoaXMucHJvcHMsIHN0YXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiB0aGlzLnN0YXRlLCBjZWxsUmVuZGVyZXIgPSBwcm9wcy5jZWxsUmVuZGVyZXIsIGNlbGxSYW5nZVJlbmRlcmVyID0gcHJvcHMuY2VsbFJhbmdlUmVuZGVyZXIsIGNvbHVtbkNvdW50ID0gcHJvcHMuY29sdW1uQ291bnQsIGRlZmVycmVkTWVhc3VyZW1lbnRDYWNoZSA9IHByb3BzLmRlZmVycmVkTWVhc3VyZW1lbnRDYWNoZSwgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LCBvdmVyc2NhbkNvbHVtbkNvdW50ID0gcHJvcHMub3ZlcnNjYW5Db2x1bW5Db3VudCwgb3ZlcnNjYW5JbmRpY2VzR2V0dGVyID0gcHJvcHMub3ZlcnNjYW5JbmRpY2VzR2V0dGVyLCBvdmVyc2NhblJvd0NvdW50ID0gcHJvcHMub3ZlcnNjYW5Sb3dDb3VudCwgcm93Q291bnQgPSBwcm9wcy5yb3dDb3VudCwgd2lkdGggPSBwcm9wcy53aWR0aCwgc2Nyb2xsRGlyZWN0aW9uSG9yaXpvbnRhbCA9IHN0YXRlLnNjcm9sbERpcmVjdGlvbkhvcml6b250YWwsIHNjcm9sbERpcmVjdGlvblZlcnRpY2FsID0gc3RhdGUuc2Nyb2xsRGlyZWN0aW9uVmVydGljYWwsIHNjcm9sbExlZnQgPSBzdGF0ZS5zY3JvbGxMZWZ0LCBzY3JvbGxUb3AgPSBzdGF0ZS5zY3JvbGxUb3AsIGlzU2Nyb2xsaW5nID0gdGhpcy5faXNTY3JvbGxpbmcocHJvcHMsIHN0YXRlKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2hpbGRyZW5Ub0Rpc3BsYXkgPSBbXSwgaGVpZ2h0ID4gMCAmJiB3aWR0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpc2libGVDb2x1bW5JbmRpY2VzID0gdGhpcy5fY29sdW1uU2l6ZUFuZFBvc2l0aW9uTWFuYWdlci5nZXRWaXNpYmxlQ2VsbFJhbmdlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNpemU6IHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBzY3JvbGxMZWZ0CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB2aXNpYmxlUm93SW5kaWNlcyA9IHRoaXMuX3Jvd1NpemVBbmRQb3NpdGlvbk1hbmFnZXIuZ2V0VmlzaWJsZUNlbGxSYW5nZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJTaXplOiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHNjcm9sbFRvcAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgaG9yaXpvbnRhbE9mZnNldEFkanVzdG1lbnQgPSB0aGlzLl9jb2x1bW5TaXplQW5kUG9zaXRpb25NYW5hZ2VyLmdldE9mZnNldEFkanVzdG1lbnQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyU2l6ZTogd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHNjcm9sbExlZnQKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHZlcnRpY2FsT2Zmc2V0QWRqdXN0bWVudCA9IHRoaXMuX3Jvd1NpemVBbmRQb3NpdGlvbk1hbmFnZXIuZ2V0T2Zmc2V0QWRqdXN0bWVudCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJTaXplOiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHNjcm9sbFRvcAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRDb2x1bW5TdGFydEluZGV4ID0gdmlzaWJsZUNvbHVtbkluZGljZXMuc3RhcnQsIHRoaXMuX3JlbmRlcmVkQ29sdW1uU3RvcEluZGV4ID0gdmlzaWJsZUNvbHVtbkluZGljZXMuc3RvcCwgCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVkUm93U3RhcnRJbmRleCA9IHZpc2libGVSb3dJbmRpY2VzLnN0YXJ0LCB0aGlzLl9yZW5kZXJlZFJvd1N0b3BJbmRleCA9IHZpc2libGVSb3dJbmRpY2VzLnN0b3A7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvdmVyc2NhbkNvbHVtbkluZGljZXMgPSBvdmVyc2NhbkluZGljZXNHZXR0ZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsQ291bnQ6IGNvbHVtbkNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnNjYW5DZWxsc0NvdW50OiBvdmVyc2NhbkNvbHVtbkNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsRGlyZWN0aW9uOiBzY3JvbGxEaXJlY3Rpb25Ib3Jpem9udGFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleDogdGhpcy5fcmVuZGVyZWRDb2x1bW5TdGFydEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcEluZGV4OiB0aGlzLl9yZW5kZXJlZENvbHVtblN0b3BJbmRleAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgb3ZlcnNjYW5Sb3dJbmRpY2VzID0gb3ZlcnNjYW5JbmRpY2VzR2V0dGVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogInZlcnRpY2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxDb3VudDogcm93Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2NhbkNlbGxzQ291bnQ6IG92ZXJzY2FuUm93Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxEaXJlY3Rpb246IHNjcm9sbERpcmVjdGlvblZlcnRpY2FsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleDogdGhpcy5fcmVuZGVyZWRSb3dTdGFydEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcEluZGV4OiB0aGlzLl9yZW5kZXJlZFJvd1N0b3BJbmRleAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29sdW1uU3RhcnRJbmRleCA9IG92ZXJzY2FuQ29sdW1uSW5kaWNlcy5vdmVyc2NhblN0YXJ0SW5kZXgsIHRoaXMuX2NvbHVtblN0b3BJbmRleCA9IG92ZXJzY2FuQ29sdW1uSW5kaWNlcy5vdmVyc2NhblN0b3BJbmRleCwgCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jvd1N0YXJ0SW5kZXggPSBvdmVyc2NhblJvd0luZGljZXMub3ZlcnNjYW5TdGFydEluZGV4LCB0aGlzLl9yb3dTdG9wSW5kZXggPSBvdmVyc2NhblJvd0luZGljZXMub3ZlcnNjYW5TdG9wSW5kZXgsIAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGlsZHJlblRvRGlzcGxheSA9IGNlbGxSYW5nZVJlbmRlcmVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxDYWNoZTogdGhpcy5fY2VsbENhY2hlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFJlbmRlcmVyOiBjZWxsUmVuZGVyZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5TaXplQW5kUG9zaXRpb25NYW5hZ2VyOiB0aGlzLl9jb2x1bW5TaXplQW5kUG9zaXRpb25NYW5hZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uU3RhcnRJbmRleDogdGhpcy5fY29sdW1uU3RhcnRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblN0b3BJbmRleDogdGhpcy5fY29sdW1uU3RvcEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWRNZWFzdXJlbWVudENhY2hlOiBkZWZlcnJlZE1lYXN1cmVtZW50Q2FjaGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0QWRqdXN0bWVudDogaG9yaXpvbnRhbE9mZnNldEFkanVzdG1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Njcm9sbGluZzogaXNTY3JvbGxpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTaXplQW5kUG9zaXRpb25NYW5hZ2VyOiB0aGlzLl9yb3dTaXplQW5kUG9zaXRpb25NYW5hZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93U3RhcnRJbmRleDogdGhpcy5fcm93U3RhcnRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1N0b3BJbmRleDogdGhpcy5fcm93U3RvcEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDYWNoZTogdGhpcy5fc3R5bGVDYWNoZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0QWRqdXN0bWVudDogdmVydGljYWxPZmZzZXRBZGp1c3RtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZUNvbHVtbkluZGljZXM6IHZpc2libGVDb2x1bW5JbmRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZVJvd0luZGljZXM6IHZpc2libGVSb3dJbmRpY2VzCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX2RlYm91bmNlU2Nyb2xsRW5kZWQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxpbmdSZXNldFRpbWVJbnRlcnZhbCA9IHRoaXMucHJvcHMuc2Nyb2xsaW5nUmVzZXRUaW1lSW50ZXJ2YWw7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzYWJsZVBvaW50ZXJFdmVudHNUaW1lb3V0SWQgJiYgY2xlYXJUaW1lb3V0KHRoaXMuX2Rpc2FibGVQb2ludGVyRXZlbnRzVGltZW91dElkKSwgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzYWJsZVBvaW50ZXJFdmVudHNUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KHRoaXMuX2RlYm91bmNlU2Nyb2xsRW5kZWRDYWxsYmFjaywgc2Nyb2xsaW5nUmVzZXRUaW1lSW50ZXJ2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfZGVib3VuY2VTY3JvbGxFbmRlZENhbGxiYWNrIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlUG9pbnRlckV2ZW50c1RpbWVvdXRJZCA9IG51bGwsIHRoaXMuX3Jlc2V0U3R5bGVDYWNoZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfZ2V0RXN0aW1hdGVkQ29sdW1uU2l6ZSIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24ocHJvcHMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm51bWJlciIgPT0gdHlwZW9mIHByb3BzLmNvbHVtbldpZHRoID8gcHJvcHMuY29sdW1uV2lkdGggOiBwcm9wcy5lc3RpbWF0ZWRDb2x1bW5TaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfZ2V0RXN0aW1hdGVkUm93U2l6ZSIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24ocHJvcHMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm51bWJlciIgPT0gdHlwZW9mIHByb3BzLnJvd0hlaWdodCA/IHByb3BzLnJvd0hlaWdodCA6IHByb3BzLmVzdGltYXRlZFJvd1NpemU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9oYW5kbGVJbnZhbGlkYXRlZEdyaWRTaXplIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIm51bWJlciIgPT0gdHlwZW9mIHRoaXMuX2RlZmVycmVkSW52YWxpZGF0ZUNvbHVtbkluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5JbmRleCA9IHRoaXMuX2RlZmVycmVkSW52YWxpZGF0ZUNvbHVtbkluZGV4LCByb3dJbmRleCA9IHRoaXMuX2RlZmVycmVkSW52YWxpZGF0ZVJvd0luZGV4OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWZlcnJlZEludmFsaWRhdGVDb2x1bW5JbmRleCA9IG51bGwsIHRoaXMuX2RlZmVycmVkSW52YWxpZGF0ZVJvd0luZGV4ID0gbnVsbCwgCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb21wdXRlR3JpZFNpemUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXg6IGNvbHVtbkluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IHJvd0luZGV4CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX2ludm9rZU9uR3JpZFJlbmRlcmVkSGVscGVyIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb25TZWN0aW9uUmVuZGVyZWQgPSB0aGlzLnByb3BzLm9uU2VjdGlvblJlbmRlcmVkOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX29uR3JpZFJlbmRlcmVkTWVtb2l6ZXIoewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogb25TZWN0aW9uUmVuZGVyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk92ZXJzY2FuU3RhcnRJbmRleDogdGhpcy5fY29sdW1uU3RhcnRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk92ZXJzY2FuU3RvcEluZGV4OiB0aGlzLl9jb2x1bW5TdG9wSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5TdGFydEluZGV4OiB0aGlzLl9yZW5kZXJlZENvbHVtblN0YXJ0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5TdG9wSW5kZXg6IHRoaXMuX3JlbmRlcmVkQ29sdW1uU3RvcEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93T3ZlcnNjYW5TdGFydEluZGV4OiB0aGlzLl9yb3dTdGFydEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93T3ZlcnNjYW5TdG9wSW5kZXg6IHRoaXMuX3Jvd1N0b3BJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1N0YXJ0SW5kZXg6IHRoaXMuX3JlbmRlcmVkUm93U3RhcnRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1N0b3BJbmRleDogdGhpcy5fcmVuZGVyZWRSb3dTdG9wSW5kZXgKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfaW52b2tlT25TY3JvbGxNZW1vaXplciIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oX3JlZjYpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX3RoaXM0ID0gdGhpcywgc2Nyb2xsTGVmdCA9IF9yZWY2LnNjcm9sbExlZnQsIHNjcm9sbFRvcCA9IF9yZWY2LnNjcm9sbFRvcCwgdG90YWxDb2x1bW5zV2lkdGggPSBfcmVmNi50b3RhbENvbHVtbnNXaWR0aCwgdG90YWxSb3dzSGVpZ2h0ID0gX3JlZjYudG90YWxSb3dzSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIHRoaXMuX29uU2Nyb2xsTWVtb2l6ZXIoewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24oX3JlZjcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxMZWZ0ID0gX3JlZjcuc2Nyb2xsTGVmdCwgc2Nyb2xsVG9wID0gX3JlZjcuc2Nyb2xsVG9wLCBfcHJvcHM3ID0gX3RoaXM0LnByb3BzLCBoZWlnaHQgPSBfcHJvcHM3LmhlaWdodCwgb25TY3JvbGwgPSBfcHJvcHM3Lm9uU2Nyb2xsLCB3aWR0aCA9IF9wcm9wczcud2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNjcm9sbCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50SGVpZ2h0OiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50V2lkdGg6IHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEhlaWdodDogdG90YWxSb3dzSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsV2lkdGg6IHRvdGFsQ29sdW1uc1dpZHRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX2lzU2Nyb2xsaW5nIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHRoaXMucHJvcHMsIHN0YXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiB0aGlzLnN0YXRlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChwcm9wcywgImlzU2Nyb2xsaW5nIikgPyBwcm9wcy5pc1Njcm9sbGluZyA6IHN0YXRlLmlzU2Nyb2xsaW5nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfc2V0U2Nyb2xsaW5nQ29udGFpbmVyUmVmIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihyZWYpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxpbmdDb250YWluZXIgPSByZWY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9zZXRTY3JvbGxQb3NpdGlvbiIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oX3JlZjgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsTGVmdCA9IF9yZWY4LnNjcm9sbExlZnQsIHNjcm9sbFRvcCA9IF9yZWY4LnNjcm9sbFRvcCwgbmV3U3RhdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uQ2hhbmdlUmVhc29uOiBTQ1JPTExfUE9TSVRJT05fQ0hBTkdFX1JFQVNPTlMuUkVRVUVTVEVECiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0ID49IDAgJiYgKG5ld1N0YXRlLnNjcm9sbERpcmVjdGlvbkhvcml6b250YWwgPSBzY3JvbGxMZWZ0ID4gdGhpcy5zdGF0ZS5zY3JvbGxMZWZ0ID8gX2RlZmF1bHRPdmVyc2NhbkluZGljZXNHZXR0ZXIuU0NST0xMX0RJUkVDVElPTl9GT1JXQVJEIDogX2RlZmF1bHRPdmVyc2NhbkluZGljZXNHZXR0ZXIuU0NST0xMX0RJUkVDVElPTl9CQUNLV0FSRCwgCiAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQpLCBzY3JvbGxUb3AgPj0gMCAmJiAobmV3U3RhdGUuc2Nyb2xsRGlyZWN0aW9uVmVydGljYWwgPSBzY3JvbGxUb3AgPiB0aGlzLnN0YXRlLnNjcm9sbFRvcCA/IF9kZWZhdWx0T3ZlcnNjYW5JbmRpY2VzR2V0dGVyLlNDUk9MTF9ESVJFQ1RJT05fRk9SV0FSRCA6IF9kZWZhdWx0T3ZlcnNjYW5JbmRpY2VzR2V0dGVyLlNDUk9MTF9ESVJFQ1RJT05fQkFDS1dBUkQsIAogICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlLnNjcm9sbFRvcCA9IHNjcm9sbFRvcCksIChzY3JvbGxMZWZ0ID49IDAgJiYgc2Nyb2xsTGVmdCAhPT0gdGhpcy5zdGF0ZS5zY3JvbGxMZWZ0IHx8IHNjcm9sbFRvcCA+PSAwICYmIHNjcm9sbFRvcCAhPT0gdGhpcy5zdGF0ZS5zY3JvbGxUb3ApICYmIHRoaXMuc2V0U3RhdGUobmV3U3RhdGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfd3JhcFByb3BlcnR5R2V0dGVyIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiZnVuY3Rpb24iID09IHR5cGVvZiB2YWx1ZSA/IHZhbHVlIDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfd3JhcFNpemVHZXR0ZXIiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHNpemUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd3JhcFByb3BlcnR5R2V0dGVyKHNpemUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfZ2V0Q2FsY3VsYXRlZFNjcm9sbExlZnQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogdGhpcy5wcm9wcywgc3RhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IHRoaXMuc3RhdGUsIGNvbHVtbkNvdW50ID0gcHJvcHMuY29sdW1uQ291bnQsIGhlaWdodCA9IHByb3BzLmhlaWdodCwgc2Nyb2xsVG9BbGlnbm1lbnQgPSBwcm9wcy5zY3JvbGxUb0FsaWdubWVudCwgc2Nyb2xsVG9Db2x1bW4gPSBwcm9wcy5zY3JvbGxUb0NvbHVtbiwgd2lkdGggPSBwcm9wcy53aWR0aCwgc2Nyb2xsTGVmdCA9IHN0YXRlLnNjcm9sbExlZnQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjcm9sbFRvQ29sdW1uID49IDAgJiYgY29sdW1uQ291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRJbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGNvbHVtbkNvdW50IC0gMSwgc2Nyb2xsVG9Db2x1bW4pKSwgdG90YWxSb3dzSGVpZ2h0ID0gdGhpcy5fcm93U2l6ZUFuZFBvc2l0aW9uTWFuYWdlci5nZXRUb3RhbFNpemUoKSwgc2Nyb2xsQmFyU2l6ZSA9IHRvdGFsUm93c0hlaWdodCA+IGhlaWdodCA/IHRoaXMuX3Njcm9sbGJhclNpemUgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uU2l6ZUFuZFBvc2l0aW9uTWFuYWdlci5nZXRVcGRhdGVkT2Zmc2V0Rm9ySW5kZXgoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246IHNjcm9sbFRvQWxpZ25tZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyU2l6ZTogd2lkdGggLSBzY3JvbGxCYXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9mZnNldDogc2Nyb2xsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4OiB0YXJnZXRJbmRleAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl91cGRhdGVTY3JvbGxMZWZ0Rm9yU2Nyb2xsVG9Db2x1bW4iLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogdGhpcy5wcm9wcywgc3RhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IHRoaXMuc3RhdGUsIHNjcm9sbExlZnQgPSBzdGF0ZS5zY3JvbGxMZWZ0LCBjYWxjdWxhdGVkU2Nyb2xsTGVmdCA9IHRoaXMuX2dldENhbGN1bGF0ZWRTY3JvbGxMZWZ0KHByb3BzLCBzdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlZFNjcm9sbExlZnQgPj0gMCAmJiBzY3JvbGxMZWZ0ICE9PSBjYWxjdWxhdGVkU2Nyb2xsTGVmdCAmJiB0aGlzLl9zZXRTY3JvbGxQb3NpdGlvbih7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbExlZnQ6IGNhbGN1bGF0ZWRTY3JvbGxMZWZ0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9nZXRDYWxjdWxhdGVkU2Nyb2xsVG9wIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHRoaXMucHJvcHMsIHN0YXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiB0aGlzLnN0YXRlLCBoZWlnaHQgPSBwcm9wcy5oZWlnaHQsIHJvd0NvdW50ID0gcHJvcHMucm93Q291bnQsIHNjcm9sbFRvQWxpZ25tZW50ID0gcHJvcHMuc2Nyb2xsVG9BbGlnbm1lbnQsIHNjcm9sbFRvUm93ID0gcHJvcHMuc2Nyb2xsVG9Sb3csIHdpZHRoID0gcHJvcHMud2lkdGgsIHNjcm9sbFRvcCA9IHN0YXRlLnNjcm9sbFRvcDsKICAgICAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsVG9Sb3cgPj0gMCAmJiByb3dDb3VudCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldEluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocm93Q291bnQgLSAxLCBzY3JvbGxUb1JvdykpLCB0b3RhbENvbHVtbnNXaWR0aCA9IHRoaXMuX2NvbHVtblNpemVBbmRQb3NpdGlvbk1hbmFnZXIuZ2V0VG90YWxTaXplKCksIHNjcm9sbEJhclNpemUgPSB0b3RhbENvbHVtbnNXaWR0aCA+IHdpZHRoID8gdGhpcy5fc2Nyb2xsYmFyU2l6ZSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb3dTaXplQW5kUG9zaXRpb25NYW5hZ2VyLmdldFVwZGF0ZWRPZmZzZXRGb3JJbmRleCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogc2Nyb2xsVG9BbGlnbm1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJTaXplOiBoZWlnaHQgLSBzY3JvbGxCYXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9mZnNldDogc2Nyb2xsVG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXg6IHRhcmdldEluZGV4CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX3Jlc2V0U3R5bGVDYWNoZSIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0eWxlQ2FjaGUgPSB0aGlzLl9zdHlsZUNhY2hlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NlbGxDYWNoZSA9IHt9LCB0aGlzLl9zdHlsZUNhY2hlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcm93SW5kZXggPSB0aGlzLl9yb3dTdGFydEluZGV4OyByb3dJbmRleCA8PSB0aGlzLl9yb3dTdG9wSW5kZXg7IHJvd0luZGV4KyspIGZvciAodmFyIGNvbHVtbkluZGV4ID0gdGhpcy5fY29sdW1uU3RhcnRJbmRleDsgY29sdW1uSW5kZXggPD0gdGhpcy5fY29sdW1uU3RvcEluZGV4OyBjb2x1bW5JbmRleCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSByb3dJbmRleCArICItIiArIGNvbHVtbkluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdHlsZUNhY2hlW2tleV0gPSBzdHlsZUNhY2hlW2tleV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoewogICAgICAgICAgICAgICAgICAgICAgICBpc1Njcm9sbGluZzogITEKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX3VwZGF0ZVNjcm9sbFRvcEZvclNjcm9sbFRvUm93IiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHRoaXMucHJvcHMsIHN0YXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiB0aGlzLnN0YXRlLCBzY3JvbGxUb3AgPSBzdGF0ZS5zY3JvbGxUb3AsIGNhbGN1bGF0ZWRTY3JvbGxUb3AgPSB0aGlzLl9nZXRDYWxjdWxhdGVkU2Nyb2xsVG9wKHByb3BzLCBzdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlZFNjcm9sbFRvcCA+PSAwICYmIHNjcm9sbFRvcCAhPT0gY2FsY3VsYXRlZFNjcm9sbFRvcCAmJiB0aGlzLl9zZXRTY3JvbGxQb3NpdGlvbih7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogY2FsY3VsYXRlZFNjcm9sbFRvcAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfb25TY3JvbGwiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fc2Nyb2xsaW5nQ29udGFpbmVyICYmICEoZXZlbnQudGFyZ2V0LnNjcm9sbFRvcCA8IDApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYm91bmNlU2Nyb2xsRW5kZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9wcm9wczggPSB0aGlzLnByb3BzLCBhdXRvSGVpZ2h0ID0gX3Byb3BzOC5hdXRvSGVpZ2h0LCBhdXRvV2lkdGggPSBfcHJvcHM4LmF1dG9XaWR0aCwgaGVpZ2h0ID0gX3Byb3BzOC5oZWlnaHQsIHdpZHRoID0gX3Byb3BzOC53aWR0aCwgX2V2ZW50JHRhcmdldCA9IGV2ZW50LnRhcmdldCwgZXZlbnRTY3JvbGxMZWZ0ID0gX2V2ZW50JHRhcmdldC5zY3JvbGxMZWZ0LCBldmVudFNjcm9sbFRvcCA9IF9ldmVudCR0YXJnZXQuc2Nyb2xsVG9wLCBzY3JvbGxiYXJTaXplID0gdGhpcy5fc2Nyb2xsYmFyU2l6ZSwgdG90YWxSb3dzSGVpZ2h0ID0gdGhpcy5fcm93U2l6ZUFuZFBvc2l0aW9uTWFuYWdlci5nZXRUb3RhbFNpemUoKSwgdG90YWxDb2x1bW5zV2lkdGggPSB0aGlzLl9jb2x1bW5TaXplQW5kUG9zaXRpb25NYW5hZ2VyLmdldFRvdGFsU2l6ZSgpLCBzY3JvbGxMZWZ0ID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgdG90YWxDb2x1bW5zV2lkdGggLSB3aWR0aCArIHNjcm9sbGJhclNpemUpLCBldmVudFNjcm9sbExlZnQpLCBzY3JvbGxUb3AgPSBNYXRoLm1pbihNYXRoLm1heCgwLCB0b3RhbFJvd3NIZWlnaHQgLSBoZWlnaHQgKyBzY3JvbGxiYXJTaXplKSwgZXZlbnRTY3JvbGxUb3ApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5zY3JvbGxMZWZ0ICE9PSBzY3JvbGxMZWZ0IHx8IHRoaXMuc3RhdGUuc2Nyb2xsVG9wICE9PSBzY3JvbGxUb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxEaXJlY3Rpb25Ib3Jpem9udGFsID0gc2Nyb2xsTGVmdCAhPT0gdGhpcy5zdGF0ZS5zY3JvbGxMZWZ0ID8gc2Nyb2xsTGVmdCA+IHRoaXMuc3RhdGUuc2Nyb2xsTGVmdCA/IF9kZWZhdWx0T3ZlcnNjYW5JbmRpY2VzR2V0dGVyLlNDUk9MTF9ESVJFQ1RJT05fRk9SV0FSRCA6IF9kZWZhdWx0T3ZlcnNjYW5JbmRpY2VzR2V0dGVyLlNDUk9MTF9ESVJFQ1RJT05fQkFDS1dBUkQgOiB0aGlzLnN0YXRlLnNjcm9sbERpcmVjdGlvbkhvcml6b250YWwsIHNjcm9sbERpcmVjdGlvblZlcnRpY2FsID0gc2Nyb2xsVG9wICE9PSB0aGlzLnN0YXRlLnNjcm9sbFRvcCA/IHNjcm9sbFRvcCA+IHRoaXMuc3RhdGUuc2Nyb2xsVG9wID8gX2RlZmF1bHRPdmVyc2NhbkluZGljZXNHZXR0ZXIuU0NST0xMX0RJUkVDVElPTl9GT1JXQVJEIDogX2RlZmF1bHRPdmVyc2NhbkluZGljZXNHZXR0ZXIuU0NST0xMX0RJUkVDVElPTl9CQUNLV0FSRCA6IHRoaXMuc3RhdGUuc2Nyb2xsRGlyZWN0aW9uVmVydGljYWwsIG5ld1N0YXRlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2Nyb2xsaW5nOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxEaXJlY3Rpb25Ib3Jpem9udGFsOiBzY3JvbGxEaXJlY3Rpb25Ib3Jpem9udGFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbERpcmVjdGlvblZlcnRpY2FsOiBzY3JvbGxEaXJlY3Rpb25WZXJ0aWNhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxQb3NpdGlvbkNoYW5nZVJlYXNvbjogU0NST0xMX1BPU0lUSU9OX0NIQU5HRV9SRUFTT05TLk9CU0VSVkVECiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0hlaWdodCB8fCAobmV3U3RhdGUuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wKSwgYXV0b1dpZHRoIHx8IChuZXdTdGF0ZS5zY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52b2tlT25TY3JvbGxNZW1vaXplcih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0OiBzY3JvbGxMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbENvbHVtbnNXaWR0aDogdG90YWxDb2x1bW5zV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFJvd3NIZWlnaHQ6IHRvdGFsUm93c0hlaWdodAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gXSksIEdyaWQ7CiAgICAgICAgfShfcmVhY3QuUHVyZUNvbXBvbmVudCk7CiAgICAgICAgR3JpZC5kZWZhdWx0UHJvcHMgPSB7CiAgICAgICAgICAgICJhcmlhLWxhYmVsIjogImdyaWQiLAogICAgICAgICAgICBjZWxsUmFuZ2VSZW5kZXJlcjogX2RlZmF1bHRDZWxsUmFuZ2VSZW5kZXJlcjIuZGVmYXVsdCwKICAgICAgICAgICAgZXN0aW1hdGVkQ29sdW1uU2l6ZTogMTAwLAogICAgICAgICAgICBlc3RpbWF0ZWRSb3dTaXplOiAzMCwKICAgICAgICAgICAgZ2V0U2Nyb2xsYmFyU2l6ZTogX3Njcm9sbGJhclNpemUyLmRlZmF1bHQsCiAgICAgICAgICAgIG5vQ29udGVudFJlbmRlcmVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvblNjcm9sbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb25TZWN0aW9uUmVuZGVyZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG92ZXJzY2FuQ29sdW1uQ291bnQ6IDAsCiAgICAgICAgICAgIG92ZXJzY2FuSW5kaWNlc0dldHRlcjogX2RlZmF1bHRPdmVyc2NhbkluZGljZXNHZXR0ZXIyLmRlZmF1bHQsCiAgICAgICAgICAgIG92ZXJzY2FuUm93Q291bnQ6IDEwLAogICAgICAgICAgICByb2xlOiAiZ3JpZCIsCiAgICAgICAgICAgIHNjcm9sbGluZ1Jlc2V0VGltZUludGVydmFsOiBERUZBVUxUX1NDUk9MTElOR19SRVNFVF9USU1FX0lOVEVSVkFMLAogICAgICAgICAgICBzY3JvbGxUb0FsaWdubWVudDogImF1dG8iLAogICAgICAgICAgICBzY3JvbGxUb0NvbHVtbjogLTEsCiAgICAgICAgICAgIHNjcm9sbFRvUm93OiAtMSwKICAgICAgICAgICAgc3R5bGU6IHt9LAogICAgICAgICAgICB0YWJJbmRleDogMAogICAgICAgIH0sIGV4cG9ydHMuZGVmYXVsdCA9IEdyaWQ7CiAgICB9LCAvKiAxMjkgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgZnVuY3Rpb24gY2FsY3VsYXRlU2l6ZUFuZFBvc2l0aW9uRGF0YUFuZFVwZGF0ZVNjcm9sbE9mZnNldChfcmVmKSB7CiAgICAgICAgICAgIHZhciBjZWxsQ291bnQgPSBfcmVmLmNlbGxDb3VudCwgY2VsbFNpemUgPSBfcmVmLmNlbGxTaXplLCBjb21wdXRlTWV0YWRhdGFDYWxsYmFjayA9IF9yZWYuY29tcHV0ZU1ldGFkYXRhQ2FsbGJhY2ssIGNvbXB1dGVNZXRhZGF0YUNhbGxiYWNrUHJvcHMgPSBfcmVmLmNvbXB1dGVNZXRhZGF0YUNhbGxiYWNrUHJvcHMsIG5leHRDZWxsc0NvdW50ID0gX3JlZi5uZXh0Q2VsbHNDb3VudCwgbmV4dENlbGxTaXplID0gX3JlZi5uZXh0Q2VsbFNpemUsIG5leHRTY3JvbGxUb0luZGV4ID0gX3JlZi5uZXh0U2Nyb2xsVG9JbmRleCwgc2Nyb2xsVG9JbmRleCA9IF9yZWYuc2Nyb2xsVG9JbmRleCwgdXBkYXRlU2Nyb2xsT2Zmc2V0Rm9yU2Nyb2xsVG9JbmRleCA9IF9yZWYudXBkYXRlU2Nyb2xsT2Zmc2V0Rm9yU2Nyb2xsVG9JbmRleDsKICAgICAgICAgICAgY2VsbENvdW50ID09PSBuZXh0Q2VsbHNDb3VudCAmJiAoIm51bWJlciIgIT0gdHlwZW9mIGNlbGxTaXplICYmICJudW1iZXIiICE9IHR5cGVvZiBuZXh0Q2VsbFNpemUgfHwgY2VsbFNpemUgPT09IG5leHRDZWxsU2l6ZSkgfHwgKGNvbXB1dGVNZXRhZGF0YUNhbGxiYWNrKGNvbXB1dGVNZXRhZGF0YUNhbGxiYWNrUHJvcHMpLCAKICAgICAgICAgICAgc2Nyb2xsVG9JbmRleCA+PSAwICYmIHNjcm9sbFRvSW5kZXggPT09IG5leHRTY3JvbGxUb0luZGV4ICYmIHVwZGF0ZVNjcm9sbE9mZnNldEZvclNjcm9sbFRvSW5kZXgoKSk7CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSksIGV4cG9ydHMuZGVmYXVsdCA9IGNhbGN1bGF0ZVNpemVBbmRQb3NpdGlvbkRhdGFBbmRVcGRhdGVTY3JvbGxPZmZzZXQ7CiAgICB9LCAvKiAxMzAgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsKICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG9iagogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgICAgICAgICAgIHZhbHVlOiAhMAogICAgICAgIH0pLCBleHBvcnRzLkRFRkFVTFRfTUFYX1NDUk9MTF9TSVpFID0gdm9pZCAwOwogICAgICAgIHZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTIpLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKSwgX2NsYXNzQ2FsbENoZWNrMiA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpLCBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKSwgX2NyZWF0ZUNsYXNzMiA9IF9fd2VicGFja19yZXF1aXJlX18oMzApLCBfY3JlYXRlQ2xhc3MzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2xhc3MyKSwgX0NlbGxTaXplQW5kUG9zaXRpb25NYW5hZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzEpLCBfQ2VsbFNpemVBbmRQb3NpdGlvbk1hbmFnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2VsbFNpemVBbmRQb3NpdGlvbk1hbmFnZXIpLCBERUZBVUxUX01BWF9TQ1JPTExfU0laRSA9IGV4cG9ydHMuREVGQVVMVF9NQVhfU0NST0xMX1NJWkUgPSAxNWU1LCBTY2FsaW5nQ2VsbFNpemVBbmRQb3NpdGlvbk1hbmFnZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZnVuY3Rpb24gU2NhbGluZ0NlbGxTaXplQW5kUG9zaXRpb25NYW5hZ2VyKF9yZWYpIHsKICAgICAgICAgICAgICAgIHZhciBfcmVmJG1heFNjcm9sbFNpemUgPSBfcmVmLm1heFNjcm9sbFNpemUsIG1heFNjcm9sbFNpemUgPSB2b2lkIDAgPT09IF9yZWYkbWF4U2Nyb2xsU2l6ZSA/IERFRkFVTFRfTUFYX1NDUk9MTF9TSVpFIDogX3JlZiRtYXhTY3JvbGxTaXplLCBwYXJhbXMgPSAoMCwgCiAgICAgICAgICAgICAgICBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzLmRlZmF1bHQpKF9yZWYsIFsgIm1heFNjcm9sbFNpemUiIF0pOwogICAgICAgICAgICAgICAgKDAsIF9jbGFzc0NhbGxDaGVjazMuZGVmYXVsdCkodGhpcywgU2NhbGluZ0NlbGxTaXplQW5kUG9zaXRpb25NYW5hZ2VyKSwgdGhpcy5fY2VsbFNpemVBbmRQb3NpdGlvbk1hbmFnZXIgPSBuZXcgX0NlbGxTaXplQW5kUG9zaXRpb25NYW5hZ2VyMi5kZWZhdWx0KHBhcmFtcyksIAogICAgICAgICAgICAgICAgdGhpcy5fbWF4U2Nyb2xsU2l6ZSA9IG1heFNjcm9sbFNpemU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICgwLCBfY3JlYXRlQ2xhc3MzLmRlZmF1bHQpKFNjYWxpbmdDZWxsU2l6ZUFuZFBvc2l0aW9uTWFuYWdlciwgWyB7CiAgICAgICAgICAgICAgICBrZXk6ICJhcmVPZmZzZXRzQWRqdXN0ZWQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jZWxsU2l6ZUFuZFBvc2l0aW9uTWFuYWdlci5nZXRUb3RhbFNpemUoKSA+IHRoaXMuX21heFNjcm9sbFNpemU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImNvbmZpZ3VyZSIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24ocGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2VsbFNpemVBbmRQb3NpdGlvbk1hbmFnZXIuY29uZmlndXJlKHBhcmFtcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImdldENlbGxDb3VudCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NlbGxTaXplQW5kUG9zaXRpb25NYW5hZ2VyLmdldENlbGxDb3VudCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJnZXRFc3RpbWF0ZWRDZWxsU2l6ZSIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NlbGxTaXplQW5kUG9zaXRpb25NYW5hZ2VyLmdldEVzdGltYXRlZENlbGxTaXplKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImdldExhc3RNZWFzdXJlZEluZGV4IiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2VsbFNpemVBbmRQb3NpdGlvbk1hbmFnZXIuZ2V0TGFzdE1lYXN1cmVkSW5kZXgoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiZ2V0T2Zmc2V0QWRqdXN0bWVudCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oX3JlZjIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyU2l6ZSA9IF9yZWYyLmNvbnRhaW5lclNpemUsIG9mZnNldCA9IF9yZWYyLm9mZnNldCwgdG90YWxTaXplID0gdGhpcy5fY2VsbFNpemVBbmRQb3NpdGlvbk1hbmFnZXIuZ2V0VG90YWxTaXplKCksIHNhZmVUb3RhbFNpemUgPSB0aGlzLmdldFRvdGFsU2l6ZSgpLCBvZmZzZXRQZXJjZW50YWdlID0gdGhpcy5fZ2V0T2Zmc2V0UGVyY2VudGFnZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNpemU6IGNvbnRhaW5lclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFNpemU6IHNhZmVUb3RhbFNpemUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChvZmZzZXRQZXJjZW50YWdlICogKHNhZmVUb3RhbFNpemUgLSB0b3RhbFNpemUpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiZ2V0U2l6ZUFuZFBvc2l0aW9uT2ZDZWxsIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jZWxsU2l6ZUFuZFBvc2l0aW9uTWFuYWdlci5nZXRTaXplQW5kUG9zaXRpb25PZkNlbGwoaW5kZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJnZXRTaXplQW5kUG9zaXRpb25PZkxhc3RNZWFzdXJlZENlbGwiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jZWxsU2l6ZUFuZFBvc2l0aW9uTWFuYWdlci5nZXRTaXplQW5kUG9zaXRpb25PZkxhc3RNZWFzdXJlZENlbGwoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiZ2V0VG90YWxTaXplIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5fbWF4U2Nyb2xsU2l6ZSwgdGhpcy5fY2VsbFNpemVBbmRQb3NpdGlvbk1hbmFnZXIuZ2V0VG90YWxTaXplKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJnZXRVcGRhdGVkT2Zmc2V0Rm9ySW5kZXgiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKF9yZWYzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9yZWYzJGFsaWduID0gX3JlZjMuYWxpZ24sIGFsaWduID0gdm9pZCAwID09PSBfcmVmMyRhbGlnbiA/ICJhdXRvIiA6IF9yZWYzJGFsaWduLCBjb250YWluZXJTaXplID0gX3JlZjMuY29udGFpbmVyU2l6ZSwgY3VycmVudE9mZnNldCA9IF9yZWYzLmN1cnJlbnRPZmZzZXQsIHRhcmdldEluZGV4ID0gX3JlZjMudGFyZ2V0SW5kZXgsIHRvdGFsU2l6ZSA9IF9yZWYzLnRvdGFsU2l6ZTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50T2Zmc2V0ID0gdGhpcy5fc2FmZU9mZnNldFRvT2Zmc2V0KHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyU2l6ZTogY29udGFpbmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBjdXJyZW50T2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMuX2NlbGxTaXplQW5kUG9zaXRpb25NYW5hZ2VyLmdldFVwZGF0ZWRPZmZzZXRGb3JJbmRleCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiBhbGlnbiwKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyU2l6ZTogY29udGFpbmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9mZnNldDogY3VycmVudE9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXg6IHRhcmdldEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFNpemU6IHRvdGFsU2l6ZQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vZmZzZXRUb1NhZmVPZmZzZXQoewogICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJTaXplOiBjb250YWluZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IG9mZnNldAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJnZXRWaXNpYmxlQ2VsbFJhbmdlIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihfcmVmNCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJTaXplID0gX3JlZjQuY29udGFpbmVyU2l6ZSwgb2Zmc2V0ID0gX3JlZjQub2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQgPSB0aGlzLl9zYWZlT2Zmc2V0VG9PZmZzZXQoewogICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJTaXplOiBjb250YWluZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IG9mZnNldAogICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl9jZWxsU2l6ZUFuZFBvc2l0aW9uTWFuYWdlci5nZXRWaXNpYmxlQ2VsbFJhbmdlKHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyU2l6ZTogY29udGFpbmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBvZmZzZXQKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAicmVzZXRDZWxsIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NlbGxTaXplQW5kUG9zaXRpb25NYW5hZ2VyLnJlc2V0Q2VsbChpbmRleCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9nZXRPZmZzZXRQZXJjZW50YWdlIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihfcmVmNSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJTaXplID0gX3JlZjUuY29udGFpbmVyU2l6ZSwgb2Zmc2V0ID0gX3JlZjUub2Zmc2V0LCB0b3RhbFNpemUgPSBfcmVmNS50b3RhbFNpemU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvdGFsU2l6ZSA8PSBjb250YWluZXJTaXplID8gMCA6IG9mZnNldCAvICh0b3RhbFNpemUgLSBjb250YWluZXJTaXplKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX29mZnNldFRvU2FmZU9mZnNldCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oX3JlZjYpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyU2l6ZSA9IF9yZWY2LmNvbnRhaW5lclNpemUsIG9mZnNldCA9IF9yZWY2Lm9mZnNldCwgdG90YWxTaXplID0gdGhpcy5fY2VsbFNpemVBbmRQb3NpdGlvbk1hbmFnZXIuZ2V0VG90YWxTaXplKCksIHNhZmVUb3RhbFNpemUgPSB0aGlzLmdldFRvdGFsU2l6ZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbFNpemUgPT09IHNhZmVUb3RhbFNpemUpIHJldHVybiBvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9mZnNldFBlcmNlbnRhZ2UgPSB0aGlzLl9nZXRPZmZzZXRQZXJjZW50YWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyU2l6ZTogY29udGFpbmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU2l6ZTogdG90YWxTaXplCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQob2Zmc2V0UGVyY2VudGFnZSAqIChzYWZlVG90YWxTaXplIC0gY29udGFpbmVyU2l6ZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfc2FmZU9mZnNldFRvT2Zmc2V0IiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihfcmVmNykgewogICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJTaXplID0gX3JlZjcuY29udGFpbmVyU2l6ZSwgb2Zmc2V0ID0gX3JlZjcub2Zmc2V0LCB0b3RhbFNpemUgPSB0aGlzLl9jZWxsU2l6ZUFuZFBvc2l0aW9uTWFuYWdlci5nZXRUb3RhbFNpemUoKSwgc2FmZVRvdGFsU2l6ZSA9IHRoaXMuZ2V0VG90YWxTaXplKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsU2l6ZSA9PT0gc2FmZVRvdGFsU2l6ZSkgcmV0dXJuIG9mZnNldDsKICAgICAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0UGVyY2VudGFnZSA9IHRoaXMuX2dldE9mZnNldFBlcmNlbnRhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJTaXplOiBjb250YWluZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTaXplOiBzYWZlVG90YWxTaXplCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQob2Zmc2V0UGVyY2VudGFnZSAqICh0b3RhbFNpemUgLSBjb250YWluZXJTaXplKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gXSksIFNjYWxpbmdDZWxsU2l6ZUFuZFBvc2l0aW9uTWFuYWdlcjsKICAgICAgICB9KCk7CiAgICAgICAgZXhwb3J0cy5kZWZhdWx0ID0gU2NhbGluZ0NlbGxTaXplQW5kUG9zaXRpb25NYW5hZ2VyOwogICAgfSwgLyogMTMxICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvYmoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KTsKICAgICAgICB2YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpLCBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKSwgX2NyZWF0ZUNsYXNzMiA9IF9fd2VicGFja19yZXF1aXJlX18oMzApLCBfY3JlYXRlQ2xhc3MzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2xhc3MyKSwgQ2VsbFNpemVBbmRQb3NpdGlvbk1hbmFnZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZnVuY3Rpb24gQ2VsbFNpemVBbmRQb3NpdGlvbk1hbmFnZXIoX3JlZikgewogICAgICAgICAgICAgICAgdmFyIF9yZWYkYmF0Y2hBbGxDZWxscyA9IF9yZWYuYmF0Y2hBbGxDZWxscywgYmF0Y2hBbGxDZWxscyA9IHZvaWQgMCAhPT0gX3JlZiRiYXRjaEFsbENlbGxzICYmIF9yZWYkYmF0Y2hBbGxDZWxscywgY2VsbENvdW50ID0gX3JlZi5jZWxsQ291bnQsIGNlbGxTaXplR2V0dGVyID0gX3JlZi5jZWxsU2l6ZUdldHRlciwgZXN0aW1hdGVkQ2VsbFNpemUgPSBfcmVmLmVzdGltYXRlZENlbGxTaXplOwogICAgICAgICAgICAgICAgKDAsIF9jbGFzc0NhbGxDaGVjazMuZGVmYXVsdCkodGhpcywgQ2VsbFNpemVBbmRQb3NpdGlvbk1hbmFnZXIpLCB0aGlzLl9iYXRjaEFsbENlbGxzID0gYmF0Y2hBbGxDZWxscywgCiAgICAgICAgICAgICAgICB0aGlzLl9jZWxsU2l6ZUdldHRlciA9IGNlbGxTaXplR2V0dGVyLCB0aGlzLl9jZWxsQ291bnQgPSBjZWxsQ291bnQsIHRoaXMuX2VzdGltYXRlZENlbGxTaXplID0gZXN0aW1hdGVkQ2VsbFNpemUsIAogICAgICAgICAgICAgICAgdGhpcy5fY2VsbFNpemVBbmRQb3NpdGlvbkRhdGEgPSB7fSwgdGhpcy5fbGFzdE1lYXN1cmVkSW5kZXggPSAtMSwgdGhpcy5fbGFzdEJhdGNoZWRJbmRleCA9IC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAoMCwgX2NyZWF0ZUNsYXNzMy5kZWZhdWx0KShDZWxsU2l6ZUFuZFBvc2l0aW9uTWFuYWdlciwgWyB7CiAgICAgICAgICAgICAgICBrZXk6ICJhcmVPZmZzZXRzQWRqdXN0ZWQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiY29uZmlndXJlIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihfcmVmMikgewogICAgICAgICAgICAgICAgICAgIHZhciBjZWxsQ291bnQgPSBfcmVmMi5jZWxsQ291bnQsIGVzdGltYXRlZENlbGxTaXplID0gX3JlZjIuZXN0aW1hdGVkQ2VsbFNpemU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2VsbENvdW50ID0gY2VsbENvdW50LCB0aGlzLl9lc3RpbWF0ZWRDZWxsU2l6ZSA9IGVzdGltYXRlZENlbGxTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJnZXRDZWxsQ291bnQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jZWxsQ291bnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImdldEVzdGltYXRlZENlbGxTaXplIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXN0aW1hdGVkQ2VsbFNpemU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImdldExhc3RNZWFzdXJlZEluZGV4IiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGFzdE1lYXN1cmVkSW5kZXg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImdldE9mZnNldEFkanVzdG1lbnQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKF9yZWYzKSB7CiAgICAgICAgICAgICAgICAgICAgX3JlZjMuY29udGFpbmVyU2l6ZSwgX3JlZjMub2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJnZXRTaXplQW5kUG9zaXRpb25PZkNlbGwiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLl9jZWxsQ291bnQpIHRocm93IEVycm9yKCJSZXF1ZXN0ZWQgaW5kZXggIiArIGluZGV4ICsgIiBpcyBvdXRzaWRlIG9mIHJhbmdlIDAuLiIgKyB0aGlzLl9jZWxsQ291bnQpOwogICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IHRoaXMuX2xhc3RNZWFzdXJlZEluZGV4KSBmb3IgKHZhciBsYXN0TWVhc3VyZWRDZWxsU2l6ZUFuZFBvc2l0aW9uID0gdGhpcy5nZXRTaXplQW5kUG9zaXRpb25PZkxhc3RNZWFzdXJlZENlbGwoKSwgX29mZnNldCA9IGxhc3RNZWFzdXJlZENlbGxTaXplQW5kUG9zaXRpb24ub2Zmc2V0ICsgbGFzdE1lYXN1cmVkQ2VsbFNpemVBbmRQb3NpdGlvbi5zaXplLCBpID0gdGhpcy5fbGFzdE1lYXN1cmVkSW5kZXggKyAxOyBpIDw9IGluZGV4OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9zaXplID0gdGhpcy5fY2VsbFNpemVHZXR0ZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGkKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IF9zaXplIHx8IGlzTmFOKF9zaXplKSkgdGhyb3cgRXJyb3IoIkludmFsaWQgc2l6ZSByZXR1cm5lZCBmb3IgY2VsbCAiICsgaSArICIgb2YgdmFsdWUgIiArIF9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PT0gX3NpemUgPyAodGhpcy5fY2VsbFNpemVBbmRQb3NpdGlvbkRhdGFbaV0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IF9vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAwCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuX2xhc3RCYXRjaGVkSW5kZXggPSBpbmRleCkgOiAodGhpcy5fY2VsbFNpemVBbmRQb3NpdGlvbkRhdGFbaV0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IF9vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBfc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICB9LCBfb2Zmc2V0ICs9IF9zaXplLCB0aGlzLl9sYXN0TWVhc3VyZWRJbmRleCA9IGluZGV4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NlbGxTaXplQW5kUG9zaXRpb25EYXRhW2luZGV4XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiZ2V0U2l6ZUFuZFBvc2l0aW9uT2ZMYXN0TWVhc3VyZWRDZWxsIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGFzdE1lYXN1cmVkSW5kZXggPj0gMCA/IHRoaXMuX2NlbGxTaXplQW5kUG9zaXRpb25EYXRhW3RoaXMuX2xhc3RNZWFzdXJlZEluZGV4XSA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiAwLAogICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAwCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiZ2V0VG90YWxTaXplIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdE1lYXN1cmVkQ2VsbFNpemVBbmRQb3NpdGlvbiA9IHRoaXMuZ2V0U2l6ZUFuZFBvc2l0aW9uT2ZMYXN0TWVhc3VyZWRDZWxsKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RNZWFzdXJlZENlbGxTaXplQW5kUG9zaXRpb24ub2Zmc2V0ICsgbGFzdE1lYXN1cmVkQ2VsbFNpemVBbmRQb3NpdGlvbi5zaXplICsgKHRoaXMuX2NlbGxDb3VudCAtIHRoaXMuX2xhc3RNZWFzdXJlZEluZGV4IC0gMSkgKiB0aGlzLl9lc3RpbWF0ZWRDZWxsU2l6ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiZ2V0VXBkYXRlZE9mZnNldEZvckluZGV4IiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihfcmVmNCkgewogICAgICAgICAgICAgICAgICAgIHZhciBfcmVmNCRhbGlnbiA9IF9yZWY0LmFsaWduLCBhbGlnbiA9IHZvaWQgMCA9PT0gX3JlZjQkYWxpZ24gPyAiYXV0byIgOiBfcmVmNCRhbGlnbiwgY29udGFpbmVyU2l6ZSA9IF9yZWY0LmNvbnRhaW5lclNpemUsIGN1cnJlbnRPZmZzZXQgPSBfcmVmNC5jdXJyZW50T2Zmc2V0LCB0YXJnZXRJbmRleCA9IF9yZWY0LnRhcmdldEluZGV4OwogICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJTaXplIDw9IDApIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHZhciBkYXR1bSA9IHRoaXMuZ2V0U2l6ZUFuZFBvc2l0aW9uT2ZDZWxsKHRhcmdldEluZGV4KSwgbWF4T2Zmc2V0ID0gZGF0dW0ub2Zmc2V0LCBtaW5PZmZzZXQgPSBtYXhPZmZzZXQgLSBjb250YWluZXJTaXplICsgZGF0dW0uc2l6ZSwgaWRlYWxPZmZzZXQgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbGlnbikgewogICAgICAgICAgICAgICAgICAgICAgY2FzZSAic3RhcnQiOgogICAgICAgICAgICAgICAgICAgICAgICBpZGVhbE9mZnNldCA9IG1heE9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgaWRlYWxPZmZzZXQgPSBtaW5PZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImNlbnRlciI6CiAgICAgICAgICAgICAgICAgICAgICAgIGlkZWFsT2Zmc2V0ID0gbWF4T2Zmc2V0IC0gKGNvbnRhaW5lclNpemUgLSBkYXR1bS5zaXplKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGlkZWFsT2Zmc2V0ID0gTWF0aC5tYXgobWluT2Zmc2V0LCBNYXRoLm1pbihtYXhPZmZzZXQsIGN1cnJlbnRPZmZzZXQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHRvdGFsU2l6ZSA9IHRoaXMuZ2V0VG90YWxTaXplKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKHRvdGFsU2l6ZSAtIGNvbnRhaW5lclNpemUsIGlkZWFsT2Zmc2V0KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImdldFZpc2libGVDZWxsUmFuZ2UiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9iYXRjaEFsbENlbGxzKSByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgc3RvcDogdGhpcy5fY2VsbENvdW50IC0gMQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lclNpemUgPSBwYXJhbXMuY29udGFpbmVyU2l6ZSwgb2Zmc2V0ID0gcGFyYW1zLm9mZnNldCwgdG90YWxTaXplID0gdGhpcy5nZXRUb3RhbFNpemUoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gdG90YWxTaXplKSByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgdmFyIG1heE9mZnNldCA9IG9mZnNldCArIGNvbnRhaW5lclNpemUsIHN0YXJ0ID0gdGhpcy5fZmluZE5lYXJlc3RDZWxsKG9mZnNldCksIGRhdHVtID0gdGhpcy5nZXRTaXplQW5kUG9zaXRpb25PZkNlbGwoc3RhcnQpOwogICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGRhdHVtLm9mZnNldCArIGRhdHVtLnNpemU7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgc3RvcCA9IHN0YXJ0OyBvZmZzZXQgPCBtYXhPZmZzZXQgJiYgc3RvcCA8IHRoaXMuX2NlbGxDb3VudCAtIDE7ICkgc3RvcCsrLCAKICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gdGhpcy5nZXRTaXplQW5kUG9zaXRpb25PZkNlbGwoc3RvcCkuc2l6ZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3A6IHN0b3AKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJyZXNldENlbGwiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdE1lYXN1cmVkSW5kZXggPSBNYXRoLm1pbih0aGlzLl9sYXN0TWVhc3VyZWRJbmRleCwgaW5kZXggLSAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX2JpbmFyeVNlYXJjaCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oX3JlZjUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBoaWdoID0gX3JlZjUuaGlnaCwgbG93ID0gX3JlZjUubG93LCBvZmZzZXQgPSBfcmVmNS5vZmZzZXQsIG1pZGRsZSA9IHZvaWQgMCwgY3VycmVudE9mZnNldCA9IHZvaWQgMDsgbG93IDw9IGhpZ2g7ICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWlkZGxlID0gbG93ICsgTWF0aC5mbG9vcigoaGlnaCAtIGxvdykgLyAyKSwgY3VycmVudE9mZnNldCA9IHRoaXMuZ2V0U2l6ZUFuZFBvc2l0aW9uT2ZDZWxsKG1pZGRsZSkub2Zmc2V0LCAKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9mZnNldCA9PT0gb2Zmc2V0KSByZXR1cm4gbWlkZGxlOwogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T2Zmc2V0IDwgb2Zmc2V0ID8gbG93ID0gbWlkZGxlICsgMSA6IGN1cnJlbnRPZmZzZXQgPiBvZmZzZXQgJiYgKGhpZ2ggPSBtaWRkbGUgLSAxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGxvdyA+IDApIHJldHVybiBsb3cgLSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfZXhwb25lbnRpYWxTZWFyY2giLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKF9yZWY2KSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSBfcmVmNi5pbmRleCwgb2Zmc2V0ID0gX3JlZjYub2Zmc2V0LCBpbnRlcnZhbCA9IDE7IGluZGV4IDwgdGhpcy5fY2VsbENvdW50ICYmIHRoaXMuZ2V0U2l6ZUFuZFBvc2l0aW9uT2ZDZWxsKGluZGV4KS5vZmZzZXQgPCBvZmZzZXQ7ICkgaW5kZXggKz0gaW50ZXJ2YWwsIAogICAgICAgICAgICAgICAgICAgIGludGVydmFsICo9IDI7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmFyeVNlYXJjaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2g6IE1hdGgubWluKGluZGV4LCB0aGlzLl9jZWxsQ291bnQgLSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgbG93OiBNYXRoLmZsb29yKGluZGV4IC8gMiksCiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9maW5kTmVhcmVzdENlbGwiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKG9mZnNldCkgewogICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihvZmZzZXQpKSB0aHJvdyBFcnJvcigiSW52YWxpZCBvZmZzZXQgIiArIG9mZnNldCArICIgc3BlY2lmaWVkIik7CiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgb2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdE1lYXN1cmVkQ2VsbFNpemVBbmRQb3NpdGlvbiA9IHRoaXMuZ2V0U2l6ZUFuZFBvc2l0aW9uT2ZMYXN0TWVhc3VyZWRDZWxsKCksIGxhc3RNZWFzdXJlZEluZGV4ID0gTWF0aC5tYXgoMCwgdGhpcy5fbGFzdE1lYXN1cmVkSW5kZXgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXN0TWVhc3VyZWRDZWxsU2l6ZUFuZFBvc2l0aW9uLm9mZnNldCA+PSBvZmZzZXQgPyB0aGlzLl9iaW5hcnlTZWFyY2goewogICAgICAgICAgICAgICAgICAgICAgICBoaWdoOiBsYXN0TWVhc3VyZWRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgbG93OiAwLAogICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IG9mZnNldAogICAgICAgICAgICAgICAgICAgIH0pIDogdGhpcy5fZXhwb25lbnRpYWxTZWFyY2goewogICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogbGFzdE1lYXN1cmVkSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gXSksIENlbGxTaXplQW5kUG9zaXRpb25NYW5hZ2VyOwogICAgICAgIH0oKTsKICAgICAgICBleHBvcnRzLmRlZmF1bHQgPSBDZWxsU2l6ZUFuZFBvc2l0aW9uTWFuYWdlcjsKICAgIH0sIC8qIDEzMiAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBkZWZhdWx0T3ZlcnNjYW5JbmRpY2VzR2V0dGVyKF9yZWYpIHsKICAgICAgICAgICAgdmFyIGNlbGxDb3VudCA9IChfcmVmLmRpcmVjdGlvbiwgX3JlZi5jZWxsQ291bnQpLCBvdmVyc2NhbkNlbGxzQ291bnQgPSBfcmVmLm92ZXJzY2FuQ2VsbHNDb3VudCwgc2Nyb2xsRGlyZWN0aW9uID0gX3JlZi5zY3JvbGxEaXJlY3Rpb24sIHN0YXJ0SW5kZXggPSBfcmVmLnN0YXJ0SW5kZXgsIHN0b3BJbmRleCA9IF9yZWYuc3RvcEluZGV4LCBvdmVyc2NhblN0YXJ0SW5kZXggPSB2b2lkIDAsIG92ZXJzY2FuU3RvcEluZGV4ID0gdm9pZCAwOwogICAgICAgICAgICBzd2l0Y2ggKHNjcm9sbERpcmVjdGlvbikgewogICAgICAgICAgICAgIGNhc2UgU0NST0xMX0RJUkVDVElPTl9GT1JXQVJEOgogICAgICAgICAgICAgICAgb3ZlcnNjYW5TdGFydEluZGV4ID0gc3RhcnRJbmRleCwgb3ZlcnNjYW5TdG9wSW5kZXggPSBzdG9wSW5kZXggKyBvdmVyc2NhbkNlbGxzQ291bnQ7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgY2FzZSBTQ1JPTExfRElSRUNUSU9OX0JBQ0tXQVJEOgogICAgICAgICAgICAgICAgb3ZlcnNjYW5TdGFydEluZGV4ID0gc3RhcnRJbmRleCAtIG92ZXJzY2FuQ2VsbHNDb3VudCwgb3ZlcnNjYW5TdG9wSW5kZXggPSBzdG9wSW5kZXg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG92ZXJzY2FuU3RhcnRJbmRleDogTWF0aC5tYXgoMCwgb3ZlcnNjYW5TdGFydEluZGV4KSwKICAgICAgICAgICAgICAgIG92ZXJzY2FuU3RvcEluZGV4OiBNYXRoLm1pbihjZWxsQ291bnQgLSAxLCBvdmVyc2NhblN0b3BJbmRleCkKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KSwgZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdE92ZXJzY2FuSW5kaWNlc0dldHRlcjsKICAgICAgICB2YXIgU0NST0xMX0RJUkVDVElPTl9CQUNLV0FSRCA9IGV4cG9ydHMuU0NST0xMX0RJUkVDVElPTl9CQUNLV0FSRCA9IC0xLCBTQ1JPTExfRElSRUNUSU9OX0ZPUldBUkQgPSBleHBvcnRzLlNDUk9MTF9ESVJFQ1RJT05fRk9SV0FSRCA9IDE7CiAgICAgICAgZXhwb3J0cy5TQ1JPTExfRElSRUNUSU9OX0hPUklaT05UQUwgPSAiaG9yaXpvbnRhbCIsIGV4cG9ydHMuU0NST0xMX0RJUkVDVElPTl9WRVJUSUNBTCA9ICJ2ZXJ0aWNhbCI7CiAgICB9LCAvKiAxMzMgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsSW5kZXhIZWxwZXIoX3JlZikgewogICAgICAgICAgICB2YXIgY2VsbFNpemUgPSBfcmVmLmNlbGxTaXplLCBjZWxsU2l6ZUFuZFBvc2l0aW9uTWFuYWdlciA9IF9yZWYuY2VsbFNpemVBbmRQb3NpdGlvbk1hbmFnZXIsIHByZXZpb3VzQ2VsbHNDb3VudCA9IF9yZWYucHJldmlvdXNDZWxsc0NvdW50LCBwcmV2aW91c0NlbGxTaXplID0gX3JlZi5wcmV2aW91c0NlbGxTaXplLCBwcmV2aW91c1Njcm9sbFRvQWxpZ25tZW50ID0gX3JlZi5wcmV2aW91c1Njcm9sbFRvQWxpZ25tZW50LCBwcmV2aW91c1Njcm9sbFRvSW5kZXggPSBfcmVmLnByZXZpb3VzU2Nyb2xsVG9JbmRleCwgcHJldmlvdXNTaXplID0gX3JlZi5wcmV2aW91c1NpemUsIHNjcm9sbE9mZnNldCA9IF9yZWYuc2Nyb2xsT2Zmc2V0LCBzY3JvbGxUb0FsaWdubWVudCA9IF9yZWYuc2Nyb2xsVG9BbGlnbm1lbnQsIHNjcm9sbFRvSW5kZXggPSBfcmVmLnNjcm9sbFRvSW5kZXgsIHNpemUgPSBfcmVmLnNpemUsIHVwZGF0ZVNjcm9sbEluZGV4Q2FsbGJhY2sgPSBfcmVmLnVwZGF0ZVNjcm9sbEluZGV4Q2FsbGJhY2ssIGNlbGxDb3VudCA9IGNlbGxTaXplQW5kUG9zaXRpb25NYW5hZ2VyLmdldENlbGxDb3VudCgpLCBoYXNTY3JvbGxUb0luZGV4ID0gc2Nyb2xsVG9JbmRleCA+PSAwICYmIHNjcm9sbFRvSW5kZXggPCBjZWxsQ291bnQsIHNpemVIYXNDaGFuZ2VkID0gc2l6ZSAhPT0gcHJldmlvdXNTaXplIHx8ICFwcmV2aW91c0NlbGxTaXplIHx8ICJudW1iZXIiID09IHR5cGVvZiBjZWxsU2l6ZSAmJiBjZWxsU2l6ZSAhPT0gcHJldmlvdXNDZWxsU2l6ZTsKICAgICAgICAgICAgaGFzU2Nyb2xsVG9JbmRleCAmJiAoc2l6ZUhhc0NoYW5nZWQgfHwgc2Nyb2xsVG9BbGlnbm1lbnQgIT09IHByZXZpb3VzU2Nyb2xsVG9BbGlnbm1lbnQgfHwgc2Nyb2xsVG9JbmRleCAhPT0gcHJldmlvdXNTY3JvbGxUb0luZGV4KSA/IHVwZGF0ZVNjcm9sbEluZGV4Q2FsbGJhY2soc2Nyb2xsVG9JbmRleCkgOiAhaGFzU2Nyb2xsVG9JbmRleCAmJiBjZWxsQ291bnQgPiAwICYmIChzaXplIDwgcHJldmlvdXNTaXplIHx8IGNlbGxDb3VudCA8IHByZXZpb3VzQ2VsbHNDb3VudCkgJiYgc2Nyb2xsT2Zmc2V0ID4gY2VsbFNpemVBbmRQb3NpdGlvbk1hbmFnZXIuZ2V0VG90YWxTaXplKCkgLSBzaXplICYmIHVwZGF0ZVNjcm9sbEluZGV4Q2FsbGJhY2soY2VsbENvdW50IC0gMSk7CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSksIGV4cG9ydHMuZGVmYXVsdCA9IHVwZGF0ZVNjcm9sbEluZGV4SGVscGVyOwogICAgfSwgLyogMTM0ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgLyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovCiAgICAgICAgKGZ1bmN0aW9uKHByb2Nlc3MpIHsKICAgICAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgICAgICBmdW5jdGlvbiBkZWZhdWx0Q2VsbFJhbmdlUmVuZGVyZXIoX3JlZikgewogICAgICAgICAgICAgICAgZm9yICh2YXIgY2VsbENhY2hlID0gX3JlZi5jZWxsQ2FjaGUsIGNlbGxSZW5kZXJlciA9IF9yZWYuY2VsbFJlbmRlcmVyLCBjb2x1bW5TaXplQW5kUG9zaXRpb25NYW5hZ2VyID0gX3JlZi5jb2x1bW5TaXplQW5kUG9zaXRpb25NYW5hZ2VyLCBjb2x1bW5TdGFydEluZGV4ID0gX3JlZi5jb2x1bW5TdGFydEluZGV4LCBjb2x1bW5TdG9wSW5kZXggPSBfcmVmLmNvbHVtblN0b3BJbmRleCwgZGVmZXJyZWRNZWFzdXJlbWVudENhY2hlID0gX3JlZi5kZWZlcnJlZE1lYXN1cmVtZW50Q2FjaGUsIGhvcml6b250YWxPZmZzZXRBZGp1c3RtZW50ID0gX3JlZi5ob3Jpem9udGFsT2Zmc2V0QWRqdXN0bWVudCwgaXNTY3JvbGxpbmcgPSBfcmVmLmlzU2Nyb2xsaW5nLCBwYXJlbnQgPSBfcmVmLnBhcmVudCwgcm93U2l6ZUFuZFBvc2l0aW9uTWFuYWdlciA9IF9yZWYucm93U2l6ZUFuZFBvc2l0aW9uTWFuYWdlciwgcm93U3RhcnRJbmRleCA9IF9yZWYucm93U3RhcnRJbmRleCwgcm93U3RvcEluZGV4ID0gX3JlZi5yb3dTdG9wSW5kZXgsIHN0eWxlQ2FjaGUgPSAoX3JlZi5zY3JvbGxMZWZ0LCAKICAgICAgICAgICAgICAgIF9yZWYuc2Nyb2xsVG9wLCBfcmVmLnN0eWxlQ2FjaGUpLCB2ZXJ0aWNhbE9mZnNldEFkanVzdG1lbnQgPSBfcmVmLnZlcnRpY2FsT2Zmc2V0QWRqdXN0bWVudCwgdmlzaWJsZUNvbHVtbkluZGljZXMgPSBfcmVmLnZpc2libGVDb2x1bW5JbmRpY2VzLCB2aXNpYmxlUm93SW5kaWNlcyA9IF9yZWYudmlzaWJsZVJvd0luZGljZXMsIGRlZmVycmVkTW9kZSA9ICJ1bmRlZmluZWQiICE9IHR5cGVvZiBkZWZlcnJlZE1lYXN1cmVtZW50Q2FjaGUsIHJlbmRlcmVkQ2VsbHMgPSBbXSwgYXJlT2Zmc2V0c0FkanVzdGVkID0gY29sdW1uU2l6ZUFuZFBvc2l0aW9uTWFuYWdlci5hcmVPZmZzZXRzQWRqdXN0ZWQoKSB8fCByb3dTaXplQW5kUG9zaXRpb25NYW5hZ2VyLmFyZU9mZnNldHNBZGp1c3RlZCgpLCBjYW5DYWNoZVN0eWxlID0gIWlzU2Nyb2xsaW5nIHx8ICFhcmVPZmZzZXRzQWRqdXN0ZWQsIHJvd0luZGV4ID0gcm93U3RhcnRJbmRleDsgcm93SW5kZXggPD0gcm93U3RvcEluZGV4OyByb3dJbmRleCsrKSBmb3IgKHZhciByb3dEYXR1bSA9IHJvd1NpemVBbmRQb3NpdGlvbk1hbmFnZXIuZ2V0U2l6ZUFuZFBvc2l0aW9uT2ZDZWxsKHJvd0luZGV4KSwgY29sdW1uSW5kZXggPSBjb2x1bW5TdGFydEluZGV4OyBjb2x1bW5JbmRleCA8PSBjb2x1bW5TdG9wSW5kZXg7IGNvbHVtbkluZGV4KyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uRGF0dW0gPSBjb2x1bW5TaXplQW5kUG9zaXRpb25NYW5hZ2VyLmdldFNpemVBbmRQb3NpdGlvbk9mQ2VsbChjb2x1bW5JbmRleCksIGlzVmlzaWJsZSA9IGNvbHVtbkluZGV4ID49IHZpc2libGVDb2x1bW5JbmRpY2VzLnN0YXJ0ICYmIGNvbHVtbkluZGV4IDw9IHZpc2libGVDb2x1bW5JbmRpY2VzLnN0b3AgJiYgcm93SW5kZXggPj0gdmlzaWJsZVJvd0luZGljZXMuc3RhcnQgJiYgcm93SW5kZXggPD0gdmlzaWJsZVJvd0luZGljZXMuc3RvcCwga2V5ID0gcm93SW5kZXggKyAiLSIgKyBjb2x1bW5JbmRleCwgc3R5bGUgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgY2FuQ2FjaGVTdHlsZSAmJiBzdHlsZUNhY2hlW2tleV0gPyBzdHlsZSA9IHN0eWxlQ2FjaGVba2V5XSA6IGRlZmVycmVkTW9kZSAmJiAhZGVmZXJyZWRNZWFzdXJlbWVudENhY2hlLmhhcyhyb3dJbmRleCwgY29sdW1uSW5kZXgpID8gc3R5bGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogImF1dG8iLAogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLAogICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogImFic29sdXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAwLAogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogImF1dG8iCiAgICAgICAgICAgICAgICAgICAgfSA6IChzdHlsZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByb3dEYXR1bS5zaXplLAogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBjb2x1bW5EYXR1bS5vZmZzZXQgKyBob3Jpem9udGFsT2Zmc2V0QWRqdXN0bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICJhYnNvbHV0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogcm93RGF0dW0ub2Zmc2V0ICsgdmVydGljYWxPZmZzZXRBZGp1c3RtZW50LAogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogY29sdW1uRGF0dW0uc2l6ZQogICAgICAgICAgICAgICAgICAgIH0sIHN0eWxlQ2FjaGVba2V5XSA9IHN0eWxlKTsKICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbFJlbmRlcmVyUGFyYW1zID0gewogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleDogY29sdW1uSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2Nyb2xsaW5nOiBpc1Njcm9sbGluZywKICAgICAgICAgICAgICAgICAgICAgICAgaXNWaXNpYmxlOiBpc1Zpc2libGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGtleToga2V5LAogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IHBhcmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IHJvd0luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGUKICAgICAgICAgICAgICAgICAgICB9LCByZW5kZXJlZENlbGwgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgIWlzU2Nyb2xsaW5nIHx8IGhvcml6b250YWxPZmZzZXRBZGp1c3RtZW50IHx8IHZlcnRpY2FsT2Zmc2V0QWRqdXN0bWVudCA/IHJlbmRlcmVkQ2VsbCA9IGNlbGxSZW5kZXJlcihjZWxsUmVuZGVyZXJQYXJhbXMpIDogKGNlbGxDYWNoZVtrZXldIHx8IChjZWxsQ2FjaGVba2V5XSA9IGNlbGxSZW5kZXJlcihjZWxsUmVuZGVyZXJQYXJhbXMpKSwgCiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRDZWxsID0gY2VsbENhY2hlW2tleV0pLCBudWxsICE9IHJlbmRlcmVkQ2VsbCAmJiByZW5kZXJlZENlbGwgIT09ICExICYmICgicHJvZHVjdGlvbiIgIT09IHByb2Nlc3MuZW52Lk5PREVfRU5WICYmIHdhcm5BYm91dE1pc3NpbmdTdHlsZShwYXJlbnQsIHJlbmRlcmVkQ2VsbCksIAogICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2VsbHMucHVzaChyZW5kZXJlZENlbGwpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZW5kZXJlZENlbGxzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHdhcm5BYm91dE1pc3NpbmdTdHlsZShwYXJlbnQsIHJlbmRlcmVkQ2VsbCkgewogICAgICAgICAgICAgICAgInByb2R1Y3Rpb24iICE9PSBwcm9jZXNzLmVudi5OT0RFX0VOViAmJiByZW5kZXJlZENlbGwgJiYgKHJlbmRlcmVkQ2VsbC50eXBlICYmIHJlbmRlcmVkQ2VsbC50eXBlLl9faW50ZXJuYWxDZWxsTWVhc3VyZXJGbGFnICYmIChyZW5kZXJlZENlbGwgPSByZW5kZXJlZENlbGwucHJvcHMuY2hpbGRyZW4pLCAKICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2VsbCAmJiByZW5kZXJlZENlbGwucHJvcHMgJiYgdm9pZCAwID09PSByZW5kZXJlZENlbGwucHJvcHMuc3R5bGUgJiYgcGFyZW50Ll9fd2FybmVkQWJvdXRNaXNzaW5nU3R5bGUgIT09ICEwICYmIChwYXJlbnQuX193YXJuZWRBYm91dE1pc3NpbmdTdHlsZSA9ICEwLCAKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybigiUmVuZGVyZWQgY2VsbCBzaG91bGQgaW5jbHVkZSBzdHlsZSBwcm9wZXJ0eSBmb3IgcG9zaXRpb25pbmcuIikpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgICAgICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICAgICAgfSksIGV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRDZWxsUmFuZ2VSZW5kZXJlcjsKICAgICAgICB9KS5jYWxsKGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oOTEpKTsKICAgIH0sIC8qIDEzNSAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBkZWZhdWx0T3ZlcnNjYW5JbmRpY2VzR2V0dGVyKF9yZWYpIHsKICAgICAgICAgICAgdmFyIGNlbGxDb3VudCA9IChfcmVmLmRpcmVjdGlvbiwgX3JlZi5jZWxsQ291bnQpLCBvdmVyc2NhbkNlbGxzQ291bnQgPSBfcmVmLm92ZXJzY2FuQ2VsbHNDb3VudCwgc2Nyb2xsRGlyZWN0aW9uID0gX3JlZi5zY3JvbGxEaXJlY3Rpb24sIHN0YXJ0SW5kZXggPSBfcmVmLnN0YXJ0SW5kZXgsIHN0b3BJbmRleCA9IF9yZWYuc3RvcEluZGV4LCBvdmVyc2NhblN0YXJ0SW5kZXggPSB2b2lkIDAsIG92ZXJzY2FuU3RvcEluZGV4ID0gdm9pZCAwOwogICAgICAgICAgICBzd2l0Y2ggKG92ZXJzY2FuQ2VsbHNDb3VudCA9IE1hdGgubWF4KDEsIG92ZXJzY2FuQ2VsbHNDb3VudCksIHNjcm9sbERpcmVjdGlvbikgewogICAgICAgICAgICAgIGNhc2UgU0NST0xMX0RJUkVDVElPTl9GT1JXQVJEOgogICAgICAgICAgICAgICAgb3ZlcnNjYW5TdGFydEluZGV4ID0gc3RhcnRJbmRleCAtIDEsIG92ZXJzY2FuU3RvcEluZGV4ID0gc3RvcEluZGV4ICsgb3ZlcnNjYW5DZWxsc0NvdW50OwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgU0NST0xMX0RJUkVDVElPTl9CQUNLV0FSRDoKICAgICAgICAgICAgICAgIG92ZXJzY2FuU3RhcnRJbmRleCA9IHN0YXJ0SW5kZXggLSBvdmVyc2NhbkNlbGxzQ291bnQsIG92ZXJzY2FuU3RvcEluZGV4ID0gc3RvcEluZGV4ICsgMTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgb3ZlcnNjYW5TdGFydEluZGV4OiBNYXRoLm1heCgwLCBvdmVyc2NhblN0YXJ0SW5kZXgpLAogICAgICAgICAgICAgICAgb3ZlcnNjYW5TdG9wSW5kZXg6IE1hdGgubWluKGNlbGxDb3VudCAtIDEsIG92ZXJzY2FuU3RvcEluZGV4KQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgICAgICAgICAgIHZhbHVlOiAhMAogICAgICAgIH0pLCBleHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0T3ZlcnNjYW5JbmRpY2VzR2V0dGVyOwogICAgICAgIHZhciBTQ1JPTExfRElSRUNUSU9OX0JBQ0tXQVJEID0gZXhwb3J0cy5TQ1JPTExfRElSRUNUSU9OX0JBQ0tXQVJEID0gLTEsIFNDUk9MTF9ESVJFQ1RJT05fRk9SV0FSRCA9IGV4cG9ydHMuU0NST0xMX0RJUkVDVElPTl9GT1JXQVJEID0gMTsKICAgICAgICBleHBvcnRzLlNDUk9MTF9ESVJFQ1RJT05fSE9SSVpPTlRBTCA9ICJob3Jpem9udGFsIiwgZXhwb3J0cy5TQ1JPTExfRElSRUNUSU9OX1ZFUlRJQ0FMID0gInZlcnRpY2FsIjsKICAgIH0sIC8qIDEzNiAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSksIGV4cG9ydHMuSW5maW5pdGVMb2FkZXIgPSBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7CiAgICAgICAgdmFyIF9JbmZpbml0ZUxvYWRlcjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzNyksIF9JbmZpbml0ZUxvYWRlcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9JbmZpbml0ZUxvYWRlcjIpOwogICAgICAgIGV4cG9ydHMuZGVmYXVsdCA9IF9JbmZpbml0ZUxvYWRlcjMuZGVmYXVsdCwgZXhwb3J0cy5JbmZpbml0ZUxvYWRlciA9IF9JbmZpbml0ZUxvYWRlcjMuZGVmYXVsdDsKICAgIH0sIC8qIDEzNyAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGlzUmFuZ2VWaXNpYmxlKF9yZWYyKSB7CiAgICAgICAgICAgIHZhciBsYXN0UmVuZGVyZWRTdGFydEluZGV4ID0gX3JlZjIubGFzdFJlbmRlcmVkU3RhcnRJbmRleCwgbGFzdFJlbmRlcmVkU3RvcEluZGV4ID0gX3JlZjIubGFzdFJlbmRlcmVkU3RvcEluZGV4LCBzdGFydEluZGV4ID0gX3JlZjIuc3RhcnRJbmRleCwgc3RvcEluZGV4ID0gX3JlZjIuc3RvcEluZGV4OwogICAgICAgICAgICByZXR1cm4gIShzdGFydEluZGV4ID4gbGFzdFJlbmRlcmVkU3RvcEluZGV4IHx8IHN0b3BJbmRleCA8IGxhc3RSZW5kZXJlZFN0YXJ0SW5kZXgpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBzY2FuRm9yVW5sb2FkZWRSYW5nZXMoX3JlZjMpIHsKICAgICAgICAgICAgZm9yICh2YXIgaXNSb3dMb2FkZWQgPSBfcmVmMy5pc1Jvd0xvYWRlZCwgbWluaW11bUJhdGNoU2l6ZSA9IF9yZWYzLm1pbmltdW1CYXRjaFNpemUsIHJvd0NvdW50ID0gX3JlZjMucm93Q291bnQsIHN0YXJ0SW5kZXggPSBfcmVmMy5zdGFydEluZGV4LCBzdG9wSW5kZXggPSBfcmVmMy5zdG9wSW5kZXgsIHVubG9hZGVkUmFuZ2VzID0gW10sIHJhbmdlU3RhcnRJbmRleCA9IG51bGwsIHJhbmdlU3RvcEluZGV4ID0gbnVsbCwgaW5kZXggPSBzdGFydEluZGV4OyBpbmRleCA8PSBzdG9wSW5kZXg7IGluZGV4KyspIHsKICAgICAgICAgICAgICAgIHZhciBsb2FkZWQgPSBpc1Jvd0xvYWRlZCh7CiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGxvYWRlZCA/IG51bGwgIT09IHJhbmdlU3RvcEluZGV4ICYmICh1bmxvYWRlZFJhbmdlcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4OiByYW5nZVN0YXJ0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgc3RvcEluZGV4OiByYW5nZVN0b3BJbmRleAogICAgICAgICAgICAgICAgfSksIHJhbmdlU3RhcnRJbmRleCA9IHJhbmdlU3RvcEluZGV4ID0gbnVsbCkgOiAocmFuZ2VTdG9wSW5kZXggPSBpbmRleCwgbnVsbCA9PT0gcmFuZ2VTdGFydEluZGV4ICYmIChyYW5nZVN0YXJ0SW5kZXggPSBpbmRleCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChudWxsICE9PSByYW5nZVN0b3BJbmRleCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgcG90ZW50aWFsU3RvcEluZGV4ID0gTWF0aC5taW4oTWF0aC5tYXgocmFuZ2VTdG9wSW5kZXgsIHJhbmdlU3RhcnRJbmRleCArIG1pbmltdW1CYXRjaFNpemUgLSAxKSwgcm93Q291bnQgLSAxKSwgX2luZGV4ID0gcmFuZ2VTdG9wSW5kZXggKyAxOyBfaW5kZXggPD0gcG90ZW50aWFsU3RvcEluZGV4ICYmICFpc1Jvd0xvYWRlZCh7CiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IF9pbmRleAogICAgICAgICAgICAgICAgfSk7IF9pbmRleCsrKSByYW5nZVN0b3BJbmRleCA9IF9pbmRleDsKICAgICAgICAgICAgICAgIHVubG9hZGVkUmFuZ2VzLnB1c2goewogICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXg6IHJhbmdlU3RhcnRJbmRleCwKICAgICAgICAgICAgICAgICAgICBzdG9wSW5kZXg6IHJhbmdlU3RvcEluZGV4CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodW5sb2FkZWRSYW5nZXMubGVuZ3RoKSBmb3IgKHZhciBmaXJzdFVubG9hZGVkUmFuZ2UgPSB1bmxvYWRlZFJhbmdlc1swXTsgZmlyc3RVbmxvYWRlZFJhbmdlLnN0b3BJbmRleCAtIGZpcnN0VW5sb2FkZWRSYW5nZS5zdGFydEluZGV4ICsgMSA8IG1pbmltdW1CYXRjaFNpemUgJiYgZmlyc3RVbmxvYWRlZFJhbmdlLnN0YXJ0SW5kZXggPiAwOyApIHsKICAgICAgICAgICAgICAgIHZhciBfaW5kZXgyID0gZmlyc3RVbmxvYWRlZFJhbmdlLnN0YXJ0SW5kZXggLSAxOwogICAgICAgICAgICAgICAgaWYgKGlzUm93TG9hZGVkKHsKICAgICAgICAgICAgICAgICAgICBpbmRleDogX2luZGV4MgogICAgICAgICAgICAgICAgfSkpIGJyZWFrOwogICAgICAgICAgICAgICAgZmlyc3RVbmxvYWRlZFJhbmdlLnN0YXJ0SW5kZXggPSBfaW5kZXgyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB1bmxvYWRlZFJhbmdlczsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZm9yY2VVcGRhdGVSZWFjdFZpcnR1YWxpemVkQ29tcG9uZW50KGNvbXBvbmVudCkgewogICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiAwLCByZWNvbXB1dGVTaXplID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgY29tcG9uZW50LnJlY29tcHV0ZUdyaWRTaXplID8gY29tcG9uZW50LnJlY29tcHV0ZUdyaWRTaXplIDogY29tcG9uZW50LnJlY29tcHV0ZVJvd0hlaWdodHM7CiAgICAgICAgICAgIHJlY29tcHV0ZVNpemUgPyByZWNvbXB1dGVTaXplLmNhbGwoY29tcG9uZW50LCBjdXJyZW50SW5kZXgpIDogY29tcG9uZW50LmZvcmNlVXBkYXRlKCk7CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSk7CiAgICAgICAgdmFyIF9nZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oMyksIF9nZXRQcm90b3R5cGVPZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRQcm90b3R5cGVPZiksIF9jbGFzc0NhbGxDaGVjazIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KSwgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMiksIF9jcmVhdGVDbGFzczIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKSwgX2NyZWF0ZUNsYXNzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNsYXNzMiksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiksIF9pbmhlcml0czIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxKSwgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7CiAgICAgICAgZXhwb3J0cy5pc1JhbmdlVmlzaWJsZSA9IGlzUmFuZ2VWaXNpYmxlLCBleHBvcnRzLnNjYW5Gb3JVbmxvYWRlZFJhbmdlcyA9IHNjYW5Gb3JVbmxvYWRlZFJhbmdlcywgCiAgICAgICAgZXhwb3J0cy5mb3JjZVVwZGF0ZVJlYWN0VmlydHVhbGl6ZWRDb21wb25lbnQgPSBmb3JjZVVwZGF0ZVJlYWN0VmlydHVhbGl6ZWRDb21wb25lbnQ7CiAgICAgICAgdmFyIF9yZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oOTcpLCBfcHJvcFR5cGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OSksIF9jcmVhdGVDYWxsYmFja01lbW9pemVyID0gKF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyksIAogICAgICAgIF9fd2VicGFja19yZXF1aXJlX18oMTE1KSksIF9jcmVhdGVDYWxsYmFja01lbW9pemVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNhbGxiYWNrTWVtb2l6ZXIpLCBJbmZpbml0ZUxvYWRlciA9IGZ1bmN0aW9uKF9QdXJlQ29tcG9uZW50KSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIEluZmluaXRlTG9hZGVyKHByb3BzLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBJbmZpbml0ZUxvYWRlcik7CiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zLmRlZmF1bHQpKHRoaXMsIChJbmZpbml0ZUxvYWRlci5fX3Byb3RvX18gfHwgKDAsIAogICAgICAgICAgICAgICAgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KShJbmZpbml0ZUxvYWRlcikpLmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fbG9hZE1vcmVSb3dzTWVtb2l6ZXIgPSAoMCwgX2NyZWF0ZUNhbGxiYWNrTWVtb2l6ZXIyLmRlZmF1bHQpKCksIF90aGlzLl9vblJvd3NSZW5kZXJlZCA9IF90aGlzLl9vblJvd3NSZW5kZXJlZC5iaW5kKF90aGlzKSwgCiAgICAgICAgICAgICAgICBfdGhpcy5fcmVnaXN0ZXJDaGlsZCA9IF90aGlzLl9yZWdpc3RlckNoaWxkLmJpbmQoX3RoaXMpLCBfdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKDAsIF9pbmhlcml0czMuZGVmYXVsdCkoSW5maW5pdGVMb2FkZXIsIF9QdXJlQ29tcG9uZW50KSwgKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoSW5maW5pdGVMb2FkZXIsIFsgewogICAgICAgICAgICAgICAga2V5OiAicmVzZXRMb2FkTW9yZVJvd3NDYWNoZSIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9hZE1vcmVSb3dzTWVtb2l6ZXIgPSAoMCwgX2NyZWF0ZUNhbGxiYWNrTWVtb2l6ZXIyLmRlZmF1bHQpKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogInJlbmRlciIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5wcm9wcy5jaGlsZHJlbjsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4oewogICAgICAgICAgICAgICAgICAgICAgICBvblJvd3NSZW5kZXJlZDogdGhpcy5fb25Sb3dzUmVuZGVyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ2hpbGQ6IHRoaXMuX3JlZ2lzdGVyQ2hpbGQKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX2xvYWRVbmxvYWRlZFJhbmdlcyIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24odW5sb2FkZWRSYW5nZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX3RoaXMyID0gdGhpcywgbG9hZE1vcmVSb3dzID0gdGhpcy5wcm9wcy5sb2FkTW9yZVJvd3M7CiAgICAgICAgICAgICAgICAgICAgdW5sb2FkZWRSYW5nZXMuZm9yRWFjaChmdW5jdGlvbih1bmxvYWRlZFJhbmdlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9taXNlID0gbG9hZE1vcmVSb3dzKHVubG9hZGVkUmFuZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlICYmIHByb21pc2UudGhlbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmFuZ2VWaXNpYmxlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UmVuZGVyZWRTdGFydEluZGV4OiBfdGhpczIuX2xhc3RSZW5kZXJlZFN0YXJ0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFJlbmRlcmVkU3RvcEluZGV4OiBfdGhpczIuX2xhc3RSZW5kZXJlZFN0b3BJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4OiB1bmxvYWRlZFJhbmdlLnN0YXJ0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcEluZGV4OiB1bmxvYWRlZFJhbmdlLnN0b3BJbmRleAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgJiYgX3RoaXMyLl9yZWdpc3RlcmVkQ2hpbGQgJiYgZm9yY2VVcGRhdGVSZWFjdFZpcnR1YWxpemVkQ29tcG9uZW50KF90aGlzMi5fcmVnaXN0ZXJlZENoaWxkLCBfdGhpczIuX2xhc3RSZW5kZXJlZFN0YXJ0SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX29uUm93c1JlbmRlcmVkIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihfcmVmKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzMyA9IHRoaXMsIHN0YXJ0SW5kZXggPSBfcmVmLnN0YXJ0SW5kZXgsIHN0b3BJbmRleCA9IF9yZWYuc3RvcEluZGV4LCBfcHJvcHMgPSB0aGlzLnByb3BzLCBpc1Jvd0xvYWRlZCA9IF9wcm9wcy5pc1Jvd0xvYWRlZCwgbWluaW11bUJhdGNoU2l6ZSA9IF9wcm9wcy5taW5pbXVtQmF0Y2hTaXplLCByb3dDb3VudCA9IF9wcm9wcy5yb3dDb3VudCwgdGhyZXNob2xkID0gX3Byb3BzLnRocmVzaG9sZDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0UmVuZGVyZWRTdGFydEluZGV4ID0gc3RhcnRJbmRleCwgdGhpcy5fbGFzdFJlbmRlcmVkU3RvcEluZGV4ID0gc3RvcEluZGV4OwogICAgICAgICAgICAgICAgICAgIHZhciB1bmxvYWRlZFJhbmdlcyA9IHNjYW5Gb3JVbmxvYWRlZFJhbmdlcyh7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzUm93TG9hZGVkOiBpc1Jvd0xvYWRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bUJhdGNoU2l6ZTogbWluaW11bUJhdGNoU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93Q291bnQ6IHJvd0NvdW50LAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4OiBNYXRoLm1heCgwLCBzdGFydEluZGV4IC0gdGhyZXNob2xkKSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RvcEluZGV4OiBNYXRoLm1pbihyb3dDb3VudCAtIDEsIHN0b3BJbmRleCArIHRocmVzaG9sZCkKICAgICAgICAgICAgICAgICAgICB9KSwgc3F1YXNoZWRVbmxvYWRlZFJhbmdlcyA9IHVubG9hZGVkUmFuZ2VzLnJlZHVjZShmdW5jdGlvbihyZWR1Y2VkLCB1bmxvYWRlZFJhbmdlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWR1Y2VkLmNvbmNhdChbIHVubG9hZGVkUmFuZ2Uuc3RhcnRJbmRleCwgdW5sb2FkZWRSYW5nZS5zdG9wSW5kZXggXSk7CiAgICAgICAgICAgICAgICAgICAgfSwgW10pOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRNb3JlUm93c01lbW9pemVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMzLl9sb2FkVW5sb2FkZWRSYW5nZXModW5sb2FkZWRSYW5nZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcXVhc2hlZFVubG9hZGVkUmFuZ2VzOiBzcXVhc2hlZFVubG9hZGVkUmFuZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX3JlZ2lzdGVyQ2hpbGQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHJlZ2lzdGVyZWRDaGlsZCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRDaGlsZCA9IHJlZ2lzdGVyZWRDaGlsZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBdKSwgSW5maW5pdGVMb2FkZXI7CiAgICAgICAgfShfcmVhY3QuUHVyZUNvbXBvbmVudCk7CiAgICAgICAgSW5maW5pdGVMb2FkZXIuZGVmYXVsdFByb3BzID0gewogICAgICAgICAgICBtaW5pbXVtQmF0Y2hTaXplOiAxMCwKICAgICAgICAgICAgcm93Q291bnQ6IDAsCiAgICAgICAgICAgIHRocmVzaG9sZDogMTUKICAgICAgICB9LCBleHBvcnRzLmRlZmF1bHQgPSBJbmZpbml0ZUxvYWRlcjsKICAgIH0sIC8qIDEzOCAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSksIGV4cG9ydHMuTGlzdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDsKICAgICAgICB2YXIgX0xpc3QyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzkpLCBfTGlzdDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9MaXN0Mik7CiAgICAgICAgZXhwb3J0cy5kZWZhdWx0ID0gX0xpc3QzLmRlZmF1bHQsIGV4cG9ydHMuTGlzdCA9IF9MaXN0My5kZWZhdWx0OwogICAgfSwgLyogMTM5ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvYmoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KTsKICAgICAgICB2YXIgX2dldE93blByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKSwgX2dldE93blByb3BlcnR5RGVzY3JpcHRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IpLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTIpLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKSwgX2V4dGVuZHMyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDcpLCBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMiksIF9nZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oMyksIF9nZXRQcm90b3R5cGVPZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRQcm90b3R5cGVPZiksIF9jbGFzc0NhbGxDaGVjazIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KSwgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMiksIF9jcmVhdGVDbGFzczIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKSwgX2NyZWF0ZUNsYXNzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNsYXNzMiksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiksIF9pbmhlcml0czIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxKSwgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMiksIF9HcmlkID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjcpLCBfR3JpZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9HcmlkKSwgX3Byb3BUeXBlcyA9IF9fd2VicGFja19yZXF1aXJlX18oODkpLCBfcmVhY3QgPSAoX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKSwgCiAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXyg5NykpLCBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpLCBfY2xhc3NuYW1lcyA9IF9fd2VicGFja19yZXF1aXJlX18oMTE0KSwgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyksIExpc3QgPSBmdW5jdGlvbihfUHVyZUNvbXBvbmVudCkgewogICAgICAgICAgICBmdW5jdGlvbiBMaXN0KHByb3BzLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBMaXN0KTsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMuZGVmYXVsdCkodGhpcywgKExpc3QuX19wcm90b19fIHx8ICgwLCAKICAgICAgICAgICAgICAgIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoTGlzdCkpLmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fY2VsbFJlbmRlcmVyID0gX3RoaXMuX2NlbGxSZW5kZXJlci5iaW5kKF90aGlzKSwgX3RoaXMuX29uU2Nyb2xsID0gX3RoaXMuX29uU2Nyb2xsLmJpbmQoX3RoaXMpLCAKICAgICAgICAgICAgICAgIF90aGlzLl9vblNlY3Rpb25SZW5kZXJlZCA9IF90aGlzLl9vblNlY3Rpb25SZW5kZXJlZC5iaW5kKF90aGlzKSwgX3RoaXMuX3NldFJlZiA9IF90aGlzLl9zZXRSZWYuYmluZChfdGhpcyksIAogICAgICAgICAgICAgICAgX3RoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICgwLCBfaW5oZXJpdHMzLmRlZmF1bHQpKExpc3QsIF9QdXJlQ29tcG9uZW50KSwgKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoTGlzdCwgWyB7CiAgICAgICAgICAgICAgICBrZXk6ICJmb3JjZVVwZGF0ZUdyaWQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuR3JpZC5mb3JjZVVwZGF0ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJtZWFzdXJlQWxsUm93cyIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5HcmlkLm1lYXN1cmVBbGxDZWxscygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJyZWNvbXB1dGVSb3dIZWlnaHRzIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IDA7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5HcmlkLnJlY29tcHV0ZUdyaWRTaXplKHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGluZGV4CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImdldE9mZnNldEZvclJvdyIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oX3JlZikgewogICAgICAgICAgICAgICAgICAgIHZhciBhbGlnbm1lbnQgPSBfcmVmLmFsaWdubWVudCwgaW5kZXggPSBfcmVmLmluZGV4LCBfR3JpZCRnZXRPZmZzZXRGb3JDZWwgPSB0aGlzLkdyaWQuZ2V0T2Zmc2V0Rm9yQ2VsbCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogYWxpZ25tZW50LAogICAgICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogaW5kZXgKICAgICAgICAgICAgICAgICAgICB9KSwgc2Nyb2xsVG9wID0gX0dyaWQkZ2V0T2Zmc2V0Rm9yQ2VsLnNjcm9sbFRvcDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJzY3JvbGxUb1Bvc2l0aW9uIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9wID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiAwOwogICAgICAgICAgICAgICAgICAgIHRoaXMuR3JpZC5zY3JvbGxUb1Bvc2l0aW9uKHsKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3AKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAic2Nyb2xsVG9Sb3ciLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogMDsKICAgICAgICAgICAgICAgICAgICB0aGlzLkdyaWQuc2Nyb2xsVG9DZWxsKHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXg6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiBpbmRleAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJyZW5kZXIiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLCBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLCBub1Jvd3NSZW5kZXJlciA9IF9wcm9wcy5ub1Jvd3NSZW5kZXJlciwgc2Nyb2xsVG9JbmRleCA9IF9wcm9wcy5zY3JvbGxUb0luZGV4LCB3aWR0aCA9IF9wcm9wcy53aWR0aCwgY2xhc3NOYW1lcyA9ICgwLCAKICAgICAgICAgICAgICAgICAgICBfY2xhc3NuYW1lczIuZGVmYXVsdCkoIlJlYWN0VmlydHVhbGl6ZWRfX0xpc3QiLCBjbGFzc05hbWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChfR3JpZDIuZGVmYXVsdCwgKDAsIF9leHRlbmRzMy5kZWZhdWx0KSh7fSwgdGhpcy5wcm9wcywgewogICAgICAgICAgICAgICAgICAgICAgICBhdXRvQ29udGFpbmVyV2lkdGg6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBjZWxsUmVuZGVyZXI6IHRoaXMuX2NlbGxSZW5kZXJlciwKICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5XaWR0aDogd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvdW50OiAxLAogICAgICAgICAgICAgICAgICAgICAgICBub0NvbnRlbnRSZW5kZXJlcjogbm9Sb3dzUmVuZGVyZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsOiB0aGlzLl9vblNjcm9sbCwKICAgICAgICAgICAgICAgICAgICAgICAgb25TZWN0aW9uUmVuZGVyZWQ6IHRoaXMuX29uU2VjdGlvblJlbmRlcmVkLAogICAgICAgICAgICAgICAgICAgICAgICByZWY6IHRoaXMuX3NldFJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9Sb3c6IHNjcm9sbFRvSW5kZXgKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9jZWxsUmVuZGVyZXIiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKF9yZWYyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJvd0luZGV4ID0gX3JlZjIucm93SW5kZXgsIHN0eWxlID0gX3JlZjIuc3R5bGUsIHJlc3QgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMy5kZWZhdWx0KShfcmVmMiwgWyAicm93SW5kZXgiLCAic3R5bGUiIF0pLCByb3dSZW5kZXJlciA9IHRoaXMucHJvcHMucm93UmVuZGVyZXIsIF9PYmplY3QkZ2V0T3duUHJvcGVydCA9ICgwLCAKICAgICAgICAgICAgICAgICAgICBfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yMi5kZWZhdWx0KShzdHlsZSwgIndpZHRoIiksIHdyaXRhYmxlID0gX09iamVjdCRnZXRPd25Qcm9wZXJ0LndyaXRhYmxlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB3cml0YWJsZSAmJiAoc3R5bGUud2lkdGggPSAiMTAwJSIpLCByb3dSZW5kZXJlcigoMCwgX2V4dGVuZHMzLmRlZmF1bHQpKHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHJvd0luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGUKICAgICAgICAgICAgICAgICAgICB9LCByZXN0KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9zZXRSZWYiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHJlZikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuR3JpZCA9IHJlZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX29uU2Nyb2xsIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihfcmVmMykgewogICAgICAgICAgICAgICAgICAgIHZhciBjbGllbnRIZWlnaHQgPSBfcmVmMy5jbGllbnRIZWlnaHQsIHNjcm9sbEhlaWdodCA9IF9yZWYzLnNjcm9sbEhlaWdodCwgc2Nyb2xsVG9wID0gX3JlZjMuc2Nyb2xsVG9wLCBvblNjcm9sbCA9IHRoaXMucHJvcHMub25TY3JvbGw7CiAgICAgICAgICAgICAgICAgICAgb25TY3JvbGwoewogICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRIZWlnaHQ6IGNsaWVudEhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsSGVpZ2h0OiBzY3JvbGxIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9vblNlY3Rpb25SZW5kZXJlZCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oX3JlZjQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcm93T3ZlcnNjYW5TdGFydEluZGV4ID0gX3JlZjQucm93T3ZlcnNjYW5TdGFydEluZGV4LCByb3dPdmVyc2NhblN0b3BJbmRleCA9IF9yZWY0LnJvd092ZXJzY2FuU3RvcEluZGV4LCByb3dTdGFydEluZGV4ID0gX3JlZjQucm93U3RhcnRJbmRleCwgcm93U3RvcEluZGV4ID0gX3JlZjQucm93U3RvcEluZGV4LCBvblJvd3NSZW5kZXJlZCA9IHRoaXMucHJvcHMub25Sb3dzUmVuZGVyZWQ7CiAgICAgICAgICAgICAgICAgICAgb25Sb3dzUmVuZGVyZWQoewogICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2NhblN0YXJ0SW5kZXg6IHJvd092ZXJzY2FuU3RhcnRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnNjYW5TdG9wSW5kZXg6IHJvd092ZXJzY2FuU3RvcEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4OiByb3dTdGFydEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBzdG9wSW5kZXg6IHJvd1N0b3BJbmRleAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IF0pLCBMaXN0OwogICAgICAgIH0oX3JlYWN0LlB1cmVDb21wb25lbnQpOwogICAgICAgIExpc3QuZGVmYXVsdFByb3BzID0gewogICAgICAgICAgICBlc3RpbWF0ZWRSb3dTaXplOiAzMCwKICAgICAgICAgICAgbm9Sb3dzUmVuZGVyZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9uUm93c1JlbmRlcmVkOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvblNjcm9sbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb3ZlcnNjYW5JbmRpY2VzR2V0dGVyOiBfR3JpZC5hY2Nlc3NpYmlsaXR5T3ZlcnNjYW5JbmRpY2VzR2V0dGVyLAogICAgICAgICAgICBvdmVyc2NhblJvd0NvdW50OiAxMCwKICAgICAgICAgICAgc2Nyb2xsVG9BbGlnbm1lbnQ6ICJhdXRvIiwKICAgICAgICAgICAgc2Nyb2xsVG9JbmRleDogLTEsCiAgICAgICAgICAgIHN0eWxlOiB7fQogICAgICAgIH0sIGV4cG9ydHMuZGVmYXVsdCA9IExpc3Q7CiAgICB9LCAvKiAxNDAgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgZGVmYXVsdDogX193ZWJwYWNrX3JlcXVpcmVfXygxNDEpLAogICAgICAgICAgICBfX2VzTW9kdWxlOiAhMAogICAgICAgIH07CiAgICB9LCAvKiAxNDEgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0Mik7CiAgICAgICAgdmFyICRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KS5PYmplY3Q7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwga2V5KSB7CiAgICAgICAgICAgIHJldHVybiAkT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KTsKICAgICAgICB9OwogICAgfSwgLyogMTQyICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKQogICAgICAgIHZhciB0b0lPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwKSwgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oNzcpLmY7CiAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXygxNCkoImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oaXQsIGtleSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodG9JT2JqZWN0KGl0KSwga2V5KTsKICAgICAgICAgICAgfTsKICAgICAgICB9KTsKICAgIH0sIC8qIDE0MyAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSksIGV4cG9ydHMuY3JlYXRlQ2VsbFBvc2l0aW9uZXIgPSBleHBvcnRzLk1hc29ucnkgPSBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7CiAgICAgICAgdmFyIF9NYXNvbnJ5MiA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ0KSwgX01hc29ucnkzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTWFzb25yeTIpLCBfY3JlYXRlQ2VsbFBvc2l0aW9uZXIyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTcpLCBfY3JlYXRlQ2VsbFBvc2l0aW9uZXIzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2VsbFBvc2l0aW9uZXIyKTsKICAgICAgICBleHBvcnRzLmRlZmF1bHQgPSBfTWFzb25yeTMuZGVmYXVsdCwgZXhwb3J0cy5NYXNvbnJ5ID0gX01hc29ucnkzLmRlZmF1bHQsIGV4cG9ydHMuY3JlYXRlQ2VsbFBvc2l0aW9uZXIgPSBfY3JlYXRlQ2VsbFBvc2l0aW9uZXIzLmRlZmF1bHQ7CiAgICB9LCAvKiAxNDQgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsKICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG9iagogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIG5vb3AoKSB7fQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSksIGV4cG9ydHMuREVGQVVMVF9TQ1JPTExJTkdfUkVTRVRfVElNRV9JTlRFUlZBTCA9IHZvaWQgMDsKICAgICAgICB2YXIgX2V4dGVuZHMyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDcpLCBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMiksIF9nZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oMyksIF9nZXRQcm90b3R5cGVPZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRQcm90b3R5cGVPZiksIF9jbGFzc0NhbGxDaGVjazIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KSwgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMiksIF9jcmVhdGVDbGFzczIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKSwgX2NyZWF0ZUNsYXNzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNsYXNzMiksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiksIF9pbmhlcml0czIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxKSwgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMiksIF9yZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oOTcpLCBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpLCBfY2xhc3NuYW1lcyA9IF9fd2VicGFja19yZXF1aXJlX18oMTE0KSwgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyksIF9Qb3NpdGlvbkNhY2hlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDUpLCBfUG9zaXRpb25DYWNoZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Qb3NpdGlvbkNhY2hlKSwgREVGQVVMVF9TQ1JPTExJTkdfUkVTRVRfVElNRV9JTlRFUlZBTCA9IGV4cG9ydHMuREVGQVVMVF9TQ1JPTExJTkdfUkVTRVRfVElNRV9JTlRFUlZBTCA9IDE1MCwgTWFzb25yeSA9IGZ1bmN0aW9uKF9QdXJlQ29tcG9uZW50KSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIE1hc29ucnkocHJvcHMsIGNvbnRleHQpIHsKICAgICAgICAgICAgICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szLmRlZmF1bHQpKHRoaXMsIE1hc29ucnkpOwogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMy5kZWZhdWx0KSh0aGlzLCAoTWFzb25yeS5fX3Byb3RvX18gfHwgKDAsIAogICAgICAgICAgICAgICAgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KShNYXNvbnJ5KSkuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpOwogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9pbnZhbGlkYXRlT25VcGRhdGVTdGFydEluZGV4ID0gbnVsbCwgX3RoaXMuX2ludmFsaWRhdGVPblVwZGF0ZVN0b3BJbmRleCA9IG51bGwsIAogICAgICAgICAgICAgICAgX3RoaXMuX3Bvc2l0aW9uQ2FjaGUgPSBuZXcgX1Bvc2l0aW9uQ2FjaGUyLmRlZmF1bHQoKSwgX3RoaXMuX3N0YXJ0SW5kZXggPSBudWxsLCAKICAgICAgICAgICAgICAgIF90aGlzLl9zdGFydEluZGV4TWVtb2l6ZWQgPSBudWxsLCBfdGhpcy5fc3RvcEluZGV4ID0gbnVsbCwgX3RoaXMuX3N0b3BJbmRleE1lbW9pemVkID0gbnVsbCwgCiAgICAgICAgICAgICAgICBfdGhpcy5zdGF0ZSA9IHsKICAgICAgICAgICAgICAgICAgICBpc1Njcm9sbGluZzogITEsCiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiAwCiAgICAgICAgICAgICAgICB9LCBfdGhpcy5fZGVib3VuY2VSZXNldElzU2Nyb2xsaW5nQ2FsbGJhY2sgPSBfdGhpcy5fZGVib3VuY2VSZXNldElzU2Nyb2xsaW5nQ2FsbGJhY2suYmluZChfdGhpcyksIAogICAgICAgICAgICAgICAgX3RoaXMuX3NldFNjcm9sbGluZ0NvbnRhaW5lclJlZiA9IF90aGlzLl9zZXRTY3JvbGxpbmdDb250YWluZXJSZWYuYmluZChfdGhpcyksIF90aGlzLl9vblNjcm9sbCA9IF90aGlzLl9vblNjcm9sbC5iaW5kKF90aGlzKSwgCiAgICAgICAgICAgICAgICBfdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKDAsIF9pbmhlcml0czMuZGVmYXVsdCkoTWFzb25yeSwgX1B1cmVDb21wb25lbnQpLCAoMCwgX2NyZWF0ZUNsYXNzMy5kZWZhdWx0KShNYXNvbnJ5LCBbIHsKICAgICAgICAgICAgICAgIGtleTogImNsZWFyQ2VsbFBvc2l0aW9ucyIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25DYWNoZSA9IG5ldyBfUG9zaXRpb25DYWNoZTIuZGVmYXVsdCgpLCB0aGlzLmZvcmNlVXBkYXRlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImludmFsaWRhdGVDZWxsU2l6ZUFmdGVyUmVuZGVyIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihfcmVmKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gX3JlZi5yb3dJbmRleDsKICAgICAgICAgICAgICAgICAgICBudWxsID09PSB0aGlzLl9pbnZhbGlkYXRlT25VcGRhdGVTdGFydEluZGV4ID8gKHRoaXMuX2ludmFsaWRhdGVPblVwZGF0ZVN0YXJ0SW5kZXggPSBpbmRleCwgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52YWxpZGF0ZU9uVXBkYXRlU3RvcEluZGV4ID0gaW5kZXgpIDogKHRoaXMuX2ludmFsaWRhdGVPblVwZGF0ZVN0YXJ0SW5kZXggPSBNYXRoLm1pbih0aGlzLl9pbnZhbGlkYXRlT25VcGRhdGVTdGFydEluZGV4LCBpbmRleCksIAogICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVPblVwZGF0ZVN0b3BJbmRleCA9IE1hdGgubWF4KHRoaXMuX2ludmFsaWRhdGVPblVwZGF0ZVN0b3BJbmRleCwgaW5kZXgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAicmVjb21wdXRlQ2VsbFBvc2l0aW9ucyIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3BJbmRleCA9IHRoaXMuX3Bvc2l0aW9uQ2FjaGUuY291bnQgLSAxOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uQ2FjaGUgPSBuZXcgX1Bvc2l0aW9uQ2FjaGUyLmRlZmF1bHQoKSwgdGhpcy5fcG9wdWxhdGVQb3NpdGlvbkNhY2hlKDAsIHN0b3BJbmRleCksIAogICAgICAgICAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiY29tcG9uZW50RGlkTW91bnQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrSW52YWxpZGF0ZU9uVXBkYXRlKCksIHRoaXMuX2ludm9rZU9uU2Nyb2xsQ2FsbGJhY2soKSwgdGhpcy5faW52b2tlT25DZWxsc1JlbmRlcmVkQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiY29tcG9uZW50RGlkVXBkYXRlIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihwcmV2UHJvcHMsIHByZXZTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrSW52YWxpZGF0ZU9uVXBkYXRlKCksIHRoaXMuX2ludm9rZU9uU2Nyb2xsQ2FsbGJhY2soKSwgdGhpcy5faW52b2tlT25DZWxsc1JlbmRlcmVkQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiY29tcG9uZW50V2lsbFVubW91bnQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYm91bmNlUmVzZXRJc1Njcm9sbGluZ0lkICYmIGNsZWFyVGltZW91dCh0aGlzLl9kZWJvdW5jZVJlc2V0SXNTY3JvbGxpbmdJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKG5leHRQcm9wcykgewogICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxUb3AgPSB0aGlzLnByb3BzLnNjcm9sbFRvcDsKICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3AgIT09IG5leHRQcm9wcy5zY3JvbGxUb3AgJiYgKHRoaXMuX2RlYm91bmNlUmVzZXRJc1Njcm9sbGluZygpLCB0aGlzLnNldFN0YXRlKHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNTY3JvbGxpbmc6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3A6IG5leHRQcm9wcy5zY3JvbGxUb3AKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogInJlbmRlciIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXMsIF9wcm9wcyA9IHRoaXMucHJvcHMsIGF1dG9IZWlnaHQgPSBfcHJvcHMuYXV0b0hlaWdodCwgY2VsbENvdW50ID0gX3Byb3BzLmNlbGxDb3VudCwgY2VsbE1lYXN1cmVyQ2FjaGUgPSBfcHJvcHMuY2VsbE1lYXN1cmVyQ2FjaGUsIGNlbGxSZW5kZXJlciA9IF9wcm9wcy5jZWxsUmVuZGVyZXIsIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsIGhlaWdodCA9IF9wcm9wcy5oZWlnaHQsIGlkID0gX3Byb3BzLmlkLCBrZXlNYXBwZXIgPSBfcHJvcHMua2V5TWFwcGVyLCBvdmVyc2NhbkJ5UGl4ZWxzID0gX3Byb3BzLm92ZXJzY2FuQnlQaXhlbHMsIHJvbGUgPSBfcHJvcHMucm9sZSwgc3R5bGUgPSBfcHJvcHMuc3R5bGUsIHRhYkluZGV4ID0gX3Byb3BzLnRhYkluZGV4LCB3aWR0aCA9IF9wcm9wcy53aWR0aCwgX3N0YXRlID0gdGhpcy5zdGF0ZSwgaXNTY3JvbGxpbmcgPSBfc3RhdGUuaXNTY3JvbGxpbmcsIHNjcm9sbFRvcCA9IF9zdGF0ZS5zY3JvbGxUb3AsIGNoaWxkcmVuID0gW10sIGVzdGltYXRlVG90YWxIZWlnaHQgPSB0aGlzLl9nZXRFc3RpbWF0ZWRUb3RhbEhlaWdodCgpLCBzaG9ydGVzdENvbHVtblNpemUgPSB0aGlzLl9wb3NpdGlvbkNhY2hlLnNob3J0ZXN0Q29sdW1uU2l6ZSwgbWVhc3VyZWRDZWxsQ291bnQgPSB0aGlzLl9wb3NpdGlvbkNhY2hlLmNvdW50OwogICAgICAgICAgICAgICAgICAgIGlmIChzaG9ydGVzdENvbHVtblNpemUgPCBzY3JvbGxUb3AgKyBoZWlnaHQgKyBvdmVyc2NhbkJ5UGl4ZWxzICYmIG1lYXN1cmVkQ2VsbENvdW50IDwgY2VsbENvdW50KSBmb3IgKHZhciBiYXRjaFNpemUgPSBNYXRoLm1pbihjZWxsQ291bnQgLSBtZWFzdXJlZENlbGxDb3VudCwgTWF0aC5jZWlsKChzY3JvbGxUb3AgKyBoZWlnaHQgKyBvdmVyc2NhbkJ5UGl4ZWxzIC0gc2hvcnRlc3RDb2x1bW5TaXplKSAvIGNlbGxNZWFzdXJlckNhY2hlLmRlZmF1bHRIZWlnaHQgKiB3aWR0aCAvIGNlbGxNZWFzdXJlckNhY2hlLmRlZmF1bHRXaWR0aCkpLCBfaW5kZXggPSBtZWFzdXJlZENlbGxDb3VudDsgX2luZGV4IDwgbWVhc3VyZWRDZWxsQ291bnQgKyBiYXRjaFNpemU7IF9pbmRleCsrKSBjaGlsZHJlbi5wdXNoKGNlbGxSZW5kZXJlcih7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2Nyb2xsaW5nOiBpc1Njcm9sbGluZywKICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBrZXlNYXBwZXIoX2luZGV4KSwKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGNlbGxNZWFzdXJlckNhY2hlLmdldFdpZHRoKF9pbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pKTsgZWxzZSAhZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdG9wSW5kZXggPSB2b2lkIDAsIHN0YXJ0SW5kZXggPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzMi5fcG9zaXRpb25DYWNoZS5yYW5nZShzY3JvbGxUb3AgLSBvdmVyc2NhbkJ5UGl4ZWxzLCBoZWlnaHQgKyBvdmVyc2NhbkJ5UGl4ZWxzLCBmdW5jdGlvbihpbmRleCwgbGVmdCwgdG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5kZWZpbmVkIiA9PSB0eXBlb2Ygc3RhcnRJbmRleCA/IChzdGFydEluZGV4ID0gaW5kZXgsIHN0b3BJbmRleCA9IGluZGV4KSA6IChzdGFydEluZGV4ID0gTWF0aC5taW4oc3RhcnRJbmRleCwgaW5kZXgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BJbmRleCA9IE1hdGgubWF4KHN0b3BJbmRleCwgaW5kZXgpKSwgY2hpbGRyZW4ucHVzaChjZWxsUmVuZGVyZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Njcm9sbGluZzogaXNTY3JvbGxpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBrZXlNYXBwZXIoaW5kZXgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogX3RoaXMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogY2VsbE1lYXN1cmVyQ2FjaGUuZ2V0SGVpZ2h0KGluZGV4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogbGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICJhYnNvbHV0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogY2VsbE1lYXN1cmVyQ2FjaGUuZ2V0V2lkdGgoaW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBfdGhpczIuX3N0YXJ0SW5kZXggPSBzdGFydEluZGV4LCBfdGhpczIuX3N0b3BJbmRleCA9IHN0b3BJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2IiwgewogICAgICAgICAgICAgICAgICAgICAgICByZWY6IHRoaXMuX3NldFNjcm9sbGluZ0NvbnRhaW5lclJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgImFyaWEtbGFiZWwiOiB0aGlzLnByb3BzWyJhcmlhLWxhYmVsIl0sCiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMi5kZWZhdWx0KSgiUmVhY3RWaXJ0dWFsaXplZF9fTWFzb25yeSIsIGNsYXNzTmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgb25TY3JvbGw6IHRoaXMuX29uU2Nyb2xsLAogICAgICAgICAgICAgICAgICAgICAgICByb2xlOiByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogKDAsIF9leHRlbmRzMy5kZWZhdWx0KSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3hTaXppbmc6ICJib3JkZXItYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogImx0ciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGF1dG9IZWlnaHQgPyAiYXV0byIgOiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvd1g6ICJoaWRkZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3dZOiBlc3RpbWF0ZVRvdGFsSGVpZ2h0IDwgaGVpZ2h0ID8gImhpZGRlbiIgOiAiYXV0byIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogInJlbGF0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYmtpdE92ZXJmbG93U2Nyb2xsaW5nOiAidG91Y2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbENoYW5nZTogInRyYW5zZm9ybSIKICAgICAgICAgICAgICAgICAgICAgICAgfSwgc3R5bGUpLAogICAgICAgICAgICAgICAgICAgICAgICB0YWJJbmRleDogdGFiSW5kZXgKICAgICAgICAgICAgICAgICAgICB9LCBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2IiwgewogICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICJSZWFjdFZpcnR1YWxpemVkX19NYXNvbnJ5X19pbm5lclNjcm9sbENvbnRhaW5lciIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBlc3RpbWF0ZVRvdGFsSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6ICIxMDAlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogZXN0aW1hdGVUb3RhbEhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiAiaGlkZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6IGlzU2Nyb2xsaW5nID8gIm5vbmUiIDogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogInJlbGF0aXZlIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgY2hpbGRyZW4pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX2NoZWNrSW52YWxpZGF0ZU9uVXBkYXRlIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIm51bWJlciIgPT0gdHlwZW9mIHRoaXMuX2ludmFsaWRhdGVPblVwZGF0ZVN0YXJ0SW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9zdGFydEluZGV4ID0gdGhpcy5faW52YWxpZGF0ZU9uVXBkYXRlU3RhcnRJbmRleCwgX3N0b3BJbmRleCA9IHRoaXMuX2ludmFsaWRhdGVPblVwZGF0ZVN0b3BJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52YWxpZGF0ZU9uVXBkYXRlU3RhcnRJbmRleCA9IG51bGwsIHRoaXMuX2ludmFsaWRhdGVPblVwZGF0ZVN0b3BJbmRleCA9IG51bGwsIAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3B1bGF0ZVBvc2l0aW9uQ2FjaGUoX3N0YXJ0SW5kZXgsIF9zdG9wSW5kZXgpLCB0aGlzLmZvcmNlVXBkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfZGVib3VuY2VSZXNldElzU2Nyb2xsaW5nIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsaW5nUmVzZXRUaW1lSW50ZXJ2YWwgPSB0aGlzLnByb3BzLnNjcm9sbGluZ1Jlc2V0VGltZUludGVydmFsOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYm91bmNlUmVzZXRJc1Njcm9sbGluZ0lkICYmIGNsZWFyVGltZW91dCh0aGlzLl9kZWJvdW5jZVJlc2V0SXNTY3JvbGxpbmdJZCksIAogICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYm91bmNlUmVzZXRJc1Njcm9sbGluZ0lkID0gc2V0VGltZW91dCh0aGlzLl9kZWJvdW5jZVJlc2V0SXNTY3JvbGxpbmdDYWxsYmFjaywgc2Nyb2xsaW5nUmVzZXRUaW1lSW50ZXJ2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfZGVib3VuY2VSZXNldElzU2Nyb2xsaW5nQ2FsbGJhY2siLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoewogICAgICAgICAgICAgICAgICAgICAgICBpc1Njcm9sbGluZzogITEKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX2dldEVzdGltYXRlZFRvdGFsSGVpZ2h0IiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHMsIGNlbGxDb3VudCA9IF9wcm9wczIuY2VsbENvdW50LCBjZWxsTWVhc3VyZXJDYWNoZSA9IF9wcm9wczIuY2VsbE1lYXN1cmVyQ2FjaGUsIHdpZHRoID0gX3Byb3BzMi53aWR0aCwgZXN0aW1hdGVkQ29sdW1uQ291bnQgPSBNYXRoLmZsb29yKHdpZHRoIC8gY2VsbE1lYXN1cmVyQ2FjaGUuZGVmYXVsdFdpZHRoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcG9zaXRpb25DYWNoZS5lc3RpbWF0ZVRvdGFsSGVpZ2h0KGNlbGxDb3VudCwgZXN0aW1hdGVkQ29sdW1uQ291bnQsIGNlbGxNZWFzdXJlckNhY2hlLmRlZmF1bHRIZWlnaHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfaW52b2tlT25TY3JvbGxDYWxsYmFjayIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9wcm9wczMgPSB0aGlzLnByb3BzLCBoZWlnaHQgPSBfcHJvcHMzLmhlaWdodCwgb25TY3JvbGwgPSBfcHJvcHMzLm9uU2Nyb2xsLCBzY3JvbGxUb3AgPSB0aGlzLnN0YXRlLnNjcm9sbFRvcDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblNjcm9sbE1lbW9pemVkICE9PSBzY3JvbGxUb3AgJiYgKG9uU2Nyb2xsKHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50SGVpZ2h0OiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEhlaWdodDogdGhpcy5fZ2V0RXN0aW1hdGVkVG90YWxIZWlnaHQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3AKICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5fb25TY3JvbGxNZW1vaXplZCA9IHNjcm9sbFRvcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9pbnZva2VPbkNlbGxzUmVuZGVyZWRDYWxsYmFjayIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXJ0SW5kZXhNZW1vaXplZCAhPT0gdGhpcy5fc3RhcnRJbmRleCB8fCB0aGlzLl9zdG9wSW5kZXhNZW1vaXplZCAhPT0gdGhpcy5fc3RvcEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfb25DZWxsc1JlbmRlcmVkID0gdGhpcy5wcm9wcy5vbkNlbGxzUmVuZGVyZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIF9vbkNlbGxzUmVuZGVyZWQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleDogdGhpcy5fc3RhcnRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BJbmRleDogdGhpcy5fc3RvcEluZGV4CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl9zdGFydEluZGV4TWVtb2l6ZWQgPSB0aGlzLl9zdGFydEluZGV4LCB0aGlzLl9zdG9wSW5kZXhNZW1vaXplZCA9IHRoaXMuX3N0b3BJbmRleDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9wb3B1bGF0ZVBvc2l0aW9uQ2FjaGUiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHN0YXJ0SW5kZXgsIHN0b3BJbmRleCkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9wcm9wczQgPSB0aGlzLnByb3BzLCBjZWxsTWVhc3VyZXJDYWNoZSA9IF9wcm9wczQuY2VsbE1lYXN1cmVyQ2FjaGUsIGNlbGxQb3NpdGlvbmVyID0gX3Byb3BzNC5jZWxsUG9zaXRpb25lciwgX2luZGV4MiA9IHN0YXJ0SW5kZXg7IF9pbmRleDIgPD0gc3RvcEluZGV4OyBfaW5kZXgyKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9jZWxsUG9zaXRpb25lciA9IGNlbGxQb3NpdGlvbmVyKF9pbmRleDIpLCBfbGVmdCA9IF9jZWxsUG9zaXRpb25lci5sZWZ0LCBfdG9wID0gX2NlbGxQb3NpdGlvbmVyLnRvcDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25DYWNoZS5zZXRQb3NpdGlvbihfaW5kZXgyLCBfbGVmdCwgX3RvcCwgY2VsbE1lYXN1cmVyQ2FjaGUuZ2V0SGVpZ2h0KF9pbmRleDIpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9zZXRTY3JvbGxpbmdDb250YWluZXJSZWYiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHJlZikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbGluZ0NvbnRhaW5lciA9IHJlZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX29uU2Nyb2xsIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSB0aGlzLnByb3BzLmhlaWdodCwgZXZlbnRTY3JvbGxUb3AgPSBldmVudC50YXJnZXQuc2Nyb2xsVG9wLCBzY3JvbGxUb3AgPSBNYXRoLm1pbihNYXRoLm1heCgwLCB0aGlzLl9nZXRFc3RpbWF0ZWRUb3RhbEhlaWdodCgpIC0gaGVpZ2h0KSwgZXZlbnRTY3JvbGxUb3ApOwogICAgICAgICAgICAgICAgICAgIGV2ZW50U2Nyb2xsVG9wID09PSBzY3JvbGxUb3AgJiYgKHRoaXMuX2RlYm91bmNlUmVzZXRJc1Njcm9sbGluZygpLCB0aGlzLnN0YXRlLnNjcm9sbFRvcCAhPT0gc2Nyb2xsVG9wICYmIHRoaXMuc2V0U3RhdGUoewogICAgICAgICAgICAgICAgICAgICAgICBpc1Njcm9sbGluZzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wCiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IF0pLCBNYXNvbnJ5OwogICAgICAgIH0oX3JlYWN0LlB1cmVDb21wb25lbnQpOwogICAgICAgIE1hc29ucnkuZGVmYXVsdFByb3BzID0gewogICAgICAgICAgICBhdXRvSGVpZ2h0OiAhMSwKICAgICAgICAgICAga2V5TWFwcGVyOiBpZGVudGl0eSwKICAgICAgICAgICAgb25DZWxsc1JlbmRlcmVkOiBub29wLAogICAgICAgICAgICBvblNjcm9sbDogbm9vcCwKICAgICAgICAgICAgb3ZlcnNjYW5CeVBpeGVsczogMjAsCiAgICAgICAgICAgIHJvbGU6ICJncmlkIiwKICAgICAgICAgICAgc2Nyb2xsaW5nUmVzZXRUaW1lSW50ZXJ2YWw6IERFRkFVTFRfU0NST0xMSU5HX1JFU0VUX1RJTUVfSU5URVJWQUwsCiAgICAgICAgICAgIHN0eWxlOiBlbXB0eU9iamVjdCwKICAgICAgICAgICAgdGFiSW5kZXg6IDAKICAgICAgICB9LCBleHBvcnRzLmRlZmF1bHQgPSBNYXNvbnJ5OwogICAgICAgIHZhciBlbXB0eU9iamVjdCA9IHt9OwogICAgfSwgLyogMTQ1ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvYmoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KTsKICAgICAgICB2YXIgX3NsaWNlZFRvQXJyYXkyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDYpLCBfc2xpY2VkVG9BcnJheTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zbGljZWRUb0FycmF5MiksIF9jbGFzc0NhbGxDaGVjazIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KSwgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMiksIF9jcmVhdGVDbGFzczIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKSwgX2NyZWF0ZUNsYXNzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNsYXNzMiksIF9pbnRlcnZhbFRyZWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1NSksIF9pbnRlcnZhbFRyZWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW50ZXJ2YWxUcmVlKSwgUG9zaXRpb25DYWNoZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmdW5jdGlvbiBQb3NpdGlvbkNhY2hlKCkgewogICAgICAgICAgICAgICAgKDAsIF9jbGFzc0NhbGxDaGVjazMuZGVmYXVsdCkodGhpcywgUG9zaXRpb25DYWNoZSksIHRoaXMuX2NvbHVtblNpemVNYXAgPSB7fSwgdGhpcy5faW50ZXJ2YWxUcmVlID0gKDAsIAogICAgICAgICAgICAgICAgX2ludGVydmFsVHJlZTIuZGVmYXVsdCkoKSwgdGhpcy5fbGVmdE1hcCA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAoMCwgX2NyZWF0ZUNsYXNzMy5kZWZhdWx0KShQb3NpdGlvbkNhY2hlLCBbIHsKICAgICAgICAgICAgICAgIGtleTogImVzdGltYXRlVG90YWxIZWlnaHQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKGNlbGxDb3VudCwgY29sdW1uQ291bnQsIGRlZmF1bHRDZWxsSGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVubWVhc3VyZWRDZWxsQ291bnQgPSBjZWxsQ291bnQgLSB0aGlzLmNvdW50OwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRhbGxlc3RDb2x1bW5TaXplICsgTWF0aC5jZWlsKHVubWVhc3VyZWRDZWxsQ291bnQgLyBjb2x1bW5Db3VudCkgKiBkZWZhdWx0Q2VsbEhlaWdodDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAicmFuZ2UiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHNjcm9sbFRvcCwgY2xpZW50SGVpZ2h0LCByZW5kZXJDYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW50ZXJ2YWxUcmVlLnF1ZXJ5SW50ZXJ2YWwoc2Nyb2xsVG9wLCBzY3JvbGxUb3AgKyBjbGllbnRIZWlnaHQsIGZ1bmN0aW9uKF9yZWYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9yZWYyID0gKDAsIF9zbGljZWRUb0FycmF5My5kZWZhdWx0KShfcmVmLCAzKSwgdG9wID0gX3JlZjJbMF0sIGluZGV4ID0gKF9yZWYyWzFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgX3JlZjJbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyQ2FsbGJhY2soaW5kZXgsIF90aGlzLl9sZWZ0TWFwW2luZGV4XSwgdG9wKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAic2V0UG9zaXRpb24iLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKGluZGV4LCBsZWZ0LCB0b3AsIGhlaWdodCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludGVydmFsVHJlZS5pbnNlcnQoWyB0b3AsIHRvcCArIGhlaWdodCwgaW5kZXggXSksIHRoaXMuX2xlZnRNYXBbaW5kZXhdID0gbGVmdDsKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uU2l6ZU1hcCA9IHRoaXMuX2NvbHVtblNpemVNYXAsIGNvbHVtbkhlaWdodCA9IGNvbHVtblNpemVNYXBbbGVmdF07CiAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBjb2x1bW5IZWlnaHQgPyBjb2x1bW5TaXplTWFwW2xlZnRdID0gdG9wICsgaGVpZ2h0IDogY29sdW1uU2l6ZU1hcFtsZWZ0XSA9IE1hdGgubWF4KGNvbHVtbkhlaWdodCwgdG9wICsgaGVpZ2h0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiY291bnQiLAogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW50ZXJ2YWxUcmVlLmNvdW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJzaG9ydGVzdENvbHVtblNpemUiLAogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uU2l6ZU1hcCA9IHRoaXMuX2NvbHVtblNpemVNYXAsIHNpemUgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gY29sdW1uU2l6ZU1hcCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gY29sdW1uU2l6ZU1hcFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDAgPT09IHNpemUgPyBoZWlnaHQgOiBNYXRoLm1pbihzaXplLCBoZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAidGFsbGVzdENvbHVtblNpemUiLAogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uU2l6ZU1hcCA9IHRoaXMuX2NvbHVtblNpemVNYXAsIHNpemUgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gY29sdW1uU2l6ZU1hcCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gY29sdW1uU2l6ZU1hcFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IE1hdGgubWF4KHNpemUsIGhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IF0pLCBQb3NpdGlvbkNhY2hlOwogICAgICAgIH0oKTsKICAgICAgICBleHBvcnRzLmRlZmF1bHQgPSBQb3NpdGlvbkNhY2hlOwogICAgfSwgLyogMTQ2ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvYmoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5fX2VzTW9kdWxlID0gITA7CiAgICAgICAgdmFyIF9pc0l0ZXJhYmxlMiA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ3KSwgX2lzSXRlcmFibGUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNJdGVyYWJsZTIpLCBfZ2V0SXRlcmF0b3IyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTEpLCBfZ2V0SXRlcmF0b3IzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0SXRlcmF0b3IyKTsKICAgICAgICBleHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHsKICAgICAgICAgICAgICAgIHZhciBfYXJyID0gW10sIF9uID0gITAsIF9kID0gITEsIF9lID0gdm9pZCAwOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfcywgX2kgPSAoMCwgX2dldEl0ZXJhdG9yMy5kZWZhdWx0KShhcnIpOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKSAmJiAoX2Fyci5wdXNoKF9zLnZhbHVlKSwgCiAgICAgICAgICAgICAgICAgICAgIWkgfHwgX2Fyci5sZW5ndGggIT09IGkpOyBfbiA9ICEwKSA7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBfZCA9ICEwLCBfZSA9IGVycjsKICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIV9uICYmIF9pLnJldHVybiAmJiBfaS5yZXR1cm4oKTsKICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2QpIHRocm93IF9lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBfYXJyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihhcnIsIGkpIHsKICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7CiAgICAgICAgICAgICAgICBpZiAoKDAsIF9pc0l0ZXJhYmxlMy5kZWZhdWx0KShPYmplY3QoYXJyKSkpIHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlIik7CiAgICAgICAgICAgIH07CiAgICAgICAgfSgpOwogICAgfSwgLyogMTQ3ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7CiAgICAgICAgICAgIGRlZmF1bHQ6IF9fd2VicGFja19yZXF1aXJlX18oMTQ4KSwKICAgICAgICAgICAgX19lc01vZHVsZTogITAKICAgICAgICB9OwogICAgfSwgLyogMTQ4ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXyg2MCksIF9fd2VicGFja19yZXF1aXJlX18oMzgpLCBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ5KTsKICAgIH0sIC8qIDE0OSAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIHZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTApLCBJVEVSQVRPUiA9IF9fd2VicGFja19yZXF1aXJlX18oNTkpKCJpdGVyYXRvciIpLCBJdGVyYXRvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KTsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpLmlzSXRlcmFibGUgPSBmdW5jdGlvbihpdCkgewogICAgICAgICAgICB2YXIgTyA9IE9iamVjdChpdCk7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IE9bSVRFUkFUT1JdIHx8ICJAQGl0ZXJhdG9yIiBpbiBPIHx8IEl0ZXJhdG9ycy5oYXNPd25Qcm9wZXJ0eShjbGFzc29mKE8pKTsKICAgICAgICB9OwogICAgfSwgLyogMTUwICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKCkKICAgICAgICB2YXIgY29mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MiksIFRBRyA9IF9fd2VicGFja19yZXF1aXJlX18oNTkpKCJ0b1N0cmluZ1RhZyIpLCBBUkcgPSAiQXJndW1lbnRzIiA9PSBjb2YoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBhcmd1bWVudHM7CiAgICAgICAgfSgpKSwgdHJ5R2V0ID0gZnVuY3Rpb24oaXQsIGtleSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIGl0W2tleV07CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgfTsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KSB7CiAgICAgICAgICAgIHZhciBPLCBULCBCOwogICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBpdCA/ICJVbmRlZmluZWQiIDogbnVsbCA9PT0gaXQgPyAiTnVsbCIgOiAic3RyaW5nIiA9PSB0eXBlb2YgKFQgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRBRykpID8gVCA6IEFSRyA/IGNvZihPKSA6ICJPYmplY3QiID09IChCID0gY29mKE8pKSAmJiAiZnVuY3Rpb24iID09IHR5cGVvZiBPLmNhbGxlZSA/ICJBcmd1bWVudHMiIDogQjsKICAgICAgICB9OwogICAgfSwgLyogMTUxICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7CiAgICAgICAgICAgIGRlZmF1bHQ6IF9fd2VicGFja19yZXF1aXJlX18oMTUyKSwKICAgICAgICAgICAgX19lc01vZHVsZTogITAKICAgICAgICB9OwogICAgfSwgLyogMTUyICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXyg2MCksIF9fd2VicGFja19yZXF1aXJlX18oMzgpLCBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUzKTsKICAgIH0sIC8qIDE1MyAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIHZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjEpLCBnZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1NCk7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KS5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uKGl0KSB7CiAgICAgICAgICAgIHZhciBpdGVyRm4gPSBnZXQoaXQpOwogICAgICAgICAgICBpZiAoImZ1bmN0aW9uIiAhPSB0eXBlb2YgaXRlckZuKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAiIGlzIG5vdCBpdGVyYWJsZSEiKTsKICAgICAgICAgICAgcmV0dXJuIGFuT2JqZWN0KGl0ZXJGbi5jYWxsKGl0KSk7CiAgICAgICAgfTsKICAgIH0sIC8qIDE1NCAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgIHZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTApLCBJVEVSQVRPUiA9IF9fd2VicGFja19yZXF1aXJlX18oNTkpKCJpdGVyYXRvciIpLCBJdGVyYXRvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KTsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpLmdldEl0ZXJhdG9yTWV0aG9kID0gZnVuY3Rpb24oaXQpIHsKICAgICAgICAgICAgaWYgKHZvaWQgMCAhPSBpdCkgcmV0dXJuIGl0W0lURVJBVE9SXSB8fCBpdFsiQEBpdGVyYXRvciJdIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07CiAgICAgICAgfTsKICAgIH0sIC8qIDE1NSAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIEludGVydmFsVHJlZU5vZGUobWlkLCBsZWZ0LCByaWdodCwgbGVmdFBvaW50cywgcmlnaHRQb2ludHMpIHsKICAgICAgICAgICAgdGhpcy5taWQgPSBtaWQsIHRoaXMubGVmdCA9IGxlZnQsIHRoaXMucmlnaHQgPSByaWdodCwgdGhpcy5sZWZ0UG9pbnRzID0gbGVmdFBvaW50cywgCiAgICAgICAgICAgIHRoaXMucmlnaHRQb2ludHMgPSByaWdodFBvaW50cywgdGhpcy5jb3VudCA9IChsZWZ0ID8gbGVmdC5jb3VudCA6IDApICsgKHJpZ2h0ID8gcmlnaHQuY291bnQgOiAwKSArIGxlZnRQb2ludHMubGVuZ3RoOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjb3B5KGEsIGIpIHsKICAgICAgICAgICAgYS5taWQgPSBiLm1pZCwgYS5sZWZ0ID0gYi5sZWZ0LCBhLnJpZ2h0ID0gYi5yaWdodCwgYS5sZWZ0UG9pbnRzID0gYi5sZWZ0UG9pbnRzLCAKICAgICAgICAgICAgYS5yaWdodFBvaW50cyA9IGIucmlnaHRQb2ludHMsIGEuY291bnQgPSBiLmNvdW50OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiByZWJ1aWxkKG5vZGUsIGludGVydmFscykgewogICAgICAgICAgICB2YXIgbnRyZWUgPSBjcmVhdGVJbnRlcnZhbFRyZWUoaW50ZXJ2YWxzKTsKICAgICAgICAgICAgbm9kZS5taWQgPSBudHJlZS5taWQsIG5vZGUubGVmdCA9IG50cmVlLmxlZnQsIG5vZGUucmlnaHQgPSBudHJlZS5yaWdodCwgbm9kZS5sZWZ0UG9pbnRzID0gbnRyZWUubGVmdFBvaW50cywgCiAgICAgICAgICAgIG5vZGUucmlnaHRQb2ludHMgPSBudHJlZS5yaWdodFBvaW50cywgbm9kZS5jb3VudCA9IG50cmVlLmNvdW50OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiByZWJ1aWxkV2l0aEludGVydmFsKG5vZGUsIGludGVydmFsKSB7CiAgICAgICAgICAgIHZhciBpbnRlcnZhbHMgPSBub2RlLmludGVydmFscyhbXSk7CiAgICAgICAgICAgIGludGVydmFscy5wdXNoKGludGVydmFsKSwgcmVidWlsZChub2RlLCBpbnRlcnZhbHMpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiByZWJ1aWxkV2l0aG91dEludGVydmFsKG5vZGUsIGludGVydmFsKSB7CiAgICAgICAgICAgIHZhciBpbnRlcnZhbHMgPSBub2RlLmludGVydmFscyhbXSksIGlkeCA9IGludGVydmFscy5pbmRleE9mKGludGVydmFsKTsKICAgICAgICAgICAgcmV0dXJuIGlkeCA8IDAgPyBOT1RfRk9VTkQgOiAoaW50ZXJ2YWxzLnNwbGljZShpZHgsIDEpLCByZWJ1aWxkKG5vZGUsIGludGVydmFscyksIAogICAgICAgICAgICBTVUNDRVNTKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gcmVwb3J0TGVmdFJhbmdlKGFyciwgaGksIGNiKSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aCAmJiBhcnJbaV1bMF0gPD0gaGk7ICsraSkgewogICAgICAgICAgICAgICAgdmFyIHIgPSBjYihhcnJbaV0pOwogICAgICAgICAgICAgICAgaWYgKHIpIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHJlcG9ydFJpZ2h0UmFuZ2UoYXJyLCBsbywgY2IpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IGFyci5sZW5ndGggLSAxOyBpID49IDAgJiYgYXJyW2ldWzFdID49IGxvOyAtLWkpIHsKICAgICAgICAgICAgICAgIHZhciByID0gY2IoYXJyW2ldKTsKICAgICAgICAgICAgICAgIGlmIChyKSByZXR1cm4gcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiByZXBvcnRSYW5nZShhcnIsIGNiKSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IGNiKGFycltpXSk7CiAgICAgICAgICAgICAgICBpZiAocikgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY29tcGFyZU51bWJlcnMoYSwgYikgewogICAgICAgICAgICByZXR1cm4gYSAtIGI7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNvbXBhcmVCZWdpbihhLCBiKSB7CiAgICAgICAgICAgIHZhciBkID0gYVswXSAtIGJbMF07CiAgICAgICAgICAgIHJldHVybiBkID8gZCA6IGFbMV0gLSBiWzFdOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjb21wYXJlRW5kKGEsIGIpIHsKICAgICAgICAgICAgdmFyIGQgPSBhWzFdIC0gYlsxXTsKICAgICAgICAgICAgcmV0dXJuIGQgPyBkIDogYVswXSAtIGJbMF07CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUludGVydmFsVHJlZShpbnRlcnZhbHMpIHsKICAgICAgICAgICAgaWYgKDAgPT09IGludGVydmFscy5sZW5ndGgpIHJldHVybiBudWxsOwogICAgICAgICAgICBmb3IgKHZhciBwdHMgPSBbXSwgaSA9IDA7IGkgPCBpbnRlcnZhbHMubGVuZ3RoOyArK2kpIHB0cy5wdXNoKGludGVydmFsc1tpXVswXSwgaW50ZXJ2YWxzW2ldWzFdKTsKICAgICAgICAgICAgcHRzLnNvcnQoY29tcGFyZU51bWJlcnMpOwogICAgICAgICAgICBmb3IgKHZhciBtaWQgPSBwdHNbcHRzLmxlbmd0aCA+PiAxXSwgbGVmdEludGVydmFscyA9IFtdLCByaWdodEludGVydmFscyA9IFtdLCBjZW50ZXJJbnRlcnZhbHMgPSBbXSwgaSA9IDA7IGkgPCBpbnRlcnZhbHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgIHZhciBzID0gaW50ZXJ2YWxzW2ldOwogICAgICAgICAgICAgICAgc1sxXSA8IG1pZCA/IGxlZnRJbnRlcnZhbHMucHVzaChzKSA6IG1pZCA8IHNbMF0gPyByaWdodEludGVydmFscy5wdXNoKHMpIDogY2VudGVySW50ZXJ2YWxzLnB1c2gocyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGxlZnRQb2ludHMgPSBjZW50ZXJJbnRlcnZhbHMsIHJpZ2h0UG9pbnRzID0gY2VudGVySW50ZXJ2YWxzLnNsaWNlKCk7CiAgICAgICAgICAgIHJldHVybiBsZWZ0UG9pbnRzLnNvcnQoY29tcGFyZUJlZ2luKSwgcmlnaHRQb2ludHMuc29ydChjb21wYXJlRW5kKSwgbmV3IEludGVydmFsVHJlZU5vZGUobWlkLCBjcmVhdGVJbnRlcnZhbFRyZWUobGVmdEludGVydmFscyksIGNyZWF0ZUludGVydmFsVHJlZShyaWdodEludGVydmFscyksIGxlZnRQb2ludHMsIHJpZ2h0UG9pbnRzKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gSW50ZXJ2YWxUcmVlKHJvb3QpIHsKICAgICAgICAgICAgdGhpcy5yb290ID0gcm9vdDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY3JlYXRlV3JhcHBlcihpbnRlcnZhbHMpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbFRyZWUoaW50ZXJ2YWxzICYmIDAgIT09IGludGVydmFscy5sZW5ndGggPyBjcmVhdGVJbnRlcnZhbFRyZWUoaW50ZXJ2YWxzKSA6IG51bGwpOwogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgICAgICAgICAgIHZhbHVlOiAhMAogICAgICAgIH0pLCBleHBvcnRzLmRlZmF1bHQgPSBjcmVhdGVXcmFwcGVyOwogICAgICAgIHZhciBfYmluYXJ5U2VhcmNoQm91bmRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTYpLCBfYmluYXJ5U2VhcmNoQm91bmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2JpbmFyeVNlYXJjaEJvdW5kcyksIE5PVF9GT1VORCA9IDAsIFNVQ0NFU1MgPSAxLCBFTVBUWSA9IDIsIHByb3RvID0gSW50ZXJ2YWxUcmVlTm9kZS5wcm90b3R5cGU7CiAgICAgICAgcHJvdG8uaW50ZXJ2YWxzID0gZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQucHVzaC5hcHBseShyZXN1bHQsIHRoaXMubGVmdFBvaW50cyksIHRoaXMubGVmdCAmJiB0aGlzLmxlZnQuaW50ZXJ2YWxzKHJlc3VsdCksIAogICAgICAgICAgICB0aGlzLnJpZ2h0ICYmIHRoaXMucmlnaHQuaW50ZXJ2YWxzKHJlc3VsdCksIHJlc3VsdDsKICAgICAgICB9LCBwcm90by5pbnNlcnQgPSBmdW5jdGlvbihpbnRlcnZhbCkgewogICAgICAgICAgICB2YXIgd2VpZ2h0ID0gdGhpcy5jb3VudCAtIHRoaXMubGVmdFBvaW50cy5sZW5ndGg7CiAgICAgICAgICAgIGlmICh0aGlzLmNvdW50ICs9IDEsIGludGVydmFsWzFdIDwgdGhpcy5taWQpIHRoaXMubGVmdCA/IDQgKiAodGhpcy5sZWZ0LmNvdW50ICsgMSkgPiAzICogKHdlaWdodCArIDEpID8gcmVidWlsZFdpdGhJbnRlcnZhbCh0aGlzLCBpbnRlcnZhbCkgOiB0aGlzLmxlZnQuaW5zZXJ0KGludGVydmFsKSA6IHRoaXMubGVmdCA9IGNyZWF0ZUludGVydmFsVHJlZShbIGludGVydmFsIF0pOyBlbHNlIGlmIChpbnRlcnZhbFswXSA+IHRoaXMubWlkKSB0aGlzLnJpZ2h0ID8gNCAqICh0aGlzLnJpZ2h0LmNvdW50ICsgMSkgPiAzICogKHdlaWdodCArIDEpID8gcmVidWlsZFdpdGhJbnRlcnZhbCh0aGlzLCBpbnRlcnZhbCkgOiB0aGlzLnJpZ2h0Lmluc2VydChpbnRlcnZhbCkgOiB0aGlzLnJpZ2h0ID0gY3JlYXRlSW50ZXJ2YWxUcmVlKFsgaW50ZXJ2YWwgXSk7IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGwgPSBfYmluYXJ5U2VhcmNoQm91bmRzMi5kZWZhdWx0LmdlKHRoaXMubGVmdFBvaW50cywgaW50ZXJ2YWwsIGNvbXBhcmVCZWdpbiksIHIgPSBfYmluYXJ5U2VhcmNoQm91bmRzMi5kZWZhdWx0LmdlKHRoaXMucmlnaHRQb2ludHMsIGludGVydmFsLCBjb21wYXJlRW5kKTsKICAgICAgICAgICAgICAgIHRoaXMubGVmdFBvaW50cy5zcGxpY2UobCwgMCwgaW50ZXJ2YWwpLCB0aGlzLnJpZ2h0UG9pbnRzLnNwbGljZShyLCAwLCBpbnRlcnZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBwcm90by5yZW1vdmUgPSBmdW5jdGlvbihpbnRlcnZhbCkgewogICAgICAgICAgICB2YXIgd2VpZ2h0ID0gdGhpcy5jb3VudCAtIHRoaXMubGVmdFBvaW50czsKICAgICAgICAgICAgaWYgKGludGVydmFsWzFdIDwgdGhpcy5taWQpIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5sZWZ0KSByZXR1cm4gTk9UX0ZPVU5EOwogICAgICAgICAgICAgICAgdmFyIHJ3ID0gdGhpcy5yaWdodCA/IHRoaXMucmlnaHQuY291bnQgOiAwOwogICAgICAgICAgICAgICAgaWYgKDQgKiBydyA+IDMgKiAod2VpZ2h0IC0gMSkpIHJldHVybiByZWJ1aWxkV2l0aG91dEludGVydmFsKHRoaXMsIGludGVydmFsKTsKICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5sZWZ0LnJlbW92ZShpbnRlcnZhbCk7CiAgICAgICAgICAgICAgICByZXR1cm4gciA9PT0gRU1QVFkgPyAodGhpcy5sZWZ0ID0gbnVsbCwgdGhpcy5jb3VudCAtPSAxLCBTVUNDRVNTKSA6IChyID09PSBTVUNDRVNTICYmICh0aGlzLmNvdW50IC09IDEpLCAKICAgICAgICAgICAgICAgIHIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbnRlcnZhbFswXSA+IHRoaXMubWlkKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmlnaHQpIHJldHVybiBOT1RfRk9VTkQ7CiAgICAgICAgICAgICAgICB2YXIgbHcgPSB0aGlzLmxlZnQgPyB0aGlzLmxlZnQuY291bnQgOiAwOwogICAgICAgICAgICAgICAgaWYgKDQgKiBsdyA+IDMgKiAod2VpZ2h0IC0gMSkpIHJldHVybiByZWJ1aWxkV2l0aG91dEludGVydmFsKHRoaXMsIGludGVydmFsKTsKICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5yaWdodC5yZW1vdmUoaW50ZXJ2YWwpOwogICAgICAgICAgICAgICAgcmV0dXJuIHIgPT09IEVNUFRZID8gKHRoaXMucmlnaHQgPSBudWxsLCB0aGlzLmNvdW50IC09IDEsIFNVQ0NFU1MpIDogKHIgPT09IFNVQ0NFU1MgJiYgKHRoaXMuY291bnQgLT0gMSksIAogICAgICAgICAgICAgICAgcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKDEgPT09IHRoaXMuY291bnQpIHJldHVybiB0aGlzLmxlZnRQb2ludHNbMF0gPT09IGludGVydmFsID8gRU1QVFkgOiBOT1RfRk9VTkQ7CiAgICAgICAgICAgIGlmICgxID09PSB0aGlzLmxlZnRQb2ludHMubGVuZ3RoICYmIHRoaXMubGVmdFBvaW50c1swXSA9PT0gaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgJiYgdGhpcy5yaWdodCkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHAgPSB0aGlzLCBuID0gdGhpcy5sZWZ0OyBuLnJpZ2h0OyApIHAgPSBuLCBuID0gbi5yaWdodDsKICAgICAgICAgICAgICAgICAgICBpZiAocCA9PT0gdGhpcykgbi5yaWdodCA9IHRoaXMucmlnaHQ7IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IHRoaXMubGVmdCwgciA9IHRoaXMucmlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHAuY291bnQgLT0gbi5jb3VudCwgcC5yaWdodCA9IG4ubGVmdCwgbi5sZWZ0ID0gbCwgbi5yaWdodCA9IHI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvcHkodGhpcywgbiksIHRoaXMuY291bnQgPSAodGhpcy5sZWZ0ID8gdGhpcy5sZWZ0LmNvdW50IDogMCkgKyAodGhpcy5yaWdodCA/IHRoaXMucmlnaHQuY291bnQgOiAwKSArIHRoaXMubGVmdFBvaW50cy5sZW5ndGg7CiAgICAgICAgICAgICAgICB9IGVsc2UgdGhpcy5sZWZ0ID8gY29weSh0aGlzLCB0aGlzLmxlZnQpIDogY29weSh0aGlzLCB0aGlzLnJpZ2h0KTsKICAgICAgICAgICAgICAgIHJldHVybiBTVUNDRVNTOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGwgPSBfYmluYXJ5U2VhcmNoQm91bmRzMi5kZWZhdWx0LmdlKHRoaXMubGVmdFBvaW50cywgaW50ZXJ2YWwsIGNvbXBhcmVCZWdpbik7IGwgPCB0aGlzLmxlZnRQb2ludHMubGVuZ3RoICYmIHRoaXMubGVmdFBvaW50c1tsXVswXSA9PT0gaW50ZXJ2YWxbMF07ICsrbCkgaWYgKHRoaXMubGVmdFBvaW50c1tsXSA9PT0gaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgIHRoaXMuY291bnQgLT0gMSwgdGhpcy5sZWZ0UG9pbnRzLnNwbGljZShsLCAxKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSBfYmluYXJ5U2VhcmNoQm91bmRzMi5kZWZhdWx0LmdlKHRoaXMucmlnaHRQb2ludHMsIGludGVydmFsLCBjb21wYXJlRW5kKTsgciA8IHRoaXMucmlnaHRQb2ludHMubGVuZ3RoICYmIHRoaXMucmlnaHRQb2ludHNbcl1bMV0gPT09IGludGVydmFsWzFdOyArK3IpIGlmICh0aGlzLnJpZ2h0UG9pbnRzW3JdID09PSBpbnRlcnZhbCkgcmV0dXJuIHRoaXMucmlnaHRQb2ludHMuc3BsaWNlKHIsIDEpLCAKICAgICAgICAgICAgICAgIFNVQ0NFU1M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIE5PVF9GT1VORDsKICAgICAgICB9LCBwcm90by5xdWVyeVBvaW50ID0gZnVuY3Rpb24oeCwgY2IpIHsKICAgICAgICAgICAgaWYgKHggPCB0aGlzLm1pZCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMubGVmdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5sZWZ0LnF1ZXJ5UG9pbnQoeCwgY2IpOwogICAgICAgICAgICAgICAgICAgIGlmIChyKSByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZXBvcnRMZWZ0UmFuZ2UodGhpcy5sZWZ0UG9pbnRzLCB4LCBjYik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHggPiB0aGlzLm1pZCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMucmlnaHQucXVlcnlQb2ludCh4LCBjYik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHIpIHJldHVybiByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJlcG9ydFJpZ2h0UmFuZ2UodGhpcy5yaWdodFBvaW50cywgeCwgY2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXBvcnRSYW5nZSh0aGlzLmxlZnRQb2ludHMsIGNiKTsKICAgICAgICB9LCBwcm90by5xdWVyeUludGVydmFsID0gZnVuY3Rpb24obG8sIGhpLCBjYikgewogICAgICAgICAgICBpZiAobG8gPCB0aGlzLm1pZCAmJiB0aGlzLmxlZnQpIHsKICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5sZWZ0LnF1ZXJ5SW50ZXJ2YWwobG8sIGhpLCBjYik7CiAgICAgICAgICAgICAgICBpZiAocikgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGhpID4gdGhpcy5taWQgJiYgdGhpcy5yaWdodCkgewogICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzLnJpZ2h0LnF1ZXJ5SW50ZXJ2YWwobG8sIGhpLCBjYik7CiAgICAgICAgICAgICAgICBpZiAocikgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGhpIDwgdGhpcy5taWQgPyByZXBvcnRMZWZ0UmFuZ2UodGhpcy5sZWZ0UG9pbnRzLCBoaSwgY2IpIDogbG8gPiB0aGlzLm1pZCA/IHJlcG9ydFJpZ2h0UmFuZ2UodGhpcy5yaWdodFBvaW50cywgbG8sIGNiKSA6IHJlcG9ydFJhbmdlKHRoaXMubGVmdFBvaW50cywgY2IpOwogICAgICAgIH07CiAgICAgICAgdmFyIHRwcm90byA9IEludGVydmFsVHJlZS5wcm90b3R5cGU7CiAgICAgICAgdHByb3RvLmluc2VydCA9IGZ1bmN0aW9uKGludGVydmFsKSB7CiAgICAgICAgICAgIHRoaXMucm9vdCA/IHRoaXMucm9vdC5pbnNlcnQoaW50ZXJ2YWwpIDogdGhpcy5yb290ID0gbmV3IEludGVydmFsVHJlZU5vZGUoaW50ZXJ2YWxbMF0sIG51bGwsIG51bGwsIFsgaW50ZXJ2YWwgXSwgWyBpbnRlcnZhbCBdKTsKICAgICAgICB9LCB0cHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24oaW50ZXJ2YWwpIHsKICAgICAgICAgICAgaWYgKHRoaXMucm9vdCkgewogICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzLnJvb3QucmVtb3ZlKGludGVydmFsKTsKICAgICAgICAgICAgICAgIHJldHVybiByID09PSBFTVBUWSAmJiAodGhpcy5yb290ID0gbnVsbCksIHIgIT09IE5PVF9GT1VORDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgfSwgdHByb3RvLnF1ZXJ5UG9pbnQgPSBmdW5jdGlvbihwLCBjYikgewogICAgICAgICAgICBpZiAodGhpcy5yb290KSByZXR1cm4gdGhpcy5yb290LnF1ZXJ5UG9pbnQocCwgY2IpOwogICAgICAgIH0sIHRwcm90by5xdWVyeUludGVydmFsID0gZnVuY3Rpb24obG8sIGhpLCBjYikgewogICAgICAgICAgICBpZiAobG8gPD0gaGkgJiYgdGhpcy5yb290KSByZXR1cm4gdGhpcy5yb290LnF1ZXJ5SW50ZXJ2YWwobG8sIGhpLCBjYik7CiAgICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRwcm90bywgImNvdW50IiwgewogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdCA/IHRoaXMucm9vdC5jb3VudCA6IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRwcm90bywgImludGVydmFscyIsIHsKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QgPyB0aGlzLnJvb3QuaW50ZXJ2YWxzKFtdKSA6IFtdOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9LCAvKiAxNTYgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgZnVuY3Rpb24gX0dFQShhLCBsLCBoLCB5KSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSBoICsgMTsgbCA8PSBoOyApIHsKICAgICAgICAgICAgICAgIHZhciBtID0gbCArIGggPj4+IDEsIHggPSBhW21dOwogICAgICAgICAgICAgICAgeCA+PSB5ID8gKGkgPSBtLCBoID0gbSAtIDEpIDogbCA9IG0gKyAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBfR0VQKGEsIGwsIGgsIHksIGMpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IGggKyAxOyBsIDw9IGg7ICkgewogICAgICAgICAgICAgICAgdmFyIG0gPSBsICsgaCA+Pj4gMSwgeCA9IGFbbV07CiAgICAgICAgICAgICAgICBjKHgsIHkpID49IDAgPyAoaSA9IG0sIGggPSBtIC0gMSkgOiBsID0gbSArIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGRpc3BhdGNoQnNlYXJjaEdFKGEsIHksIGMsIGwsIGgpIHsKICAgICAgICAgICAgcmV0dXJuICJmdW5jdGlvbiIgPT0gdHlwZW9mIGMgPyBfR0VQKGEsIHZvaWQgMCA9PT0gbCA/IDAgOiAwIHwgbCwgdm9pZCAwID09PSBoID8gYS5sZW5ndGggLSAxIDogMCB8IGgsIHksIGMpIDogX0dFQShhLCB2b2lkIDAgPT09IGMgPyAwIDogMCB8IGMsIHZvaWQgMCA9PT0gbCA/IGEubGVuZ3RoIC0gMSA6IDAgfCBsLCB5KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gX0dUQShhLCBsLCBoLCB5KSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSBoICsgMTsgbCA8PSBoOyApIHsKICAgICAgICAgICAgICAgIHZhciBtID0gbCArIGggPj4+IDEsIHggPSBhW21dOwogICAgICAgICAgICAgICAgeCA+IHkgPyAoaSA9IG0sIGggPSBtIC0gMSkgOiBsID0gbSArIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIF9HVFAoYSwgbCwgaCwgeSwgYykgewogICAgICAgICAgICBmb3IgKHZhciBpID0gaCArIDE7IGwgPD0gaDsgKSB7CiAgICAgICAgICAgICAgICB2YXIgbSA9IGwgKyBoID4+PiAxLCB4ID0gYVttXTsKICAgICAgICAgICAgICAgIGMoeCwgeSkgPiAwID8gKGkgPSBtLCBoID0gbSAtIDEpIDogbCA9IG0gKyAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBkaXNwYXRjaEJzZWFyY2hHVChhLCB5LCBjLCBsLCBoKSB7CiAgICAgICAgICAgIHJldHVybiAiZnVuY3Rpb24iID09IHR5cGVvZiBjID8gX0dUUChhLCB2b2lkIDAgPT09IGwgPyAwIDogMCB8IGwsIHZvaWQgMCA9PT0gaCA/IGEubGVuZ3RoIC0gMSA6IDAgfCBoLCB5LCBjKSA6IF9HVEEoYSwgdm9pZCAwID09PSBjID8gMCA6IDAgfCBjLCB2b2lkIDAgPT09IGwgPyBhLmxlbmd0aCAtIDEgOiAwIHwgbCwgeSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIF9MVEEoYSwgbCwgaCwgeSkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gbCAtIDE7IGwgPD0gaDsgKSB7CiAgICAgICAgICAgICAgICB2YXIgbSA9IGwgKyBoID4+PiAxLCB4ID0gYVttXTsKICAgICAgICAgICAgICAgIHggPCB5ID8gKGkgPSBtLCBsID0gbSArIDEpIDogaCA9IG0gLSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBfTFRQKGEsIGwsIGgsIHksIGMpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IGwgLSAxOyBsIDw9IGg7ICkgewogICAgICAgICAgICAgICAgdmFyIG0gPSBsICsgaCA+Pj4gMSwgeCA9IGFbbV07CiAgICAgICAgICAgICAgICBjKHgsIHkpIDwgMCA/IChpID0gbSwgbCA9IG0gKyAxKSA6IGggPSBtIC0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZGlzcGF0Y2hCc2VhcmNoTFQoYSwgeSwgYywgbCwgaCkgewogICAgICAgICAgICByZXR1cm4gImZ1bmN0aW9uIiA9PSB0eXBlb2YgYyA/IF9MVFAoYSwgdm9pZCAwID09PSBsID8gMCA6IDAgfCBsLCB2b2lkIDAgPT09IGggPyBhLmxlbmd0aCAtIDEgOiAwIHwgaCwgeSwgYykgOiBfTFRBKGEsIHZvaWQgMCA9PT0gYyA/IDAgOiAwIHwgYywgdm9pZCAwID09PSBsID8gYS5sZW5ndGggLSAxIDogMCB8IGwsIHkpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBfTEVBKGEsIGwsIGgsIHkpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IGwgLSAxOyBsIDw9IGg7ICkgewogICAgICAgICAgICAgICAgdmFyIG0gPSBsICsgaCA+Pj4gMSwgeCA9IGFbbV07CiAgICAgICAgICAgICAgICB4IDw9IHkgPyAoaSA9IG0sIGwgPSBtICsgMSkgOiBoID0gbSAtIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIF9MRVAoYSwgbCwgaCwgeSwgYykgewogICAgICAgICAgICBmb3IgKHZhciBpID0gbCAtIDE7IGwgPD0gaDsgKSB7CiAgICAgICAgICAgICAgICB2YXIgbSA9IGwgKyBoID4+PiAxLCB4ID0gYVttXTsKICAgICAgICAgICAgICAgIGMoeCwgeSkgPD0gMCA/IChpID0gbSwgbCA9IG0gKyAxKSA6IGggPSBtIC0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZGlzcGF0Y2hCc2VhcmNoTEUoYSwgeSwgYywgbCwgaCkgewogICAgICAgICAgICByZXR1cm4gImZ1bmN0aW9uIiA9PSB0eXBlb2YgYyA/IF9MRVAoYSwgdm9pZCAwID09PSBsID8gMCA6IDAgfCBsLCB2b2lkIDAgPT09IGggPyBhLmxlbmd0aCAtIDEgOiAwIHwgaCwgeSwgYykgOiBfTEVBKGEsIHZvaWQgMCA9PT0gYyA/IDAgOiAwIHwgYywgdm9pZCAwID09PSBsID8gYS5sZW5ndGggLSAxIDogMCB8IGwsIHkpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBfRVFBKGEsIGwsIGgsIHkpIHsKICAgICAgICAgICAgZm9yICg7bCA8PSBoOyApIHsKICAgICAgICAgICAgICAgIHZhciBtID0gbCArIGggPj4+IDEsIHggPSBhW21dOwogICAgICAgICAgICAgICAgaWYgKHggPT09IHkpIHJldHVybiBtOwogICAgICAgICAgICAgICAgeCA8PSB5ID8gbCA9IG0gKyAxIDogaCA9IG0gLSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gX0VRUChhLCBsLCBoLCB5LCBjKSB7CiAgICAgICAgICAgIGZvciAoO2wgPD0gaDsgKSB7CiAgICAgICAgICAgICAgICB2YXIgbSA9IGwgKyBoID4+PiAxLCB4ID0gYVttXSwgcCA9IGMoeCwgeSk7CiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gcCkgcmV0dXJuIG07CiAgICAgICAgICAgICAgICBwIDw9IDAgPyBsID0gbSArIDEgOiBoID0gbSAtIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBkaXNwYXRjaEJzZWFyY2hFUShhLCB5LCBjLCBsLCBoKSB7CiAgICAgICAgICAgIHJldHVybiAiZnVuY3Rpb24iID09IHR5cGVvZiBjID8gX0VRUChhLCB2b2lkIDAgPT09IGwgPyAwIDogMCB8IGwsIHZvaWQgMCA9PT0gaCA/IGEubGVuZ3RoIC0gMSA6IDAgfCBoLCB5LCBjKSA6IF9FUUEoYSwgdm9pZCAwID09PSBjID8gMCA6IDAgfCBjLCB2b2lkIDAgPT09IGwgPyBhLmxlbmd0aCAtIDEgOiAwIHwgbCwgeSk7CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSksIGV4cG9ydHMuZGVmYXVsdCA9IHsKICAgICAgICAgICAgZ2U6IGRpc3BhdGNoQnNlYXJjaEdFLAogICAgICAgICAgICBndDogZGlzcGF0Y2hCc2VhcmNoR1QsCiAgICAgICAgICAgIGx0OiBkaXNwYXRjaEJzZWFyY2hMVCwKICAgICAgICAgICAgbGU6IGRpc3BhdGNoQnNlYXJjaExFLAogICAgICAgICAgICBlcTogZGlzcGF0Y2hCc2VhcmNoRVEKICAgICAgICB9OwogICAgfSwgLyogMTU3ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUNlbGxQb3NpdGlvbmVyKF9yZWYpIHsKICAgICAgICAgICAgZnVuY3Rpb24gY2VsbFBvc2l0aW9uZXIoaW5kZXgpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNvbHVtbkluZGV4ID0gMCwgaSA9IDE7IGkgPCBjb2x1bW5IZWlnaHRzLmxlbmd0aDsgaSsrKSBjb2x1bW5IZWlnaHRzW2ldIDwgY29sdW1uSGVpZ2h0c1tjb2x1bW5JbmRleF0gJiYgKGNvbHVtbkluZGV4ID0gaSk7CiAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IGNvbHVtbkluZGV4ICogKGNvbHVtbldpZHRoICsgc3BhY2VyKSwgdG9wID0gY29sdW1uSGVpZ2h0c1tjb2x1bW5JbmRleF0gfHwgMDsKICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW5IZWlnaHRzW2NvbHVtbkluZGV4XSA9IHRvcCArIGNlbGxNZWFzdXJlckNhY2hlLmdldEhlaWdodChpbmRleCkgKyBzcGFjZXIsIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGxlZnQ6IGxlZnQsCiAgICAgICAgICAgICAgICAgICAgdG9wOiB0b3AKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaW5pdE9yUmVzZXREZXJpdmVkVmFsdWVzKCkgewogICAgICAgICAgICAgICAgY29sdW1uSGVpZ2h0cyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSBjb2x1bW5IZWlnaHRzW2ldID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZXNldChwYXJhbXMpIHsKICAgICAgICAgICAgICAgIGNvbHVtbkNvdW50ID0gcGFyYW1zLmNvbHVtbkNvdW50LCBjb2x1bW5XaWR0aCA9IHBhcmFtcy5jb2x1bW5XaWR0aCwgc3BhY2VyID0gcGFyYW1zLnNwYWNlciwgCiAgICAgICAgICAgICAgICBpbml0T3JSZXNldERlcml2ZWRWYWx1ZXMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY2VsbE1lYXN1cmVyQ2FjaGUgPSBfcmVmLmNlbGxNZWFzdXJlckNhY2hlLCBjb2x1bW5Db3VudCA9IF9yZWYuY29sdW1uQ291bnQsIGNvbHVtbldpZHRoID0gX3JlZi5jb2x1bW5XaWR0aCwgX3JlZiRzcGFjZXIgPSBfcmVmLnNwYWNlciwgc3BhY2VyID0gdm9pZCAwID09PSBfcmVmJHNwYWNlciA/IDAgOiBfcmVmJHNwYWNlciwgY29sdW1uSGVpZ2h0cyA9IHZvaWQgMDsKICAgICAgICAgICAgcmV0dXJuIGluaXRPclJlc2V0RGVyaXZlZFZhbHVlcygpLCBjZWxsUG9zaXRpb25lci5yZXNldCA9IHJlc2V0LCBjZWxsUG9zaXRpb25lcjsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KSwgZXhwb3J0cy5kZWZhdWx0ID0gY3JlYXRlQ2VsbFBvc2l0aW9uZXI7CiAgICB9LCAvKiAxNTggKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsKICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG9iagogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgICAgICAgICAgIHZhbHVlOiAhMAogICAgICAgIH0pLCBleHBvcnRzLk11bHRpR3JpZCA9IGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDsKICAgICAgICB2YXIgX011bHRpR3JpZDIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1OSksIF9NdWx0aUdyaWQzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTXVsdGlHcmlkMik7CiAgICAgICAgZXhwb3J0cy5kZWZhdWx0ID0gX011bHRpR3JpZDMuZGVmYXVsdCwgZXhwb3J0cy5NdWx0aUdyaWQgPSBfTXVsdGlHcmlkMy5kZWZhdWx0OwogICAgfSwgLyogMTU5ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvYmoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KTsKICAgICAgICB2YXIgX2V4dGVuZHMyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDcpLCBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMiksIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMiksIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpLCBfZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpLCBfZ2V0UHJvdG90eXBlT2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0UHJvdG90eXBlT2YpLCBfY2xhc3NDYWxsQ2hlY2syID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSksIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpLCBfY3JlYXRlQ2xhc3MyID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMCksIF9jcmVhdGVDbGFzczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDbGFzczIpLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpLCBfaW5oZXJpdHMyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MSksIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpLCBfcHJvcFR5cGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OSksIF9yZWFjdCA9IChfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpLCAKICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3KSksIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCksIF9HcmlkID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjcpLCBfR3JpZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9HcmlkKSwgU0NST0xMQkFSX1NJWkVfQlVGRkVSID0gMjAsIE11bHRpR3JpZCA9IGZ1bmN0aW9uKF9QdXJlQ29tcG9uZW50KSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIE11bHRpR3JpZChwcm9wcywgY29udGV4dCkgewogICAgICAgICAgICAgICAgKDAsIF9jbGFzc0NhbGxDaGVjazMuZGVmYXVsdCkodGhpcywgTXVsdGlHcmlkKTsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMuZGVmYXVsdCkodGhpcywgKE11bHRpR3JpZC5fX3Byb3RvX18gfHwgKDAsIAogICAgICAgICAgICAgICAgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KShNdWx0aUdyaWQpKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuc3RhdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogMCwKICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3A6IDAKICAgICAgICAgICAgICAgIH0sIF90aGlzLl9kZWZlcnJlZEludmFsaWRhdGVDb2x1bW5JbmRleCA9IG51bGwsIF90aGlzLl9kZWZlcnJlZEludmFsaWRhdGVSb3dJbmRleCA9IG51bGwsIAogICAgICAgICAgICAgICAgX3RoaXMuX2JvdHRvbUxlZnRHcmlkUmVmID0gX3RoaXMuX2JvdHRvbUxlZnRHcmlkUmVmLmJpbmQoX3RoaXMpLCBfdGhpcy5fYm90dG9tUmlnaHRHcmlkUmVmID0gX3RoaXMuX2JvdHRvbVJpZ2h0R3JpZFJlZi5iaW5kKF90aGlzKSwgCiAgICAgICAgICAgICAgICBfdGhpcy5fY2VsbFJlbmRlcmVyQm90dG9tTGVmdEdyaWQgPSBfdGhpcy5fY2VsbFJlbmRlcmVyQm90dG9tTGVmdEdyaWQuYmluZChfdGhpcyksIAogICAgICAgICAgICAgICAgX3RoaXMuX2NlbGxSZW5kZXJlckJvdHRvbVJpZ2h0R3JpZCA9IF90aGlzLl9jZWxsUmVuZGVyZXJCb3R0b21SaWdodEdyaWQuYmluZChfdGhpcyksIAogICAgICAgICAgICAgICAgX3RoaXMuX2NlbGxSZW5kZXJlclRvcFJpZ2h0R3JpZCA9IF90aGlzLl9jZWxsUmVuZGVyZXJUb3BSaWdodEdyaWQuYmluZChfdGhpcyksIF90aGlzLl9jb2x1bW5XaWR0aFJpZ2h0R3JpZCA9IF90aGlzLl9jb2x1bW5XaWR0aFJpZ2h0R3JpZC5iaW5kKF90aGlzKSwgCiAgICAgICAgICAgICAgICBfdGhpcy5fb25TY3JvbGwgPSBfdGhpcy5fb25TY3JvbGwuYmluZChfdGhpcyksIF90aGlzLl9yb3dIZWlnaHRCb3R0b21HcmlkID0gX3RoaXMuX3Jvd0hlaWdodEJvdHRvbUdyaWQuYmluZChfdGhpcyksIAogICAgICAgICAgICAgICAgX3RoaXMuX3RvcExlZnRHcmlkUmVmID0gX3RoaXMuX3RvcExlZnRHcmlkUmVmLmJpbmQoX3RoaXMpLCBfdGhpcy5fdG9wUmlnaHRHcmlkUmVmID0gX3RoaXMuX3RvcFJpZ2h0R3JpZFJlZi5iaW5kKF90aGlzKSwgCiAgICAgICAgICAgICAgICBfdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKDAsIF9pbmhlcml0czMuZGVmYXVsdCkoTXVsdGlHcmlkLCBfUHVyZUNvbXBvbmVudCksICgwLCBfY3JlYXRlQ2xhc3MzLmRlZmF1bHQpKE11bHRpR3JpZCwgWyB7CiAgICAgICAgICAgICAgICBrZXk6ICJmb3JjZVVwZGF0ZUdyaWRzIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9ib3R0b21MZWZ0R3JpZCAmJiB0aGlzLl9ib3R0b21MZWZ0R3JpZC5mb3JjZVVwZGF0ZSgpLCB0aGlzLl9ib3R0b21SaWdodEdyaWQgJiYgdGhpcy5fYm90dG9tUmlnaHRHcmlkLmZvcmNlVXBkYXRlKCksIAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3RvcExlZnRHcmlkICYmIHRoaXMuX3RvcExlZnRHcmlkLmZvcmNlVXBkYXRlKCksIHRoaXMuX3RvcFJpZ2h0R3JpZCAmJiB0aGlzLl90b3BSaWdodEdyaWQuZm9yY2VVcGRhdGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiaW52YWxpZGF0ZUNlbGxTaXplQWZ0ZXJSZW5kZXIiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB7fSwgX3JlZiRjb2x1bW5JbmRleCA9IF9yZWYuY29sdW1uSW5kZXgsIGNvbHVtbkluZGV4ID0gdm9pZCAwID09PSBfcmVmJGNvbHVtbkluZGV4ID8gMCA6IF9yZWYkY29sdW1uSW5kZXgsIF9yZWYkcm93SW5kZXggPSBfcmVmLnJvd0luZGV4LCByb3dJbmRleCA9IHZvaWQgMCA9PT0gX3JlZiRyb3dJbmRleCA/IDAgOiBfcmVmJHJvd0luZGV4OwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlZmVycmVkSW52YWxpZGF0ZUNvbHVtbkluZGV4ID0gIm51bWJlciIgPT0gdHlwZW9mIHRoaXMuX2RlZmVycmVkSW52YWxpZGF0ZUNvbHVtbkluZGV4ID8gTWF0aC5taW4odGhpcy5fZGVmZXJyZWRJbnZhbGlkYXRlQ29sdW1uSW5kZXgsIGNvbHVtbkluZGV4KSA6IGNvbHVtbkluZGV4LCAKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWZlcnJlZEludmFsaWRhdGVSb3dJbmRleCA9ICJudW1iZXIiID09IHR5cGVvZiB0aGlzLl9kZWZlcnJlZEludmFsaWRhdGVSb3dJbmRleCA/IE1hdGgubWluKHRoaXMuX2RlZmVycmVkSW52YWxpZGF0ZVJvd0luZGV4LCByb3dJbmRleCkgOiByb3dJbmRleDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAibWVhc3VyZUFsbENlbGxzIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9ib3R0b21MZWZ0R3JpZCAmJiB0aGlzLl9ib3R0b21MZWZ0R3JpZC5tZWFzdXJlQWxsQ2VsbHMoKSwgdGhpcy5fYm90dG9tUmlnaHRHcmlkICYmIHRoaXMuX2JvdHRvbVJpZ2h0R3JpZC5tZWFzdXJlQWxsQ2VsbHMoKSwgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdG9wTGVmdEdyaWQgJiYgdGhpcy5fdG9wTGVmdEdyaWQubWVhc3VyZUFsbENlbGxzKCksIHRoaXMuX3RvcFJpZ2h0R3JpZCAmJiB0aGlzLl90b3BSaWdodEdyaWQubWVhc3VyZUFsbENlbGxzKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogInJlY29tcHV0ZUdyaWRTaXplIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX3JlZjIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9LCBfcmVmMiRjb2x1bW5JbmRleCA9IF9yZWYyLmNvbHVtbkluZGV4LCBjb2x1bW5JbmRleCA9IHZvaWQgMCA9PT0gX3JlZjIkY29sdW1uSW5kZXggPyAwIDogX3JlZjIkY29sdW1uSW5kZXgsIF9yZWYyJHJvd0luZGV4ID0gX3JlZjIucm93SW5kZXgsIHJvd0luZGV4ID0gdm9pZCAwID09PSBfcmVmMiRyb3dJbmRleCA/IDAgOiBfcmVmMiRyb3dJbmRleCwgX3Byb3BzID0gdGhpcy5wcm9wcywgZml4ZWRDb2x1bW5Db3VudCA9IF9wcm9wcy5maXhlZENvbHVtbkNvdW50LCBmaXhlZFJvd0NvdW50ID0gX3Byb3BzLmZpeGVkUm93Q291bnQsIGFkanVzdGVkQ29sdW1uSW5kZXggPSBNYXRoLm1heCgwLCBjb2x1bW5JbmRleCAtIGZpeGVkQ29sdW1uQ291bnQpLCBhZGp1c3RlZFJvd0luZGV4ID0gTWF0aC5tYXgoMCwgcm93SW5kZXggLSBmaXhlZFJvd0NvdW50KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9ib3R0b21MZWZ0R3JpZCAmJiB0aGlzLl9ib3R0b21MZWZ0R3JpZC5yZWNvbXB1dGVHcmlkU2l6ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4OiBjb2x1bW5JbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGFkanVzdGVkUm93SW5kZXgKICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5fYm90dG9tUmlnaHRHcmlkICYmIHRoaXMuX2JvdHRvbVJpZ2h0R3JpZC5yZWNvbXB1dGVHcmlkU2l6ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4OiBhZGp1c3RlZENvbHVtbkluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogYWRqdXN0ZWRSb3dJbmRleAogICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl90b3BMZWZ0R3JpZCAmJiB0aGlzLl90b3BMZWZ0R3JpZC5yZWNvbXB1dGVHcmlkU2l6ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4OiBjb2x1bW5JbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IHJvd0luZGV4CiAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuX3RvcFJpZ2h0R3JpZCAmJiB0aGlzLl90b3BSaWdodEdyaWQucmVjb21wdXRlR3JpZFNpemUoewogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleDogYWRqdXN0ZWRDb2x1bW5JbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IHJvd0luZGV4CiAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuX2xlZnRHcmlkV2lkdGggPSBudWxsLCB0aGlzLl90b3BHcmlkSGVpZ2h0ID0gbnVsbCwgdGhpcy5fbWF5YmVDYWxjdWxhdGVDYWNoZWRTdHlsZXMobnVsbCwgdGhpcy5wcm9wcywgbnVsbCwgdGhpcy5zdGF0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImNvbXBvbmVudERpZE1vdW50IiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHMsIHNjcm9sbExlZnQgPSBfcHJvcHMyLnNjcm9sbExlZnQsIHNjcm9sbFRvcCA9IF9wcm9wczIuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgICAgIGlmIChzY3JvbGxMZWZ0ID4gMCB8fCBzY3JvbGxUb3AgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdTdGF0ZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0ID4gMCAmJiAobmV3U3RhdGUuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQpLCBzY3JvbGxUb3AgPiAwICYmIChuZXdTdGF0ZS5zY3JvbGxUb3AgPSBzY3JvbGxUb3ApLCAKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUludmFsaWRhdGVkR3JpZFNpemUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiY29tcG9uZW50RGlkVXBkYXRlIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihwcmV2UHJvcHMsIHByZXZTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUludmFsaWRhdGVkR3JpZFNpemUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiY29tcG9uZW50V2lsbE1vdW50IiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXliZUNhbGN1bGF0ZUNhY2hlZFN0eWxlcyhudWxsLCB0aGlzLnByb3BzLCBudWxsLCB0aGlzLnN0YXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24obmV4dFByb3BzLCBuZXh0U3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX3Byb3BzMyA9IHRoaXMucHJvcHMsIGNvbHVtbldpZHRoID0gX3Byb3BzMy5jb2x1bW5XaWR0aCwgZml4ZWRDb2x1bW5Db3VudCA9IF9wcm9wczMuZml4ZWRDb2x1bW5Db3VudCwgZml4ZWRSb3dDb3VudCA9IF9wcm9wczMuZml4ZWRSb3dDb3VudCwgcm93SGVpZ2h0ID0gX3Byb3BzMy5yb3dIZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbldpZHRoID09PSBuZXh0UHJvcHMuY29sdW1uV2lkdGggJiYgZml4ZWRDb2x1bW5Db3VudCA9PT0gbmV4dFByb3BzLmZpeGVkQ29sdW1uQ291bnQgfHwgKHRoaXMuX2xlZnRHcmlkV2lkdGggPSBudWxsKSwgCiAgICAgICAgICAgICAgICAgICAgZml4ZWRSb3dDb3VudCA9PT0gbmV4dFByb3BzLmZpeGVkUm93Q291bnQgJiYgcm93SGVpZ2h0ID09PSBuZXh0UHJvcHMucm93SGVpZ2h0IHx8ICh0aGlzLl90b3BHcmlkSGVpZ2h0ID0gbnVsbCksIAogICAgICAgICAgICAgICAgICAgIG5leHRQcm9wcy5zY3JvbGxMZWZ0ICE9PSB0aGlzLnByb3BzLnNjcm9sbExlZnQgfHwgbmV4dFByb3BzLnNjcm9sbFRvcCAhPT0gdGhpcy5wcm9wcy5zY3JvbGxUb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1N0YXRlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gbmV4dFByb3BzLnNjcm9sbExlZnQgJiYgbmV4dFByb3BzLnNjcm9sbExlZnQgPj0gMCAmJiAobmV3U3RhdGUuc2Nyb2xsTGVmdCA9IG5leHRQcm9wcy5zY3JvbGxMZWZ0KSwgCiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gbmV4dFByb3BzLnNjcm9sbFRvcCAmJiBuZXh0UHJvcHMuc2Nyb2xsVG9wID49IDAgJiYgKG5ld1N0YXRlLnNjcm9sbFRvcCA9IG5leHRQcm9wcy5zY3JvbGxUb3ApLCAKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuX21heWJlQ2FsY3VsYXRlQ2FjaGVkU3R5bGVzKHRoaXMucHJvcHMsIG5leHRQcm9wcywgdGhpcy5zdGF0ZSwgbmV4dFN0YXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAicmVuZGVyIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX3Byb3BzNCA9IHRoaXMucHJvcHMsIG9uU2Nyb2xsID0gX3Byb3BzNC5vblNjcm9sbCwgb25TZWN0aW9uUmVuZGVyZWQgPSBfcHJvcHM0Lm9uU2VjdGlvblJlbmRlcmVkLCBzY3JvbGxUb0NvbHVtbiA9IChfcHJvcHM0LnNjcm9sbExlZnQsIAogICAgICAgICAgICAgICAgICAgIF9wcm9wczQuc2Nyb2xsVG9Db2x1bW4pLCBzY3JvbGxUb1JvdyA9IChfcHJvcHM0LnNjcm9sbFRvcCwgX3Byb3BzNC5zY3JvbGxUb1JvdyksIHJlc3QgPSAoMCwgCiAgICAgICAgICAgICAgICAgICAgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMy5kZWZhdWx0KShfcHJvcHM0LCBbICJvblNjcm9sbCIsICJvblNlY3Rpb25SZW5kZXJlZCIsICJzY3JvbGxMZWZ0IiwgInNjcm9sbFRvQ29sdW1uIiwgInNjcm9sbFRvcCIsICJzY3JvbGxUb1JvdyIgXSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IHRoaXMucHJvcHMud2lkdGggfHwgMCA9PT0gdGhpcy5wcm9wcy5oZWlnaHQpIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIHZhciBfc3RhdGUgPSB0aGlzLnN0YXRlLCBzY3JvbGxMZWZ0ID0gX3N0YXRlLnNjcm9sbExlZnQsIHNjcm9sbFRvcCA9IF9zdGF0ZS5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB0aGlzLl9jb250YWluZXJPdXRlclN0eWxlCiAgICAgICAgICAgICAgICAgICAgfSwgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHRoaXMuX2NvbnRhaW5lclRvcFN0eWxlCiAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5fcmVuZGVyVG9wTGVmdEdyaWQocmVzdCksIHRoaXMuX3JlbmRlclRvcFJpZ2h0R3JpZCgoMCwgX2V4dGVuZHMzLmRlZmF1bHQpKHt9LCByZXN0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQKICAgICAgICAgICAgICAgICAgICB9KSkpLCBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2IiwgewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogdGhpcy5fY29udGFpbmVyQm90dG9tU3R5bGUKICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLl9yZW5kZXJCb3R0b21MZWZ0R3JpZCgoMCwgX2V4dGVuZHMzLmRlZmF1bHQpKHt9LCByZXN0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wCiAgICAgICAgICAgICAgICAgICAgfSkpLCB0aGlzLl9yZW5kZXJCb3R0b21SaWdodEdyaWQoKDAsIF9leHRlbmRzMy5kZWZhdWx0KSh7fSwgcmVzdCwgewogICAgICAgICAgICAgICAgICAgICAgICBvblNjcm9sbDogb25TY3JvbGwsCiAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VjdGlvblJlbmRlcmVkOiBvblNlY3Rpb25SZW5kZXJlZCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9Db2x1bW46IHNjcm9sbFRvQ29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb1Jvdzogc2Nyb2xsVG9Sb3csCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wCiAgICAgICAgICAgICAgICAgICAgfSkpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9ib3R0b21MZWZ0R3JpZFJlZiIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24ocmVmKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYm90dG9tTGVmdEdyaWQgPSByZWY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9ib3R0b21SaWdodEdyaWRSZWYiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHJlZikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2JvdHRvbVJpZ2h0R3JpZCA9IHJlZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX2NlbGxSZW5kZXJlckJvdHRvbUxlZnRHcmlkIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihfcmVmMykgewogICAgICAgICAgICAgICAgICAgIHZhciByb3dJbmRleCA9IF9yZWYzLnJvd0luZGV4LCByZXN0ID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMuZGVmYXVsdCkoX3JlZjMsIFsgInJvd0luZGV4IiBdKSwgX3Byb3BzNSA9IHRoaXMucHJvcHMsIGNlbGxSZW5kZXJlciA9IF9wcm9wczUuY2VsbFJlbmRlcmVyLCBmaXhlZFJvd0NvdW50ID0gX3Byb3BzNS5maXhlZFJvd0NvdW50LCByb3dDb3VudCA9IF9wcm9wczUucm93Q291bnQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvd0luZGV4ID09PSByb3dDb3VudCAtIGZpeGVkUm93Q291bnQgPyBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2IiwgewogICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHJlc3Qua2V5LAogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogKDAsIF9leHRlbmRzMy5kZWZhdWx0KSh7fSwgcmVzdC5zdHlsZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBTQ1JPTExCQVJfU0laRV9CVUZGRVIKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICB9KSA6IGNlbGxSZW5kZXJlcigoMCwgX2V4dGVuZHMzLmRlZmF1bHQpKHt9LCByZXN0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IHJvd0luZGV4ICsgZml4ZWRSb3dDb3VudAogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX2NlbGxSZW5kZXJlckJvdHRvbVJpZ2h0R3JpZCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oX3JlZjQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uSW5kZXggPSBfcmVmNC5jb2x1bW5JbmRleCwgcm93SW5kZXggPSBfcmVmNC5yb3dJbmRleCwgcmVzdCA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzLmRlZmF1bHQpKF9yZWY0LCBbICJjb2x1bW5JbmRleCIsICJyb3dJbmRleCIgXSksIF9wcm9wczYgPSB0aGlzLnByb3BzLCBjZWxsUmVuZGVyZXIgPSBfcHJvcHM2LmNlbGxSZW5kZXJlciwgZml4ZWRDb2x1bW5Db3VudCA9IF9wcm9wczYuZml4ZWRDb2x1bW5Db3VudCwgZml4ZWRSb3dDb3VudCA9IF9wcm9wczYuZml4ZWRSb3dDb3VudDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2VsbFJlbmRlcmVyKCgwLCBfZXh0ZW5kczMuZGVmYXVsdCkoe30sIHJlc3QsIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXg6IGNvbHVtbkluZGV4ICsgZml4ZWRDb2x1bW5Db3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogcm93SW5kZXggKyBmaXhlZFJvd0NvdW50CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfY2VsbFJlbmRlcmVyVG9wUmlnaHRHcmlkIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihfcmVmNSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5JbmRleCA9IF9yZWY1LmNvbHVtbkluZGV4LCByZXN0ID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMuZGVmYXVsdCkoX3JlZjUsIFsgImNvbHVtbkluZGV4IiBdKSwgX3Byb3BzNyA9IHRoaXMucHJvcHMsIGNlbGxSZW5kZXJlciA9IF9wcm9wczcuY2VsbFJlbmRlcmVyLCBjb2x1bW5Db3VudCA9IF9wcm9wczcuY29sdW1uQ291bnQsIGZpeGVkQ29sdW1uQ291bnQgPSBfcHJvcHM3LmZpeGVkQ29sdW1uQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbkluZGV4ID09PSBjb2x1bW5Db3VudCAtIGZpeGVkQ29sdW1uQ291bnQgPyBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2IiwgewogICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHJlc3Qua2V5LAogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogKDAsIF9leHRlbmRzMy5kZWZhdWx0KSh7fSwgcmVzdC5zdHlsZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IFNDUk9MTEJBUl9TSVpFX0JVRkZFUgogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIH0pIDogY2VsbFJlbmRlcmVyKCgwLCBfZXh0ZW5kczMuZGVmYXVsdCkoe30sIHJlc3QsIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXg6IGNvbHVtbkluZGV4ICsgZml4ZWRDb2x1bW5Db3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiB0aGlzCiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfY29sdW1uV2lkdGhSaWdodEdyaWQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKF9yZWY2KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gX3JlZjYuaW5kZXgsIF9wcm9wczggPSB0aGlzLnByb3BzLCBjb2x1bW5Db3VudCA9IF9wcm9wczguY29sdW1uQ291bnQsIGZpeGVkQ29sdW1uQ291bnQgPSBfcHJvcHM4LmZpeGVkQ29sdW1uQ291bnQsIGNvbHVtbldpZHRoID0gX3Byb3BzOC5jb2x1bW5XaWR0aDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPT09IGNvbHVtbkNvdW50IC0gZml4ZWRDb2x1bW5Db3VudCA/IFNDUk9MTEJBUl9TSVpFX0JVRkZFUiA6ICJmdW5jdGlvbiIgPT0gdHlwZW9mIGNvbHVtbldpZHRoID8gY29sdW1uV2lkdGgoewogICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXggKyBmaXhlZENvbHVtbkNvdW50CiAgICAgICAgICAgICAgICAgICAgfSkgOiBjb2x1bW5XaWR0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX2dldEJvdHRvbUdyaWRIZWlnaHQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHByb3BzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IHByb3BzLmhlaWdodCwgdG9wR3JpZEhlaWdodCA9IHRoaXMuX2dldFRvcEdyaWRIZWlnaHQocHJvcHMpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBoZWlnaHQgLSB0b3BHcmlkSGVpZ2h0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfZ2V0TGVmdEdyaWRXaWR0aCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24ocHJvcHMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZml4ZWRDb2x1bW5Db3VudCA9IHByb3BzLmZpeGVkQ29sdW1uQ291bnQsIGNvbHVtbldpZHRoID0gcHJvcHMuY29sdW1uV2lkdGg7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gdGhpcy5fbGVmdEdyaWRXaWR0aCkgaWYgKCJmdW5jdGlvbiIgPT0gdHlwZW9mIGNvbHVtbldpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGxlZnRHcmlkV2lkdGggPSAwLCBpbmRleCA9IDA7IGluZGV4IDwgZml4ZWRDb2x1bW5Db3VudDsgaW5kZXgrKykgbGVmdEdyaWRXaWR0aCArPSBjb2x1bW5XaWR0aCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xlZnRHcmlkV2lkdGggPSBsZWZ0R3JpZFdpZHRoOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLl9sZWZ0R3JpZFdpZHRoID0gY29sdW1uV2lkdGggKiBmaXhlZENvbHVtbkNvdW50OwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9sZWZ0R3JpZFdpZHRoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfZ2V0UmlnaHRHcmlkV2lkdGgiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHByb3BzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gcHJvcHMud2lkdGgsIGxlZnRHcmlkV2lkdGggPSB0aGlzLl9nZXRMZWZ0R3JpZFdpZHRoKHByb3BzKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2lkdGggLSBsZWZ0R3JpZFdpZHRoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfZ2V0VG9wR3JpZEhlaWdodCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24ocHJvcHMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZml4ZWRSb3dDb3VudCA9IHByb3BzLmZpeGVkUm93Q291bnQsIHJvd0hlaWdodCA9IHByb3BzLnJvd0hlaWdodDsKICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSB0aGlzLl90b3BHcmlkSGVpZ2h0KSBpZiAoImZ1bmN0aW9uIiA9PSB0eXBlb2Ygcm93SGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHRvcEdyaWRIZWlnaHQgPSAwLCBpbmRleCA9IDA7IGluZGV4IDwgZml4ZWRSb3dDb3VudDsgaW5kZXgrKykgdG9wR3JpZEhlaWdodCArPSByb3dIZWlnaHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90b3BHcmlkSGVpZ2h0ID0gdG9wR3JpZEhlaWdodDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgdGhpcy5fdG9wR3JpZEhlaWdodCA9IHJvd0hlaWdodCAqIGZpeGVkUm93Q291bnQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RvcEdyaWRIZWlnaHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9oYW5kbGVJbnZhbGlkYXRlZEdyaWRTaXplIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIm51bWJlciIgPT0gdHlwZW9mIHRoaXMuX2RlZmVycmVkSW52YWxpZGF0ZUNvbHVtbkluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5JbmRleCA9IHRoaXMuX2RlZmVycmVkSW52YWxpZGF0ZUNvbHVtbkluZGV4LCByb3dJbmRleCA9IHRoaXMuX2RlZmVycmVkSW52YWxpZGF0ZVJvd0luZGV4OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWZlcnJlZEludmFsaWRhdGVDb2x1bW5JbmRleCA9IG51bGwsIHRoaXMuX2RlZmVycmVkSW52YWxpZGF0ZVJvd0luZGV4ID0gbnVsbCwgCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb21wdXRlR3JpZFNpemUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXg6IGNvbHVtbkluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IHJvd0luZGV4CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLmZvcmNlVXBkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfbWF5YmVDYWxjdWxhdGVDYWNoZWRTdHlsZXMiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHByZXZQcm9wcywgcHJvcHMsIHByZXZTdGF0ZSwgc3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uV2lkdGggPSBwcm9wcy5jb2x1bW5XaWR0aCwgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LCBmaXhlZENvbHVtbkNvdW50ID0gcHJvcHMuZml4ZWRDb2x1bW5Db3VudCwgZml4ZWRSb3dDb3VudCA9IHByb3BzLmZpeGVkUm93Q291bnQsIHJvd0hlaWdodCA9IHByb3BzLnJvd0hlaWdodCwgc3R5bGUgPSBwcm9wcy5zdHlsZSwgc3R5bGVCb3R0b21MZWZ0R3JpZCA9IHByb3BzLnN0eWxlQm90dG9tTGVmdEdyaWQsIHN0eWxlQm90dG9tUmlnaHRHcmlkID0gcHJvcHMuc3R5bGVCb3R0b21SaWdodEdyaWQsIHN0eWxlVG9wTGVmdEdyaWQgPSBwcm9wcy5zdHlsZVRvcExlZnRHcmlkLCBzdHlsZVRvcFJpZ2h0R3JpZCA9IHByb3BzLnN0eWxlVG9wUmlnaHRHcmlkLCB3aWR0aCA9IHByb3BzLndpZHRoLCBmaXJzdFJlbmRlciA9ICFwcmV2UHJvcHMsIHNpemVDaGFuZ2UgPSBmaXJzdFJlbmRlciB8fCBoZWlnaHQgIT09IHByZXZQcm9wcy5oZWlnaHQgfHwgd2lkdGggIT09IHByZXZQcm9wcy53aWR0aCwgbGVmdFNpemVDaGFuZ2UgPSBmaXJzdFJlbmRlciB8fCBjb2x1bW5XaWR0aCAhPT0gcHJldlByb3BzLmNvbHVtbldpZHRoIHx8IGZpeGVkQ29sdW1uQ291bnQgIT09IHByZXZQcm9wcy5maXhlZENvbHVtbkNvdW50LCB0b3BTaXplQ2hhbmdlID0gZmlyc3RSZW5kZXIgfHwgZml4ZWRSb3dDb3VudCAhPT0gcHJldlByb3BzLmZpeGVkUm93Q291bnQgfHwgcm93SGVpZ2h0ICE9PSBwcmV2UHJvcHMucm93SGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIChmaXJzdFJlbmRlciB8fCBzaXplQ2hhbmdlIHx8IHN0eWxlICE9PSBwcmV2UHJvcHMuc3R5bGUpICYmICh0aGlzLl9jb250YWluZXJPdXRlclN0eWxlID0gKDAsIAogICAgICAgICAgICAgICAgICAgIF9leHRlbmRzMy5kZWZhdWx0KSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogInZpc2libGUiLAogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgKICAgICAgICAgICAgICAgICAgICB9LCBzdHlsZSkpLCAoZmlyc3RSZW5kZXIgfHwgc2l6ZUNoYW5nZSB8fCB0b3BTaXplQ2hhbmdlKSAmJiAodGhpcy5fY29udGFpbmVyVG9wU3R5bGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5fZ2V0VG9wR3JpZEhlaWdodChwcm9wcyksCiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAicmVsYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgKICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLl9jb250YWluZXJCb3R0b21TdHlsZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSB0aGlzLl9nZXRUb3BHcmlkSGVpZ2h0KHByb3BzKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6ICJ2aXNpYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICJyZWxhdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aAogICAgICAgICAgICAgICAgICAgIH0pLCAoZmlyc3RSZW5kZXIgfHwgc3R5bGVCb3R0b21MZWZ0R3JpZCAhPT0gcHJldlByb3BzLnN0eWxlQm90dG9tTGVmdEdyaWQpICYmICh0aGlzLl9ib3R0b21MZWZ0R3JpZFN0eWxlID0gKDAsIAogICAgICAgICAgICAgICAgICAgIF9leHRlbmRzMy5kZWZhdWx0KSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93WDogImhpZGRlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93WTogImhpZGRlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAiYWJzb2x1dGUiCiAgICAgICAgICAgICAgICAgICAgfSwgc3R5bGVCb3R0b21MZWZ0R3JpZCkpLCAoZmlyc3RSZW5kZXIgfHwgbGVmdFNpemVDaGFuZ2UgfHwgc3R5bGVCb3R0b21SaWdodEdyaWQgIT09IHByZXZQcm9wcy5zdHlsZUJvdHRvbVJpZ2h0R3JpZCkgJiYgKHRoaXMuX2JvdHRvbVJpZ2h0R3JpZFN0eWxlID0gKDAsIAogICAgICAgICAgICAgICAgICAgIF9leHRlbmRzMy5kZWZhdWx0KSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHRoaXMuX2dldExlZnRHcmlkV2lkdGgocHJvcHMpLAogICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogImFic29sdXRlIgogICAgICAgICAgICAgICAgICAgIH0sIHN0eWxlQm90dG9tUmlnaHRHcmlkKSksIChmaXJzdFJlbmRlciB8fCBzdHlsZVRvcExlZnRHcmlkICE9PSBwcmV2UHJvcHMuc3R5bGVUb3BMZWZ0R3JpZCkgJiYgKHRoaXMuX3RvcExlZnRHcmlkU3R5bGUgPSAoMCwgCiAgICAgICAgICAgICAgICAgICAgX2V4dGVuZHMzLmRlZmF1bHQpKHsKICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3dYOiAiaGlkZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3dZOiAiaGlkZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICJhYnNvbHV0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogMAogICAgICAgICAgICAgICAgICAgIH0sIHN0eWxlVG9wTGVmdEdyaWQpKSwgKGZpcnN0UmVuZGVyIHx8IGxlZnRTaXplQ2hhbmdlIHx8IHN0eWxlVG9wUmlnaHRHcmlkICE9PSBwcmV2UHJvcHMuc3R5bGVUb3BSaWdodEdyaWQpICYmICh0aGlzLl90b3BSaWdodEdyaWRTdHlsZSA9ICgwLCAKICAgICAgICAgICAgICAgICAgICBfZXh0ZW5kczMuZGVmYXVsdCkoewogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiB0aGlzLl9nZXRMZWZ0R3JpZFdpZHRoKHByb3BzKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3dYOiAiaGlkZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3dZOiAiaGlkZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICJhYnNvbHV0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogMAogICAgICAgICAgICAgICAgICAgIH0sIHN0eWxlVG9wUmlnaHRHcmlkKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9vblNjcm9sbCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oc2Nyb2xsSW5mbykgewogICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxMZWZ0ID0gc2Nyb2xsSW5mby5zY3JvbGxMZWZ0LCBzY3JvbGxUb3AgPSBzY3JvbGxJbmZvLnNjcm9sbFRvcDsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3AKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB2YXIgb25TY3JvbGwgPSB0aGlzLnByb3BzLm9uU2Nyb2xsOwogICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsICYmIG9uU2Nyb2xsKHNjcm9sbEluZm8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfcmVuZGVyQm90dG9tTGVmdEdyaWQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHByb3BzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpeGVkQ29sdW1uQ291bnQgPSBwcm9wcy5maXhlZENvbHVtbkNvdW50LCBmaXhlZFJvd0NvdW50ID0gcHJvcHMuZml4ZWRSb3dDb3VudCwgcm93Q291bnQgPSBwcm9wcy5yb3dDb3VudCwgc2Nyb2xsVG9wID0gcHJvcHMuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXhlZENvbHVtbkNvdW50ID8gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX0dyaWQyLmRlZmF1bHQsICgwLCBfZXh0ZW5kczMuZGVmYXVsdCkoe30sIHByb3BzLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlcjogdGhpcy5fY2VsbFJlbmRlcmVyQm90dG9tTGVmdEdyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvdW50OiBmaXhlZENvbHVtbkNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuX2dldEJvdHRvbUdyaWRIZWlnaHQocHJvcHMpLAogICAgICAgICAgICAgICAgICAgICAgICByZWY6IHRoaXMuX2JvdHRvbUxlZnRHcmlkUmVmLAogICAgICAgICAgICAgICAgICAgICAgICByb3dDb3VudDogTWF0aC5tYXgoMCwgcm93Q291bnQgLSBmaXhlZFJvd0NvdW50KSArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0hlaWdodDogdGhpcy5fcm93SGVpZ2h0Qm90dG9tR3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3AsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB0aGlzLl9ib3R0b21MZWZ0R3JpZFN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICB0YWJJbmRleDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMuX2dldExlZnRHcmlkV2lkdGgocHJvcHMpCiAgICAgICAgICAgICAgICAgICAgfSkpIDogbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX3JlbmRlckJvdHRvbVJpZ2h0R3JpZCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24ocHJvcHMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uQ291bnQgPSBwcm9wcy5jb2x1bW5Db3VudCwgZml4ZWRDb2x1bW5Db3VudCA9IHByb3BzLmZpeGVkQ29sdW1uQ291bnQsIGZpeGVkUm93Q291bnQgPSBwcm9wcy5maXhlZFJvd0NvdW50LCByb3dDb3VudCA9IHByb3BzLnJvd0NvdW50LCBzY3JvbGxUb0NvbHVtbiA9IHByb3BzLnNjcm9sbFRvQ29sdW1uLCBzY3JvbGxUb1JvdyA9IHByb3BzLnNjcm9sbFRvUm93OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChfR3JpZDIuZGVmYXVsdCwgKDAsIF9leHRlbmRzMy5kZWZhdWx0KSh7fSwgcHJvcHMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFJlbmRlcmVyOiB0aGlzLl9jZWxsUmVuZGVyZXJCb3R0b21SaWdodEdyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvdW50OiBNYXRoLm1heCgwLCBjb2x1bW5Db3VudCAtIGZpeGVkQ29sdW1uQ291bnQpLAogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5XaWR0aDogdGhpcy5fY29sdW1uV2lkdGhSaWdodEdyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5fZ2V0Qm90dG9tR3JpZEhlaWdodChwcm9wcyksCiAgICAgICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsOiB0aGlzLl9vblNjcm9sbCwKICAgICAgICAgICAgICAgICAgICAgICAgcmVmOiB0aGlzLl9ib3R0b21SaWdodEdyaWRSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0NvdW50OiBNYXRoLm1heCgwLCByb3dDb3VudCAtIGZpeGVkUm93Q291bnQpLAogICAgICAgICAgICAgICAgICAgICAgICByb3dIZWlnaHQ6IHRoaXMuX3Jvd0hlaWdodEJvdHRvbUdyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvQ29sdW1uOiBzY3JvbGxUb0NvbHVtbiAtIGZpeGVkQ29sdW1uQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvUm93OiBzY3JvbGxUb1JvdyAtIGZpeGVkUm93Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB0aGlzLl9ib3R0b21SaWdodEdyaWRTdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMuX2dldFJpZ2h0R3JpZFdpZHRoKHByb3BzKQogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX3JlbmRlclRvcExlZnRHcmlkIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihwcm9wcykgewogICAgICAgICAgICAgICAgICAgIHZhciBmaXhlZENvbHVtbkNvdW50ID0gcHJvcHMuZml4ZWRDb2x1bW5Db3VudCwgZml4ZWRSb3dDb3VudCA9IHByb3BzLmZpeGVkUm93Q291bnQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpeGVkQ29sdW1uQ291bnQgJiYgZml4ZWRSb3dDb3VudCA/IF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9HcmlkMi5kZWZhdWx0LCAoMCwgCiAgICAgICAgICAgICAgICAgICAgX2V4dGVuZHMzLmRlZmF1bHQpKHt9LCBwcm9wcywgewogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db3VudDogZml4ZWRDb2x1bW5Db3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLl9nZXRUb3BHcmlkSGVpZ2h0KHByb3BzKSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVmOiB0aGlzLl90b3BMZWZ0R3JpZFJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgcm93Q291bnQ6IGZpeGVkUm93Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB0aGlzLl90b3BMZWZ0R3JpZFN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICB0YWJJbmRleDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMuX2dldExlZnRHcmlkV2lkdGgocHJvcHMpCiAgICAgICAgICAgICAgICAgICAgfSkpIDogbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX3JlbmRlclRvcFJpZ2h0R3JpZCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24ocHJvcHMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uQ291bnQgPSBwcm9wcy5jb2x1bW5Db3VudCwgZml4ZWRDb2x1bW5Db3VudCA9IHByb3BzLmZpeGVkQ29sdW1uQ291bnQsIGZpeGVkUm93Q291bnQgPSBwcm9wcy5maXhlZFJvd0NvdW50LCBzY3JvbGxMZWZ0ID0gcHJvcHMuc2Nyb2xsTGVmdDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZml4ZWRSb3dDb3VudCA/IF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9HcmlkMi5kZWZhdWx0LCAoMCwgX2V4dGVuZHMzLmRlZmF1bHQpKHt9LCBwcm9wcywgewogICAgICAgICAgICAgICAgICAgICAgICBjZWxsUmVuZGVyZXI6IHRoaXMuX2NlbGxSZW5kZXJlclRvcFJpZ2h0R3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uQ291bnQ6IE1hdGgubWF4KDAsIGNvbHVtbkNvdW50IC0gZml4ZWRDb2x1bW5Db3VudCkgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5XaWR0aDogdGhpcy5fY29sdW1uV2lkdGhSaWdodEdyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5fZ2V0VG9wR3JpZEhlaWdodChwcm9wcyksCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZjogdGhpcy5fdG9wUmlnaHRHcmlkUmVmLAogICAgICAgICAgICAgICAgICAgICAgICByb3dDb3VudDogZml4ZWRSb3dDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHRoaXMuX3RvcFJpZ2h0R3JpZFN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICB0YWJJbmRleDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMuX2dldFJpZ2h0R3JpZFdpZHRoKHByb3BzKQogICAgICAgICAgICAgICAgICAgIH0pKSA6IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9yb3dIZWlnaHRCb3R0b21HcmlkIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihfcmVmNykgewogICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IF9yZWY3LmluZGV4LCBfcHJvcHM5ID0gdGhpcy5wcm9wcywgZml4ZWRSb3dDb3VudCA9IF9wcm9wczkuZml4ZWRSb3dDb3VudCwgcm93Q291bnQgPSBfcHJvcHM5LnJvd0NvdW50LCByb3dIZWlnaHQgPSBfcHJvcHM5LnJvd0hlaWdodDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPT09IHJvd0NvdW50IC0gZml4ZWRSb3dDb3VudCA/IFNDUk9MTEJBUl9TSVpFX0JVRkZFUiA6ICJmdW5jdGlvbiIgPT0gdHlwZW9mIHJvd0hlaWdodCA/IHJvd0hlaWdodCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCArIGZpeGVkUm93Q291bnQKICAgICAgICAgICAgICAgICAgICB9KSA6IHJvd0hlaWdodDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX3RvcExlZnRHcmlkUmVmIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihyZWYpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90b3BMZWZ0R3JpZCA9IHJlZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX3RvcFJpZ2h0R3JpZFJlZiIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24ocmVmKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdG9wUmlnaHRHcmlkID0gcmVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IF0pLCBNdWx0aUdyaWQ7CiAgICAgICAgfShfcmVhY3QuUHVyZUNvbXBvbmVudCk7CiAgICAgICAgTXVsdGlHcmlkLmRlZmF1bHRQcm9wcyA9IHsKICAgICAgICAgICAgZml4ZWRDb2x1bW5Db3VudDogMCwKICAgICAgICAgICAgZml4ZWRSb3dDb3VudDogMCwKICAgICAgICAgICAgc3R5bGU6IHt9LAogICAgICAgICAgICBzdHlsZUJvdHRvbUxlZnRHcmlkOiB7fSwKICAgICAgICAgICAgc3R5bGVCb3R0b21SaWdodEdyaWQ6IHt9LAogICAgICAgICAgICBzdHlsZVRvcExlZnRHcmlkOiB7fSwKICAgICAgICAgICAgc3R5bGVUb3BSaWdodEdyaWQ6IHt9CiAgICAgICAgfSwgZXhwb3J0cy5kZWZhdWx0ID0gTXVsdGlHcmlkOwogICAgfSwgLyogMTYwICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvYmoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KSwgZXhwb3J0cy5TY3JvbGxTeW5jID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwOwogICAgICAgIHZhciBfU2Nyb2xsU3luYzIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2MSksIF9TY3JvbGxTeW5jMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1Njcm9sbFN5bmMyKTsKICAgICAgICBleHBvcnRzLmRlZmF1bHQgPSBfU2Nyb2xsU3luYzMuZGVmYXVsdCwgZXhwb3J0cy5TY3JvbGxTeW5jID0gX1Njcm9sbFN5bmMzLmRlZmF1bHQ7CiAgICB9LCAvKiAxNjEgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsKICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG9iagogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgICAgICAgICAgIHZhbHVlOiAhMAogICAgICAgIH0pOwogICAgICAgIHZhciBfZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpLCBfZ2V0UHJvdG90eXBlT2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0UHJvdG90eXBlT2YpLCBfY2xhc3NDYWxsQ2hlY2syID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSksIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpLCBfY3JlYXRlQ2xhc3MyID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMCksIF9jcmVhdGVDbGFzczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDbGFzczIpLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpLCBfaW5oZXJpdHMyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MSksIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpLCBfcHJvcFR5cGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OSksIF9yZWFjdCA9IChfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpLCAKICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3KSksIFNjcm9sbFN5bmMgPSBmdW5jdGlvbihfUHVyZUNvbXBvbmVudCkgewogICAgICAgICAgICBmdW5jdGlvbiBTY3JvbGxTeW5jKHByb3BzLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBTY3JvbGxTeW5jKTsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMuZGVmYXVsdCkodGhpcywgKFNjcm9sbFN5bmMuX19wcm90b19fIHx8ICgwLCAKICAgICAgICAgICAgICAgIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoU2Nyb2xsU3luYykpLmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5zdGF0ZSA9IHsKICAgICAgICAgICAgICAgICAgICBjbGllbnRIZWlnaHQ6IDAsCiAgICAgICAgICAgICAgICAgICAgY2xpZW50V2lkdGg6IDAsCiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsSGVpZ2h0OiAwLAogICAgICAgICAgICAgICAgICAgIHNjcm9sbExlZnQ6IDAsCiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiAwLAogICAgICAgICAgICAgICAgICAgIHNjcm9sbFdpZHRoOiAwCiAgICAgICAgICAgICAgICB9LCBfdGhpcy5fb25TY3JvbGwgPSBfdGhpcy5fb25TY3JvbGwuYmluZChfdGhpcyksIF90aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAoMCwgX2luaGVyaXRzMy5kZWZhdWx0KShTY3JvbGxTeW5jLCBfUHVyZUNvbXBvbmVudCksICgwLCBfY3JlYXRlQ2xhc3MzLmRlZmF1bHQpKFNjcm9sbFN5bmMsIFsgewogICAgICAgICAgICAgICAga2V5OiAicmVuZGVyIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuLCBfc3RhdGUgPSB0aGlzLnN0YXRlLCBjbGllbnRIZWlnaHQgPSBfc3RhdGUuY2xpZW50SGVpZ2h0LCBjbGllbnRXaWR0aCA9IF9zdGF0ZS5jbGllbnRXaWR0aCwgc2Nyb2xsSGVpZ2h0ID0gX3N0YXRlLnNjcm9sbEhlaWdodCwgc2Nyb2xsTGVmdCA9IF9zdGF0ZS5zY3JvbGxMZWZ0LCBzY3JvbGxUb3AgPSBfc3RhdGUuc2Nyb2xsVG9wLCBzY3JvbGxXaWR0aCA9IF9zdGF0ZS5zY3JvbGxXaWR0aDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4oewogICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRIZWlnaHQ6IGNsaWVudEhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50V2lkdGg6IGNsaWVudFdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICBvblNjcm9sbDogdGhpcy5fb25TY3JvbGwsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEhlaWdodDogc2Nyb2xsSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0OiBzY3JvbGxMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3A6IHNjcm9sbFRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsV2lkdGg6IHNjcm9sbFdpZHRoCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9vblNjcm9sbCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oX3JlZikgewogICAgICAgICAgICAgICAgICAgIHZhciBjbGllbnRIZWlnaHQgPSBfcmVmLmNsaWVudEhlaWdodCwgY2xpZW50V2lkdGggPSBfcmVmLmNsaWVudFdpZHRoLCBzY3JvbGxIZWlnaHQgPSBfcmVmLnNjcm9sbEhlaWdodCwgc2Nyb2xsTGVmdCA9IF9yZWYuc2Nyb2xsTGVmdCwgc2Nyb2xsVG9wID0gX3JlZi5zY3JvbGxUb3AsIHNjcm9sbFdpZHRoID0gX3JlZi5zY3JvbGxXaWR0aDsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50SGVpZ2h0OiBjbGllbnRIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFdpZHRoOiBjbGllbnRXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsSGVpZ2h0OiBzY3JvbGxIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wLAogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxXaWR0aDogc2Nyb2xsV2lkdGgKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBdKSwgU2Nyb2xsU3luYzsKICAgICAgICB9KF9yZWFjdC5QdXJlQ29tcG9uZW50KTsKICAgICAgICBleHBvcnRzLmRlZmF1bHQgPSBTY3JvbGxTeW5jOwogICAgfSwgLyogMTYyICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvYmoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KSwgZXhwb3J0cy5Tb3J0SW5kaWNhdG9yID0gZXhwb3J0cy5Tb3J0RGlyZWN0aW9uID0gZXhwb3J0cy5Db2x1bW4gPSBleHBvcnRzLlRhYmxlID0gZXhwb3J0cy5kZWZhdWx0Um93UmVuZGVyZXIgPSBleHBvcnRzLmRlZmF1bHRIZWFkZXJSZW5kZXJlciA9IGV4cG9ydHMuZGVmYXVsdEhlYWRlclJvd1JlbmRlcmVyID0gZXhwb3J0cy5kZWZhdWx0Q2VsbFJlbmRlcmVyID0gZXhwb3J0cy5kZWZhdWx0Q2VsbERhdGFHZXR0ZXIgPSBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7CiAgICAgICAgdmFyIF9UYWJsZTIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2MyksIF9UYWJsZTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UYWJsZTIpLCBfZGVmYXVsdENlbGxEYXRhR2V0dGVyMiA9IF9fd2VicGFja19yZXF1aXJlX18oMTY5KSwgX2RlZmF1bHRDZWxsRGF0YUdldHRlcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZWZhdWx0Q2VsbERhdGFHZXR0ZXIyKSwgX2RlZmF1bHRDZWxsUmVuZGVyZXIyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjgpLCBfZGVmYXVsdENlbGxSZW5kZXJlcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZWZhdWx0Q2VsbFJlbmRlcmVyMiksIF9kZWZhdWx0SGVhZGVyUm93UmVuZGVyZXIyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzEpLCBfZGVmYXVsdEhlYWRlclJvd1JlbmRlcmVyMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZmF1bHRIZWFkZXJSb3dSZW5kZXJlcjIpLCBfZGVmYXVsdEhlYWRlclJlbmRlcmVyMiA9IF9fd2VicGFja19yZXF1aXJlX18oMTY1KSwgX2RlZmF1bHRIZWFkZXJSZW5kZXJlcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZWZhdWx0SGVhZGVyUmVuZGVyZXIyKSwgX2RlZmF1bHRSb3dSZW5kZXJlcjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3MCksIF9kZWZhdWx0Um93UmVuZGVyZXIzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmYXVsdFJvd1JlbmRlcmVyMiksIF9Db2x1bW4yID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjQpLCBfQ29sdW1uMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NvbHVtbjIpLCBfU29ydERpcmVjdGlvbjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2NyksIF9Tb3J0RGlyZWN0aW9uMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1NvcnREaXJlY3Rpb24yKSwgX1NvcnRJbmRpY2F0b3IyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjYpLCBfU29ydEluZGljYXRvcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Tb3J0SW5kaWNhdG9yMik7CiAgICAgICAgZXhwb3J0cy5kZWZhdWx0ID0gX1RhYmxlMy5kZWZhdWx0LCBleHBvcnRzLmRlZmF1bHRDZWxsRGF0YUdldHRlciA9IF9kZWZhdWx0Q2VsbERhdGFHZXR0ZXIzLmRlZmF1bHQsIAogICAgICAgIGV4cG9ydHMuZGVmYXVsdENlbGxSZW5kZXJlciA9IF9kZWZhdWx0Q2VsbFJlbmRlcmVyMy5kZWZhdWx0LCBleHBvcnRzLmRlZmF1bHRIZWFkZXJSb3dSZW5kZXJlciA9IF9kZWZhdWx0SGVhZGVyUm93UmVuZGVyZXIzLmRlZmF1bHQsIAogICAgICAgIGV4cG9ydHMuZGVmYXVsdEhlYWRlclJlbmRlcmVyID0gX2RlZmF1bHRIZWFkZXJSZW5kZXJlcjMuZGVmYXVsdCwgZXhwb3J0cy5kZWZhdWx0Um93UmVuZGVyZXIgPSBfZGVmYXVsdFJvd1JlbmRlcmVyMy5kZWZhdWx0LCAKICAgICAgICBleHBvcnRzLlRhYmxlID0gX1RhYmxlMy5kZWZhdWx0LCBleHBvcnRzLkNvbHVtbiA9IF9Db2x1bW4zLmRlZmF1bHQsIGV4cG9ydHMuU29ydERpcmVjdGlvbiA9IF9Tb3J0RGlyZWN0aW9uMy5kZWZhdWx0LCAKICAgICAgICBleHBvcnRzLlNvcnRJbmRpY2F0b3IgPSBfU29ydEluZGljYXRvcjMuZGVmYXVsdDsKICAgIH0sIC8qIDE2MyAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSk7CiAgICAgICAgdmFyIF9leHRlbmRzMiA9IF9fd2VicGFja19yZXF1aXJlX18oMTA3KSwgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpLCBfZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpLCBfZ2V0UHJvdG90eXBlT2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0UHJvdG90eXBlT2YpLCBfY2xhc3NDYWxsQ2hlY2syID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSksIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpLCBfY3JlYXRlQ2xhc3MyID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMCksIF9jcmVhdGVDbGFzczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDbGFzczIpLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpLCBfaW5oZXJpdHMyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MSksIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpLCBfY2xhc3NuYW1lcyA9IF9fd2VicGFja19yZXF1aXJlX18oMTE0KSwgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyksIF9Db2x1bW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2NCksIF9wcm9wVHlwZXMgPSAoX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ29sdW1uKSwgCiAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXyg4OSkpLCBfcmVhY3QgPSAoX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKSwgX193ZWJwYWNrX3JlcXVpcmVfXyg5NykpLCBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpLCBfcmVhY3REb20gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMyksIF9HcmlkID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjcpLCBfR3JpZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9HcmlkKSwgX2RlZmF1bHRSb3dSZW5kZXJlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTcwKSwgX2RlZmF1bHRSb3dSZW5kZXJlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZWZhdWx0Um93UmVuZGVyZXIpLCBfZGVmYXVsdEhlYWRlclJvd1JlbmRlcmVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzEpLCBfZGVmYXVsdEhlYWRlclJvd1JlbmRlcmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZmF1bHRIZWFkZXJSb3dSZW5kZXJlciksIF9Tb3J0RGlyZWN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjcpLCBfU29ydERpcmVjdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Tb3J0RGlyZWN0aW9uKSwgVGFibGUgPSBmdW5jdGlvbihfUHVyZUNvbXBvbmVudCkgewogICAgICAgICAgICBmdW5jdGlvbiBUYWJsZShwcm9wcykgewogICAgICAgICAgICAgICAgKDAsIF9jbGFzc0NhbGxDaGVjazMuZGVmYXVsdCkodGhpcywgVGFibGUpOwogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMy5kZWZhdWx0KSh0aGlzLCAoVGFibGUuX19wcm90b19fIHx8ICgwLCAKICAgICAgICAgICAgICAgIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoVGFibGUpKS5jYWxsKHRoaXMsIHByb3BzKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuc3RhdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYmFyV2lkdGg6IDAKICAgICAgICAgICAgICAgIH0sIF90aGlzLl9jcmVhdGVDb2x1bW4gPSBfdGhpcy5fY3JlYXRlQ29sdW1uLmJpbmQoX3RoaXMpLCBfdGhpcy5fY3JlYXRlUm93ID0gX3RoaXMuX2NyZWF0ZVJvdy5iaW5kKF90aGlzKSwgCiAgICAgICAgICAgICAgICBfdGhpcy5fb25TY3JvbGwgPSBfdGhpcy5fb25TY3JvbGwuYmluZChfdGhpcyksIF90aGlzLl9vblNlY3Rpb25SZW5kZXJlZCA9IF90aGlzLl9vblNlY3Rpb25SZW5kZXJlZC5iaW5kKF90aGlzKSwgCiAgICAgICAgICAgICAgICBfdGhpcy5fc2V0UmVmID0gX3RoaXMuX3NldFJlZi5iaW5kKF90aGlzKSwgX3RoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICgwLCBfaW5oZXJpdHMzLmRlZmF1bHQpKFRhYmxlLCBfUHVyZUNvbXBvbmVudCksICgwLCBfY3JlYXRlQ2xhc3MzLmRlZmF1bHQpKFRhYmxlLCBbIHsKICAgICAgICAgICAgICAgIGtleTogImZvcmNlVXBkYXRlR3JpZCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5HcmlkLmZvcmNlVXBkYXRlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImdldE9mZnNldEZvclJvdyIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oX3JlZikgewogICAgICAgICAgICAgICAgICAgIHZhciBhbGlnbm1lbnQgPSBfcmVmLmFsaWdubWVudCwgaW5kZXggPSBfcmVmLmluZGV4LCBfR3JpZCRnZXRPZmZzZXRGb3JDZWwgPSB0aGlzLkdyaWQuZ2V0T2Zmc2V0Rm9yQ2VsbCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogYWxpZ25tZW50LAogICAgICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogaW5kZXgKICAgICAgICAgICAgICAgICAgICB9KSwgc2Nyb2xsVG9wID0gX0dyaWQkZ2V0T2Zmc2V0Rm9yQ2VsLnNjcm9sbFRvcDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJtZWFzdXJlQWxsUm93cyIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5HcmlkLm1lYXN1cmVBbGxDZWxscygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJyZWNvbXB1dGVSb3dIZWlnaHRzIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IDA7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5HcmlkLnJlY29tcHV0ZUdyaWRTaXplKHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGluZGV4CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogInNjcm9sbFRvUG9zaXRpb24iLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxUb3AgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IDA7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5HcmlkLnNjcm9sbFRvUG9zaXRpb24oewogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3A6IHNjcm9sbFRvcAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJzY3JvbGxUb1JvdyIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiAwOwogICAgICAgICAgICAgICAgICAgIHRoaXMuR3JpZC5zY3JvbGxUb0NlbGwoewogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGluZGV4CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImNvbXBvbmVudERpZE1vdW50IiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXRTY3JvbGxiYXJXaWR0aCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJjb21wb25lbnREaWRVcGRhdGUiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NldFNjcm9sbGJhcldpZHRoKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogInJlbmRlciIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXMsIF9wcm9wcyA9IHRoaXMucHJvcHMsIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLCBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLCBkaXNhYmxlSGVhZGVyID0gX3Byb3BzLmRpc2FibGVIZWFkZXIsIGdyaWRDbGFzc05hbWUgPSBfcHJvcHMuZ3JpZENsYXNzTmFtZSwgZ3JpZFN0eWxlID0gX3Byb3BzLmdyaWRTdHlsZSwgaGVhZGVySGVpZ2h0ID0gX3Byb3BzLmhlYWRlckhlaWdodCwgaGVhZGVyUm93UmVuZGVyZXIgPSBfcHJvcHMuaGVhZGVyUm93UmVuZGVyZXIsIGhlaWdodCA9IF9wcm9wcy5oZWlnaHQsIGlkID0gX3Byb3BzLmlkLCBub1Jvd3NSZW5kZXJlciA9IF9wcm9wcy5ub1Jvd3NSZW5kZXJlciwgcm93Q2xhc3NOYW1lID0gX3Byb3BzLnJvd0NsYXNzTmFtZSwgcm93U3R5bGUgPSBfcHJvcHMucm93U3R5bGUsIHNjcm9sbFRvSW5kZXggPSBfcHJvcHMuc2Nyb2xsVG9JbmRleCwgc3R5bGUgPSBfcHJvcHMuc3R5bGUsIHdpZHRoID0gX3Byb3BzLndpZHRoLCBzY3JvbGxiYXJXaWR0aCA9IHRoaXMuc3RhdGUuc2Nyb2xsYmFyV2lkdGgsIGF2YWlsYWJsZVJvd3NIZWlnaHQgPSBkaXNhYmxlSGVhZGVyID8gaGVpZ2h0IDogaGVpZ2h0IC0gaGVhZGVySGVpZ2h0LCByb3dDbGFzcyA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIHJvd0NsYXNzTmFtZSA/IHJvd0NsYXNzTmFtZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiAtMQogICAgICAgICAgICAgICAgICAgIH0pIDogcm93Q2xhc3NOYW1lLCByb3dTdHlsZU9iamVjdCA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIHJvd1N0eWxlID8gcm93U3R5bGUoewogICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogLTEKICAgICAgICAgICAgICAgICAgICB9KSA6IHJvd1N0eWxlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRDb2x1bW5TdHlsZXMgPSBbXSwgX3JlYWN0Mi5kZWZhdWx0LkNoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24oY29sdW1uLCBpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmxleFN0eWxlcyA9IF90aGlzMi5fZ2V0RmxleFN0eWxlRm9yQ29sdW1uKGNvbHVtbiwgY29sdW1uLnByb3BzLnN0eWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMyLl9jYWNoZWRDb2x1bW5TdHlsZXNbaW5kZXhdID0gKDAsIF9leHRlbmRzMy5kZWZhdWx0KSh7fSwgZmxleFN0eWxlcywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6ICJoaWRkZW4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pLCBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2IiwgewogICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczIuZGVmYXVsdCkoIlJlYWN0VmlydHVhbGl6ZWRfX1RhYmxlIiwgY2xhc3NOYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLAogICAgICAgICAgICAgICAgICAgICAgICByb2xlOiAiZ3JpZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiBzdHlsZQogICAgICAgICAgICAgICAgICAgIH0sICFkaXNhYmxlSGVhZGVyICYmIGhlYWRlclJvd1JlbmRlcmVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyLmRlZmF1bHQpKCJSZWFjdFZpcnR1YWxpemVkX19UYWJsZV9faGVhZGVyUm93Iiwgcm93Q2xhc3MpLAogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiB0aGlzLl9nZXRIZWFkZXJDb2x1bW5zKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiAoMCwgX2V4dGVuZHMzLmRlZmF1bHQpKHt9LCByb3dTdHlsZU9iamVjdCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWFkZXJIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogImhpZGRlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nUmlnaHQ6IHNjcm9sbGJhcldpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgfSksIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9HcmlkMi5kZWZhdWx0LCAoMCwgX2V4dGVuZHMzLmRlZmF1bHQpKHt9LCB0aGlzLnByb3BzLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Db250YWluZXJXaWR0aDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMi5kZWZhdWx0KSgiUmVhY3RWaXJ0dWFsaXplZF9fVGFibGVfX0dyaWQiLCBncmlkQ2xhc3NOYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFJlbmRlcmVyOiB0aGlzLl9jcmVhdGVSb3csCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbldpZHRoOiB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uQ291bnQ6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogYXZhaWxhYmxlUm93c0hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgbm9Db250ZW50UmVuZGVyZXI6IG5vUm93c1JlbmRlcmVyLAogICAgICAgICAgICAgICAgICAgICAgICBvblNjcm9sbDogdGhpcy5fb25TY3JvbGwsCiAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VjdGlvblJlbmRlcmVkOiB0aGlzLl9vblNlY3Rpb25SZW5kZXJlZCwKICAgICAgICAgICAgICAgICAgICAgICAgcmVmOiB0aGlzLl9zZXRSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU6ICJyb3dncm91cCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGJhcldpZHRoOiBzY3JvbGxiYXJXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9Sb3c6IHNjcm9sbFRvSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiAoMCwgX2V4dGVuZHMzLmRlZmF1bHQpKHt9LCBncmlkU3R5bGUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93WDogImhpZGRlbiIKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfY3JlYXRlQ29sdW1uIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihfcmVmMikgewogICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW4gPSBfcmVmMi5jb2x1bW4sIGNvbHVtbkluZGV4ID0gX3JlZjIuY29sdW1uSW5kZXgsIGlzU2Nyb2xsaW5nID0gX3JlZjIuaXNTY3JvbGxpbmcsIHBhcmVudCA9IF9yZWYyLnBhcmVudCwgcm93RGF0YSA9IF9yZWYyLnJvd0RhdGEsIHJvd0luZGV4ID0gX3JlZjIucm93SW5kZXgsIF9jb2x1bW4kcHJvcHMgPSBjb2x1bW4ucHJvcHMsIGNlbGxEYXRhR2V0dGVyID0gX2NvbHVtbiRwcm9wcy5jZWxsRGF0YUdldHRlciwgY2VsbFJlbmRlcmVyID0gX2NvbHVtbiRwcm9wcy5jZWxsUmVuZGVyZXIsIGNsYXNzTmFtZSA9IF9jb2x1bW4kcHJvcHMuY2xhc3NOYW1lLCBjb2x1bW5EYXRhID0gX2NvbHVtbiRwcm9wcy5jb2x1bW5EYXRhLCBkYXRhS2V5ID0gX2NvbHVtbiRwcm9wcy5kYXRhS2V5LCBjZWxsRGF0YSA9IGNlbGxEYXRhR2V0dGVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRGF0YTogY29sdW1uRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUtleTogZGF0YUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YTogcm93RGF0YQogICAgICAgICAgICAgICAgICAgIH0pLCByZW5kZXJlZENlbGwgPSBjZWxsUmVuZGVyZXIoewogICAgICAgICAgICAgICAgICAgICAgICBjZWxsRGF0YTogY2VsbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkRhdGE6IGNvbHVtbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFLZXk6IGRhdGFLZXksCiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2Nyb2xsaW5nOiBpc1Njcm9sbGluZywKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0RhdGE6IHJvd0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiByb3dJbmRleAogICAgICAgICAgICAgICAgICAgIH0pLCBzdHlsZSA9IHRoaXMuX2NhY2hlZENvbHVtblN0eWxlc1tjb2x1bW5JbmRleF0sIHRpdGxlID0gInN0cmluZyIgPT0gdHlwZW9mIHJlbmRlcmVkQ2VsbCA/IHJlbmRlcmVkQ2VsbCA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogIlJvdyIgKyByb3dJbmRleCArICItQ29sIiArIGNvbHVtbkluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczIuZGVmYXVsdCkoIlJlYWN0VmlydHVhbGl6ZWRfX1RhYmxlX19yb3dDb2x1bW4iLCBjbGFzc05hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZQogICAgICAgICAgICAgICAgICAgIH0sIHJlbmRlcmVkQ2VsbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9jcmVhdGVIZWFkZXIiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKF9yZWYzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHVtbiA9IF9yZWYzLmNvbHVtbiwgaW5kZXggPSBfcmVmMy5pbmRleCwgX3Byb3BzMiA9IHRoaXMucHJvcHMsIGhlYWRlckNsYXNzTmFtZSA9IF9wcm9wczIuaGVhZGVyQ2xhc3NOYW1lLCBoZWFkZXJTdHlsZSA9IF9wcm9wczIuaGVhZGVyU3R5bGUsIG9uSGVhZGVyQ2xpY2sgPSBfcHJvcHMyLm9uSGVhZGVyQ2xpY2ssIHNvcnQgPSBfcHJvcHMyLnNvcnQsIHNvcnRCeSA9IF9wcm9wczIuc29ydEJ5LCBzb3J0RGlyZWN0aW9uID0gX3Byb3BzMi5zb3J0RGlyZWN0aW9uLCBfY29sdW1uJHByb3BzMiA9IGNvbHVtbi5wcm9wcywgZGF0YUtleSA9IF9jb2x1bW4kcHJvcHMyLmRhdGFLZXksIGRpc2FibGVTb3J0ID0gX2NvbHVtbiRwcm9wczIuZGlzYWJsZVNvcnQsIGhlYWRlclJlbmRlcmVyID0gX2NvbHVtbiRwcm9wczIuaGVhZGVyUmVuZGVyZXIsIGxhYmVsID0gX2NvbHVtbiRwcm9wczIubGFiZWwsIGNvbHVtbkRhdGEgPSBfY29sdW1uJHByb3BzMi5jb2x1bW5EYXRhLCBzb3J0RW5hYmxlZCA9ICFkaXNhYmxlU29ydCAmJiBzb3J0LCBjbGFzc05hbWVzID0gKDAsIAogICAgICAgICAgICAgICAgICAgIF9jbGFzc25hbWVzMi5kZWZhdWx0KSgiUmVhY3RWaXJ0dWFsaXplZF9fVGFibGVfX2hlYWRlckNvbHVtbiIsIGhlYWRlckNsYXNzTmFtZSwgY29sdW1uLnByb3BzLmhlYWRlckNsYXNzTmFtZSwgewogICAgICAgICAgICAgICAgICAgICAgICBSZWFjdFZpcnR1YWxpemVkX19UYWJsZV9fc29ydGFibGVIZWFkZXJDb2x1bW46IHNvcnRFbmFibGVkCiAgICAgICAgICAgICAgICAgICAgfSksIHN0eWxlID0gdGhpcy5fZ2V0RmxleFN0eWxlRm9yQ29sdW1uKGNvbHVtbiwgaGVhZGVyU3R5bGUpLCByZW5kZXJlZEhlYWRlciA9IGhlYWRlclJlbmRlcmVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRGF0YTogY29sdW1uRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUtleTogZGF0YUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZVNvcnQ6IGRpc2FibGVTb3J0LAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogbGFiZWwsCiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRCeTogc29ydEJ5LAogICAgICAgICAgICAgICAgICAgICAgICBzb3J0RGlyZWN0aW9uOiBzb3J0RGlyZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgfSksIGExMXlQcm9wcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiAoc29ydEVuYWJsZWQgfHwgb25IZWFkZXJDbGljaykgJiYgIWZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3U29ydERpcmVjdGlvbiA9IHNvcnRCeSAhPT0gZGF0YUtleSB8fCBzb3J0RGlyZWN0aW9uID09PSBfU29ydERpcmVjdGlvbjIuZGVmYXVsdC5ERVNDID8gX1NvcnREaXJlY3Rpb24yLmRlZmF1bHQuQVNDIDogX1NvcnREaXJlY3Rpb24yLmRlZmF1bHQuREVTQywgb25DbGljayA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0RW5hYmxlZCAmJiBzb3J0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0Qnk6IGRhdGFLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydERpcmVjdGlvbjogbmV3U29ydERpcmVjdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG9uSGVhZGVyQ2xpY2sgJiYgb25IZWFkZXJDbGljayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRGF0YTogY29sdW1uRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhS2V5OiBkYXRhS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uS2V5RG93biA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW50ZXIiICE9PSBldmVudC5rZXkgJiYgIiAiICE9PSBldmVudC5rZXkgfHwgb25DbGljayhldmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGExMXlQcm9wc1siYXJpYS1sYWJlbCJdID0gY29sdW1uLnByb3BzWyJhcmlhLWxhYmVsIl0gfHwgbGFiZWwgfHwgZGF0YUtleSwgYTExeVByb3BzLnJvbGUgPSAicm93aGVhZGVyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGExMXlQcm9wcy50YWJJbmRleCA9IDAsIGExMXlQcm9wcy5vbkNsaWNrID0gb25DbGljaywgYTExeVByb3BzLm9uS2V5RG93biA9IG9uS2V5RG93bjsKICAgICAgICAgICAgICAgICAgICB9KCksIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLCAoMCwgX2V4dGVuZHMzLmRlZmF1bHQpKHt9LCBhMTF5UHJvcHMsIHsKICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAiSGVhZGVyLUNvbCIgKyBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGUKICAgICAgICAgICAgICAgICAgICB9KSwgcmVuZGVyZWRIZWFkZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfY3JlYXRlUm93IiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihfcmVmNCkgewogICAgICAgICAgICAgICAgICAgIHZhciBfdGhpczMgPSB0aGlzLCBpbmRleCA9IF9yZWY0LnJvd0luZGV4LCBpc1Njcm9sbGluZyA9IF9yZWY0LmlzU2Nyb2xsaW5nLCBrZXkgPSBfcmVmNC5rZXksIHBhcmVudCA9IF9yZWY0LnBhcmVudCwgc3R5bGUgPSBfcmVmNC5zdHlsZSwgX3Byb3BzMyA9IHRoaXMucHJvcHMsIGNoaWxkcmVuID0gX3Byb3BzMy5jaGlsZHJlbiwgb25Sb3dDbGljayA9IF9wcm9wczMub25Sb3dDbGljaywgb25Sb3dEb3VibGVDbGljayA9IF9wcm9wczMub25Sb3dEb3VibGVDbGljaywgb25Sb3dNb3VzZU92ZXIgPSBfcHJvcHMzLm9uUm93TW91c2VPdmVyLCBvblJvd01vdXNlT3V0ID0gX3Byb3BzMy5vblJvd01vdXNlT3V0LCByb3dDbGFzc05hbWUgPSBfcHJvcHMzLnJvd0NsYXNzTmFtZSwgcm93R2V0dGVyID0gX3Byb3BzMy5yb3dHZXR0ZXIsIHJvd1JlbmRlcmVyID0gX3Byb3BzMy5yb3dSZW5kZXJlciwgcm93U3R5bGUgPSBfcHJvcHMzLnJvd1N0eWxlLCBzY3JvbGxiYXJXaWR0aCA9IHRoaXMuc3RhdGUuc2Nyb2xsYmFyV2lkdGgsIHJvd0NsYXNzID0gImZ1bmN0aW9uIiA9PSB0eXBlb2Ygcm93Q2xhc3NOYW1lID8gcm93Q2xhc3NOYW1lKHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4CiAgICAgICAgICAgICAgICAgICAgfSkgOiByb3dDbGFzc05hbWUsIHJvd1N0eWxlT2JqZWN0ID0gImZ1bmN0aW9uIiA9PSB0eXBlb2Ygcm93U3R5bGUgPyByb3dTdHlsZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleAogICAgICAgICAgICAgICAgICAgIH0pIDogcm93U3R5bGUsIHJvd0RhdGEgPSByb3dHZXR0ZXIoewogICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgKICAgICAgICAgICAgICAgICAgICB9KSwgY29sdW1ucyA9IF9yZWFjdDIuZGVmYXVsdC5DaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKS5tYXAoZnVuY3Rpb24oY29sdW1uLCBjb2x1bW5JbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMzLl9jcmVhdGVDb2x1bW4oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleDogY29sdW1uSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Njcm9sbGluZzogaXNTY3JvbGxpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IHBhcmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0RhdGE6IHJvd0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxiYXJXaWR0aDogc2Nyb2xsYmFyV2lkdGgKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSksIGNsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lczIuZGVmYXVsdCkoIlJlYWN0VmlydHVhbGl6ZWRfX1RhYmxlX19yb3ciLCByb3dDbGFzcyksIGZsYXR0ZW5lZFN0eWxlID0gKDAsIAogICAgICAgICAgICAgICAgICAgIF9leHRlbmRzMy5kZWZhdWx0KSh7fSwgc3R5bGUsIHJvd1N0eWxlT2JqZWN0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5fZ2V0Um93SGVpZ2h0KGluZGV4KSwKICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6ICJoaWRkZW4iLAogICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nUmlnaHQ6IHNjcm9sbGJhcldpZHRoCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvd1JlbmRlcmVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6IGNvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgaXNTY3JvbGxpbmc6IGlzU2Nyb2xsaW5nLAogICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgb25Sb3dDbGljazogb25Sb3dDbGljaywKICAgICAgICAgICAgICAgICAgICAgICAgb25Sb3dEb3VibGVDbGljazogb25Sb3dEb3VibGVDbGljaywKICAgICAgICAgICAgICAgICAgICAgICAgb25Sb3dNb3VzZU92ZXI6IG9uUm93TW91c2VPdmVyLAogICAgICAgICAgICAgICAgICAgICAgICBvblJvd01vdXNlT3V0OiBvblJvd01vdXNlT3V0LAogICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhOiByb3dEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogZmxhdHRlbmVkU3R5bGUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX2dldEZsZXhTdHlsZUZvckNvbHVtbiIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oY29sdW1uKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGN1c3RvbVN0eWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiB7fSwgZmxleFZhbHVlID0gY29sdW1uLnByb3BzLmZsZXhHcm93ICsgIiAiICsgY29sdW1uLnByb3BzLmZsZXhTaHJpbmsgKyAiICIgKyBjb2x1bW4ucHJvcHMud2lkdGggKyAicHgiLCBzdHlsZSA9ICgwLCAKICAgICAgICAgICAgICAgICAgICBfZXh0ZW5kczMuZGVmYXVsdCkoe30sIGN1c3RvbVN0eWxlLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZsZXg6IGZsZXhWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgbXNGbGV4OiBmbGV4VmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIFdlYmtpdEZsZXg6IGZsZXhWYWx1ZQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4ucHJvcHMubWF4V2lkdGggJiYgKHN0eWxlLm1heFdpZHRoID0gY29sdW1uLnByb3BzLm1heFdpZHRoKSwgY29sdW1uLnByb3BzLm1pbldpZHRoICYmIChzdHlsZS5taW5XaWR0aCA9IGNvbHVtbi5wcm9wcy5taW5XaWR0aCksIAogICAgICAgICAgICAgICAgICAgIHN0eWxlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfZ2V0SGVhZGVyQ29sdW1ucyIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzNCA9IHRoaXMsIF9wcm9wczQgPSB0aGlzLnByb3BzLCBjaGlsZHJlbiA9IF9wcm9wczQuY2hpbGRyZW4sIGRpc2FibGVIZWFkZXIgPSBfcHJvcHM0LmRpc2FibGVIZWFkZXIsIGl0ZW1zID0gZGlzYWJsZUhlYWRlciA/IFtdIDogX3JlYWN0Mi5kZWZhdWx0LkNoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtcy5tYXAoZnVuY3Rpb24oY29sdW1uLCBpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM0Ll9jcmVhdGVIZWFkZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9nZXRSb3dIZWlnaHQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHJvd0luZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJvd0hlaWdodCA9IHRoaXMucHJvcHMucm93SGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIHJldHVybiAiZnVuY3Rpb24iID09IHR5cGVvZiByb3dIZWlnaHQgPyByb3dIZWlnaHQoewogICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogcm93SW5kZXgKICAgICAgICAgICAgICAgICAgICB9KSA6IHJvd0hlaWdodDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX29uU2Nyb2xsIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihfcmVmNSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjbGllbnRIZWlnaHQgPSBfcmVmNS5jbGllbnRIZWlnaHQsIHNjcm9sbEhlaWdodCA9IF9yZWY1LnNjcm9sbEhlaWdodCwgc2Nyb2xsVG9wID0gX3JlZjUuc2Nyb2xsVG9wLCBvblNjcm9sbCA9IHRoaXMucHJvcHMub25TY3JvbGw7CiAgICAgICAgICAgICAgICAgICAgb25TY3JvbGwoewogICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRIZWlnaHQ6IGNsaWVudEhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsSGVpZ2h0OiBzY3JvbGxIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9vblNlY3Rpb25SZW5kZXJlZCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oX3JlZjYpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcm93T3ZlcnNjYW5TdGFydEluZGV4ID0gX3JlZjYucm93T3ZlcnNjYW5TdGFydEluZGV4LCByb3dPdmVyc2NhblN0b3BJbmRleCA9IF9yZWY2LnJvd092ZXJzY2FuU3RvcEluZGV4LCByb3dTdGFydEluZGV4ID0gX3JlZjYucm93U3RhcnRJbmRleCwgcm93U3RvcEluZGV4ID0gX3JlZjYucm93U3RvcEluZGV4LCBvblJvd3NSZW5kZXJlZCA9IHRoaXMucHJvcHMub25Sb3dzUmVuZGVyZWQ7CiAgICAgICAgICAgICAgICAgICAgb25Sb3dzUmVuZGVyZWQoewogICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2NhblN0YXJ0SW5kZXg6IHJvd092ZXJzY2FuU3RhcnRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnNjYW5TdG9wSW5kZXg6IHJvd092ZXJzY2FuU3RvcEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4OiByb3dTdGFydEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBzdG9wSW5kZXg6IHJvd1N0b3BJbmRleAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJfc2V0UmVmIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihyZWYpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLkdyaWQgPSByZWY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9zZXRTY3JvbGxiYXJXaWR0aCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIEdyaWQgPSAoMCwgX3JlYWN0RG9tLmZpbmRET01Ob2RlKSh0aGlzLkdyaWQpLCBjbGllbnRXaWR0aCA9IEdyaWQuY2xpZW50V2lkdGggfHwgMCwgb2Zmc2V0V2lkdGggPSBHcmlkLm9mZnNldFdpZHRoIHx8IDAsIHNjcm9sbGJhcldpZHRoID0gb2Zmc2V0V2lkdGggLSBjbGllbnRXaWR0aDsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYmFyV2lkdGg6IHNjcm9sbGJhcldpZHRoCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gXSksIFRhYmxlOwogICAgICAgIH0oX3JlYWN0LlB1cmVDb21wb25lbnQpOwogICAgICAgIFRhYmxlLmRlZmF1bHRQcm9wcyA9IHsKICAgICAgICAgICAgZGlzYWJsZUhlYWRlcjogITEsCiAgICAgICAgICAgIGVzdGltYXRlZFJvd1NpemU6IDMwLAogICAgICAgICAgICBoZWFkZXJIZWlnaHQ6IDAsCiAgICAgICAgICAgIGhlYWRlclN0eWxlOiB7fSwKICAgICAgICAgICAgbm9Sb3dzUmVuZGVyZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9uUm93c1JlbmRlcmVkOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvblNjcm9sbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb3ZlcnNjYW5JbmRpY2VzR2V0dGVyOiBfR3JpZC5hY2Nlc3NpYmlsaXR5T3ZlcnNjYW5JbmRpY2VzR2V0dGVyLAogICAgICAgICAgICBvdmVyc2NhblJvd0NvdW50OiAxMCwKICAgICAgICAgICAgcm93UmVuZGVyZXI6IF9kZWZhdWx0Um93UmVuZGVyZXIyLmRlZmF1bHQsCiAgICAgICAgICAgIGhlYWRlclJvd1JlbmRlcmVyOiBfZGVmYXVsdEhlYWRlclJvd1JlbmRlcmVyMi5kZWZhdWx0LAogICAgICAgICAgICByb3dTdHlsZToge30sCiAgICAgICAgICAgIHNjcm9sbFRvQWxpZ25tZW50OiAiYXV0byIsCiAgICAgICAgICAgIHNjcm9sbFRvSW5kZXg6IC0xLAogICAgICAgICAgICBzdHlsZToge30KICAgICAgICB9LCBleHBvcnRzLmRlZmF1bHQgPSBUYWJsZTsKICAgIH0sIC8qIDE2NCAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSk7CiAgICAgICAgdmFyIF9nZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oMyksIF9nZXRQcm90b3R5cGVPZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRQcm90b3R5cGVPZiksIF9jbGFzc0NhbGxDaGVjazIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KSwgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMiksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiksIF9pbmhlcml0czIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxKSwgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMiksIF9wcm9wVHlwZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg5KSwgX3JlYWN0ID0gKF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyksIAogICAgICAgIF9fd2VicGFja19yZXF1aXJlX18oOTcpKSwgX2RlZmF1bHRIZWFkZXJSZW5kZXJlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTY1KSwgX2RlZmF1bHRIZWFkZXJSZW5kZXJlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZWZhdWx0SGVhZGVyUmVuZGVyZXIpLCBfZGVmYXVsdENlbGxSZW5kZXJlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTY4KSwgX2RlZmF1bHRDZWxsUmVuZGVyZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmYXVsdENlbGxSZW5kZXJlciksIF9kZWZhdWx0Q2VsbERhdGFHZXR0ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2OSksIF9kZWZhdWx0Q2VsbERhdGFHZXR0ZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmYXVsdENlbGxEYXRhR2V0dGVyKSwgQ29sdW1uID0gZnVuY3Rpb24oX0NvbXBvbmVudCkgewogICAgICAgICAgICBmdW5jdGlvbiBDb2x1bW4oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKDAsIF9jbGFzc0NhbGxDaGVjazMuZGVmYXVsdCkodGhpcywgQ29sdW1uKSwgKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMy5kZWZhdWx0KSh0aGlzLCAoQ29sdW1uLl9fcHJvdG9fXyB8fCAoMCwgCiAgICAgICAgICAgICAgICBfZ2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKENvbHVtbikpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAoMCwgX2luaGVyaXRzMy5kZWZhdWx0KShDb2x1bW4sIF9Db21wb25lbnQpLCBDb2x1bW47CiAgICAgICAgfShfcmVhY3QuQ29tcG9uZW50KTsKICAgICAgICBDb2x1bW4uZGVmYXVsdFByb3BzID0gewogICAgICAgICAgICBjZWxsRGF0YUdldHRlcjogX2RlZmF1bHRDZWxsRGF0YUdldHRlcjIuZGVmYXVsdCwKICAgICAgICAgICAgY2VsbFJlbmRlcmVyOiBfZGVmYXVsdENlbGxSZW5kZXJlcjIuZGVmYXVsdCwKICAgICAgICAgICAgZmxleEdyb3c6IDAsCiAgICAgICAgICAgIGZsZXhTaHJpbms6IDEsCiAgICAgICAgICAgIGhlYWRlclJlbmRlcmVyOiBfZGVmYXVsdEhlYWRlclJlbmRlcmVyMi5kZWZhdWx0LAogICAgICAgICAgICBzdHlsZToge30KICAgICAgICB9LCBleHBvcnRzLmRlZmF1bHQgPSBDb2x1bW47CiAgICB9LCAvKiAxNjUgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsKICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG9iagogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBkZWZhdWx0SGVhZGVyUmVuZGVyZXIoX3JlZikgewogICAgICAgICAgICB2YXIgZGF0YUtleSA9IChfcmVmLmNvbHVtbkRhdGEsIF9yZWYuZGF0YUtleSksIGxhYmVsID0gKF9yZWYuZGlzYWJsZVNvcnQsIF9yZWYubGFiZWwpLCBzb3J0QnkgPSBfcmVmLnNvcnRCeSwgc29ydERpcmVjdGlvbiA9IF9yZWYuc29ydERpcmVjdGlvbiwgc2hvd1NvcnRJbmRpY2F0b3IgPSBzb3J0QnkgPT09IGRhdGFLZXksIGNoaWxkcmVuID0gWyBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgic3BhbiIsIHsKICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogIlJlYWN0VmlydHVhbGl6ZWRfX1RhYmxlX19oZWFkZXJUcnVuY2F0ZWRUZXh0IiwKICAgICAgICAgICAgICAgIGtleTogImxhYmVsIiwKICAgICAgICAgICAgICAgIHRpdGxlOiBsYWJlbAogICAgICAgICAgICB9LCBsYWJlbCkgXTsKICAgICAgICAgICAgcmV0dXJuIHNob3dTb3J0SW5kaWNhdG9yICYmIGNoaWxkcmVuLnB1c2goX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX1NvcnRJbmRpY2F0b3IyLmRlZmF1bHQsIHsKICAgICAgICAgICAgICAgIGtleTogIlNvcnRJbmRpY2F0b3IiLAogICAgICAgICAgICAgICAgc29ydERpcmVjdGlvbjogc29ydERpcmVjdGlvbgogICAgICAgICAgICB9KSksIGNoaWxkcmVuOwogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgICAgICAgICAgIHZhbHVlOiAhMAogICAgICAgIH0pLCBleHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0SGVhZGVyUmVuZGVyZXI7CiAgICAgICAgdmFyIF9yZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oOTcpLCBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpLCBfU29ydEluZGljYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTY2KSwgX1NvcnRJbmRpY2F0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU29ydEluZGljYXRvcik7CiAgICB9LCAvKiAxNjYgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsKICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG9iagogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBTb3J0SW5kaWNhdG9yKF9yZWYpIHsKICAgICAgICAgICAgdmFyIHNvcnREaXJlY3Rpb24gPSBfcmVmLnNvcnREaXJlY3Rpb24sIGNsYXNzTmFtZXMgPSAoMCwgX2NsYXNzbmFtZXMyLmRlZmF1bHQpKCJSZWFjdFZpcnR1YWxpemVkX19UYWJsZV9fc29ydGFibGVIZWFkZXJJY29uIiwgewogICAgICAgICAgICAgICAgIlJlYWN0VmlydHVhbGl6ZWRfX1RhYmxlX19zb3J0YWJsZUhlYWRlckljb24tLUFTQyI6IHNvcnREaXJlY3Rpb24gPT09IF9Tb3J0RGlyZWN0aW9uMi5kZWZhdWx0LkFTQywKICAgICAgICAgICAgICAgICJSZWFjdFZpcnR1YWxpemVkX19UYWJsZV9fc29ydGFibGVIZWFkZXJJY29uLS1ERVNDIjogc29ydERpcmVjdGlvbiA9PT0gX1NvcnREaXJlY3Rpb24yLmRlZmF1bHQuREVTQwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJzdmciLCB7CiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMsCiAgICAgICAgICAgICAgICB3aWR0aDogMTgsCiAgICAgICAgICAgICAgICBoZWlnaHQ6IDE4LAogICAgICAgICAgICAgICAgdmlld0JveDogIjAgMCAyNCAyNCIKICAgICAgICAgICAgfSwgc29ydERpcmVjdGlvbiA9PT0gX1NvcnREaXJlY3Rpb24yLmRlZmF1bHQuQVNDID8gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLCB7CiAgICAgICAgICAgICAgICBkOiAiTTcgMTRsNS01IDUgNXoiCiAgICAgICAgICAgIH0pIDogX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLCB7CiAgICAgICAgICAgICAgICBkOiAiTTcgMTBsNSA1IDUtNXoiCiAgICAgICAgICAgIH0pLCBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgicGF0aCIsIHsKICAgICAgICAgICAgICAgIGQ6ICJNMCAwaDI0djI0SDB6IiwKICAgICAgICAgICAgICAgIGZpbGw6ICJub25lIgogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSksIGV4cG9ydHMuZGVmYXVsdCA9IFNvcnRJbmRpY2F0b3I7CiAgICAgICAgdmFyIF9jbGFzc25hbWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTQpLCBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKSwgX3Byb3BUeXBlcyA9IF9fd2VicGFja19yZXF1aXJlX18oODkpLCBfcmVhY3QgPSAoX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKSwgCiAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXyg5NykpLCBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpLCBfU29ydERpcmVjdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTY3KSwgX1NvcnREaXJlY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU29ydERpcmVjdGlvbik7CiAgICB9LCAvKiAxNjcgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KTsKICAgICAgICB2YXIgU29ydERpcmVjdGlvbiA9IHsKICAgICAgICAgICAgQVNDOiAiQVNDIiwKICAgICAgICAgICAgREVTQzogIkRFU0MiCiAgICAgICAgfTsKICAgICAgICBleHBvcnRzLmRlZmF1bHQgPSBTb3J0RGlyZWN0aW9uOwogICAgfSwgLyogMTY4ICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRDZWxsUmVuZGVyZXIoX3JlZikgewogICAgICAgICAgICB2YXIgY2VsbERhdGEgPSBfcmVmLmNlbGxEYXRhOwogICAgICAgICAgICBfcmVmLmNvbHVtbkRhdGEsIF9yZWYuZGF0YUtleSwgX3JlZi5yb3dEYXRhLCBfcmVmLnJvd0luZGV4OwogICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBjZWxsRGF0YSA/ICIiIDogU3RyaW5nKGNlbGxEYXRhKTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KSwgZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdENlbGxSZW5kZXJlcjsKICAgIH0sIC8qIDE2OSAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBkZWZhdWx0Q2VsbERhdGFHZXR0ZXIoX3JlZikgewogICAgICAgICAgICB2YXIgZGF0YUtleSA9IChfcmVmLmNvbHVtbkRhdGEsIF9yZWYuZGF0YUtleSksIHJvd0RhdGEgPSBfcmVmLnJvd0RhdGE7CiAgICAgICAgICAgIHJldHVybiAiZnVuY3Rpb24iID09IHR5cGVvZiByb3dEYXRhLmdldCA/IHJvd0RhdGEuZ2V0KGRhdGFLZXkpIDogcm93RGF0YVtkYXRhS2V5XTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KSwgZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdENlbGxEYXRhR2V0dGVyOwogICAgfSwgLyogMTcwICovCiAgICAvKioqLwogICAgZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvYmoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZGVmYXVsdFJvd1JlbmRlcmVyKF9yZWYpIHsKICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLCBjb2x1bW5zID0gX3JlZi5jb2x1bW5zLCBpbmRleCA9IF9yZWYuaW5kZXgsIGtleSA9IChfcmVmLmlzU2Nyb2xsaW5nLCAKICAgICAgICAgICAgX3JlZi5rZXkpLCBvblJvd0NsaWNrID0gX3JlZi5vblJvd0NsaWNrLCBvblJvd0RvdWJsZUNsaWNrID0gX3JlZi5vblJvd0RvdWJsZUNsaWNrLCBvblJvd01vdXNlT3ZlciA9IF9yZWYub25Sb3dNb3VzZU92ZXIsIG9uUm93TW91c2VPdXQgPSBfcmVmLm9uUm93TW91c2VPdXQsIHJvd0RhdGEgPSBfcmVmLnJvd0RhdGEsIHN0eWxlID0gX3JlZi5zdHlsZSwgYTExeVByb3BzID0ge307CiAgICAgICAgICAgIHJldHVybiAob25Sb3dDbGljayB8fCBvblJvd0RvdWJsZUNsaWNrIHx8IG9uUm93TW91c2VPdmVyIHx8IG9uUm93TW91c2VPdXQpICYmIChhMTF5UHJvcHNbImFyaWEtbGFiZWwiXSA9ICJyb3ciLCAKICAgICAgICAgICAgYTExeVByb3BzLnRhYkluZGV4ID0gMCwgb25Sb3dDbGljayAmJiAoYTExeVByb3BzLm9uQ2xpY2sgPSBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG9uUm93Q2xpY2soewogICAgICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgcm93RGF0YTogcm93RGF0YQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pLCBvblJvd0RvdWJsZUNsaWNrICYmIChhMTF5UHJvcHMub25Eb3VibGVDbGljayA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb25Sb3dEb3VibGVDbGljayh7CiAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LAogICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCwKICAgICAgICAgICAgICAgICAgICByb3dEYXRhOiByb3dEYXRhCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSksIG9uUm93TW91c2VPdXQgJiYgKGExMXlQcm9wcy5vbk1vdXNlT3V0ID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvblJvd01vdXNlT3V0KHsKICAgICAgICAgICAgICAgICAgICBldmVudDogZXZlbnQsCiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LAogICAgICAgICAgICAgICAgICAgIHJvd0RhdGE6IHJvd0RhdGEKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSwgb25Sb3dNb3VzZU92ZXIgJiYgKGExMXlQcm9wcy5vbk1vdXNlT3ZlciA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb25Sb3dNb3VzZU92ZXIoewogICAgICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgcm93RGF0YTogcm93RGF0YQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKSwgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIsICgwLCBfZXh0ZW5kczMuZGVmYXVsdCkoe30sIGExMXlQcm9wcywgewogICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsCiAgICAgICAgICAgICAgICBrZXk6IGtleSwKICAgICAgICAgICAgICAgIHJvbGU6ICJyb3ciLAogICAgICAgICAgICAgICAgc3R5bGU6IHN0eWxlCiAgICAgICAgICAgIH0pLCBjb2x1bW5zKTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICB9KTsKICAgICAgICB2YXIgX2V4dGVuZHMyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDcpLCBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7CiAgICAgICAgZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdFJvd1JlbmRlcmVyOwogICAgICAgIHZhciBfcmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3KSwgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTsKICAgIH0sIC8qIDE3MSAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRIZWFkZXJSb3dSZW5kZXJlcihfcmVmKSB7CiAgICAgICAgICAgIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSwgY29sdW1ucyA9IF9yZWYuY29sdW1ucywgc3R5bGUgPSBfcmVmLnN0eWxlOwogICAgICAgICAgICByZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIsIHsKICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLAogICAgICAgICAgICAgICAgcm9sZTogInJvdyIsCiAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGUKICAgICAgICAgICAgfSwgY29sdW1ucyk7CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSksIGV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRIZWFkZXJSb3dSZW5kZXJlcjsKICAgICAgICB2YXIgX3JlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NyksIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7CiAgICB9LCAvKiAxNzIgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsKICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG9iagogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgICAgICAgICAgIHZhbHVlOiAhMAogICAgICAgIH0pLCBleHBvcnRzLklTX1NDUk9MTElOR19USU1FT1VUID0gZXhwb3J0cy5XaW5kb3dTY3JvbGxlciA9IGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDsKICAgICAgICB2YXIgX29uU2Nyb2xsID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzMpOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiSVNfU0NST0xMSU5HX1RJTUVPVVQiLCB7CiAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9vblNjcm9sbC5JU19TQ1JPTExJTkdfVElNRU9VVDsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHZhciBfV2luZG93U2Nyb2xsZXIyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzQpLCBfV2luZG93U2Nyb2xsZXIzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfV2luZG93U2Nyb2xsZXIyKTsKICAgICAgICBleHBvcnRzLmRlZmF1bHQgPSBfV2luZG93U2Nyb2xsZXIzLmRlZmF1bHQsIGV4cG9ydHMuV2luZG93U2Nyb2xsZXIgPSBfV2luZG93U2Nyb2xsZXIzLmRlZmF1bHQ7CiAgICB9LCAvKiAxNzMgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgZnVuY3Rpb24gZW5hYmxlUG9pbnRlckV2ZW50c0lmRGlzYWJsZWQoKSB7CiAgICAgICAgICAgIGRpc2FibGVQb2ludGVyRXZlbnRzVGltZW91dElkICYmIChkaXNhYmxlUG9pbnRlckV2ZW50c1RpbWVvdXRJZCA9IG51bGwsIGRvY3VtZW50LmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyA9IG9yaWdpbmFsQm9keVBvaW50ZXJFdmVudHMsIAogICAgICAgICAgICBvcmlnaW5hbEJvZHlQb2ludGVyRXZlbnRzID0gbnVsbCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGVuYWJsZVBvaW50ZXJFdmVudHNBZnRlckRlbGF5Q2FsbGJhY2soKSB7CiAgICAgICAgICAgIGVuYWJsZVBvaW50ZXJFdmVudHNJZkRpc2FibGVkKCksIG1vdW50ZWRJbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbihpbnN0YW5jZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlLl9fcmVzZXRJc1Njcm9sbGluZygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZW5hYmxlUG9pbnRlckV2ZW50c0FmdGVyRGVsYXkoKSB7CiAgICAgICAgICAgIGRpc2FibGVQb2ludGVyRXZlbnRzVGltZW91dElkICYmIGNsZWFyVGltZW91dChkaXNhYmxlUG9pbnRlckV2ZW50c1RpbWVvdXRJZCksIGRpc2FibGVQb2ludGVyRXZlbnRzVGltZW91dElkID0gc2V0VGltZW91dChlbmFibGVQb2ludGVyRXZlbnRzQWZ0ZXJEZWxheUNhbGxiYWNrLCBJU19TQ1JPTExJTkdfVElNRU9VVCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIG9uU2Nyb2xsV2luZG93KGV2ZW50KSB7CiAgICAgICAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQgPT09IHdpbmRvdyAmJiBudWxsID09IG9yaWdpbmFsQm9keVBvaW50ZXJFdmVudHMgJiYgKG9yaWdpbmFsQm9keVBvaW50ZXJFdmVudHMgPSBkb2N1bWVudC5ib2R5LnN0eWxlLnBvaW50ZXJFdmVudHMsIAogICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAibm9uZSIpLCBlbmFibGVQb2ludGVyRXZlbnRzQWZ0ZXJEZWxheSgpLCBtb3VudGVkSW5zdGFuY2VzLmZvckVhY2goZnVuY3Rpb24oaW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlLnNjcm9sbEVsZW1lbnQgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQgJiYgaW5zdGFuY2UuX19oYW5kbGVXaW5kb3dTY3JvbGxFdmVudChldmVudCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiByZWdpc3RlclNjcm9sbExpc3RlbmVyKGNvbXBvbmVudCwgZWxlbWVudCkgewogICAgICAgICAgICBtb3VudGVkSW5zdGFuY2VzLnNvbWUoZnVuY3Rpb24oaW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5zY3JvbGxFbGVtZW50ID09PSBlbGVtZW50OwogICAgICAgICAgICB9KSB8fCBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIG9uU2Nyb2xsV2luZG93KSwgbW91bnRlZEluc3RhbmNlcy5wdXNoKGNvbXBvbmVudCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHVucmVnaXN0ZXJTY3JvbGxMaXN0ZW5lcihjb21wb25lbnQsIGVsZW1lbnQpIHsKICAgICAgICAgICAgbW91bnRlZEluc3RhbmNlcyA9IG1vdW50ZWRJbnN0YW5jZXMuZmlsdGVyKGZ1bmN0aW9uKGluc3RhbmNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UgIT09IGNvbXBvbmVudDsKICAgICAgICAgICAgfSksIG1vdW50ZWRJbnN0YW5jZXMubGVuZ3RoIHx8IChlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIG9uU2Nyb2xsV2luZG93KSwgCiAgICAgICAgICAgIGRpc2FibGVQb2ludGVyRXZlbnRzVGltZW91dElkICYmIChjbGVhclRpbWVvdXQoZGlzYWJsZVBvaW50ZXJFdmVudHNUaW1lb3V0SWQpLCBlbmFibGVQb2ludGVyRXZlbnRzSWZEaXNhYmxlZCgpKSk7CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSksIGV4cG9ydHMucmVnaXN0ZXJTY3JvbGxMaXN0ZW5lciA9IHJlZ2lzdGVyU2Nyb2xsTGlzdGVuZXIsIGV4cG9ydHMudW5yZWdpc3RlclNjcm9sbExpc3RlbmVyID0gdW5yZWdpc3RlclNjcm9sbExpc3RlbmVyOwogICAgICAgIHZhciBtb3VudGVkSW5zdGFuY2VzID0gW10sIG9yaWdpbmFsQm9keVBvaW50ZXJFdmVudHMgPSBudWxsLCBkaXNhYmxlUG9pbnRlckV2ZW50c1RpbWVvdXRJZCA9IG51bGwsIElTX1NDUk9MTElOR19USU1FT1VUID0gZXhwb3J0cy5JU19TQ1JPTExJTkdfVElNRU9VVCA9IDE1MDsKICAgIH0sIC8qIDE3NCAqLwogICAgLyoqKi8KICAgIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewogICAgICAgICAgICAgICAgZGVmYXVsdDogb2JqCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgfSk7CiAgICAgICAgdmFyIF9nZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oMyksIF9nZXRQcm90b3R5cGVPZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRQcm90b3R5cGVPZiksIF9jbGFzc0NhbGxDaGVjazIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KSwgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMiksIF9jcmVhdGVDbGFzczIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKSwgX2NyZWF0ZUNsYXNzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNsYXNzMiksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiksIF9pbmhlcml0czIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxKSwgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMiksIF9wcm9wVHlwZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg5KSwgX3JlYWN0ID0gKF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyksIAogICAgICAgIF9fd2VicGFja19yZXF1aXJlX18oOTcpKSwgX3JlYWN0RG9tID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDMpLCBfcmVhY3REb20yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3REb20pLCBfb25TY3JvbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3MyksIF9kaW1lbnNpb25zID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzUpLCBXaW5kb3dTY3JvbGxlciA9IGZ1bmN0aW9uKF9QdXJlQ29tcG9uZW50KSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIFdpbmRvd1Njcm9sbGVyKHByb3BzKSB7CiAgICAgICAgICAgICAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBXaW5kb3dTY3JvbGxlcik7CiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zLmRlZmF1bHQpKHRoaXMsIChXaW5kb3dTY3JvbGxlci5fX3Byb3RvX18gfHwgKDAsIAogICAgICAgICAgICAgICAgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KShXaW5kb3dTY3JvbGxlcikpLmNhbGwodGhpcywgcHJvcHMpKSwgX3JlZiA9ICJ1bmRlZmluZWQiICE9IHR5cGVvZiB3aW5kb3cgPyAoMCwgCiAgICAgICAgICAgICAgICBfZGltZW5zaW9ucy5nZXREaW1lbnNpb25zKShwcm9wcy5zY3JvbGxFbGVtZW50IHx8IHdpbmRvdykgOiB7CiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDAsCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwCiAgICAgICAgICAgICAgICB9LCB3aWR0aCA9IF9yZWYud2lkdGgsIGhlaWdodCA9IF9yZWYuaGVpZ2h0OwogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnN0YXRlID0gewogICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCwKICAgICAgICAgICAgICAgICAgICBpc1Njcm9sbGluZzogITEsCiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogMCwKICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3A6IDAKICAgICAgICAgICAgICAgIH0sIF90aGlzLl9vblJlc2l6ZSA9IF90aGlzLl9vblJlc2l6ZS5iaW5kKF90aGlzKSwgX3RoaXMuX19oYW5kbGVXaW5kb3dTY3JvbGxFdmVudCA9IF90aGlzLl9faGFuZGxlV2luZG93U2Nyb2xsRXZlbnQuYmluZChfdGhpcyksIAogICAgICAgICAgICAgICAgX3RoaXMuX19yZXNldElzU2Nyb2xsaW5nID0gX3RoaXMuX19yZXNldElzU2Nyb2xsaW5nLmJpbmQoX3RoaXMpLCBfdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKDAsIF9pbmhlcml0czMuZGVmYXVsdCkoV2luZG93U2Nyb2xsZXIsIF9QdXJlQ29tcG9uZW50KSwgKDAsIF9jcmVhdGVDbGFzczMuZGVmYXVsdCkoV2luZG93U2Nyb2xsZXIsIFsgewogICAgICAgICAgICAgICAga2V5OiAidXBkYXRlUG9zaXRpb24iLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHNjcm9sbEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb25SZXNpemUgPSB0aGlzLnByb3BzLm9uUmVzaXplLCBfc3RhdGUgPSB0aGlzLnN0YXRlLCBoZWlnaHQgPSBfc3RhdGUuaGVpZ2h0LCB3aWR0aCA9IF9zdGF0ZS53aWR0aDsKICAgICAgICAgICAgICAgICAgICBzY3JvbGxFbGVtZW50ID0gc2Nyb2xsRWxlbWVudCB8fCB0aGlzLnByb3BzLnNjcm9sbEVsZW1lbnQgfHwgd2luZG93OwogICAgICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAoMCwgX2RpbWVuc2lvbnMuZ2V0UG9zaXRpb25PZmZzZXQpKF9yZWFjdERvbTIuZGVmYXVsdC5maW5kRE9NTm9kZSh0aGlzKSwgc2Nyb2xsRWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25Gcm9tVG9wID0gb2Zmc2V0LnRvcCwgdGhpcy5fcG9zaXRpb25Gcm9tTGVmdCA9IG9mZnNldC5sZWZ0OwogICAgICAgICAgICAgICAgICAgIHZhciBkaW1lbnNpb25zID0gKDAsIF9kaW1lbnNpb25zLmdldERpbWVuc2lvbnMpKHNjcm9sbEVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgIGhlaWdodCA9PT0gZGltZW5zaW9ucy5oZWlnaHQgJiYgd2lkdGggPT09IGRpbWVuc2lvbnMud2lkdGggfHwgKHRoaXMuc2V0U3RhdGUoewogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGRpbWVuc2lvbnMuaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogZGltZW5zaW9ucy53aWR0aAogICAgICAgICAgICAgICAgICAgIH0pLCBvblJlc2l6ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogZGltZW5zaW9ucy5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBkaW1lbnNpb25zLndpZHRoCiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJjb21wb25lbnREaWRNb3VudCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNjcm9sbEVsZW1lbnQgPSB0aGlzLnByb3BzLnNjcm9sbEVsZW1lbnQgfHwgd2luZG93OwogICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oc2Nyb2xsRWxlbWVudCksICgwLCBfb25TY3JvbGwucmVnaXN0ZXJTY3JvbGxMaXN0ZW5lcikodGhpcywgc2Nyb2xsRWxlbWVudCksIAogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCB0aGlzLl9vblJlc2l6ZSwgITEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihuZXh0UHJvcHMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsRWxlbWVudCA9IHRoaXMucHJvcHMuc2Nyb2xsRWxlbWVudCB8fCB3aW5kb3csIG5leHRTY3JvbGxFbGVtZW50ID0gbmV4dFByb3BzLnNjcm9sbEVsZW1lbnQgfHwgd2luZG93OwogICAgICAgICAgICAgICAgICAgIHNjcm9sbEVsZW1lbnQgIT09IG5leHRTY3JvbGxFbGVtZW50ICYmICh0aGlzLnVwZGF0ZVBvc2l0aW9uKG5leHRTY3JvbGxFbGVtZW50KSwgCiAgICAgICAgICAgICAgICAgICAgKDAsIF9vblNjcm9sbC51bnJlZ2lzdGVyU2Nyb2xsTGlzdGVuZXIpKHRoaXMsIHNjcm9sbEVsZW1lbnQpLCAoMCwgX29uU2Nyb2xsLnJlZ2lzdGVyU2Nyb2xsTGlzdGVuZXIpKHRoaXMsIG5leHRTY3JvbGxFbGVtZW50KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImNvbXBvbmVudFdpbGxVbm1vdW50IiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAoMCwgX29uU2Nyb2xsLnVucmVnaXN0ZXJTY3JvbGxMaXN0ZW5lcikodGhpcywgdGhpcy5wcm9wcy5zY3JvbGxFbGVtZW50IHx8IHdpbmRvdyksIAogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLCB0aGlzLl9vblJlc2l6ZSwgITEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJyZW5kZXIiLAogICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucHJvcHMuY2hpbGRyZW4sIF9zdGF0ZTIgPSB0aGlzLnN0YXRlLCBpc1Njcm9sbGluZyA9IF9zdGF0ZTIuaXNTY3JvbGxpbmcsIHNjcm9sbFRvcCA9IF9zdGF0ZTIuc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0ID0gX3N0YXRlMi5zY3JvbGxMZWZ0LCBoZWlnaHQgPSBfc3RhdGUyLmhlaWdodCwgd2lkdGggPSBfc3RhdGUyLndpZHRoOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbih7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2Nyb2xsaW5nOiBpc1Njcm9sbGluZywKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3AKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX29uUmVzaXplIiwKICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiX19oYW5kbGVXaW5kb3dTY3JvbGxFdmVudCIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb25TY3JvbGwgPSB0aGlzLnByb3BzLm9uU2Nyb2xsLCBzY3JvbGxFbGVtZW50ID0gdGhpcy5wcm9wcy5zY3JvbGxFbGVtZW50IHx8IHdpbmRvdywgc2Nyb2xsT2Zmc2V0ID0gKDAsIAogICAgICAgICAgICAgICAgICAgIF9kaW1lbnNpb25zLmdldFNjcm9sbE9mZnNldCkoc2Nyb2xsRWxlbWVudCksIHNjcm9sbExlZnQgPSBNYXRoLm1heCgwLCBzY3JvbGxPZmZzZXQubGVmdCAtIHRoaXMuX3Bvc2l0aW9uRnJvbUxlZnQpLCBzY3JvbGxUb3AgPSBNYXRoLm1heCgwLCBzY3JvbGxPZmZzZXQudG9wIC0gdGhpcy5fcG9zaXRpb25Gcm9tVG9wKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNTY3JvbGxpbmc6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0OiBzY3JvbGxMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3A6IHNjcm9sbFRvcAogICAgICAgICAgICAgICAgICAgIH0pLCBvblNjcm9sbCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIl9fcmVzZXRJc1Njcm9sbGluZyIsCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2Nyb2xsaW5nOiAhMQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJzY3JvbGxFbGVtZW50IiwKICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuc2Nyb2xsRWxlbWVudCB8fCB3aW5kb3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gXSksIFdpbmRvd1Njcm9sbGVyOwogICAgICAgIH0oX3JlYWN0LlB1cmVDb21wb25lbnQpOwogICAgICAgIFdpbmRvd1Njcm9sbGVyLmRlZmF1bHRQcm9wcyA9IHsKICAgICAgICAgICAgb25SZXNpemU6IGZ1bmN0aW9uKCkge30sCiAgICAgICAgICAgIG9uU2Nyb2xsOiBmdW5jdGlvbigpIHt9CiAgICAgICAgfSwgZXhwb3J0cy5kZWZhdWx0ID0gV2luZG93U2Nyb2xsZXI7CiAgICB9LCAvKiAxNzUgKi8KICAgIC8qKiovCiAgICBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgZnVuY3Rpb24gZ2V0RGltZW5zaW9ucyhlbGVtZW50KSB7CiAgICAgICAgICAgIGlmIChlbGVtZW50ID09PSB3aW5kb3cpIHJldHVybiB7CiAgICAgICAgICAgICAgICBoZWlnaHQ6ICJudW1iZXIiID09IHR5cGVvZiB3aW5kb3cuaW5uZXJIZWlnaHQgPyB3aW5kb3cuaW5uZXJIZWlnaHQgOiAwLAogICAgICAgICAgICAgICAgd2lkdGg6ICJudW1iZXIiID09IHR5cGVvZiB3aW5kb3cuaW5uZXJXaWR0aCA/IHdpbmRvdy5pbm5lcldpZHRoIDogMAogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgX2VsZW1lbnQkZ2V0Qm91bmRpbmdDID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgd2lkdGggPSBfZWxlbWVudCRnZXRCb3VuZGluZ0Mud2lkdGgsIGhlaWdodCA9IF9lbGVtZW50JGdldEJvdW5kaW5nQy5oZWlnaHQ7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgsCiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBnZXRQb3NpdGlvbk9mZnNldChlbGVtZW50LCBjb250YWluZXIpIHsKICAgICAgICAgICAgdmFyIHNjcm9sbE9mZnNldCA9IGNvbnRhaW5lciA9PT0gd2luZG93ID8gewogICAgICAgICAgICAgICAgdG9wOiAwLAogICAgICAgICAgICAgICAgbGVmdDogMAogICAgICAgICAgICB9IDogZ2V0U2Nyb2xsT2Zmc2V0KGNvbnRhaW5lciksIGNvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIgPT09IHdpbmRvdyA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCA6IGNvbnRhaW5lciwgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHRvcDogZWxlbWVudFJlY3QudG9wICsgc2Nyb2xsT2Zmc2V0LnRvcCAtIGNvbnRhaW5lclJlY3QudG9wLAogICAgICAgICAgICAgICAgbGVmdDogZWxlbWVudFJlY3QubGVmdCArIHNjcm9sbE9mZnNldC5sZWZ0IC0gY29udGFpbmVyUmVjdC5sZWZ0CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGdldFNjcm9sbE9mZnNldChlbGVtZW50KSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50ID09PSB3aW5kb3cgPyB7CiAgICAgICAgICAgICAgICB0b3A6ICJzY3JvbGxZIiBpbiB3aW5kb3cgPyB3aW5kb3cuc2Nyb2xsWSA6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AsCiAgICAgICAgICAgICAgICBsZWZ0OiAic2Nyb2xsWCIgaW4gd2luZG93ID8gd2luZG93LnNjcm9sbFggOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdAogICAgICAgICAgICB9IDogewogICAgICAgICAgICAgICAgdG9wOiBlbGVtZW50LnNjcm9sbFRvcCwKICAgICAgICAgICAgICAgIGxlZnQ6IGVsZW1lbnQuc2Nyb2xsTGVmdAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgICAgICAgICAgIHZhbHVlOiAhMAogICAgICAgIH0pLCBleHBvcnRzLmdldERpbWVuc2lvbnMgPSBnZXREaW1lbnNpb25zLCBleHBvcnRzLmdldFBvc2l0aW9uT2Zmc2V0ID0gZ2V0UG9zaXRpb25PZmZzZXQsIAogICAgICAgIGV4cG9ydHMuZ2V0U2Nyb2xsT2Zmc2V0ID0gZ2V0U2Nyb2xsT2Zmc2V0OwogICAgfSBdKTsKfSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWN0LXZpcnR1YWxpemVkLmpzLm1hcA=="></script>
<script src="data:application/x-javascript;base64,LyohIGpRdWVyeSB2MS4xMS4zIHwgKGMpIDIwMDUsIDIwMTUgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8NCiFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWEuZG9jdW1lbnQ/YihhLCEwKTpmdW5jdGlvbihhKXtpZighYS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gYihhKX06YihhKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkPWMuc2xpY2UsZT1jLmNvbmNhdCxmPWMucHVzaCxnPWMuaW5kZXhPZixoPXt9LGk9aC50b1N0cmluZyxqPWguaGFzT3duUHJvcGVydHksaz17fSxsPSIxLjExLjMiLG09ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IG0uZm4uaW5pdChhLGIpfSxuPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZyxvPS9eLW1zLS8scD0vLShbXGRhLXpdKS9naSxxPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIudG9VcHBlckNhc2UoKX07bS5mbj1tLnByb3RvdHlwZT17anF1ZXJ5OmwsY29uc3RydWN0b3I6bSxzZWxlY3RvcjoiIixsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIGQuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hPzA+YT90aGlzW2ErdGhpcy5sZW5ndGhdOnRoaXNbYV06ZC5jYWxsKHRoaXMpfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSl7dmFyIGI9bS5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksYSk7cmV0dXJuIGIucHJldk9iamVjdD10aGlzLGIuY29udGV4dD10aGlzLmNvbnRleHQsYn0sZWFjaDpmdW5jdGlvbihhLGIpe3JldHVybiBtLmVhY2godGhpcyxhLGIpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG0ubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmxlbmd0aCxjPSthKygwPmE/YjowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYz49MCYmYj5jP1t0aGlzW2NdXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6Zixzb3J0OmMuc29ydCxzcGxpY2U6Yy5zcGxpY2V9LG0uZXh0ZW5kPW0uZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGc9YXJndW1lbnRzWzBdfHx7fSxoPTEsaT1hcmd1bWVudHMubGVuZ3RoLGo9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGcmJihqPWcsZz1hcmd1bWVudHNbaF18fHt9LGgrKyksIm9iamVjdCI9PXR5cGVvZiBnfHxtLmlzRnVuY3Rpb24oZyl8fChnPXt9KSxoPT09aSYmKGc9dGhpcyxoLS0pO2k+aDtoKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW2hdKSlmb3IoZCBpbiBlKWE9Z1tkXSxjPWVbZF0sZyE9PWMmJihqJiZjJiYobS5pc1BsYWluT2JqZWN0KGMpfHwoYj1tLmlzQXJyYXkoYykpKT8oYj8oYj0hMSxmPWEmJm0uaXNBcnJheShhKT9hOltdKTpmPWEmJm0uaXNQbGFpbk9iamVjdChhKT9hOnt9LGdbZF09bS5leHRlbmQoaixmLGMpKTp2b2lkIDAhPT1jJiYoZ1tkXT1jKSk7cmV0dXJuIGd9LG0uZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhsK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKGEpfSxub29wOmZ1bmN0aW9uKCl7fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PT1tLnR5cGUoYSl9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuImFycmF5Ij09PW0udHlwZShhKX0saXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJmE9PWEud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIW0uaXNBcnJheShhKSYmYS1wYXJzZUZsb2F0KGEpKzE+PTB9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtpZighYXx8Im9iamVjdCIhPT1tLnR5cGUoYSl8fGEubm9kZVR5cGV8fG0uaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFqLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIWouY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfWlmKGsub3duTGFzdClmb3IoYiBpbiBhKXJldHVybiBqLmNhbGwoYSxiKTtmb3IoYiBpbiBhKTtyZXR1cm4gdm9pZCAwPT09Ynx8ai5jYWxsKGEsYil9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/YSsiIjoib2JqZWN0Ij09dHlwZW9mIGF8fCJmdW5jdGlvbiI9PXR5cGVvZiBhP2hbaS5jYWxsKGEpXXx8Im9iamVjdCI6dHlwZW9mIGF9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oYil7YiYmbS50cmltKGIpJiYoYS5leGVjU2NyaXB0fHxmdW5jdGlvbihiKXthLmV2YWwuY2FsbChhLGIpfSkoYil9LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKG8sIm1zLSIpLnJlcGxhY2UocCxxKX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yi50b0xvd2VyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPTAsZj1hLmxlbmd0aCxnPXIoYSk7aWYoYyl7aWYoZyl7Zm9yKDtmPmU7ZSsrKWlmKGQ9Yi5hcHBseShhW2VdLGMpLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgaWYoZyl7Zm9yKDtmPmU7ZSsrKWlmKGQ9Yi5jYWxsKGFbZV0sZSxhW2VdKSxkPT09ITEpYnJlYWt9ZWxzZSBmb3IoZSBpbiBhKWlmKGQ9Yi5jYWxsKGFbZV0sZSxhW2VdKSxkPT09ITEpYnJlYWs7cmV0dXJuIGF9LHRyaW06ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6KGErIiIpLnJlcGxhY2UobiwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe3ZhciBjPWJ8fFtdO3JldHVybiBudWxsIT1hJiYocihPYmplY3QoYSkpP20ubWVyZ2UoYywic3RyaW5nIj09dHlwZW9mIGE/W2FdOmEpOmYuY2FsbChjLGEpKSxjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihnKXJldHVybiBnLmNhbGwoYixhLGMpO2ZvcihkPWIubGVuZ3RoLGM9Yz8wPmM/TWF0aC5tYXgoMCxkK2MpOmM6MDtkPmM7YysrKWlmKGMgaW4gYiYmYltjXT09PWEpcmV0dXJuIGN9cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGEsYil7dmFyIGM9K2IubGVuZ3RoLGQ9MCxlPWEubGVuZ3RoO3doaWxlKGM+ZClhW2UrK109YltkKytdO2lmKGMhPT1jKXdoaWxlKHZvaWQgMCE9PWJbZF0pYVtlKytdPWJbZCsrXTtyZXR1cm4gYS5sZW5ndGg9ZSxhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQsZT1bXSxmPTAsZz1hLmxlbmd0aCxoPSFjO2c+ZjtmKyspZD0hYihhW2ZdLGYpLGQhPT1oJiZlLnB1c2goYVtmXSk7cmV0dXJuIGV9LG1hcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj0wLGc9YS5sZW5ndGgsaD1yKGEpLGk9W107aWYoaClmb3IoO2c+ZjtmKyspZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7ZWxzZSBmb3IoZiBpbiBhKWQ9YihhW2ZdLGYsYyksbnVsbCE9ZCYmaS5wdXNoKGQpO3JldHVybiBlLmFwcGx5KFtdLGkpfSxndWlkOjEscHJveHk6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGY7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBiJiYoZj1hW2JdLGI9YSxhPWYpLG0uaXNGdW5jdGlvbihhKT8oYz1kLmNhbGwoYXJndW1lbnRzLDIpLGU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShifHx0aGlzLGMuY29uY2F0KGQuY2FsbChhcmd1bWVudHMpKSl9LGUuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxtLmd1aWQrKyxlKTp2b2lkIDB9LG5vdzpmdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX0sc3VwcG9ydDprfSksbS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7aFsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiByKGEpe3ZhciBiPSJsZW5ndGgiaW4gYSYmYS5sZW5ndGgsYz1tLnR5cGUoYSk7cmV0dXJuImZ1bmN0aW9uIj09PWN8fG0uaXNXaW5kb3coYSk/ITE6MT09PWEubm9kZVR5cGUmJmI/ITA6ImFycmF5Ij09PWN8fDA9PT1ifHwibnVtYmVyIj09dHlwZW9mIGImJmI+MCYmYi0xIGluIGF9dmFyIHM9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdT0ic2l6emxlIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9aGEoKSx6PWhhKCksQT1oYSgpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPTE8PDMxLEQ9e30uaGFzT3duUHJvcGVydHksRT1bXSxGPUUucG9wLEc9RS5wdXNoLEg9RS5wdXNoLEk9RS5zbGljZSxKPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKWlmKGFbY109PT1iKXJldHVybiBjO3JldHVybi0xfSxLPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTD0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTT0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLE49TS5yZXBsYWNlKCJ3IiwidyMiKSxPPSJcXFsiK0wrIiooIitNKyIpKD86IitMKyIqKFsqXiR8IX5dPz0pIitMKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrTisiKSl8KSIrTCsiKlxcXSIsUD0iOigiK00rIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK08rIikqKXwuKilcXCl8KSIsUT1uZXcgUmVnRXhwKEwrIisiLCJnIiksUj1uZXcgUmVnRXhwKCJeIitMKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK0wrIiskIiwiZyIpLFM9bmV3IFJlZ0V4cCgiXiIrTCsiKiwiK0wrIioiKSxUPW5ldyBSZWdFeHAoIl4iK0wrIiooWz4rfl18IitMKyIpIitMKyIqIiksVT1uZXcgUmVnRXhwKCI9IitMKyIqKFteXFxdJ1wiXSo/KSIrTCsiKlxcXSIsImciKSxWPW5ldyBSZWdFeHAoUCksVz1uZXcgUmVnRXhwKCJeIitOKyIkIiksWD17SUQ6bmV3IFJlZ0V4cCgiXiMoIitNKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK00rIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK00ucmVwbGFjZSgidyIsIncqIikrIikiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK08pLFBTRVVETzpuZXcgUmVnRXhwKCJeIitQKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK0wrIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK0wrIiooPzooWystXXwpIitMKyIqKFxcZCspfCkpIitMKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitLKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTCsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitMKyIqKCg/Oi1cXGQpP1xcZCopIitMKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxZPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksWj0vXmhcZCQvaSwkPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxfPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sYWE9L1srfl0vLGJhPS8nfFxcL2csY2E9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitMKyI/fCgiK0wrIil8LikiLCJpZyIpLGRhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0iMHgiK2ItNjU1MzY7cmV0dXJuIGQhPT1kfHxjP2I6MD5kP1N0cmluZy5mcm9tQ2hhckNvZGUoZCs2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShkPj4xMHw1NTI5NiwxMDIzJmR8NTYzMjApfSxlYT1mdW5jdGlvbigpe20oKX07dHJ5e0guYXBwbHkoRT1JLmNhbGwodi5jaGlsZE5vZGVzKSx2LmNoaWxkTm9kZXMpLEVbdi5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZmEpe0g9e2FwcGx5OkUubGVuZ3RoP2Z1bmN0aW9uKGEsYil7Ry5hcHBseShhLEkuY2FsbChiKSl9OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGgsZD0wO3doaWxlKGFbYysrXT1iW2QrK10pO2EubGVuZ3RoPWMtMX19fWZ1bmN0aW9uIGdhKGEsYixkLGUpe3ZhciBmLGgsaixrLGwsbyxyLHMsdyx4O2lmKChiP2Iub3duZXJEb2N1bWVudHx8Yjp2KSE9PW4mJm0oYiksYj1ifHxuLGQ9ZHx8W10saz1iLm5vZGVUeXBlLCJzdHJpbmciIT10eXBlb2YgYXx8IWF8fDEhPT1rJiY5IT09ayYmMTEhPT1rKXJldHVybiBkO2lmKCFlJiZwKXtpZigxMSE9PWsmJihmPV8uZXhlYyhhKSkpaWYoaj1mWzFdKXtpZig5PT09ayl7aWYoaD1iLmdldEVsZW1lbnRCeUlkKGopLCFofHwhaC5wYXJlbnROb2RlKXJldHVybiBkO2lmKGguaWQ9PT1qKXJldHVybiBkLnB1c2goaCksZH1lbHNlIGlmKGIub3duZXJEb2N1bWVudCYmKGg9Yi5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGopKSYmdChiLGgpJiZoLmlkPT09ailyZXR1cm4gZC5wdXNoKGgpLGR9ZWxzZXtpZihmWzJdKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSksZDtpZigoaj1mWzNdKSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGopKSxkfWlmKGMucXNhJiYoIXF8fCFxLnRlc3QoYSkpKXtpZihzPXI9dSx3PWIseD0xIT09ayYmYSwxPT09ayYmIm9iamVjdCIhPT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe289ZyhhKSwocj1iLmdldEF0dHJpYnV0ZSgiaWQiKSk/cz1yLnJlcGxhY2UoYmEsIlxcJCYiKTpiLnNldEF0dHJpYnV0ZSgiaWQiLHMpLHM9IltpZD0nIitzKyInXSAiLGw9by5sZW5ndGg7d2hpbGUobC0tKW9bbF09cytyYShvW2xdKTt3PWFhLnRlc3QoYSkmJnBhKGIucGFyZW50Tm9kZSl8fGIseD1vLmpvaW4oIiwiKX1pZih4KXRyeXtyZXR1cm4gSC5hcHBseShkLHcucXVlcnlTZWxlY3RvckFsbCh4KSksZH1jYXRjaCh5KXt9ZmluYWxseXtyfHxiLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBpKGEucmVwbGFjZShSLCIkMSIpLGIsZCxlKX1mdW5jdGlvbiBoYSgpe3ZhciBhPVtdO2Z1bmN0aW9uIGIoYyxlKXtyZXR1cm4gYS5wdXNoKGMrIiAiKT5kLmNhY2hlTGVuZ3RoJiZkZWxldGUgYlthLnNoaWZ0KCldLGJbYysiICJdPWV9cmV0dXJuIGJ9ZnVuY3Rpb24gaWEoYSl7cmV0dXJuIGFbdV09ITAsYX1mdW5jdGlvbiBqYShhKXt2YXIgYj1uLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4hIWEoYil9Y2F0Y2goYyl7cmV0dXJuITF9ZmluYWxseXtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSxiPW51bGx9fWZ1bmN0aW9uIGthKGEsYil7dmFyIGM9YS5zcGxpdCgifCIpLGU9YS5sZW5ndGg7d2hpbGUoZS0tKWQuYXR0ckhhbmRsZVtjW2VdXT1ifWZ1bmN0aW9uIGxhKGEsYil7dmFyIGM9YiYmYSxkPWMmJjE9PT1hLm5vZGVUeXBlJiYxPT09Yi5ub2RlVHlwZSYmKH5iLnNvdXJjZUluZGV4fHxDKS0ofmEuc291cmNlSW5kZXh8fEMpO2lmKGQpcmV0dXJuIGQ7aWYoYyl3aGlsZShjPWMubmV4dFNpYmxpbmcpaWYoYz09PWIpcmV0dXJuLTE7cmV0dXJuIGE/MTotMX1mdW5jdGlvbiBtYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1jJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBuYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09Y3x8ImJ1dHRvbiI9PT1jKSYmYi50eXBlPT09YX19ZnVuY3Rpb24gb2EoYSl7cmV0dXJuIGlhKGZ1bmN0aW9uKGIpe3JldHVybiBiPStiLGlhKGZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hKFtdLGMubGVuZ3RoLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWNbZT1mW2ddXSYmKGNbZV09IShkW2VdPWNbZV0pKX0pfSl9ZnVuY3Rpb24gcGEoYSl7cmV0dXJuIGEmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmYX1jPWdhLnN1cHBvcnQ9e30sZj1nYS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj1hJiYoYS5vd25lckRvY3VtZW50fHxhKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIGI/IkhUTUwiIT09Yi5ub2RlTmFtZTohMX0sbT1nYS5zZXREb2N1bWVudD1mdW5jdGlvbihhKXt2YXIgYixlLGc9YT9hLm93bmVyRG9jdW1lbnR8fGE6djtyZXR1cm4gZyE9PW4mJjk9PT1nLm5vZGVUeXBlJiZnLmRvY3VtZW50RWxlbWVudD8obj1nLG89Zy5kb2N1bWVudEVsZW1lbnQsZT1nLmRlZmF1bHRWaWV3LGUmJmUhPT1lLnRvcCYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZWEsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixlYSkpLHA9IWYoZyksYy5hdHRyaWJ1dGVzPWphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmNsYXNzTmFtZT0iaSIsIWEuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLGMuZ2V0RWxlbWVudHNCeVRhZ05hbWU9amEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZy5jcmVhdGVDb21tZW50KCIiKSksIWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxjLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9JC50ZXN0KGcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksYy5nZXRCeUlkPWphKGZ1bmN0aW9uKGEpe3JldHVybiBvLmFwcGVuZENoaWxkKGEpLmlkPXUsIWcuZ2V0RWxlbWVudHNCeU5hbWV8fCFnLmdldEVsZW1lbnRzQnlOYW1lKHUpLmxlbmd0aH0pLGMuZ2V0QnlJZD8oZC5maW5kLklEPWZ1bmN0aW9uKGEsYil7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRCeUlkJiZwKXt2YXIgYz1iLmdldEVsZW1lbnRCeUlkKGEpO3JldHVybiBjJiZjLnBhcmVudE5vZGU/W2NdOltdfX0sZC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGNhLGRhKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn19KTooZGVsZXRlIGQuZmluZC5JRCxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2EsZGEpO3JldHVybiBmdW5jdGlvbihhKXt2YXIgYz0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSYmYS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBjJiZjLnZhbHVlPT09Yn19KSxkLmZpbmQuVEFHPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZnVuY3Rpb24oYSxiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWU/Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKTpjLnFzYT9iLnF1ZXJ5U2VsZWN0b3JBbGwoYSk6dm9pZCAwfTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT0wLGY9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKTtpZigiKiI9PT1hKXt3aGlsZShjPWZbZSsrXSkxPT09Yy5ub2RlVHlwZSYmZC5wdXNoKGMpO3JldHVybiBkfXJldHVybiBmfSxkLmZpbmQuQ0xBU1M9Yy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbihhLGIpe3JldHVybiBwP2IuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKTp2b2lkIDB9LHI9W10scT1bXSwoYy5xc2E9JC50ZXN0KGcucXVlcnlTZWxlY3RvckFsbCkpJiYoamEoZnVuY3Rpb24oYSl7by5hcHBlbmRDaGlsZChhKS5pbm5lckhUTUw9IjxhIGlkPSciK3UrIic+PC9hPjxzZWxlY3QgaWQ9JyIrdSsiLVxmXScgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitMKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitMKyIqKD86dmFsdWV8IitLKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrdSsiLV0iKS5sZW5ndGh8fHEucHVzaCgifj0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrdSsiKyoiKS5sZW5ndGh8fHEucHVzaCgiLiMuK1srfl0iKX0pLGphKGZ1bmN0aW9uKGEpe3ZhciBiPWcuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGEuYXBwZW5kQ2hpbGQoYikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGEucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnEucHVzaCgibmFtZSIrTCsiKlsqXiR8IX5dPz0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RofHxxLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikscS5wdXNoKCIsLio6Iil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPSQudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmamEoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSwiZGl2Iikscy5jYWxsKGEsIltzIT0nJ106eCIpLHIucHVzaCgiIT0iLFApfSkscT1xLmxlbmd0aCYmbmV3IFJlZ0V4cChxLmpvaW4oInwiKSkscj1yLmxlbmd0aCYmbmV3IFJlZ0V4cChyLmpvaW4oInwiKSksYj0kLnRlc3Qoby5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksdD1ifHwkLnRlc3Qoby5jb250YWlucyk/ZnVuY3Rpb24oYSxiKXt2YXIgYz05PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLGQ9YiYmYi5wYXJlbnROb2RlO3JldHVybiBhPT09ZHx8ISghZHx8MSE9PWQubm9kZVR5cGV8fCEoYy5jb250YWlucz9jLmNvbnRhaW5zKGQpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZCkpKX06ZnVuY3Rpb24oYSxiKXtpZihiKXdoaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiEwO3JldHVybiExfSxCPWI/ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBkPSFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBkP2Q6KGQ9KGEub3duZXJEb2N1bWVudHx8YSk9PT0oYi5vd25lckRvY3VtZW50fHxiKT9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpOjEsMSZkfHwhYy5zb3J0RGV0YWNoZWQmJmIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSk9PT1kP2E9PT1nfHxhLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYSk/LTE6Yj09PWd8fGIub3duZXJEb2N1bWVudD09PXYmJnQodixiKT8xOms/SihrLGEpLUooayxiKTowOjQmZD8tMToxKX06ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBjLGQ9MCxlPWEucGFyZW50Tm9kZSxmPWIucGFyZW50Tm9kZSxoPVthXSxpPVtiXTtpZighZXx8IWYpcmV0dXJuIGE9PT1nPy0xOmI9PT1nPzE6ZT8tMTpmPzE6az9KKGssYSktSihrLGIpOjA7aWYoZT09PWYpcmV0dXJuIGxhKGEsYik7Yz1hO3doaWxlKGM9Yy5wYXJlbnROb2RlKWgudW5zaGlmdChjKTtjPWI7d2hpbGUoYz1jLnBhcmVudE5vZGUpaS51bnNoaWZ0KGMpO3doaWxlKGhbZF09PT1pW2RdKWQrKztyZXR1cm4gZD9sYShoW2RdLGlbZF0pOmhbZF09PT12Py0xOmlbZF09PT12PzE6MH0sZyk6bn0sZ2EubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBnYShhLG51bGwsbnVsbCxiKX0sZ2EubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYil7aWYoKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLGI9Yi5yZXBsYWNlKFUsIj0nJDEnXSIpLCEoIWMubWF0Y2hlc1NlbGVjdG9yfHwhcHx8ciYmci50ZXN0KGIpfHxxJiZxLnRlc3QoYikpKXRyeXt2YXIgZD1zLmNhbGwoYSxiKTtpZihkfHxjLmRpc2Nvbm5lY3RlZE1hdGNofHxhLmRvY3VtZW50JiYxMSE9PWEuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGR9Y2F0Y2goZSl7fXJldHVybiBnYShiLG4sbnVsbCxbYV0pLmxlbmd0aD4wfSxnYS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybihhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSx0KGEsYil9LGdhLmF0dHI9ZnVuY3Rpb24oYSxiKXsoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSk7dmFyIGU9ZC5hdHRySGFuZGxlW2IudG9Mb3dlckNhc2UoKV0sZj1lJiZELmNhbGwoZC5hdHRySGFuZGxlLGIudG9Mb3dlckNhc2UoKSk/ZShhLGIsIXApOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09Zj9mOmMuYXR0cmlidXRlc3x8IXA/YS5nZXRBdHRyaWJ1dGUoYik6KGY9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZi5zcGVjaWZpZWQ/Zi52YWx1ZTpudWxsfSxnYS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9LGdhLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXSxlPTAsZj0wO2lmKGw9IWMuZGV0ZWN0RHVwbGljYXRlcyxrPSFjLnNvcnRTdGFibGUmJmEuc2xpY2UoMCksYS5zb3J0KEIpLGwpe3doaWxlKGI9YVtmKytdKWI9PT1hW2ZdJiYoZT1kLnB1c2goZikpO3doaWxlKGUtLSlhLnNwbGljZShkW2VdLDEpfXJldHVybiBrPW51bGwsYX0sZT1nYS5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9IiIsZD0wLGY9YS5ub2RlVHlwZTtpZihmKXtpZigxPT09Znx8OT09PWZ8fDExPT09Zil7aWYoInN0cmluZyI9PXR5cGVvZiBhLnRleHRDb250ZW50KXJldHVybiBhLnRleHRDb250ZW50O2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyljKz1lKGEpfWVsc2UgaWYoMz09PWZ8fDQ9PT1mKXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKGI9YVtkKytdKWMrPWUoYik7cmV0dXJuIGN9LGQ9Z2Euc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86aWEsbWF0Y2g6WCxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS5yZXBsYWNlKGNhLGRhKSxhWzNdPShhWzNdfHxhWzRdfHxhWzVdfHwiIikucmVwbGFjZShjYSxkYSksIn49Ij09PWFbMl0mJihhWzNdPSIgIithWzNdKyIgIiksYS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1hWzFdLnNsaWNlKDAsMyk/KGFbM118fGdhLmVycm9yKGFbMF0pLGFbNF09KyhhWzRdP2FbNV0rKGFbNl18fDEpOjIqKCJldmVuIj09PWFbM118fCJvZGQiPT09YVszXSkpLGFbNV09KyhhWzddK2FbOF18fCJvZGQiPT09YVszXSkpOmFbM10mJmdhLmVycm9yKGFbMF0pLGF9LFBTRVVETzpmdW5jdGlvbihhKXt2YXIgYixjPSFhWzZdJiZhWzJdO3JldHVybiBYLkNISUxELnRlc3QoYVswXSk/bnVsbDooYVszXT9hWzJdPWFbNF18fGFbNV18fCIiOmMmJlYudGVzdChjKSYmKGI9ZyhjLCEwKSkmJihiPWMuaW5kZXhPZigiKSIsYy5sZW5ndGgtYiktYy5sZW5ndGgpJiYoYVswXT1hWzBdLnNsaWNlKDAsYiksYVsyXT1jLnNsaWNlKDAsYikpLGEuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2EsZGEpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09YT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn19LENMQVNTOmZ1bmN0aW9uKGEpe3ZhciBiPXlbYSsiICJdO3JldHVybiBifHwoYj1uZXcgUmVnRXhwKCIoXnwiK0wrIikiK2ErIigiK0wrInwkKSIpKSYmeShhLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoInN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZSYmYS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBlPWdhLmF0dHIoZCxhKTtyZXR1cm4gbnVsbD09ZT8iIT0iPT09YjpiPyhlKz0iIiwiPSI9PT1iP2U9PT1jOiIhPSI9PT1iP2UhPT1jOiJePSI9PT1iP2MmJjA9PT1lLmluZGV4T2YoYyk6Iio9Ij09PWI/YyYmZS5pbmRleE9mKGMpPi0xOiIkPSI9PT1iP2MmJmUuc2xpY2UoLWMubGVuZ3RoKT09PWM6In49Ij09PWI/KCIgIitlLnJlcGxhY2UoUSwiICIpKyIgIikuaW5kZXhPZihjKT4tMToifD0iPT09Yj9lPT09Y3x8ZS5zbGljZSgwLGMubGVuZ3RoKzEpPT09YysiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj0ibnRoIiE9PWEuc2xpY2UoMCwzKSxnPSJsYXN0IiE9PWEuc2xpY2UoLTQpLGg9Im9mLXR5cGUiPT09YjtyZXR1cm4gMT09PWQmJjA9PT1lP2Z1bmN0aW9uKGEpe3JldHVybiEhYS5wYXJlbnROb2RlfTpmdW5jdGlvbihiLGMsaSl7dmFyIGosayxsLG0sbixvLHA9ZiE9PWc/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixxPWIucGFyZW50Tm9kZSxyPWgmJmIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxzPSFpJiYhaDtpZihxKXtpZihmKXt3aGlsZShwKXtsPWI7d2hpbGUobD1sW3BdKWlmKGg/bC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cjoxPT09bC5ub2RlVHlwZSlyZXR1cm4hMTtvPXA9Im9ubHkiPT09YSYmIW8mJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYobz1bZz9xLmZpcnN0Q2hpbGQ6cS5sYXN0Q2hpbGRdLGcmJnMpe2s9cVt1XXx8KHFbdV09e30pLGo9a1thXXx8W10sbj1qWzBdPT09dyYmalsxXSxtPWpbMF09PT13JiZqWzJdLGw9biYmcS5jaGlsZE5vZGVzW25dO3doaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKDE9PT1sLm5vZGVUeXBlJiYrK20mJmw9PT1iKXtrW2FdPVt3LG4sbV07YnJlYWt9fWVsc2UgaWYocyYmKGo9KGJbdV18fChiW3VdPXt9KSlbYV0pJiZqWzBdPT09dyltPWpbMV07ZWxzZSB3aGlsZShsPSsrbiYmbCYmbFtwXXx8KG09bj0wKXx8by5wb3AoKSlpZigoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKSYmKyttJiYocyYmKChsW3VdfHwobFt1XT17fSkpW2FdPVt3LG1dKSxsPT09YikpYnJlYWs7cmV0dXJuIG0tPWUsbT09PWR8fG0lZD09PTAmJm0vZD49MH19fSxQU0VVRE86ZnVuY3Rpb24oYSxiKXt2YXIgYyxlPWQucHNldWRvc1thXXx8ZC5zZXRGaWx0ZXJzW2EudG9Mb3dlckNhc2UoKV18fGdhLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrYSk7cmV0dXJuIGVbdV0/ZShiKTplLmxlbmd0aD4xPyhjPVthLGEsIiIsYl0sZC5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/aWEoZnVuY3Rpb24oYSxjKXt2YXIgZCxmPWUoYSxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSlkPUooYSxmW2ddKSxhW2RdPSEoY1tkXT1mW2ddKX0pOmZ1bmN0aW9uKGEpe3JldHVybiBlKGEsMCxjKX0pOmV9fSxwc2V1ZG9zOntub3Q6aWEoZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxkPWgoYS5yZXBsYWNlKFIsIiQxIikpO3JldHVybiBkW3VdP2lhKGZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmLGc9ZChhLG51bGwsZSxbXSksaD1hLmxlbmd0aDt3aGlsZShoLS0pKGY9Z1toXSkmJihhW2hdPSEoYltoXT1mKSl9KTpmdW5jdGlvbihhLGUsZil7cmV0dXJuIGJbMF09YSxkKGIsbnVsbCxmLGMpLGJbMF09bnVsbCwhYy5wb3AoKX19KSxoYXM6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBnYShhLGIpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmlhKGZ1bmN0aW9uKGEpe3JldHVybiBhPWEucmVwbGFjZShjYSxkYSksZnVuY3Rpb24oYil7cmV0dXJuKGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0fHxlKGIpKS5pbmRleE9mKGEpPi0xfX0pLGxhbmc6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIFcudGVzdChhfHwiIil8fGdhLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2EpLGE9YS5yZXBsYWNlKGNhLGRhKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGIpe3ZhciBjO2RvIGlmKGM9cD9iLmxhbmc6Yi5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGIuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuIGM9Yy50b0xvd2VyQ2FzZSgpLGM9PT1hfHwwPT09Yy5pbmRleE9mKGErIi0iKTt3aGlsZSgoYj1iLnBhcmVudE5vZGUpJiYxPT09Yi5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGIpe3ZhciBjPWEubG9jYXRpb24mJmEubG9jYXRpb24uaGFzaDtyZXR1cm4gYyYmYy5zbGljZSgxKT09PWIuaWR9LHJvb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1vfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW4uYWN0aXZlRWxlbWVudCYmKCFuLmhhc0ZvY3VzfHxuLmhhc0ZvY3VzKCkpJiYhIShhLnR5cGV8fGEuaHJlZnx8fmEudGFiSW5kZXgpfSxlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYhIWEuY2hlY2tlZHx8Im9wdGlvbiI9PT1iJiYhIWEuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGEuc2VsZWN0ZWQ9PT0hMH0sZW1wdHk6ZnVuY3Rpb24oYSl7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWlmKGEubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiFkLnBzZXVkb3MuZW1wdHkoYSl9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4gWi50ZXN0KGEubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4gWS50ZXN0KGEubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYiYnV0dG9uIj09PWEudHlwZXx8ImJ1dHRvbiI9PT1ifSx0ZXh0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PWEudHlwZSYmKG51bGw9PShiPWEuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT1iLnRvTG93ZXJDYXNlKCkpfSxmaXJzdDpvYShmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6b2EoZnVuY3Rpb24oYSxiKXtyZXR1cm5bYi0xXX0pLGVxOm9hKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm5bMD5jP2MrYjpjXX0pLGV2ZW46b2EoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxvZGQ6b2EoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MTtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxsdDpvYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzstLWQ+PTA7KWEucHVzaChkKTtyZXR1cm4gYX0pLGd0Om9hKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOysrZDxiOylhLnB1c2goZCk7cmV0dXJuIGF9KX19LGQucHNldWRvcy5udGg9ZC5wc2V1ZG9zLmVxO2ZvcihiIGlue3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KWQucHNldWRvc1tiXT1tYShiKTtmb3IoYiBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KWQucHNldWRvc1tiXT1uYShiKTtmdW5jdGlvbiBxYSgpe31xYS5wcm90b3R5cGU9ZC5maWx0ZXJzPWQucHNldWRvcyxkLnNldEZpbHRlcnM9bmV3IHFhLGc9Z2EudG9rZW5pemU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPXpbYSsiICJdO2lmKGspcmV0dXJuIGI/MDprLnNsaWNlKDApO2g9YSxpPVtdLGo9ZC5wcmVGaWx0ZXI7d2hpbGUoaCl7KCFjfHwoZT1TLmV4ZWMoaCkpKSYmKGUmJihoPWguc2xpY2UoZVswXS5sZW5ndGgpfHxoKSxpLnB1c2goZj1bXSkpLGM9ITEsKGU9VC5leGVjKGgpKSYmKGM9ZS5zaGlmdCgpLGYucHVzaCh7dmFsdWU6Yyx0eXBlOmVbMF0ucmVwbGFjZShSLCIgIil9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtmb3IoZyBpbiBkLmZpbHRlcikhKGU9WFtnXS5leGVjKGgpKXx8altnXSYmIShlPWpbZ10oZSkpfHwoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZyxtYXRjaGVzOmV9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtpZighYylicmVha31yZXR1cm4gYj9oLmxlbmd0aDpoP2dhLmVycm9yKGEpOnooYSxpKS5zbGljZSgwKX07ZnVuY3Rpb24gcmEoYSl7Zm9yKHZhciBiPTAsYz1hLmxlbmd0aCxkPSIiO2M+YjtiKyspZCs9YVtiXS52YWx1ZTtyZXR1cm4gZH1mdW5jdGlvbiBzYShhLGIsYyl7dmFyIGQ9Yi5kaXIsZT1jJiYicGFyZW50Tm9kZSI9PT1kLGY9eCsrO3JldHVybiBiLmZpcnN0P2Z1bmN0aW9uKGIsYyxmKXt3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpcmV0dXJuIGEoYixjLGYpfTpmdW5jdGlvbihiLGMsZyl7dmFyIGgsaSxqPVt3LGZdO2lmKGcpe3doaWxlKGI9YltkXSlpZigoMT09PWIubm9kZVR5cGV8fGUpJiZhKGIsYyxnKSlyZXR1cm4hMH1lbHNlIHdoaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSl7aWYoaT1iW3VdfHwoYlt1XT17fSksKGg9aVtkXSkmJmhbMF09PT13JiZoWzFdPT09ZilyZXR1cm4galsyXT1oWzJdO2lmKGlbZF09aixqWzJdPWEoYixjLGcpKXJldHVybiEwfX19ZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEubGVuZ3RoPjE/ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEubGVuZ3RoO3doaWxlKGUtLSlpZighYVtlXShiLGMsZCkpcmV0dXJuITE7cmV0dXJuITB9OmFbMF19ZnVuY3Rpb24gdWEoYSxiLGMpe2Zvcih2YXIgZD0wLGU9Yi5sZW5ndGg7ZT5kO2QrKylnYShhLGJbZF0sYyk7cmV0dXJuIGN9ZnVuY3Rpb24gdmEoYSxiLGMsZCxlKXtmb3IodmFyIGYsZz1bXSxoPTAsaT1hLmxlbmd0aCxqPW51bGwhPWI7aT5oO2grKykoZj1hW2hdKSYmKCFjfHxjKGYsZCxlKSkmJihnLnB1c2goZiksaiYmYi5wdXNoKGgpKTtyZXR1cm4gZ31mdW5jdGlvbiB3YShhLGIsYyxkLGUsZil7cmV0dXJuIGQmJiFkW3VdJiYoZD13YShkKSksZSYmIWVbdV0mJihlPXdhKGUsZikpLGlhKGZ1bmN0aW9uKGYsZyxoLGkpe3ZhciBqLGssbCxtPVtdLG49W10sbz1nLmxlbmd0aCxwPWZ8fHVhKGJ8fCIqIixoLm5vZGVUeXBlP1toXTpoLFtdKSxxPSFhfHwhZiYmYj9wOnZhKHAsbSxhLGgsaSkscj1jP2V8fChmP2E6b3x8ZCk/W106ZzpxO2lmKGMmJmMocSxyLGgsaSksZCl7aj12YShyLG4pLGQoaixbXSxoLGkpLGs9ai5sZW5ndGg7d2hpbGUoay0tKShsPWpba10pJiYocltuW2tdXT0hKHFbbltrXV09bCkpfWlmKGYpe2lmKGV8fGEpe2lmKGUpe2o9W10saz1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJmoucHVzaChxW2tdPWwpO2UobnVsbCxyPVtdLGosaSl9az1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJihqPWU/SihmLGwpOm1ba10pPi0xJiYoZltqXT0hKGdbal09bCkpfX1lbHNlIHI9dmEocj09PWc/ci5zcGxpY2UobyxyLmxlbmd0aCk6ciksZT9lKG51bGwsZyxyLGkpOkguYXBwbHkoZyxyKX0pfWZ1bmN0aW9uIHhhKGEpe2Zvcih2YXIgYixjLGUsZj1hLmxlbmd0aCxnPWQucmVsYXRpdmVbYVswXS50eXBlXSxoPWd8fGQucmVsYXRpdmVbIiAiXSxpPWc/MTowLGs9c2EoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1ifSxoLCEwKSxsPXNhKGZ1bmN0aW9uKGEpe3JldHVybiBKKGIsYSk+LTF9LGgsITApLG09W2Z1bmN0aW9uKGEsYyxkKXt2YXIgZT0hZyYmKGR8fGMhPT1qKXx8KChiPWMpLm5vZGVUeXBlP2soYSxjLGQpOmwoYSxjLGQpKTtyZXR1cm4gYj1udWxsLGV9XTtmPmk7aSsrKWlmKGM9ZC5yZWxhdGl2ZVthW2ldLnR5cGVdKW09W3NhKHRhKG0pLGMpXTtlbHNle2lmKGM9ZC5maWx0ZXJbYVtpXS50eXBlXS5hcHBseShudWxsLGFbaV0ubWF0Y2hlcyksY1t1XSl7Zm9yKGU9KytpO2Y+ZTtlKyspaWYoZC5yZWxhdGl2ZVthW2VdLnR5cGVdKWJyZWFrO3JldHVybiB3YShpPjEmJnRhKG0pLGk+MSYmcmEoYS5zbGljZSgwLGktMSkuY29uY2F0KHt2YWx1ZToiICI9PT1hW2ktMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZShSLCIkMSIpLGMsZT5pJiZ4YShhLnNsaWNlKGksZSkpLGY+ZSYmeGEoYT1hLnNsaWNlKGUpKSxmPmUmJnJhKGEpKX1tLnB1c2goYyl9cmV0dXJuIHRhKG0pfWZ1bmN0aW9uIHlhKGEsYil7dmFyIGM9Yi5sZW5ndGg+MCxlPWEubGVuZ3RoPjAsZj1mdW5jdGlvbihmLGcsaCxpLGspe3ZhciBsLG0sbyxwPTAscT0iMCIscj1mJiZbXSxzPVtdLHQ9aix1PWZ8fGUmJmQuZmluZC5UQUcoIioiLGspLHY9dys9bnVsbD09dD8xOk1hdGgucmFuZG9tKCl8fC4xLHg9dS5sZW5ndGg7Zm9yKGsmJihqPWchPT1uJiZnKTtxIT09eCYmbnVsbCE9KGw9dVtxXSk7cSsrKXtpZihlJiZsKXttPTA7d2hpbGUobz1hW20rK10paWYobyhsLGcsaCkpe2kucHVzaChsKTticmVha31rJiYodz12KX1jJiYoKGw9IW8mJmwpJiZwLS0sZiYmci5wdXNoKGwpKX1pZihwKz1xLGMmJnEhPT1wKXttPTA7d2hpbGUobz1iW20rK10pbyhyLHMsZyxoKTtpZihmKXtpZihwPjApd2hpbGUocS0tKXJbcV18fHNbcV18fChzW3FdPUYuY2FsbChpKSk7cz12YShzKX1ILmFwcGx5KGkscyksayYmIWYmJnMubGVuZ3RoPjAmJnArYi5sZW5ndGg+MSYmZ2EudW5pcXVlU29ydChpKX1yZXR1cm4gayYmKHc9dixqPXQpLHJ9O3JldHVybiBjP2lhKGYpOmZ9cmV0dXJuIGg9Z2EuY29tcGlsZT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1bXSxmPUFbYSsiICJdO2lmKCFmKXtifHwoYj1nKGEpKSxjPWIubGVuZ3RoO3doaWxlKGMtLSlmPXhhKGJbY10pLGZbdV0/ZC5wdXNoKGYpOmUucHVzaChmKTtmPUEoYSx5YShlLGQpKSxmLnNlbGVjdG9yPWF9cmV0dXJuIGZ9LGk9Z2Euc2VsZWN0PWZ1bmN0aW9uKGEsYixlLGYpe3ZhciBpLGosayxsLG0sbj0iZnVuY3Rpb24iPT10eXBlb2YgYSYmYSxvPSFmJiZnKGE9bi5zZWxlY3Rvcnx8YSk7aWYoZT1lfHxbXSwxPT09by5sZW5ndGgpe2lmKGo9b1swXT1vWzBdLnNsaWNlKDApLGoubGVuZ3RoPjImJiJJRCI9PT0oaz1qWzBdKS50eXBlJiZjLmdldEJ5SWQmJjk9PT1iLm5vZGVUeXBlJiZwJiZkLnJlbGF0aXZlW2pbMV0udHlwZV0pe2lmKGI9KGQuZmluZC5JRChrLm1hdGNoZXNbMF0ucmVwbGFjZShjYSxkYSksYil8fFtdKVswXSwhYilyZXR1cm4gZTtuJiYoYj1iLnBhcmVudE5vZGUpLGE9YS5zbGljZShqLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPVgubmVlZHNDb250ZXh0LnRlc3QoYSk/MDpqLmxlbmd0aDt3aGlsZShpLS0pe2lmKGs9altpXSxkLnJlbGF0aXZlW2w9ay50eXBlXSlicmVhaztpZigobT1kLmZpbmRbbF0pJiYoZj1tKGsubWF0Y2hlc1swXS5yZXBsYWNlKGNhLGRhKSxhYS50ZXN0KGpbMF0udHlwZSkmJnBhKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoai5zcGxpY2UoaSwxKSxhPWYubGVuZ3RoJiZyYShqKSwhYSlyZXR1cm4gSC5hcHBseShlLGYpLGU7YnJlYWt9fX1yZXR1cm4obnx8aChhLG8pKShmLGIsIXAsZSxhYS50ZXN0KGEpJiZwYShiLnBhcmVudE5vZGUpfHxiKSxlfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9amEoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLGphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGthKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsInR5cGUiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGlucHV0Lz4iLGEuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGthKCJ2YWx1ZSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHwiaW5wdXQiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3ZvaWQgMDphLmRlZmF1bHRWYWx1ZX0pLGphKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxrYShLLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxnYX0oYSk7bS5maW5kPXMsbS5leHByPXMuc2VsZWN0b3JzLG0uZXhwclsiOiJdPW0uZXhwci5wc2V1ZG9zLG0udW5pcXVlPXMudW5pcXVlU29ydCxtLnRleHQ9cy5nZXRUZXh0LG0uaXNYTUxEb2M9cy5pc1hNTCxtLmNvbnRhaW5zPXMuY29udGFpbnM7dmFyIHQ9bS5leHByLm1hdGNoLm5lZWRzQ29udGV4dCx1PS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8sdj0vXi5bXjojXFtcLixdKiQvO2Z1bmN0aW9uIHcoYSxiLGMpe2lmKG0uaXNGdW5jdGlvbihiKSlyZXR1cm4gbS5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4hIWIuY2FsbChhLGQsYSkhPT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gbS5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iIT09Y30pO2lmKCJzdHJpbmciPT10eXBlb2YgYil7aWYodi50ZXN0KGIpKXJldHVybiBtLmZpbHRlcihiLGEsYyk7Yj1tLmZpbHRlcihiLGEpfXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gbS5pbkFycmF5KGEsYik+PTAhPT1jfSl9bS5maWx0ZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWJbMF07cmV0dXJuIGMmJihhPSI6bm90KCIrYSsiKSIpLDE9PT1iLmxlbmd0aCYmMT09PWQubm9kZVR5cGU/bS5maW5kLm1hdGNoZXNTZWxlY3RvcihkLGEpP1tkXTpbXTptLmZpbmQubWF0Y2hlcyhhLG0uZ3JlcChiLGZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZX0pKX0sbS5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXSxkPXRoaXMsZT1kLmxlbmd0aDtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIHRoaXMucHVzaFN0YWNrKG0oYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGI9MDtlPmI7YisrKWlmKG0uY29udGFpbnMoZFtiXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3IoYj0wO2U+YjtiKyspbS5maW5kKGEsZFtiXSxjKTtyZXR1cm4gYz10aGlzLnB1c2hTdGFjayhlPjE/bS51bmlxdWUoYyk6YyksYy5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrIiAiK2E6YSxjfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcodGhpcyxhfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcodGhpcyxhfHxbXSwhMCkpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIXcodGhpcywic3RyaW5nIj09dHlwZW9mIGEmJnQudGVzdChhKT9tKGEpOmF8fFtdLCExKS5sZW5ndGh9fSk7dmFyIHgseT1hLmRvY3VtZW50LHo9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLyxBPW0uZm4uaW5pdD1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7aWYoIWEpcmV0dXJuIHRoaXM7aWYoInN0cmluZyI9PXR5cGVvZiBhKXtpZihjPSI8Ij09PWEuY2hhckF0KDApJiYiPiI9PT1hLmNoYXJBdChhLmxlbmd0aC0xKSYmYS5sZW5ndGg+PTM/W251bGwsYSxudWxsXTp6LmV4ZWMoYSksIWN8fCFjWzFdJiZiKXJldHVybiFifHxiLmpxdWVyeT8oYnx8eCkuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGIpLmZpbmQoYSk7aWYoY1sxXSl7aWYoYj1iIGluc3RhbmNlb2YgbT9iWzBdOmIsbS5tZXJnZSh0aGlzLG0ucGFyc2VIVE1MKGNbMV0sYiYmYi5ub2RlVHlwZT9iLm93bmVyRG9jdW1lbnR8fGI6eSwhMCkpLHUudGVzdChjWzFdKSYmbS5pc1BsYWluT2JqZWN0KGIpKWZvcihjIGluIGIpbS5pc0Z1bmN0aW9uKHRoaXNbY10pP3RoaXNbY10oYltjXSk6dGhpcy5hdHRyKGMsYltjXSk7cmV0dXJuIHRoaXN9aWYoZD15LmdldEVsZW1lbnRCeUlkKGNbMl0pLGQmJmQucGFyZW50Tm9kZSl7aWYoZC5pZCE9PWNbMl0pcmV0dXJuIHguZmluZChhKTt0aGlzLmxlbmd0aD0xLHRoaXNbMF09ZH1yZXR1cm4gdGhpcy5jb250ZXh0PXksdGhpcy5zZWxlY3Rvcj1hLHRoaXN9cmV0dXJuIGEubm9kZVR5cGU/KHRoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MSx0aGlzKTptLmlzRnVuY3Rpb24oYSk/InVuZGVmaW5lZCIhPXR5cGVvZiB4LnJlYWR5P3gucmVhZHkoYSk6YShtKToodm9pZCAwIT09YS5zZWxlY3RvciYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9YS5jb250ZXh0KSxtLm1ha2VBcnJheShhLHRoaXMpKX07QS5wcm90b3R5cGU9bS5mbix4PW0oeSk7dmFyIEI9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sQz17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTttLmV4dGVuZCh7ZGlyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPWFbYl07d2hpbGUoZSYmOSE9PWUubm9kZVR5cGUmJih2b2lkIDA9PT1jfHwxIT09ZS5ub2RlVHlwZXx8IW0oZSkuaXMoYykpKTE9PT1lLm5vZGVUeXBlJiZkLnB1c2goZSksZT1lW2JdO3JldHVybiBkfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdO2E7YT1hLm5leHRTaWJsaW5nKTE9PT1hLm5vZGVUeXBlJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pLG0uZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oYSl7dmFyIGIsYz1tKGEsdGhpcyksZD1jLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2Q+YjtiKyspaWYobS5jb250YWlucyh0aGlzLGNbYl0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPXQudGVzdChhKXx8InN0cmluZyIhPXR5cGVvZiBhP20oYSxifHx0aGlzLmNvbnRleHQpOjA7ZT5kO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJm0uZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9tLnVuaXF1ZShmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP20uaW5BcnJheSh0aGlzWzBdLG0oYSkpOm0uaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobS51bmlxdWUobS5tZXJnZSh0aGlzLmdldCgpLG0oYSxiKSkpKX0sYWRkQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09YT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihhKSl9fSk7ZnVuY3Rpb24gRChhLGIpe2RvIGE9YVtiXTt3aGlsZShhJiYxIT09YS5ub2RlVHlwZSk7cmV0dXJuIGF9bS5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiYxMSE9PWIubm9kZVR5cGU/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBtLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBEKGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBtLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBtLnNpYmxpbmcoKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBtLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG0ubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDptLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe20uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1tLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW0uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihDW2FdfHwoZT1tLnVuaXF1ZShlKSksQi50ZXN0KGEpJiYoZT1lLnJldmVyc2UoKSkpLHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBFPS9cUysvZyxGPXt9O2Z1bmN0aW9uIEcoYSl7dmFyIGI9RlthXT17fTtyZXR1cm4gbS5lYWNoKGEubWF0Y2goRSl8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bS5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT0ic3RyaW5nIj09dHlwZW9mIGE/RlthXXx8RyhhKTptLmV4dGVuZCh7fSxhKTt2YXIgYixjLGQsZSxmLGcsaD1bXSxpPSFhLm9uY2UmJltdLGo9ZnVuY3Rpb24obCl7Zm9yKGM9YS5tZW1vcnkmJmwsZD0hMCxmPWd8fDAsZz0wLGU9aC5sZW5ndGgsYj0hMDtoJiZlPmY7ZisrKWlmKGhbZl0uYXBwbHkobFswXSxsWzFdKT09PSExJiZhLnN0b3BPbkZhbHNlKXtjPSExO2JyZWFrfWI9ITEsaCYmKGk/aS5sZW5ndGgmJmooaS5zaGlmdCgpKTpjP2g9W106ay5kaXNhYmxlKCkpfSxrPXthZGQ6ZnVuY3Rpb24oKXtpZihoKXt2YXIgZD1oLmxlbmd0aDshZnVuY3Rpb24gZihiKXttLmVhY2goYixmdW5jdGlvbihiLGMpe3ZhciBkPW0udHlwZShjKTsiZnVuY3Rpb24iPT09ZD9hLnVuaXF1ZSYmay5oYXMoYyl8fGgucHVzaChjKTpjJiZjLmxlbmd0aCYmInN0cmluZyIhPT1kJiZmKGMpfSl9KGFyZ3VtZW50cyksYj9lPWgubGVuZ3RoOmMmJihnPWQsaihjKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBoJiZtLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYyl7dmFyIGQ7d2hpbGUoKGQ9bS5pbkFycmF5KGMsaCxkKSk+LTEpaC5zcGxpY2UoZCwxKSxiJiYoZT49ZCYmZS0tLGY+PWQmJmYtLSl9KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/bS5pbkFycmF5KGEsaCk+LTE6ISghaHx8IWgubGVuZ3RoKX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaD1bXSxlPTAsdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBoPWk9Yz12b2lkIDAsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haH0sbG9jazpmdW5jdGlvbigpe3JldHVybiBpPXZvaWQgMCxjfHxrLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sZmlyZVdpdGg6ZnVuY3Rpb24oYSxjKXtyZXR1cm4haHx8ZCYmIWl8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sYj9pLnB1c2goYyk6aihjKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBrLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBrfSxtLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLG0uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsbS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsbS5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBtLkRlZmVycmVkKGZ1bmN0aW9uKGMpe20uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bS5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZtLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5kb25lKGMucmVzb2x2ZSkuZmFpbChjLnJlamVjdCkucHJvZ3Jlc3MoYy5ub3RpZnkpOmNbZlswXSsiV2l0aCJdKHRoaXM9PT1kP2MucHJvbWlzZSgpOnRoaXMsZz9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hP20uZXh0ZW5kKGEsZCk6ZH19LGU9e307cmV0dXJuIGQucGlwZT1kLnRoZW4sbS5lYWNoKGIsZnVuY3Rpb24oYSxmKXt2YXIgZz1mWzJdLGg9ZlszXTtkW2ZbMV1dPWcuYWRkLGgmJmcuYWRkKGZ1bmN0aW9uKCl7Yz1ofSxiWzFeYV1bMl0uZGlzYWJsZSxiWzJdWzJdLmxvY2spLGVbZlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gZVtmWzBdKyJXaXRoIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1kLmNhbGwoYXJndW1lbnRzKSxlPWMubGVuZ3RoLGY9MSE9PWV8fGEmJm0uaXNGdW5jdGlvbihhLnByb21pc2UpP2U6MCxnPTE9PT1mP2E6bS5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihlKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZC5jYWxsKGFyZ3VtZW50cyk6ZSxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGU+MSlmb3IoaT1uZXcgQXJyYXkoZSksaj1uZXcgQXJyYXkoZSksaz1uZXcgQXJyYXkoZSk7ZT5iO2IrKyljW2JdJiZtLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5kb25lKGgoYixrLGMpKS5mYWlsKGcucmVqZWN0KS5wcm9ncmVzcyhoKGIsaixpKSk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEg7bS5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbS5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxtLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9tLnJlYWR5V2FpdCsrOm0ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITA/IS0tbS5yZWFkeVdhaXQ6IW0uaXNSZWFkeSl7aWYoIXkuYm9keSlyZXR1cm4gc2V0VGltZW91dChtLnJlYWR5KTttLmlzUmVhZHk9ITAsYSE9PSEwJiYtLW0ucmVhZHlXYWl0PjB8fChILnJlc29sdmVXaXRoKHksW21dKSxtLmZuLnRyaWdnZXJIYW5kbGVyJiYobSh5KS50cmlnZ2VySGFuZGxlcigicmVhZHkiKSxtKHkpLm9mZigicmVhZHkiKSkpfX19KTtmdW5jdGlvbiBJKCl7eS5hZGRFdmVudExpc3RlbmVyPyh5LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEosITEpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsSiwhMSkpOih5LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEopLGEuZGV0YWNoRXZlbnQoIm9ubG9hZCIsSikpfWZ1bmN0aW9uIEooKXsoeS5hZGRFdmVudExpc3RlbmVyfHwibG9hZCI9PT1ldmVudC50eXBlfHwiY29tcGxldGUiPT09eS5yZWFkeVN0YXRlKSYmKEkoKSxtLnJlYWR5KCkpfW0ucmVhZHkucHJvbWlzZT1mdW5jdGlvbihiKXtpZighSClpZihIPW0uRGVmZXJyZWQoKSwiY29tcGxldGUiPT09eS5yZWFkeVN0YXRlKXNldFRpbWVvdXQobS5yZWFkeSk7ZWxzZSBpZih5LmFkZEV2ZW50TGlzdGVuZXIpeS5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixKLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLEosITEpO2Vsc2V7eS5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixKKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLEopO3ZhciBjPSExO3RyeXtjPW51bGw9PWEuZnJhbWVFbGVtZW50JiZ5LmRvY3VtZW50RWxlbWVudH1jYXRjaChkKXt9YyYmYy5kb1Njcm9sbCYmIWZ1bmN0aW9uIGUoKXtpZighbS5pc1JlYWR5KXt0cnl7Yy5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3JldHVybiBzZXRUaW1lb3V0KGUsNTApfUkoKSxtLnJlYWR5KCl9fSgpfXJldHVybiBILnByb21pc2UoYil9O3ZhciBLPSJ1bmRlZmluZWQiLEw7Zm9yKEwgaW4gbShrKSlicmVhaztrLm93bkxhc3Q9IjAiIT09TCxrLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9ITEsbShmdW5jdGlvbigpe3ZhciBhLGIsYyxkO2M9eS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLGMmJmMuc3R5bGUmJihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9ImRpc3BsYXk6aW5saW5lO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGsuaW5saW5lQmxvY2tOZWVkc0xheW91dD1hPTM9PT1iLm9mZnNldFdpZHRoLGEmJihjLnN0eWxlLnpvb209MSkpLGMucmVtb3ZlQ2hpbGQoZCkpfSksZnVuY3Rpb24oKXt2YXIgYT15LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKG51bGw9PWsuZGVsZXRlRXhwYW5kbyl7ay5kZWxldGVFeHBhbmRvPSEwO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKGIpe2suZGVsZXRlRXhwYW5kbz0hMX19YT1udWxsfSgpLG0uYWNjZXB0RGF0YT1mdW5jdGlvbihhKXt2YXIgYj1tLm5vRGF0YVsoYS5ub2RlTmFtZSsiICIpLnRvTG93ZXJDYXNlKCldLGM9K2Eubm9kZVR5cGV8fDE7cmV0dXJuIDEhPT1jJiY5IT09Yz8hMTohYnx8YiE9PSEwJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09Yn07dmFyIE09L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxOPS8oW0EtWl0pL2c7ZnVuY3Rpb24gTyhhLGIsYyl7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpe3ZhciBkPSJkYXRhLSIrYi5yZXBsYWNlKE4sIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSJ0cnVlIj09PWM/ITA6ImZhbHNlIj09PWM/ITE6Im51bGwiPT09Yz9udWxsOitjKyIiPT09Yz8rYzpNLnRlc3QoYyk/bS5wYXJzZUpTT04oYyk6Y31jYXRjaChlKXt9bS5kYXRhKGEsYixjKX1lbHNlIGM9dm9pZCAwfXJldHVybiBjfWZ1bmN0aW9uIFAoYSl7dmFyIGI7Zm9yKGIgaW4gYSlpZigoImRhdGEiIT09Ynx8IW0uaXNFbXB0eU9iamVjdChhW2JdKSkmJiJ0b0pTT04iIT09YilyZXR1cm4hMTsNCg0KcmV0dXJuITB9ZnVuY3Rpb24gUShhLGIsZCxlKXtpZihtLmFjY2VwdERhdGEoYSkpe3ZhciBmLGcsaD1tLmV4cGFuZG8saT1hLm5vZGVUeXBlLGo9aT9tLmNhY2hlOmEsaz1pP2FbaF06YVtoXSYmaDtpZihrJiZqW2tdJiYoZXx8altrXS5kYXRhKXx8dm9pZCAwIT09ZHx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBrfHwoaz1pP2FbaF09Yy5wb3AoKXx8bS5ndWlkKys6aCksaltrXXx8KGpba109aT97fTp7dG9KU09OOm0ubm9vcH0pLCgib2JqZWN0Ij09dHlwZW9mIGJ8fCJmdW5jdGlvbiI9PXR5cGVvZiBiKSYmKGU/altrXT1tLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1tLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbS5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbS5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFIoYSxiLGMpe2lmKG0uYWNjZXB0RGF0YShhKSl7dmFyIGQsZSxmPWEubm9kZVR5cGUsZz1mP20uY2FjaGU6YSxoPWY/YVttLmV4cGFuZG9dOm0uZXhwYW5kbztpZihnW2hdKXtpZihiJiYoZD1jP2dbaF06Z1toXS5kYXRhKSl7bS5pc0FycmF5KGIpP2I9Yi5jb25jYXQobS5tYXAoYixtLmNhbWVsQ2FzZSkpOmIgaW4gZD9iPVtiXTooYj1tLmNhbWVsQ2FzZShiKSxiPWIgaW4gZD9bYl06Yi5zcGxpdCgiICIpKSxlPWIubGVuZ3RoO3doaWxlKGUtLSlkZWxldGUgZFtiW2VdXTtpZihjPyFQKGQpOiFtLmlzRW1wdHlPYmplY3QoZCkpcmV0dXJufShjfHwoZGVsZXRlIGdbaF0uZGF0YSxQKGdbaF0pKSkmJihmP20uY2xlYW5EYXRhKFthXSwhMCk6ay5kZWxldGVFeHBhbmRvfHxnIT1nLndpbmRvdz9kZWxldGUgZ1toXTpnW2hdPW51bGwpfX19bS5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP20uY2FjaGVbYVttLmV4cGFuZG9dXTphW20uZXhwYW5kb10sISFhJiYhUChhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFEoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFIoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBRKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUihhLGIsITApfX0pLG0uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bS5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbS5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW0uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLE8oZixkLGVbZF0pKSk7bS5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhLGIpfSk6Zj9PKGYsYSxtLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXttLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG0uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1tLl9kYXRhKGEsYiksYyYmKCFkfHxtLmlzQXJyYXkoYyk/ZD1tLl9kYXRhKGEsYixtLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW0ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bS5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXttLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbS5fZGF0YShhLGMpfHxtLl9kYXRhKGEsYyx7ZW1wdHk6bS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bS5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbS5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxtLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bS5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1tLnF1ZXVlKHRoaXMsYSxiKTttLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm0uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1tLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW0uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIFM9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsVD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLFU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1ifHxhLCJub25lIj09PW0uY3NzKGEsImRpc3BsYXkiKXx8IW0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfSxWPW0uYWNjZXNzPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1tLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYyltLmFjY2VzcyhhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxtLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwobShhKSxjKX0pKSxiKSlmb3IoO2k+aDtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxXPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pOyFmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYz15LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixrLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1iLmZpcnN0Q2hpbGQubm9kZVR5cGUsay50Ym9keT0hYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsay5odG1sU2VyaWFsaXplPSEhYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxrLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09eS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxhLnR5cGU9ImNoZWNrYm94IixhLmNoZWNrZWQ9ITAsYy5hcHBlbmRDaGlsZChhKSxrLmFwcGVuZENoZWNrZWQ9YS5jaGVja2VkLGIuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixrLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYy5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBjaGVja2VkPSdjaGVja2VkJyBuYW1lPSd0Jy8+IixrLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsay5ub0Nsb25lRXZlbnQ9ITAsYi5hdHRhY2hFdmVudCYmKGIuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7ay5ub0Nsb25lRXZlbnQ9ITF9KSxiLmNsb25lTm9kZSghMCkuY2xpY2soKSksbnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goZCl7ay5kZWxldGVFeHBhbmRvPSExfX19KCksZnVuY3Rpb24oKXt2YXIgYixjLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3IoYiBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWM9Im9uIitiLChrW2IrIkJ1YmJsZXMiXT1jIGluIGEpfHwoZC5zZXRBdHRyaWJ1dGUoYywidCIpLGtbYisiQnViYmxlcyJdPWQuYXR0cmlidXRlc1tjXS5leHBhbmRvPT09ITEpO2Q9bnVsbH0oKTt2YXIgWD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksWT0vXmtleS8sWj0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnUpfGNsaWNrLywkPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxfPS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gYWEoKXtyZXR1cm4hMH1mdW5jdGlvbiBiYSgpe3JldHVybiExfWZ1bmN0aW9uIGNhKCl7dHJ5e3JldHVybiB5LmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1tLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixvLHAscSxyPW0uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW0uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgbT09PUt8fGEmJm0uZXZlbnQudHJpZ2dlcmVkPT09YS50eXBlP3ZvaWQgMDptLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGsuZWxlbSxhcmd1bWVudHMpfSxrLmVsZW09YSksYj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGg9Yi5sZW5ndGg7d2hpbGUoaC0tKWY9Xy5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW0uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm0uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChuPWdbb10pfHwobj1nW29dPVtdLG4uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP24uc3BsaWNlKG4uZGVsZWdhdGVDb3VudCsrLDAsbCk6bi5wdXNoKGwpLG0uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxuLG8scCxxLHI9bS5oYXNEYXRhKGEpJiZtLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9Xy5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyl7bD1tLmV2ZW50LnNwZWNpYWxbb118fHt9LG89KGQ/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG8sbj1rW29dfHxbXSxoPWhbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK3Auam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksaT1mPW4ubGVuZ3RoO3doaWxlKGYtLSlnPW5bZl0sIWUmJnEhPT1nLm9yaWdUeXBlfHxjJiZjLmd1aWQhPT1nLmd1aWR8fGgmJiFoLnRlc3QoZy5uYW1lc3BhY2UpfHxkJiZkIT09Zy5zZWxlY3RvciYmKCIqKiIhPT1kfHwhZy5zZWxlY3Rvcil8fChuLnNwbGljZShmLDEpLGcuc2VsZWN0b3ImJm4uZGVsZWdhdGVDb3VudC0tLGwucmVtb3ZlJiZsLnJlbW92ZS5jYWxsKGEsZykpO2kmJiFuLmxlbmd0aCYmKGwudGVhcmRvd24mJmwudGVhcmRvd24uY2FsbChhLHAsci5oYW5kbGUpIT09ITF8fG0ucmVtb3ZlRXZlbnQoYSxvLHIuaGFuZGxlKSxkZWxldGUga1tvXSl9ZWxzZSBmb3IobyBpbiBrKW0uZXZlbnQucmVtb3ZlKGEsbytiW2pdLGMsZCwhMCk7bS5pc0VtcHR5T2JqZWN0KGspJiYoZGVsZXRlIHIuaGFuZGxlLG0uX3JlbW92ZURhdGEoYSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZixnLGgsaSxrLGwsbixvPVtkfHx5XSxwPWouY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscT1qLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihoPWw9ZD1kfHx5LDMhPT1kLm5vZGVUeXBlJiY4IT09ZC5ub2RlVHlwZSYmISQudGVzdChwK20uZXZlbnQudHJpZ2dlcmVkKSYmKHAuaW5kZXhPZigiLiIpPj0wJiYocT1wLnNwbGl0KCIuIikscD1xLnNoaWZ0KCkscS5zb3J0KCkpLGc9cC5pbmRleE9mKCI6Iik8MCYmIm9uIitwLGI9YlttLmV4cGFuZG9dP2I6bmV3IG0uRXZlbnQocCwib2JqZWN0Ij09dHlwZW9mIGImJmIpLGIuaXNUcmlnZ2VyPWU/MjozLGIubmFtZXNwYWNlPXEuam9pbigiLiIpLGIubmFtZXNwYWNlX3JlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Euam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1kKSxjPW51bGw9PWM/W2JdOm0ubWFrZUFycmF5KGMsW2JdKSxrPW0uZXZlbnQuc3BlY2lhbFtwXXx8e30sZXx8IWsudHJpZ2dlcnx8ay50cmlnZ2VyLmFwcGx5KGQsYykhPT0hMSkpe2lmKCFlJiYhay5ub0J1YmJsZSYmIW0uaXNXaW5kb3coZCkpe2ZvcihpPWsuZGVsZWdhdGVUeXBlfHxwLCQudGVzdChpK3ApfHwoaD1oLnBhcmVudE5vZGUpO2g7aD1oLnBhcmVudE5vZGUpby5wdXNoKGgpLGw9aDtsPT09KGQub3duZXJEb2N1bWVudHx8eSkmJm8ucHVzaChsLmRlZmF1bHRWaWV3fHxsLnBhcmVudFdpbmRvd3x8YSl9bj0wO3doaWxlKChoPW9bbisrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPW4+MT9pOmsuYmluZFR5cGV8fHAsZj0obS5fZGF0YShoLCJldmVudHMiKXx8e30pW2IudHlwZV0mJm0uX2RhdGEoaCwiaGFuZGxlIiksZiYmZi5hcHBseShoLGMpLGY9ZyYmaFtnXSxmJiZmLmFwcGx5JiZtLmFjY2VwdERhdGEoaCkmJihiLnJlc3VsdD1mLmFwcGx5KGgsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtpZihiLnR5cGU9cCwhZSYmIWIuaXNEZWZhdWx0UHJldmVudGVkKCkmJighay5fZGVmYXVsdHx8ay5fZGVmYXVsdC5hcHBseShvLnBvcCgpLGMpPT09ITEpJiZtLmFjY2VwdERhdGEoZCkmJmcmJmRbcF0mJiFtLmlzV2luZG93KGQpKXtsPWRbZ10sbCYmKGRbZ109bnVsbCksbS5ldmVudC50cmlnZ2VyZWQ9cDt0cnl7ZFtwXSgpfWNhdGNoKHIpe31tLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbCYmKGRbZ109bCl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1tLmV2ZW50LmZpeChhKTt2YXIgYixjLGUsZixnLGg9W10saT1kLmNhbGwoYXJndW1lbnRzKSxqPShtLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1tLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1tLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGc9MDt3aGlsZSgoZT1mLmhhbmRsZXJzW2crK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSghYS5uYW1lc3BhY2VfcmV8fGEubmFtZXNwYWNlX3JlLnRlc3QoZS5uYW1lc3BhY2UpKSYmKGEuaGFuZGxlT2JqPWUsYS5kYXRhPWUuZGF0YSxjPSgobS5ldmVudC5zcGVjaWFsW2Uub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxlLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1jJiYoYS5yZXN1bHQ9Yyk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoIWEuYnV0dG9ufHwiY2xpY2siIT09YS50eXBlKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZT1bXSxmPTA7aD5mO2YrKylkPWJbZl0sYz1kLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1lW2NdJiYoZVtjXT1kLm5lZWRzQ29udGV4dD9tKGMsdGhpcykuaW5kZXgoaSk+PTA6bS5maW5kKGMsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxlW2NdJiZlLnB1c2goZCk7ZS5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmV9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW20uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxkLGU9YS50eXBlLGY9YSxnPXRoaXMuZml4SG9va3NbZV07Z3x8KHRoaXMuZml4SG9va3NbZV09Zz1aLnRlc3QoZSk/dGhpcy5tb3VzZUhvb2tzOlkudGVzdChlKT90aGlzLmtleUhvb2tzOnt9KSxkPWcucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoZy5wcm9wcyk6dGhpcy5wcm9wcyxhPW5ldyBtLkV2ZW50KGYpLGI9ZC5sZW5ndGg7d2hpbGUoYi0tKWM9ZFtiXSxhW2NdPWZbY107cmV0dXJuIGEudGFyZ2V0fHwoYS50YXJnZXQ9Zi5zcmNFbGVtZW50fHx5KSwzPT09YS50YXJnZXQubm9kZVR5cGUmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxhLm1ldGFLZXk9ISFhLm1ldGFLZXksZy5maWx0ZXI/Zy5maWx0ZXIoYSxmKTphfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9Yi5idXR0b24sZz1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihkPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fHksZT1kLmRvY3VtZW50RWxlbWVudCxjPWQuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZSYmZS5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShlJiZlLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGUmJmUuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGUmJmUuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmcmJihhLnJlbGF0ZWRUYXJnZXQ9Zz09PWEudGFyZ2V0P2IudG9FbGVtZW50OmcpLGEud2hpY2h8fHZvaWQgMD09PWZ8fChhLndoaWNoPTEmZj8xOjImZj8zOjQmZj8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09Y2EoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1jYSgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5leHRlbmQobmV3IG0uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP20uZXZlbnQudHJpZ2dlcihlLG51bGwsYik6bS5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbS5yZW1vdmVFdmVudD15LnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT09SyYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbS5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgbS5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/YWE6YmEpOnRoaXMudHlwZT1hLGImJm0uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG0ubm93KCksdm9pZCh0aGlzW20uZXhwYW5kb109ITApKTpuZXcgbS5FdmVudChhLGIpfSxtLkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOmJhLGlzUHJvcGFnYXRpb25TdG9wcGVkOmJhLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmJhLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWFhLGEmJihhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG0uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXttLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybighZXx8ZSE9PWQmJiFtLmNvbnRhaW5zKGQsZSkpJiYoYS50eXBlPWYub3JpZ1R5cGUsYz1mLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iKSxjfX19KSxrLnN1Ym1pdEJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTp2b2lkIG0uZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1tLm5vZGVOYW1lKGIsImlucHV0Iil8fG0ubm9kZU5hbWUoYiwiYnV0dG9uIik/Yi5mb3JtOnZvaWQgMDtjJiYhbS5fZGF0YShjLCJzdWJtaXRCdWJibGVzIikmJihtLmV2ZW50LmFkZChjLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZT0hMH0pLG0uX2RhdGEoYywic3VibWl0QnViYmxlcyIsITApKX0pfSxwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZSYmKGRlbGV0ZSBhLl9zdWJtaXRfYnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZtLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhLCEwKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG0ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbS5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxrLmNoYW5nZUJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBYLnRlc3QodGhpcy5ub2RlTmFtZSk/KCgiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlKSYmKG0uZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpeyJjaGVja2VkIj09PWEub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUmJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSksbS5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhYS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEpLG0uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKX0pKSwhMSk6dm9pZCBtLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtYLnRlc3QoYi5ub2RlTmFtZSkmJiFtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiKSYmKG0uZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXshdGhpcy5wYXJlbnROb2RlfHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8bS5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBtLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFYLnRlc3QodGhpcy5ub2RlTmFtZSl9fSksay5mb2N1c2luQnViYmxlc3x8bS5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe20uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxtLmV2ZW50LmZpeChhKSwhMCl9O20uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1tLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbS5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW0uX2RhdGEoZCxiKS0xO2U/bS5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG0uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG0uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWN8fGIsYj12b2lkIDApO2ZvcihmIGluIGEpdGhpcy5vbihmLGIsYyxhW2ZdLGUpO3JldHVybiB0aGlzfWlmKG51bGw9PWMmJm51bGw9PWQ/KGQ9YixjPWI9dm9pZCAwKTpudWxsPT1kJiYoInN0cmluZyI9PXR5cGVvZiBiPyhkPWMsYz12b2lkIDApOihkPWMsYz1iLGI9dm9pZCAwKSksZD09PSExKWQ9YmE7ZWxzZSBpZighZClyZXR1cm4gdGhpcztyZXR1cm4gMT09PWUmJihnPWQsZD1mdW5jdGlvbihhKXtyZXR1cm4gbSgpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZC5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1tLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQuYWRkKHRoaXMsYSxkLGMsYil9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixtKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGI9PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIGIpJiYoYz1iLGI9dm9pZCAwKSxjPT09ITEmJihjPWJhKSx0aGlzLmVhY2goZnVuY3Rpb24oKXttLmV2ZW50LnJlbW92ZSh0aGlzLGEsYyxiKX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzWzBdO3JldHVybiBjP20uZXZlbnQudHJpZ2dlcihhLGIsYywhMCk6dm9pZCAwfX0pO2Z1bmN0aW9uIGRhKGEpe3ZhciBiPWVhLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfXZhciBlYT0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsZmE9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyxnYT1uZXcgUmVnRXhwKCI8KD86IitlYSsiKVtcXHMvPl0iLCJpIiksaGE9L15ccysvLGlhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksamE9LzwoW1x3Ol0rKS8sa2E9Lzx0Ym9keS9pLGxhPS88fCYjP1x3KzsvLG1hPS88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksbmE9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksb2E9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLHBhPS9edHJ1ZVwvKC4qKS8scWE9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLHJhPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0scGFyYW06WzEsIjxvYmplY3Q+IiwiPC9vYmplY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDprLmh0bWxTZXJpYWxpemU/WzAsIiIsIiJdOlsxLCJYPGRpdj4iLCI8L2Rpdj4iXX0sc2E9ZGEoeSksdGE9c2EuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7cmEub3B0Z3JvdXA9cmEub3B0aW9uLHJhLnRib2R5PXJhLnRmb290PXJhLmNvbGdyb3VwPXJhLmNhcHRpb249cmEudGhlYWQscmEudGg9cmEudGQ7ZnVuY3Rpb24gdWEoYSxiKXt2YXIgYyxkLGU9MCxmPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09Sz9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9PUs/YS5xdWVyeVNlbGVjdG9yQWxsKGJ8fCIqIik6dm9pZCAwO2lmKCFmKWZvcihmPVtdLGM9YS5jaGlsZE5vZGVzfHxhO251bGwhPShkPWNbZV0pO2UrKykhYnx8bS5ub2RlTmFtZShkLGIpP2YucHVzaChkKTptLm1lcmdlKGYsdWEoZCxiKSk7cmV0dXJuIHZvaWQgMD09PWJ8fGImJm0ubm9kZU5hbWUoYSxiKT9tLm1lcmdlKFthXSxmKTpmfWZ1bmN0aW9uIHZhKGEpe1cudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIHdhKGEsYil7cmV0dXJuIG0ubm9kZU5hbWUoYSwidGFibGUiKSYmbS5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiB4YShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bS5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24geWEoYSl7dmFyIGI9cGEuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiB6YShhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW0uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG0uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX1mdW5jdGlvbiBBYShhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZtLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW0uX2RhdGEoYSksZz1tLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyltLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW0uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBCYShhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWsubm9DbG9uZUV2ZW50JiZiW20uZXhwYW5kb10pe2U9bS5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyltLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobS5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oeGEoYikudGV4dD1hLnRleHQseWEoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGsuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFtLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmVy50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOigiaW5wdXQiPT09Y3x8InRleHRhcmVhIj09PWMpJiYoYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfX1tLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1tLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihrLmh0bWw1Q2xvbmV8fG0uaXNYTUxEb2MoYSl8fCFnYS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KHRhLmlubmVySFRNTD1hLm91dGVySFRNTCx0YS5yZW1vdmVDaGlsZChmPXRhLmZpcnN0Q2hpbGQpKSwhKGsubm9DbG9uZUV2ZW50JiZrLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxtLmlzWE1MRG9jKGEpKSlmb3IoZD11YShmKSxoPXVhKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmQmEoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8dWEoYSksZD1kfHx1YShmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUFhKGUsZFtnXSk7ZWxzZSBBYShhLGYpO3JldHVybiBkPXVhKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJnphKGQsIWkmJnVhKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlLGYsZyxoLGksaixsLG49YS5sZW5ndGgsbz1kYShiKSxwPVtdLHE9MDtuPnE7cSsrKWlmKGY9YVtxXSxmfHwwPT09ZilpZigib2JqZWN0Ij09PW0udHlwZShmKSltLm1lcmdlKHAsZi5ub2RlVHlwZT9bZl06Zik7ZWxzZSBpZihsYS50ZXN0KGYpKXtoPWh8fG8uYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaT0oamEuZXhlYyhmKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxsPXJhW2ldfHxyYS5fZGVmYXVsdCxoLmlubmVySFRNTD1sWzFdK2YucmVwbGFjZShpYSwiPCQxPjwvJDI+IikrbFsyXSxlPWxbMF07d2hpbGUoZS0tKWg9aC5sYXN0Q2hpbGQ7aWYoIWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoZikmJnAucHVzaChiLmNyZWF0ZVRleHROb2RlKGhhLmV4ZWMoZilbMF0pKSwhay50Ym9keSl7Zj0idGFibGUiIT09aXx8a2EudGVzdChmKT8iPHRhYmxlPiIhPT1sWzFdfHxrYS50ZXN0KGYpPzA6aDpoLmZpcnN0Q2hpbGQsZT1mJiZmLmNoaWxkTm9kZXMubGVuZ3RoO3doaWxlKGUtLSltLm5vZGVOYW1lKGo9Zi5jaGlsZE5vZGVzW2VdLCJ0Ym9keSIpJiYhai5jaGlsZE5vZGVzLmxlbmd0aCYmZi5yZW1vdmVDaGlsZChqKX1tLm1lcmdlKHAsaC5jaGlsZE5vZGVzKSxoLnRleHRDb250ZW50PSIiO3doaWxlKGguZmlyc3RDaGlsZCloLnJlbW92ZUNoaWxkKGguZmlyc3RDaGlsZCk7aD1vLmxhc3RDaGlsZH1lbHNlIHAucHVzaChiLmNyZWF0ZVRleHROb2RlKGYpKTtoJiZvLnJlbW92ZUNoaWxkKGgpLGsuYXBwZW5kQ2hlY2tlZHx8bS5ncmVwKHVhKHAsImlucHV0IiksdmEpLHE9MDt3aGlsZShmPXBbcSsrXSlpZigoIWR8fC0xPT09bS5pbkFycmF5KGYsZCkpJiYoZz1tLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxoPXVhKG8uYXBwZW5kQ2hpbGQoZiksInNjcmlwdCIpLGcmJnphKGgpLGMpKXtlPTA7d2hpbGUoZj1oW2UrK10pb2EudGVzdChmLnR5cGV8fCIiKSYmYy5wdXNoKGYpfXJldHVybiBoPW51bGwsb30sY2xlYW5EYXRhOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkLGUsZixnLGg9MCxpPW0uZXhwYW5kbyxqPW0uY2FjaGUsbD1rLmRlbGV0ZUV4cGFuZG8sbj1tLmV2ZW50LnNwZWNpYWw7bnVsbCE9KGQ9YVtoXSk7aCsrKWlmKChifHxtLmFjY2VwdERhdGEoZCkpJiYoZj1kW2ldLGc9ZiYmaltmXSkpe2lmKGcuZXZlbnRzKWZvcihlIGluIGcuZXZlbnRzKW5bZV0/bS5ldmVudC5yZW1vdmUoZCxlKTptLnJlbW92ZUV2ZW50KGQsZSxnLmhhbmRsZSk7altmXSYmKGRlbGV0ZSBqW2ZdLGw/ZGVsZXRlIGRbaV06dHlwZW9mIGQucmVtb3ZlQXR0cmlidXRlIT09Sz9kLnJlbW92ZUF0dHJpYnV0ZShpKTpkW2ldPW51bGwsYy5wdXNoKGYpKX19fSksbS5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9tLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHx5KS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj13YSh0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPXdhKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9YT9tLmZpbHRlcihhLHRoaXMpOnRoaXMsZT0wO251bGwhPShjPWRbZV0pO2UrKylifHwxIT09Yy5ub2RlVHlwZXx8bS5jbGVhbkRhdGEodWEoYykpLGMucGFyZW50Tm9kZSYmKGImJm0uY29udGFpbnMoYy5vd25lckRvY3VtZW50LGMpJiZ6YSh1YShjLCJzY3JpcHQiKSksYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm0uY2xlYW5EYXRhKHVhKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbS5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbS5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UoZmEsIiIpOnZvaWQgMDtpZighKCJzdHJpbmciIT10eXBlb2YgYXx8bWEudGVzdChhKXx8IWsuaHRtbFNlcmlhbGl6ZSYmZ2EudGVzdChhKXx8IWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoYSl8fHJhWyhqYS5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkpe2E9YS5yZXBsYWNlKGlhLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtkPmM7YysrKWI9dGhpc1tjXXx8e30sMT09PWIubm9kZVR5cGUmJihtLmNsZWFuRGF0YSh1YShiLCExKSksYi5pbm5lckhUTUw9YSk7Yj0wfWNhdGNoKGUpe319YiYmdGhpcy5lbXB0eSgpLmFwcGVuZChhKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYil7YT10aGlzLnBhcmVudE5vZGUsbS5jbGVhbkRhdGEodWEodGhpcykpLGEmJmEucmVwbGFjZUNoaWxkKGIsdGhpcyl9KSxhJiYoYS5sZW5ndGh8fGEubm9kZVR5cGUpP3RoaXM6dGhpcy5yZW1vdmUoKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxiKXthPWUuYXBwbHkoW10sYSk7dmFyIGMsZCxmLGcsaCxpLGo9MCxsPXRoaXMubGVuZ3RoLG49dGhpcyxvPWwtMSxwPWFbMF0scT1tLmlzRnVuY3Rpb24ocCk7aWYocXx8bD4xJiYic3RyaW5nIj09dHlwZW9mIHAmJiFrLmNoZWNrQ2xvbmUmJm5hLnRlc3QocCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZD1uLmVxKGMpO3EmJihhWzBdPXAuY2FsbCh0aGlzLGMsZC5odG1sKCkpKSxkLmRvbU1hbmlwKGEsYil9KTtpZihsJiYoaT1tLmJ1aWxkRnJhZ21lbnQoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsdGhpcyksYz1pLmZpcnN0Q2hpbGQsMT09PWkuY2hpbGROb2Rlcy5sZW5ndGgmJihpPWMpLGMpKXtmb3IoZz1tLm1hcCh1YShpLCJzY3JpcHQiKSx4YSksZj1nLmxlbmd0aDtsPmo7aisrKWQ9aSxqIT09byYmKGQ9bS5jbG9uZShkLCEwLCEwKSxmJiZtLm1lcmdlKGcsdWEoZCwic2NyaXB0IikpKSxiLmNhbGwodGhpc1tqXSxkLGopO2lmKGYpZm9yKGg9Z1tnLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG0ubWFwKGcseWEpLGo9MDtmPmo7aisrKWQ9Z1tqXSxvYS50ZXN0KGQudHlwZXx8IiIpJiYhbS5fZGF0YShkLCJnbG9iYWxFdmFsIikmJm0uY29udGFpbnMoaCxkKSYmKGQuc3JjP20uX2V2YWxVcmwmJm0uX2V2YWxVcmwoZC5zcmMpOm0uZ2xvYmFsRXZhbCgoZC50ZXh0fHxkLnRleHRDb250ZW50fHxkLmlubmVySFRNTHx8IiIpLnJlcGxhY2UocWEsIiIpKSk7aT1jPW51bGx9cmV0dXJuIHRoaXN9fSksbS5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXttLmZuW2FdPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPTAsZT1bXSxnPW0oYSksaD1nLmxlbmd0aC0xO2g+PWQ7ZCsrKWM9ZD09PWg/dGhpczp0aGlzLmNsb25lKCEwKSxtKGdbZF0pW2JdKGMpLGYuYXBwbHkoZSxjLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIENhLERhPXt9O2Z1bmN0aW9uIEVhKGIsYyl7dmFyIGQsZT1tKGMuY3JlYXRlRWxlbWVudChiKSkuYXBwZW5kVG8oYy5ib2R5KSxmPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUmJihkPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUoZVswXSkpP2QuZGlzcGxheTptLmNzcyhlWzBdLCJkaXNwbGF5Iik7cmV0dXJuIGUuZGV0YWNoKCksZn1mdW5jdGlvbiBGYShhKXt2YXIgYj15LGM9RGFbYV07cmV0dXJuIGN8fChjPUVhKGEsYiksIm5vbmUiIT09YyYmY3x8KENhPShDYXx8bSgiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIpKS5hcHBlbmRUbyhiLmRvY3VtZW50RWxlbWVudCksYj0oQ2FbMF0uY29udGVudFdpbmRvd3x8Q2FbMF0uY29udGVudERvY3VtZW50KS5kb2N1bWVudCxiLndyaXRlKCksYi5jbG9zZSgpLGM9RWEoYSxiKSxDYS5kZXRhY2goKSksRGFbYV09YyksY30hZnVuY3Rpb24oKXt2YXIgYTtrLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxkO3JldHVybiBjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChkKSxhKTp2b2lkIDB9fSgpO3ZhciBHYT0vXm1hcmdpbi8sSGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoPyFweClbYS16JV0rJCIsImkiKSxJYSxKYSxLYT0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhJYT1mdW5jdGlvbihiKXtyZXR1cm4gYi5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Lm9wZW5lcj9iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jLmdldFByb3BlcnR5VmFsdWUoYil8fGNbYl06dm9pZCAwLGMmJigiIiE9PWd8fG0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfHwoZz1tLnN0eWxlKGEsYikpLEhhLnRlc3QoZykmJkdhLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9ZikpLHZvaWQgMD09PWc/ZzpnKyIifSk6eS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoSWE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3VycmVudFN0eWxlfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jW2JdOnZvaWQgMCxudWxsPT1nJiZoJiZoW2JdJiYoZz1oW2JdKSxIYS50ZXN0KGcpJiYhS2EudGVzdChiKSYmKGQ9aC5sZWZ0LGU9YS5ydW50aW1lU3R5bGUsZj1lJiZlLmxlZnQsZiYmKGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxoLmxlZnQ9ImZvbnRTaXplIj09PWI/IjFlbSI6ZyxnPWgucGl4ZWxMZWZ0KyJweCIsaC5sZWZ0PWQsZiYmKGUubGVmdD1mKSksdm9pZCAwPT09Zz9nOmcrIiJ8fCJhdXRvIn0pO2Z1bmN0aW9uIExhKGEsYil7cmV0dXJue2dldDpmdW5jdGlvbigpe3ZhciBjPWEoKTtpZihudWxsIT1jKXJldHVybiBjP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0hZnVuY3Rpb24oKXt2YXIgYixjLGQsZSxmLGcsaDtpZihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sYz1kJiZkLnN0eWxlKXtjLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsay5vcGFjaXR5PSIwLjUiPT09Yy5vcGFjaXR5LGsuY3NzRmxvYXQ9ISFjLmNzc0Zsb2F0LGIuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixiLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsay5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWIuc3R5bGUuYmFja2dyb3VuZENsaXAsay5ib3hTaXppbmc9IiI9PT1jLmJveFNpemluZ3x8IiI9PT1jLk1vekJveFNpemluZ3x8IiI9PT1jLldlYmtpdEJveFNpemluZyxtLmV4dGVuZChrLHtyZWxpYWJsZUhpZGRlbk9mZnNldHM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZyYmaSgpLGd9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWYmJmkoKSxmfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWUmJmkoKSxlfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWgmJmkoKSxofX0pO2Z1bmN0aW9uIGkoKXt2YXIgYixjLGQsaTtjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlJiYoYj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4IixjLmFwcGVuZENoaWxkKGQpLmFwcGVuZENoaWxkKGIpLGIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxJTt0b3A6MSU7Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGUiLGU9Zj0hMSxoPSEwLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGU9IjElIiE9PShhLmdldENvbXB1dGVkU3R5bGUoYixudWxsKXx8e30pLnRvcCxmPSI0cHgiPT09KGEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxpPWIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSksaS5zdHlsZS5jc3NUZXh0PWIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowIixpLnN0eWxlLm1hcmdpblJpZ2h0PWkuc3R5bGUud2lkdGg9IjAiLGIuc3R5bGUud2lkdGg9IjFweCIsaD0hcGFyc2VGbG9hdCgoYS5nZXRDb21wdXRlZFN0eWxlKGksbnVsbCl8fHt9KS5tYXJnaW5SaWdodCksYi5yZW1vdmVDaGlsZChpKSksYi5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGk9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxpWzBdLnN0eWxlLmNzc1RleHQ9Im1hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtkaXNwbGF5Om5vbmUiLGc9MD09PWlbMF0ub2Zmc2V0SGVpZ2h0LGcmJihpWzBdLnN0eWxlLmRpc3BsYXk9IiIsaVsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixnPTA9PT1pWzBdLm9mZnNldEhlaWdodCksYy5yZW1vdmVDaGlsZChkKSl9fX0oKSxtLnN3YXA9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O3ZhciBNYT0vYWxwaGFcKFteKV0qXCkvaSxOYT0vb3BhY2l0eVxzKj1ccyooW14pXSopLyxPYT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sUGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoLiopJCIsImkiKSxRYT1uZXcgUmVnRXhwKCJeKFsrLV0pPSgiK1MrIikiLCJpIiksUmE9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFNhPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSxUYT1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIFVhKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1UYS5sZW5ndGg7d2hpbGUoZS0tKWlmKGI9VGFbZV0rYyxiIGluIGEpcmV0dXJuIGI7cmV0dXJuIGR9ZnVuY3Rpb24gVmEoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bS5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlUoZCkmJihmW2ddPW0uX2RhdGEoZCwib2xkZGlzcGxheSIsRmEoZC5ub2RlTmFtZSkpKSk6KGU9VShkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZtLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzptLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIFdhKGEsYixjKXt2YXIgZD1QYS5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIFhhKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1tLmNzcyhhLGMrVFtmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gWWEoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPUlhKGEpLGc9ay5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW0uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1KYShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLEhhLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYoay5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK1hhKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1tLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPUphKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6ay5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1tLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1tLmNzc1Byb3BzW2hdfHwobS5jc3NQcm9wc1toXT1VYShpLGgpKSxnPW0uY3NzSG9va3NbYl18fG0uY3NzSG9va3NbaF0sdm9pZCAwPT09YylyZXR1cm4gZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl07aWYoZj10eXBlb2YgYywic3RyaW5nIj09PWYmJihlPVFhLmV4ZWMoYykpJiYoYz0oZVsxXSsxKSplWzJdK3BhcnNlRmxvYXQobS5jc3MoYSxiKSksZj0ibnVtYmVyIiksbnVsbCE9YyYmYz09PWMmJigibnVtYmVyIiE9PWZ8fG0uY3NzTnVtYmVyW2hdfHwoYys9InB4Iiksay5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW0uY2FtZWxDYXNlKGIpO3JldHVybiBiPW0uY3NzUHJvcHNbaF18fChtLmNzc1Byb3BzW2hdPVVhKGEuc3R5bGUsaCkpLGc9bS5jc3NIb29rc1tiXXx8bS5jc3NIb29rc1toXSxnJiYiZ2V0ImluIGcmJihmPWcuZ2V0KGEsITAsYykpLHZvaWQgMD09PWYmJihmPUphKGEsYixkKSksIm5vcm1hbCI9PT1mJiZiIGluIFNhJiYoZj1TYVtiXSksIiI9PT1jfHxjPyhlPXBhcnNlRmxvYXQoZiksYz09PSEwfHxtLmlzTnVtZXJpYyhlKT9lfHwwOmYpOmZ9fSksbS5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGM/T2EudGVzdChtLmNzcyhhLCJkaXNwbGF5IikpJiYwPT09YS5vZmZzZXRXaWR0aD9tLnN3YXAoYSxSYSxmdW5jdGlvbigpe3JldHVybiBZYShhLGIsZCl9KTpZYShhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJklhKGEpO3JldHVybiBXYShhLGMsZD9YYShhLGIsZCxrLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bS5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksay5vcGFjaXR5fHwobS5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gTmEudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW0uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1tLnRyaW0oZi5yZXBsYWNlKE1hLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPU1hLnRlc3QoZik/Zi5yZXBsYWNlKE1hLGUpOmYrIiAiK2UpfX0pLG0uY3NzSG9va3MubWFyZ2luUmlnaHQ9TGEoay5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/bS5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LEphLFthLCJtYXJnaW5SaWdodCJdKTp2b2lkIDB9KSxtLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYStiXT17ZXhwYW5kOmZ1bmN0aW9uKGMpe2Zvcih2YXIgZD0wLGU9e30sZj0ic3RyaW5nIj09dHlwZW9mIGM/Yy5zcGxpdCgiICIpOltjXTs0PmQ7ZCsrKWVbYStUW2RdK2JdPWZbZF18fGZbZC0yXXx8ZlswXTtyZXR1cm4gZX19LEdhLnRlc3QoYSl8fChtLmNzc0hvb2tzW2ErYl0uc2V0PVdhKX0pLG0uZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9e30sZz0wO2lmKG0uaXNBcnJheShiKSl7Zm9yKGQ9SWEoYSksZT1iLmxlbmd0aDtlPmc7ZysrKWZbYltnXV09bS5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP20uc3R5bGUoYSxiLGMpOm0uY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oYSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYT9hP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe1UodGhpcyk/bSh0aGlzKS5zaG93KCk6bSh0aGlzKS5oaWRlKCl9KX19KTtmdW5jdGlvbiBaYShhLGIsYyxkLGUpew0KcmV0dXJuIG5ldyBaYS5wcm90b3R5cGUuaW5pdChhLGIsYyxkLGUpfW0uVHdlZW49WmEsWmEucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpaYSxpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHwic3dpbmciLHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobS5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPVphLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpaYS5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1aYS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWI9bS5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9Yj1hLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpiK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLGMmJmMuc2V0P2Muc2V0KHRoaXMpOlphLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LFphLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1aYS5wcm90b3R5cGUsWmEucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBudWxsPT1hLmVsZW1bYS5wcm9wXXx8YS5lbGVtLnN0eWxlJiZudWxsIT1hLmVsZW0uc3R5bGVbYS5wcm9wXT8oYj1tLmNzcyhhLmVsZW0sYS5wcm9wLCIiKSxiJiYiYXV0byIhPT1iP2I6MCk6YS5lbGVtW2EucHJvcF19LHNldDpmdW5jdGlvbihhKXttLmZ4LnN0ZXBbYS5wcm9wXT9tLmZ4LnN0ZXBbYS5wcm9wXShhKTphLmVsZW0uc3R5bGUmJihudWxsIT1hLmVsZW0uc3R5bGVbbS5jc3NQcm9wc1thLnByb3BdXXx8bS5jc3NIb29rc1thLnByb3BdKT9tLnN0eWxlKGEuZWxlbSxhLnByb3AsYS5ub3crYS51bml0KTphLmVsZW1bYS5wcm9wXT1hLm5vd319fSxaYS5wcm9wSG9va3Muc2Nyb2xsVG9wPVphLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oYSl7YS5lbGVtLm5vZGVUeXBlJiZhLmVsZW0ucGFyZW50Tm9kZSYmKGEuZWxlbVthLnByb3BdPWEubm93KX19LG0uZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LHN3aW5nOmZ1bmN0aW9uKGEpe3JldHVybi41LU1hdGguY29zKGEqTWF0aC5QSSkvMn19LG0uZng9WmEucHJvdG90eXBlLmluaXQsbS5meC5zdGVwPXt9O3ZhciAkYSxfYSxhYj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sYmI9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK1MrIikoW2EteiVdKikkIiwiaSIpLGNiPS9xdWV1ZUhvb2tzJC8sZGI9W2liXSxlYj17IioiOltmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuY3JlYXRlVHdlZW4oYSxiKSxkPWMuY3VyKCksZT1iYi5leGVjKGIpLGY9ZSYmZVszXXx8KG0uY3NzTnVtYmVyW2FdPyIiOiJweCIpLGc9KG0uY3NzTnVtYmVyW2FdfHwicHgiIT09ZiYmK2QpJiZiYi5leGVjKG0uY3NzKGMuZWxlbSxhKSksaD0xLGk9MjA7aWYoZyYmZ1szXSE9PWYpe2Y9Znx8Z1szXSxlPWV8fFtdLGc9K2R8fDE7ZG8gaD1ofHwiLjUiLGcvPWgsbS5zdHlsZShjLmVsZW0sYSxnK2YpO3doaWxlKGghPT0oaD1jLmN1cigpL2QpJiYxIT09aCYmLS1pKX1yZXR1cm4gZSYmKGc9Yy5zdGFydD0rZ3x8K2R8fDAsYy51bml0PWYsYy5lbmQ9ZVsxXT9nKyhlWzFdKzEpKmVbMl06K2VbMl0pLGN9XX07ZnVuY3Rpb24gZmIoKXtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpeyRhPXZvaWQgMH0pLCRhPW0ubm93KCl9ZnVuY3Rpb24gZ2IoYSxiKXt2YXIgYyxkPXtoZWlnaHQ6YX0sZT0wO2ZvcihiPWI/MTowOzQ+ZTtlKz0yLWIpYz1UW2VdLGRbIm1hcmdpbiIrY109ZFsicGFkZGluZyIrY109YTtyZXR1cm4gYiYmKGQub3BhY2l0eT1kLndpZHRoPWEpLGR9ZnVuY3Rpb24gaGIoYSxiLGMpe2Zvcih2YXIgZCxlPShlYltiXXx8W10pLmNvbmNhdChlYlsiKiJdKSxmPTAsZz1lLmxlbmd0aDtnPmY7ZisrKWlmKGQ9ZVtmXS5jYWxsKGMsYixhKSlyZXR1cm4gZH1mdW5jdGlvbiBpYihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosbCxuPXRoaXMsbz17fSxwPWEuc3R5bGUscT1hLm5vZGVUeXBlJiZVKGEpLHI9bS5fZGF0YShhLCJmeHNob3ciKTtjLnF1ZXVlfHwoaD1tLl9xdWV1ZUhvb2tzKGEsImZ4IiksbnVsbD09aC51bnF1ZXVlZCYmKGgudW5xdWV1ZWQ9MCxpPWguZW1wdHkuZmlyZSxoLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtoLnVucXVldWVkfHxpKCl9KSxoLnVucXVldWVkKyssbi5hbHdheXMoZnVuY3Rpb24oKXtuLmFsd2F5cyhmdW5jdGlvbigpe2gudW5xdWV1ZWQtLSxtLnF1ZXVlKGEsImZ4IikubGVuZ3RofHxoLmVtcHR5LmZpcmUoKX0pfSkpLDE9PT1hLm5vZGVUeXBlJiYoImhlaWdodCJpbiBifHwid2lkdGgiaW4gYikmJihjLm92ZXJmbG93PVtwLm92ZXJmbG93LHAub3ZlcmZsb3dYLHAub3ZlcmZsb3dZXSxqPW0uY3NzKGEsImRpc3BsYXkiKSxsPSJub25lIj09PWo/bS5fZGF0YShhLCJvbGRkaXNwbGF5Iil8fEZhKGEubm9kZU5hbWUpOmosImlubGluZSI9PT1sJiYibm9uZSI9PT1tLmNzcyhhLCJmbG9hdCIpJiYoay5pbmxpbmVCbG9ja05lZWRzTGF5b3V0JiYiaW5saW5lIiE9PUZhKGEubm9kZU5hbWUpP3Auem9vbT0xOnAuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLGMub3ZlcmZsb3cmJihwLm92ZXJmbG93PSJoaWRkZW4iLGsuc2hyaW5rV3JhcEJsb2NrcygpfHxuLmFsd2F5cyhmdW5jdGlvbigpe3Aub3ZlcmZsb3c9Yy5vdmVyZmxvd1swXSxwLm92ZXJmbG93WD1jLm92ZXJmbG93WzFdLHAub3ZlcmZsb3dZPWMub3ZlcmZsb3dbMl19KSk7Zm9yKGQgaW4gYilpZihlPWJbZF0sYWIuZXhlYyhlKSl7aWYoZGVsZXRlIGJbZF0sZj1mfHwidG9nZ2xlIj09PWUsZT09PShxPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1lfHwhcnx8dm9pZCAwPT09cltkXSljb250aW51ZTtxPSEwfW9bZF09ciYmcltkXXx8bS5zdHlsZShhLGQpfWVsc2Ugaj12b2lkIDA7aWYobS5pc0VtcHR5T2JqZWN0KG8pKSJpbmxpbmUiPT09KCJub25lIj09PWo/RmEoYS5ub2RlTmFtZSk6aikmJihwLmRpc3BsYXk9aik7ZWxzZXtyPyJoaWRkZW4iaW4gciYmKHE9ci5oaWRkZW4pOnI9bS5fZGF0YShhLCJmeHNob3ciLHt9KSxmJiYoci5oaWRkZW49IXEpLHE/bShhKS5zaG93KCk6bi5kb25lKGZ1bmN0aW9uKCl7bShhKS5oaWRlKCl9KSxuLmRvbmUoZnVuY3Rpb24oKXt2YXIgYjttLl9yZW1vdmVEYXRhKGEsImZ4c2hvdyIpO2ZvcihiIGluIG8pbS5zdHlsZShhLGIsb1tiXSl9KTtmb3IoZCBpbiBvKWc9aGIocT9yW2RdOjAsZCxuKSxkIGluIHJ8fChyW2RdPWcuc3RhcnQscSYmKGcuZW5kPWcuc3RhcnQsZy5zdGFydD0id2lkdGgiPT09ZHx8ImhlaWdodCI9PT1kPzE6MCkpfX1mdW5jdGlvbiBqYihhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGMgaW4gYSlpZihkPW0uY2FtZWxDYXNlKGMpLGU9YltkXSxmPWFbY10sbS5pc0FycmF5KGYpJiYoZT1mWzFdLGY9YVtjXT1mWzBdKSxjIT09ZCYmKGFbZF09ZixkZWxldGUgYVtjXSksZz1tLmNzc0hvb2tzW2RdLGcmJiJleHBhbmQiaW4gZyl7Zj1nLmV4cGFuZChmKSxkZWxldGUgYVtkXTtmb3IoYyBpbiBmKWMgaW4gYXx8KGFbY109ZltjXSxiW2NdPWUpfWVsc2UgYltkXT1lfWZ1bmN0aW9uIGtiKGEsYixjKXt2YXIgZCxlLGY9MCxnPWRiLmxlbmd0aCxoPW0uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPSRhfHxmYigpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczptLmV4dGVuZCh7fSxiKSxvcHRzOm0uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9fSxjKSxvcmlnaW5hbFByb3BlcnRpZXM6YixvcmlnaW5hbE9wdGlvbnM6YyxzdGFydFRpbWU6JGF8fGZiKCksZHVyYXRpb246Yy5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oYixjKXt2YXIgZD1tLlR3ZWVuKGEsai5vcHRzLGIsYyxqLm9wdHMuc3BlY2lhbEVhc2luZ1tiXXx8ai5vcHRzLmVhc2luZyk7cmV0dXJuIGoudHdlZW5zLnB1c2goZCksZH0sc3RvcDpmdW5jdGlvbihiKXt2YXIgYz0wLGQ9Yj9qLnR3ZWVucy5sZW5ndGg6MDtpZihlKXJldHVybiB0aGlzO2ZvcihlPSEwO2Q+YztjKyspai50d2VlbnNbY10ucnVuKDEpO3JldHVybiBiP2gucmVzb2x2ZVdpdGgoYSxbaixiXSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihqYihrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9ZGJbZl0uY2FsbChqLGEsayxqLm9wdHMpKXJldHVybiBkO3JldHVybiBtLm1hcChrLGhiLGopLG0uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG0uZngudGltZXIobS5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bS5BbmltYXRpb249bS5leHRlbmQoa2Ise3R3ZWVuZXI6ZnVuY3Rpb24oYSxiKXttLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVsiKiJdKTphPWEuc3BsaXQoIiAiKTtmb3IodmFyIGMsZD0wLGU9YS5sZW5ndGg7ZT5kO2QrKyljPWFbZF0sZWJbY109ZWJbY118fFtdLGViW2NdLnVuc2hpZnQoYil9LHByZWZpbHRlcjpmdW5jdGlvbihhLGIpe2I/ZGIudW5zaGlmdChhKTpkYi5wdXNoKGEpfX0pLG0uc3BlZWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJiJvYmplY3QiPT10eXBlb2YgYT9tLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG0uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbS5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1tLmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbS5meC5zcGVlZHM/bS5meC5zcGVlZHNbZC5kdXJhdGlvbl06bS5meC5zcGVlZHMuX2RlZmF1bHQsKG51bGw9PWQucXVldWV8fGQucXVldWU9PT0hMCkmJihkLnF1ZXVlPSJmeCIpLGQub2xkPWQuY29tcGxldGUsZC5jb21wbGV0ZT1mdW5jdGlvbigpe20uaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZSYmbS5kZXF1ZXVlKHRoaXMsZC5xdWV1ZSl9LGR9LG0uZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuZmlsdGVyKFUpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW0uaXNFbXB0eU9iamVjdChhKSxmPW0uc3BlZWQoYixjLGQpLGc9ZnVuY3Rpb24oKXt2YXIgYj1rYih0aGlzLG0uZXh0ZW5kKHt9LGEpLGYpOyhlfHxtLl9kYXRhKHRoaXMsImZpbmlzaCIpKSYmYi5zdG9wKCEwKX07cmV0dXJuIGcuZmluaXNoPWcsZXx8Zi5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGYucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuc3RvcDtkZWxldGUgYS5zdG9wLGIoYyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGM9YixiPWEsYT12b2lkIDApLGImJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj0hMCxlPW51bGwhPWEmJmErInF1ZXVlSG9va3MiLGY9bS50aW1lcnMsZz1tLl9kYXRhKHRoaXMpO2lmKGUpZ1tlXSYmZ1tlXS5zdG9wJiZkKGdbZV0pO2Vsc2UgZm9yKGUgaW4gZylnW2VdJiZnW2VdLnN0b3AmJmNiLnRlc3QoZSkmJmQoZ1tlXSk7Zm9yKGU9Zi5sZW5ndGg7ZS0tOylmW2VdLmVsZW0hPT10aGlzfHxudWxsIT1hJiZmW2VdLnF1ZXVlIT09YXx8KGZbZV0uYW5pbS5zdG9wKGMpLGI9ITEsZi5zcGxpY2UoZSwxKSk7KGJ8fCFjKSYmbS5kZXF1ZXVlKHRoaXMsYSl9KX0sZmluaXNoOmZ1bmN0aW9uKGEpe3JldHVybiBhIT09ITEmJihhPWF8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiLGM9bS5fZGF0YSh0aGlzKSxkPWNbYSsicXVldWUiXSxlPWNbYSsicXVldWVIb29rcyJdLGY9bS50aW1lcnMsZz1kP2QubGVuZ3RoOjA7Zm9yKGMuZmluaXNoPSEwLG0ucXVldWUodGhpcyxhLFtdKSxlJiZlLnN0b3AmJmUuc3RvcC5jYWxsKHRoaXMsITApLGI9Zi5sZW5ndGg7Yi0tOylmW2JdLmVsZW09PT10aGlzJiZmW2JdLnF1ZXVlPT09YSYmKGZbYl0uYW5pbS5zdG9wKCEwKSxmLnNwbGljZShiLDEpKTtmb3IoYj0wO2c+YjtiKyspZFtiXSYmZFtiXS5maW5pc2gmJmRbYl0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIGMuZmluaXNofSl9fSksbS5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihhLGIpe3ZhciBjPW0uZm5bYl07bS5mbltiXT1mdW5jdGlvbihhLGQsZSl7cmV0dXJuIG51bGw9PWF8fCJib29sZWFuIj09dHlwZW9mIGE/Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGdiKGIsITApLGEsZCxlKX19KSxtLmVhY2goe3NsaWRlRG93bjpnYigic2hvdyIpLHNsaWRlVXA6Z2IoImhpZGUiKSxzbGlkZVRvZ2dsZTpnYigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe20uZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksbS50aW1lcnM9W10sbS5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGEsYj1tLnRpbWVycyxjPTA7Zm9yKCRhPW0ubm93KCk7YzxiLmxlbmd0aDtjKyspYT1iW2NdLGEoKXx8YltjXSE9PWF8fGIuc3BsaWNlKGMtLSwxKTtiLmxlbmd0aHx8bS5meC5zdG9wKCksJGE9dm9pZCAwfSxtLmZ4LnRpbWVyPWZ1bmN0aW9uKGEpe20udGltZXJzLnB1c2goYSksYSgpP20uZnguc3RhcnQoKTptLnRpbWVycy5wb3AoKX0sbS5meC5pbnRlcnZhbD0xMyxtLmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7X2F8fChfYT1zZXRJbnRlcnZhbChtLmZ4LnRpY2ssbS5meC5pbnRlcnZhbCkpfSxtLmZ4LnN0b3A9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKF9hKSxfYT1udWxsfSxtLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxtLmZuLmRlbGF5PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bS5meD9tLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4Iix0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxmdW5jdGlvbigpe3ZhciBhLGIsYyxkLGU7Yj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGIuc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0IiksYi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sYz15LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGU9Yy5hcHBlbmRDaGlsZCh5LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0sZC5zdHlsZS5jc3NUZXh0PSJ0b3A6MXB4IixrLmdldFNldEF0dHJpYnV0ZT0idCIhPT1iLmNsYXNzTmFtZSxrLnN0eWxlPS90b3AvLnRlc3QoZC5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLGsuaHJlZk5vcm1hbGl6ZWQ9Ii9hIj09PWQuZ2V0QXR0cmlidXRlKCJocmVmIiksay5jaGVja09uPSEhYS52YWx1ZSxrLm9wdFNlbGVjdGVkPWUuc2VsZWN0ZWQsay5lbmN0eXBlPSEheS5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSxjLmRpc2FibGVkPSEwLGsub3B0RGlzYWJsZWQ9IWUuZGlzYWJsZWQsYT15LmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYS5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksay5pbnB1dD0iIj09PWEuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpLGEudmFsdWU9InQiLGEuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxrLnJhZGlvVmFsdWU9InQiPT09YS52YWx1ZX0oKTt2YXIgbGI9L1xyL2c7bS5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBkPW0uaXNGdW5jdGlvbihhKSx0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGU7MT09PXRoaXMubm9kZVR5cGUmJihlPWQ/YS5jYWxsKHRoaXMsYyxtKHRoaXMpLnZhbCgpKTphLG51bGw9PWU/ZT0iIjoibnVtYmVyIj09dHlwZW9mIGU/ZSs9IiI6bS5pc0FycmF5KGUpJiYoZT1tLm1hcChlLGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOmErIiJ9KSksYj1tLnZhbEhvb2tzW3RoaXMudHlwZV18fG0udmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYic2V0ImluIGImJnZvaWQgMCE9PWIuc2V0KHRoaXMsZSwidmFsdWUiKXx8KHRoaXMudmFsdWU9ZSkpfSk7aWYoZSlyZXR1cm4gYj1tLnZhbEhvb2tzW2UudHlwZV18fG0udmFsSG9va3NbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYiZ2V0ImluIGImJnZvaWQgMCE9PShjPWIuZ2V0KGUsInZhbHVlIikpP2M6KGM9ZS52YWx1ZSwic3RyaW5nIj09dHlwZW9mIGM/Yy5yZXBsYWNlKGxiLCIiKTpudWxsPT1jPyIiOmMpfX19KSxtLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW0uZmluZC5hdHRyKGEsInZhbHVlIik7cmV0dXJuIG51bGwhPWI/YjptLnRyaW0obS50ZXh0KGEpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQ9YS5vcHRpb25zLGU9YS5zZWxlY3RlZEluZGV4LGY9InNlbGVjdC1vbmUiPT09YS50eXBlfHwwPmUsZz1mP251bGw6W10saD1mP2UrMTpkLmxlbmd0aCxpPTA+ZT9oOmY/ZTowO2g+aTtpKyspaWYoYz1kW2ldLCEoIWMuc2VsZWN0ZWQmJmkhPT1lfHwoay5vcHREaXNhYmxlZD9jLmRpc2FibGVkOm51bGwhPT1jLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSl8fGMucGFyZW50Tm9kZS5kaXNhYmxlZCYmbS5ub2RlTmFtZShjLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZihiPW0oYykudmFsKCksZilyZXR1cm4gYjtnLnB1c2goYil9cmV0dXJuIGd9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZT1hLm9wdGlvbnMsZj1tLm1ha2VBcnJheShiKSxnPWUubGVuZ3RoO3doaWxlKGctLSlpZihkPWVbZ10sbS5pbkFycmF5KG0udmFsSG9va3Mub3B0aW9uLmdldChkKSxmKT49MCl0cnl7ZC5zZWxlY3RlZD1jPSEwfWNhdGNoKGgpe2Quc2Nyb2xsSGVpZ2h0fWVsc2UgZC5zZWxlY3RlZD0hMTtyZXR1cm4gY3x8KGEuc2VsZWN0ZWRJbmRleD0tMSksZX19fX0pLG0uZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe20udmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihhLGIpe3JldHVybiBtLmlzQXJyYXkoYik/YS5jaGVja2VkPW0uaW5BcnJheShtKGEpLnZhbCgpLGIpPj0wOnZvaWQgMH19LGsuY2hlY2tPbnx8KG0udmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YS5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjphLnZhbHVlfSl9KTt2YXIgbWIsbmIsb2I9bS5leHByLmF0dHJIYW5kbGUscGI9L14oPzpjaGVja2VkfHNlbGVjdGVkKSQvaSxxYj1rLmdldFNldEF0dHJpYnV0ZSxyYj1rLmlucHV0O20uZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFYodGhpcyxtLmF0dHIsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20ucmVtb3ZlQXR0cih0aGlzLGEpfSl9fSksbS5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj1hLm5vZGVUeXBlO2lmKGEmJjMhPT1mJiY4IT09ZiYmMiE9PWYpcmV0dXJuIHR5cGVvZiBhLmdldEF0dHJpYnV0ZT09PUs/bS5wcm9wKGEsYixjKTooMT09PWYmJm0uaXNYTUxEb2MoYSl8fChiPWIudG9Mb3dlckNhc2UoKSxkPW0uYXR0ckhvb2tzW2JdfHwobS5leHByLm1hdGNoLmJvb2wudGVzdChiKT9uYjptYikpLHZvaWQgMD09PWM/ZCYmImdldCJpbiBkJiZudWxsIT09KGU9ZC5nZXQoYSxiKSk/ZTooZT1tLmZpbmQuYXR0cihhLGIpLG51bGw9PWU/dm9pZCAwOmUpOm51bGwhPT1jP2QmJiJzZXQiaW4gZCYmdm9pZCAwIT09KGU9ZC5zZXQoYSxjLGIpKT9lOihhLnNldEF0dHJpYnV0ZShiLGMrIiIpLGMpOnZvaWQgbS5yZW1vdmVBdHRyKGEsYikpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPTAsZj1iJiZiLm1hdGNoKEUpO2lmKGYmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZltlKytdKWQ9bS5wcm9wRml4W2NdfHxjLG0uZXhwci5tYXRjaC5ib29sLnRlc3QoYyk/cmImJnFifHwhcGIudGVzdChjKT9hW2RdPSExOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtkXT0hMTptLmF0dHIoYSxjLCIiKSxhLnJlbW92ZUF0dHJpYnV0ZShxYj9jOmQpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKCFrLnJhZGlvVmFsdWUmJiJyYWRpbyI9PT1iJiZtLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7cmV0dXJuIGEuc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKSxifX19fX0pLG5iPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/bS5yZW1vdmVBdHRyKGEsYyk6cmImJnFifHwhcGIudGVzdChjKT9hLnNldEF0dHJpYnV0ZSghcWImJm0ucHJvcEZpeFtjXXx8YyxjKTphW20uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYyldPWFbY109ITAsY319LG0uZWFjaChtLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihhLGIpe3ZhciBjPW9iW2JdfHxtLmZpbmQuYXR0cjtvYltiXT1yYiYmcWJ8fCFwYi50ZXN0KGIpP2Z1bmN0aW9uKGEsYixkKXt2YXIgZSxmO3JldHVybiBkfHwoZj1vYltiXSxvYltiXT1lLGU9bnVsbCE9YyhhLGIsZCk/Yi50b0xvd2VyQ2FzZSgpOm51bGwsb2JbYl09ZiksZX06ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjP3ZvaWQgMDphW20uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYildP2IudG9Mb3dlckNhc2UoKTpudWxsfX0pLHJiJiZxYnx8KG0uYXR0ckhvb2tzLnZhbHVlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBtLm5vZGVOYW1lKGEsImlucHV0Iik/dm9pZChhLmRlZmF1bHRWYWx1ZT1iKTptYiYmbWIuc2V0KGEsYixjKX19KSxxYnx8KG1iPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0QXR0cmlidXRlTm9kZShjKTtyZXR1cm4gZHx8YS5zZXRBdHRyaWJ1dGVOb2RlKGQ9YS5vd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShjKSksZC52YWx1ZT1iKz0iIiwidmFsdWUiPT09Y3x8Yj09PWEuZ2V0QXR0cmlidXRlKGMpP2I6dm9pZCAwfX0sb2IuaWQ9b2IubmFtZT1vYi5jb29yZHM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiYiIiE9PWQudmFsdWU/ZC52YWx1ZTpudWxsfSxtLnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpO3JldHVybiBjJiZjLnNwZWNpZmllZD9jLnZhbHVlOnZvaWQgMH0sc2V0Om1iLnNldH0sbS5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe21iLnNldChhLCIiPT09Yj8hMTpiLGMpfX0sbS5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe20uYXR0ckhvb2tzW2JdPXtzZXQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4iIj09PWM/KGEuc2V0QXR0cmlidXRlKGIsImF1dG8iKSxjKTp2b2lkIDB9fX0pKSxrLnN0eWxlfHwobS5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0fHx2b2lkIDB9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0eWxlLmNzc1RleHQ9YisiIn19KTt2YXIgc2I9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdCkkL2ksdGI9L14oPzphfGFyZWEpJC9pO20uZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFYodGhpcyxtLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9bS5wcm9wRml4W2FdfHxhLHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPXZvaWQgMCxkZWxldGUgdGhpc1thXX1jYXRjaChiKXt9fSl9fSksbS5leHRlbmQoe3Byb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifSxwcm9wOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZz1hLm5vZGVUeXBlO2lmKGEmJjMhPT1nJiY4IT09ZyYmMiE9PWcpcmV0dXJuIGY9MSE9PWd8fCFtLmlzWE1MRG9jKGEpLGYmJihiPW0ucHJvcEZpeFtiXXx8YixlPW0ucHJvcEhvb2tzW2JdKSx2b2lkIDAhPT1jP2UmJiJzZXQiaW4gZSYmdm9pZCAwIT09KGQ9ZS5zZXQoYSxjLGIpKT9kOmFbYl09YzplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOmFbYl19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgYj1tLmZpbmQuYXR0cihhLCJ0YWJpbmRleCIpO3JldHVybiBiP3BhcnNlSW50KGIsMTApOnNiLnRlc3QoYS5ub2RlTmFtZSl8fHRiLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOi0xfX19fSksay5ocmVmTm9ybWFsaXplZHx8bS5lYWNoKFsiaHJlZiIsInNyYyJdLGZ1bmN0aW9uKGEsYil7bS5wcm9wSG9va3NbYl09e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoYiw0KX19fSksay5vcHRTZWxlY3RlZHx8KG0ucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiYoYi5zZWxlY3RlZEluZGV4LGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpLG51bGx9fSksbS5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXttLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSksay5lbmN0eXBlfHwobS5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIik7dmFyIHViPS9bXHRcclxuXGZdL2c7bS5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoPTAsaT10aGlzLmxlbmd0aCxqPSJzdHJpbmciPT10eXBlb2YgYSYmYTtpZihtLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXttKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGopZm9yKGI9KGF8fCIiKS5tYXRjaChFKXx8W107aT5oO2grKylpZihjPXRoaXNbaF0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPygiICIrYy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHViLCIgIik6IiAiKSl7Zj0wO3doaWxlKGU9YltmKytdKWQuaW5kZXhPZigiICIrZSsiICIpPDAmJihkKz1lKyIgIik7Zz1tLnRyaW0oZCksYy5jbGFzc05hbWUhPT1nJiYoYy5jbGFzc05hbWU9Zyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoPTAsaT10aGlzLmxlbmd0aCxqPTA9PT1hcmd1bWVudHMubGVuZ3RofHwic3RyaW5nIj09dHlwZW9mIGEmJmE7aWYobS5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bSh0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihqKWZvcihiPShhfHwiIikubWF0Y2goRSl8fFtdO2k+aDtoKyspaWYoYz10aGlzW2hdLGQ9MT09PWMubm9kZVR5cGUmJihjLmNsYXNzTmFtZT8oIiAiK2MuY2xhc3NOYW1lKyIgIikucmVwbGFjZSh1YiwiICIpOiIiKSl7Zj0wO3doaWxlKGU9YltmKytdKXdoaWxlKGQuaW5kZXhPZigiICIrZSsiICIpPj0wKWQ9ZC5yZXBsYWNlKCIgIitlKyIgIiwiICIpO2c9YT9tLnRyaW0oZCk6IiIsYy5jbGFzc05hbWUhPT1nJiYoYy5jbGFzc05hbWU9Zyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYiYmInN0cmluZyI9PT1jP2I/dGhpcy5hZGRDbGFzcyhhKTp0aGlzLnJlbW92ZUNsYXNzKGEpOnRoaXMuZWFjaChtLmlzRnVuY3Rpb24oYSk/ZnVuY3Rpb24oYyl7bSh0aGlzKS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLHRoaXMuY2xhc3NOYW1lLGIpLGIpfTpmdW5jdGlvbigpe2lmKCJzdHJpbmciPT09Yyl7dmFyIGIsZD0wLGU9bSh0aGlzKSxmPWEubWF0Y2goRSl8fFtdO3doaWxlKGI9ZltkKytdKWUuaGFzQ2xhc3MoYik/ZS5yZW1vdmVDbGFzcyhiKTplLmFkZENsYXNzKGIpfWVsc2UoYz09PUt8fCJib29sZWFuIj09PWMpJiYodGhpcy5jbGFzc05hbWUmJm0uX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxhPT09ITE/IiI6bS5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKX0pfSxoYXNDbGFzczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiAiK2ErIiAiLGM9MCxkPXRoaXMubGVuZ3RoO2Q+YztjKyspaWYoMT09PXRoaXNbY10ubm9kZVR5cGUmJigiICIrdGhpc1tjXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHViLCIgIikuaW5kZXhPZihiKT49MClyZXR1cm4hMDtyZXR1cm4hMX19KSxtLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXttLmZuW2JdPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX19KSxtLmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9LGJpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGEsIioqIik6dGhpcy5vZmYoYixhfHwiKioiLGMpfX0pO3ZhciB2Yj1tLm5vdygpLHdiPS9cPy8seGI9LygsKXwoXFt8eyl8KH18XSl8Iig/OlteIlxcXHJcbl18XFxbIlxcXC9iZm5ydF18XFx1W1xkYS1mQS1GXXs0fSkqIlxzKjo/fHRydWV8ZmFsc2V8bnVsbHwtPyg/ITBcZClcZCsoPzpcLlxkK3wpKD86W2VFXVsrLV0/XGQrfCkvZzttLnBhcnNlSlNPTj1mdW5jdGlvbihiKXtpZihhLkpTT04mJmEuSlNPTi5wYXJzZSlyZXR1cm4gYS5KU09OLnBhcnNlKGIrIiIpO3ZhciBjLGQ9bnVsbCxlPW0udHJpbShiKyIiKTtyZXR1cm4gZSYmIW0udHJpbShlLnJlcGxhY2UoeGIsZnVuY3Rpb24oYSxiLGUsZil7cmV0dXJuIGMmJmImJihkPTApLDA9PT1kP2E6KGM9ZXx8YixkKz0hZi0hZSwiIil9KSk/RnVuY3Rpb24oInJldHVybiAiK2UpKCk6bS5lcnJvcigiSW52YWxpZCBKU09OOiAiK2IpfSxtLnBhcnNlWE1MPWZ1bmN0aW9uKGIpe3ZhciBjLGQ7aWYoIWJ8fCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gbnVsbDt0cnl7YS5ET01QYXJzZXI/KGQ9bmV3IERPTVBhcnNlcixjPWQucGFyc2VGcm9tU3RyaW5nKGIsInRleHQveG1sIikpOihjPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIiksYy5hc3luYz0iZmFsc2UiLGMubG9hZFhNTChiKSl9Y2F0Y2goZSl7Yz12b2lkIDB9cmV0dXJuIGMmJmMuZG9jdW1lbnRFbGVtZW50JiYhYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fG0uZXJyb3IoIkludmFsaWQgWE1MOiAiK2IpLGN9O3ZhciB5Yix6YixBYj0vIy4qJC8sQmI9LyhbPyZdKV89W14mXSovLENiPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvZ20sRGI9L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sRWI9L14oPzpHRVR8SEVBRCkkLyxGYj0vXlwvXC8vLEdiPS9eKFtcdy4rLV0rOikoPzpcL1wvKD86W15cLz8jXSpAfCkoW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLEhiPXt9LEliPXt9LEpiPSIqLyIuY29uY2F0KCIqIik7dHJ5e3piPWxvY2F0aW9uLmhyZWZ9Y2F0Y2goS2Ipe3piPXkuY3JlYXRlRWxlbWVudCgiYSIpLHpiLmhyZWY9IiIsemI9emIuaHJlZn15Yj1HYi5leGVjKHpiLnRvTG93ZXJDYXNlKCkpfHxbXTtmdW5jdGlvbiBMYihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWIsYj0iKiIpO3ZhciBkLGU9MCxmPWIudG9Mb3dlckNhc2UoKS5tYXRjaChFKXx8W107aWYobS5pc0Z1bmN0aW9uKGMpKXdoaWxlKGQ9ZltlKytdKSIrIj09PWQuY2hhckF0KDApPyhkPWQuc2xpY2UoMSl8fCIqIiwoYVtkXT1hW2RdfHxbXSkudW5zaGlmdChjKSk6KGFbZF09YVtkXXx8W10pLnB1c2goYyl9fWZ1bmN0aW9uIE1iKGEsYixjLGQpe3ZhciBlPXt9LGY9YT09PUliO2Z1bmN0aW9uIGcoaCl7dmFyIGk7cmV0dXJuIGVbaF09ITAsbS5lYWNoKGFbaF18fFtdLGZ1bmN0aW9uKGEsaCl7dmFyIGo9aChiLGMsZCk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBqfHxmfHxlW2pdP2Y/IShpPWopOnZvaWQgMDooYi5kYXRhVHlwZXMudW5zaGlmdChqKSxnKGopLCExKX0pLGl9cmV0dXJuIGcoYi5kYXRhVHlwZXNbMF0pfHwhZVsiKiJdJiZnKCIqIil9ZnVuY3Rpb24gTmIoYSxiKXt2YXIgYyxkLGU9bS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGIpdm9pZCAwIT09YltkXSYmKChlW2RdP2E6Y3x8KGM9e30pKVtkXT1iW2RdKTtyZXR1cm4gYyYmbS5leHRlbmQoITAsYSxjKSxhfWZ1bmN0aW9uIE9iKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuY29udGVudHMsaT1hLmRhdGFUeXBlczt3aGlsZSgiKiI9PT1pWzBdKWkuc2hpZnQoKSx2b2lkIDA9PT1lJiYoZT1hLm1pbWVUeXBlfHxiLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYoZSlmb3IoZyBpbiBoKWlmKGhbZ10mJmhbZ10udGVzdChlKSl7aS51bnNoaWZ0KGcpO2JyZWFrfWlmKGlbMF1pbiBjKWY9aVswXTtlbHNle2ZvcihnIGluIGMpe2lmKCFpWzBdfHxhLmNvbnZlcnRlcnNbZysiICIraVswXV0pe2Y9ZzticmVha31kfHwoZD1nKX1mPWZ8fGR9cmV0dXJuIGY/KGYhPT1pWzBdJiZpLnVuc2hpZnQoZiksY1tmXSk6dm9pZCAwfWZ1bmN0aW9uIFBiKGEsYixjLGQpe3ZhciBlLGYsZyxoLGksaj17fSxrPWEuZGF0YVR5cGVzLnNsaWNlKCk7aWYoa1sxXSlmb3IoZyBpbiBhLmNvbnZlcnRlcnMpaltnLnRvTG93ZXJDYXNlKCldPWEuY29udmVydGVyc1tnXTtmPWsuc2hpZnQoKTt3aGlsZShmKWlmKGEucmVzcG9uc2VGaWVsZHNbZl0mJihjW2EucmVzcG9uc2VGaWVsZHNbZl1dPWIpLCFpJiZkJiZhLmRhdGFGaWx0ZXImJihiPWEuZGF0YUZpbHRlcihiLGEuZGF0YVR5cGUpKSxpPWYsZj1rLnNoaWZ0KCkpaWYoIioiPT09ZilmPWk7ZWxzZSBpZigiKiIhPT1pJiZpIT09Zil7aWYoZz1qW2krIiAiK2ZdfHxqWyIqICIrZl0sIWcpZm9yKGUgaW4gailpZihoPWUuc3BsaXQoIiAiKSxoWzFdPT09ZiYmKGc9altpKyIgIitoWzBdXXx8alsiKiAiK2hbMF1dKSl7Zz09PSEwP2c9altlXTpqW2VdIT09ITAmJihmPWhbMF0say51bnNoaWZ0KGhbMV0pKTticmVha31pZihnIT09ITApaWYoZyYmYVsidGhyb3dzIl0pYj1nKGIpO2Vsc2UgdHJ5e2I9ZyhiKX1jYXRjaChsKXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjpnP2w6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK2krIiB0byAiK2Z9fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6Yn19bS5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOnpiLHR5cGU6IkdFVCIsaXNMb2NhbDpEYi50ZXN0KHliWzFdKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOkpiLHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi94bWwvLGh0bWw6L2h0bWwvLGpzb246L2pzb24vfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6bS5wYXJzZUpTT04sInRleHQgeG1sIjptLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9OYihOYihhLG0uYWpheFNldHRpbmdzKSxiKTpOYihtLmFqYXhTZXR0aW5ncyxhKX0sYWpheFByZWZpbHRlcjpMYihIYiksYWpheFRyYW5zcG9ydDpMYihJYiksYWpheDpmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYj1ifHx7fTt2YXIgYyxkLGUsZixnLGgsaSxqLGs9bS5hamF4U2V0dXAoe30sYiksbD1rLmNvbnRleHR8fGssbj1rLmNvbnRleHQmJihsLm5vZGVUeXBlfHxsLmpxdWVyeSk/bShsKTptLmV2ZW50LG89bS5EZWZlcnJlZCgpLHA9bS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikscT1rLnN0YXR1c0NvZGV8fHt9LHI9e30scz17fSx0PTAsdT0iY2FuY2VsZWQiLHY9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXt2YXIgYjtpZigyPT09dCl7aWYoIWope2o9e307d2hpbGUoYj1DYi5leGVjKGYpKWpbYlsxXS50b0xvd2VyQ2FzZSgpXT1iWzJdfWI9althLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT1iP251bGw6Yn0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT10P2Y6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhLGIpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTtyZXR1cm4gdHx8KGE9c1tjXT1zW2NdfHxhLHJbYV09YiksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gdHx8KGsubWltZVR5cGU9YSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihhKXt2YXIgYjtpZihhKWlmKDI+dClmb3IoYiBpbiBhKXFbYl09W3FbYl0sYVtiXV07ZWxzZSB2LmFsd2F5cyhhW3Yuc3RhdHVzXSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe3ZhciBiPWF8fHU7cmV0dXJuIGkmJmkuYWJvcnQoYikseCgwLGIpLHRoaXN9fTtpZihvLnByb21pc2UodikuY29tcGxldGU9cC5hZGQsdi5zdWNjZXNzPXYuZG9uZSx2LmVycm9yPXYuZmFpbCxrLnVybD0oKGF8fGsudXJsfHx6YikrIiIpLnJlcGxhY2UoQWIsIiIpLnJlcGxhY2UoRmIseWJbMV0rIi8vIiksay50eXBlPWIubWV0aG9kfHxiLnR5cGV8fGsubWV0aG9kfHxrLnR5cGUsay5kYXRhVHlwZXM9bS50cmltKGsuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChFKXx8WyIiXSxudWxsPT1rLmNyb3NzRG9tYWluJiYoYz1HYi5leGVjKGsudXJsLnRvTG93ZXJDYXNlKCkpLGsuY3Jvc3NEb21haW49ISghY3x8Y1sxXT09PXliWzFdJiZjWzJdPT09eWJbMl0mJihjWzNdfHwoImh0dHA6Ij09PWNbMV0/IjgwIjoiNDQzIikpPT09KHliWzNdfHwoImh0dHA6Ij09PXliWzFdPyI4MCI6IjQ0MyIpKSkpLGsuZGF0YSYmay5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBrLmRhdGEmJihrLmRhdGE9bS5wYXJhbShrLmRhdGEsay50cmFkaXRpb25hbCkpLE1iKEhiLGssYix2KSwyPT09dClyZXR1cm4gdjtoPW0uZXZlbnQmJmsuZ2xvYmFsLGgmJjA9PT1tLmFjdGl2ZSsrJiZtLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGsudHlwZT1rLnR5cGUudG9VcHBlckNhc2UoKSxrLmhhc0NvbnRlbnQ9IUViLnRlc3Qoay50eXBlKSxlPWsudXJsLGsuaGFzQ29udGVudHx8KGsuZGF0YSYmKGU9ay51cmwrPSh3Yi50ZXN0KGUpPyImIjoiPyIpK2suZGF0YSxkZWxldGUgay5kYXRhKSxrLmNhY2hlPT09ITEmJihrLnVybD1CYi50ZXN0KGUpP2UucmVwbGFjZShCYiwiJDFfPSIrdmIrKyk6ZSsod2IudGVzdChlKT8iJiI6Ij8iKSsiXz0iK3ZiKyspKSxrLmlmTW9kaWZpZWQmJihtLmxhc3RNb2RpZmllZFtlXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsbS5sYXN0TW9kaWZpZWRbZV0pLG0uZXRhZ1tlXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixtLmV0YWdbZV0pKSwoay5kYXRhJiZrLmhhc0NvbnRlbnQmJmsuY29udGVudFR5cGUhPT0hMXx8Yi5jb250ZW50VHlwZSkmJnYuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixrLmNvbnRlbnRUeXBlKSx2LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsay5kYXRhVHlwZXNbMF0mJmsuYWNjZXB0c1trLmRhdGFUeXBlc1swXV0/ay5hY2NlcHRzW2suZGF0YVR5cGVzWzBdXSsoIioiIT09ay5kYXRhVHlwZXNbMF0/IiwgIitKYisiOyBxPTAuMDEiOiIiKTprLmFjY2VwdHNbIioiXSk7Zm9yKGQgaW4gay5oZWFkZXJzKXYuc2V0UmVxdWVzdEhlYWRlcihkLGsuaGVhZGVyc1tkXSk7aWYoay5iZWZvcmVTZW5kJiYoay5iZWZvcmVTZW5kLmNhbGwobCx2LGspPT09ITF8fDI9PT10KSlyZXR1cm4gdi5hYm9ydCgpO3U9ImFib3J0Ijtmb3IoZCBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl2W2RdKGtbZF0pO2lmKGk9TWIoSWIsayxiLHYpKXt2LnJlYWR5U3RhdGU9MSxoJiZuLnRyaWdnZXIoImFqYXhTZW5kIixbdixrXSksay5hc3luYyYmay50aW1lb3V0PjAmJihnPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2LmFib3J0KCJ0aW1lb3V0Iil9LGsudGltZW91dCkpO3RyeXt0PTEsaS5zZW5kKHIseCl9Y2F0Y2godyl7aWYoISgyPnQpKXRocm93IHc7eCgtMSx3KX19ZWxzZSB4KC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiB4KGEsYixjLGQpe3ZhciBqLHIscyx1LHcseD1iOzIhPT10JiYodD0yLGcmJmNsZWFyVGltZW91dChnKSxpPXZvaWQgMCxmPWR8fCIiLHYucmVhZHlTdGF0ZT1hPjA/NDowLGo9YT49MjAwJiYzMDA+YXx8MzA0PT09YSxjJiYodT1PYihrLHYsYykpLHU9UGIoayx1LHYsaiksaj8oay5pZk1vZGlmaWVkJiYodz12LmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIiksdyYmKG0ubGFzdE1vZGlmaWVkW2VdPXcpLHc9di5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpLHcmJihtLmV0YWdbZV09dykpLDIwND09PWF8fCJIRUFEIj09PWsudHlwZT94PSJub2NvbnRlbnQiOjMwND09PWE/eD0ibm90bW9kaWZpZWQiOih4PXUuc3RhdGUscj11LmRhdGEscz11LmVycm9yLGo9IXMpKToocz14LChhfHwheCkmJih4PSJlcnJvciIsMD5hJiYoYT0wKSkpLHYuc3RhdHVzPWEsdi5zdGF0dXNUZXh0PShifHx4KSsiIixqP28ucmVzb2x2ZVdpdGgobCxbcix4LHZdKTpvLnJlamVjdFdpdGgobCxbdix4LHNdKSx2LnN0YXR1c0NvZGUocSkscT12b2lkIDAsaCYmbi50cmlnZ2VyKGo/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbdixrLGo/cjpzXSkscC5maXJlV2l0aChsLFt2LHhdKSxoJiYobi50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt2LGtdKSwtLW0uYWN0aXZlfHxtLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gdn0sZ2V0SlNPTjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZ2V0KGEsYixjLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbihhLGIpe3JldHVybiBtLmdldChhLHZvaWQgMCxiLCJzY3JpcHQiKX19KSxtLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxiKXttW2JdPWZ1bmN0aW9uKGEsYyxkLGUpe3JldHVybiBtLmlzRnVuY3Rpb24oYykmJihlPWV8fGQsZD1jLGM9dm9pZCAwKSxtLmFqYXgoe3VybDphLHR5cGU6YixkYXRhVHlwZTplLGRhdGE6YyxzdWNjZXNzOmR9KX19KSxtLl9ldmFsVXJsPWZ1bmN0aW9uKGEpe3JldHVybiBtLmFqYXgoe3VybDphLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsYXN5bmM6ITEsZ2xvYmFsOiExLCJ0aHJvd3MiOiEwfSl9LG0uZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGEpe2lmKG0uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20odGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxiKSl9KTtpZih0aGlzWzBdKXt2YXIgYj1tKGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZiLmluc2VydEJlZm9yZSh0aGlzWzBdKSxiLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXM7d2hpbGUoYS5maXJzdENoaWxkJiYxPT09YS5maXJzdENoaWxkLm5vZGVUeXBlKWE9YS5maXJzdENoaWxkO3JldHVybiBhfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChtLmlzRnVuY3Rpb24oYSk/ZnVuY3Rpb24oYil7bSh0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsYikpfTpmdW5jdGlvbigpe3ZhciBiPW0odGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9bS5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7bSh0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe20ubm9kZU5hbWUodGhpcywiYm9keSIpfHxtKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX19KSxtLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7cmV0dXJuIGEub2Zmc2V0V2lkdGg8PTAmJmEub2Zmc2V0SGVpZ2h0PD0wfHwhay5yZWxpYWJsZUhpZGRlbk9mZnNldHMoKSYmIm5vbmUiPT09KGEuc3R5bGUmJmEuc3R5bGUuZGlzcGxheXx8bS5jc3MoYSwiZGlzcGxheSIpKX0sbS5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hbS5leHByLmZpbHRlcnMuaGlkZGVuKGEpfTt2YXIgUWI9LyUyMC9nLFJiPS9cW1xdJC8sU2I9L1xyP1xuL2csVGI9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFViPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBWYihhLGIsYyxkKXt2YXIgZTtpZihtLmlzQXJyYXkoYikpbS5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxSYi50ZXN0KGEpP2QoYSxlKTpWYihhKyJbIisoIm9iamVjdCI9PXR5cGVvZiBlP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKGN8fCJvYmplY3QiIT09bS50eXBlKGIpKWQoYSxiKTtlbHNlIGZvcihlIGluIGIpVmIoYSsiWyIrZSsiXSIsYltlXSxjLGQpfW0ucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXtiPW0uaXNGdW5jdGlvbihiKT9iKCk6bnVsbD09Yj8iIjpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtpZih2b2lkIDA9PT1iJiYoYj1tLmFqYXhTZXR0aW5ncyYmbS5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLG0uaXNBcnJheShhKXx8YS5qcXVlcnkmJiFtLmlzUGxhaW5PYmplY3QoYSkpbS5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlWYihjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZShRYiwiKyIpfSxtLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG0ucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT1tLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gYT9tLm1ha2VBcnJheShhKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFtKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmVWIudGVzdCh0aGlzLm5vZGVOYW1lKSYmIVRiLnRlc3QoYSkmJih0aGlzLmNoZWNrZWR8fCFXLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9bSh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOm0uaXNBcnJheShjKT9tLm1hcChjLGZ1bmN0aW9uKGEpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoU2IsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKFNiLCJcclxuIil9fSkuZ2V0KCl9fSksbS5hamF4U2V0dGluZ3MueGhyPXZvaWQgMCE9PWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzTG9jYWwmJi9eKGdldHxwb3N0fGhlYWR8cHV0fGRlbGV0ZXxvcHRpb25zKSQvaS50ZXN0KHRoaXMudHlwZSkmJlpiKCl8fCRiKCl9OlpiO3ZhciBXYj0wLFhiPXt9LFliPW0uYWpheFNldHRpbmdzLnhocigpO2EuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixmdW5jdGlvbigpe2Zvcih2YXIgYSBpbiBYYilYYlthXSh2b2lkIDAsITApfSksay5jb3JzPSEhWWImJiJ3aXRoQ3JlZGVudGlhbHMiaW4gWWIsWWI9ay5hamF4PSEhWWIsWWImJm0uYWpheFRyYW5zcG9ydChmdW5jdGlvbihhKXtpZighYS5jcm9zc0RvbWFpbnx8ay5jb3JzKXt2YXIgYjtyZXR1cm57c2VuZDpmdW5jdGlvbihjLGQpe3ZhciBlLGY9YS54aHIoKSxnPSsrV2I7aWYoZi5vcGVuKGEudHlwZSxhLnVybCxhLmFzeW5jLGEudXNlcm5hbWUsYS5wYXNzd29yZCksYS54aHJGaWVsZHMpZm9yKGUgaW4gYS54aHJGaWVsZHMpZltlXT1hLnhockZpZWxkc1tlXTthLm1pbWVUeXBlJiZmLm92ZXJyaWRlTWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZShhLm1pbWVUeXBlKSxhLmNyb3NzRG9tYWlufHxjWyJYLVJlcXVlc3RlZC1XaXRoIl18fChjWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7Zm9yKGUgaW4gYyl2b2lkIDAhPT1jW2VdJiZmLnNldFJlcXVlc3RIZWFkZXIoZSxjW2VdKyIiKTtmLnNlbmQoYS5oYXNDb250ZW50JiZhLmRhdGF8fG51bGwpLGI9ZnVuY3Rpb24oYyxlKXt2YXIgaCxpLGo7aWYoYiYmKGV8fDQ9PT1mLnJlYWR5U3RhdGUpKWlmKGRlbGV0ZSBYYltnXSxiPXZvaWQgMCxmLm9ucmVhZHlzdGF0ZWNoYW5nZT1tLm5vb3AsZSk0IT09Zi5yZWFkeVN0YXRlJiZmLmFib3J0KCk7ZWxzZXtqPXt9LGg9Zi5zdGF0dXMsInN0cmluZyI9PXR5cGVvZiBmLnJlc3BvbnNlVGV4dCYmKGoudGV4dD1mLnJlc3BvbnNlVGV4dCk7dHJ5e2k9Zi5zdGF0dXNUZXh0fWNhdGNoKGspe2k9IiJ9aHx8IWEuaXNMb2NhbHx8YS5jcm9zc0RvbWFpbj8xMjIzPT09aCYmKGg9MjA0KTpoPWoudGV4dD8yMDA6NDA0fWomJmQoaCxpLGosZi5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSl9LGEuYXN5bmM/ND09PWYucmVhZHlTdGF0ZT9zZXRUaW1lb3V0KGIpOmYub25yZWFkeXN0YXRlY2hhbmdlPVhiW2ddPWI6YigpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIodm9pZCAwLCEwKX19fX0pO2Z1bmN0aW9uIFpiKCl7dHJ5e3JldHVybiBuZXcgYS5YTUxIdHRwUmVxdWVzdH1jYXRjaChiKXt9fWZ1bmN0aW9uICRiKCl7dHJ5e3JldHVybiBuZXcgYS5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpfWNhdGNoKGIpe319bS5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi8oPzpqYXZhfGVjbWEpc2NyaXB0L30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtyZXR1cm4gbS5nbG9iYWxFdmFsKGEpLGF9fX0pLG0uYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXt2b2lkIDA9PT1hLmNhY2hlJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIixhLmdsb2JhbD0hMSl9KSxtLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbil7dmFyIGIsYz15LmhlYWR8fG0oImhlYWQiKVswXXx8eS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZCxlKXtiPXkuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksYi5hc3luYz0hMCxhLnNjcmlwdENoYXJzZXQmJihiLmNoYXJzZXQ9YS5zY3JpcHRDaGFyc2V0KSxiLnNyYz1hLnVybCxiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihhLGMpeyhjfHwhYi5yZWFkeVN0YXRlfHwvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KGIucmVhZHlTdGF0ZSkpJiYoYi5vbmxvYWQ9Yi5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSxiPW51bGwsY3x8ZSgyMDAsInN1Y2Nlc3MiKSl9LGMuaW5zZXJ0QmVmb3JlKGIsYy5maXJzdENoaWxkKX0sYWJvcnQ6ZnVuY3Rpb24oKXtiJiZiLm9ubG9hZCh2b2lkIDAsITApfX19fSk7dmFyIF9iPVtdLGFjPS8oPSlcPyg/PSZ8JCl8XD9cPy87bS5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBhPV9iLnBvcCgpfHxtLmV4cGFuZG8rIl8iK3ZiKys7cmV0dXJuIHRoaXNbYV09ITAsYX19KSxtLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZSxmLGcsaD1iLmpzb25wIT09ITEmJihhYy50ZXN0KGIudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIGIuZGF0YSYmIShiLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJmFjLnRlc3QoYi5kYXRhKSYmImRhdGEiKTtyZXR1cm4gaHx8Impzb25wIj09PWIuZGF0YVR5cGVzWzBdPyhlPWIuanNvbnBDYWxsYmFjaz1tLmlzRnVuY3Rpb24oYi5qc29ucENhbGxiYWNrKT9iLmpzb25wQ2FsbGJhY2soKTpiLmpzb25wQ2FsbGJhY2ssaD9iW2hdPWJbaF0ucmVwbGFjZShhYywiJDEiK2UpOmIuanNvbnAhPT0hMSYmKGIudXJsKz0od2IudGVzdChiLnVybCk/IiYiOiI/IikrYi5qc29ucCsiPSIrZSksYi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIGd8fG0uZXJyb3IoZSsiIHdhcyBub3QgY2FsbGVkIiksZ1swXX0sYi5kYXRhVHlwZXNbMF09Impzb24iLGY9YVtlXSxhW2VdPWZ1bmN0aW9uKCl7Zz1hcmd1bWVudHN9LGQuYWx3YXlzKGZ1bmN0aW9uKCl7YVtlXT1mLGJbZV0mJihiLmpzb25wQ2FsbGJhY2s9Yy5qc29ucENhbGxiYWNrLF9iLnB1c2goZSkpLGcmJm0uaXNGdW5jdGlvbihmKSYmZihnWzBdKSxnPWY9dm9pZCAwfSksInNjcmlwdCIpOnZvaWQgMH0pLG0ucGFyc2VIVE1MPWZ1bmN0aW9uKGEsYixjKXtpZighYXx8InN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBudWxsOyJib29sZWFuIj09dHlwZW9mIGImJihjPWIsYj0hMSksYj1ifHx5O3ZhciBkPXUuZXhlYyhhKSxlPSFjJiZbXTtyZXR1cm4gZD9bYi5jcmVhdGVFbGVtZW50KGRbMV0pXTooZD1tLmJ1aWxkRnJhZ21lbnQoW2FdLGIsZSksZSYmZS5sZW5ndGgmJm0oZSkucmVtb3ZlKCksbS5tZXJnZShbXSxkLmNoaWxkTm9kZXMpKX07dmFyIGJjPW0uZm4ubG9hZDttLmZuLmxvYWQ9ZnVuY3Rpb24oYSxiLGMpe2lmKCJzdHJpbmciIT10eXBlb2YgYSYmYmMpcmV0dXJuIGJjLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZCxlLGYsZz10aGlzLGg9YS5pbmRleE9mKCIgIik7cmV0dXJuIGg+PTAmJihkPW0udHJpbShhLnNsaWNlKGgsYS5sZW5ndGgpKSxhPWEuc2xpY2UoMCxoKSksbS5pc0Z1bmN0aW9uKGIpPyhjPWIsYj12b2lkIDApOmImJiJvYmplY3QiPT10eXBlb2YgYiYmKGY9IlBPU1QiKSxnLmxlbmd0aD4wJiZtLmFqYXgoe3VybDphLHR5cGU6ZixkYXRhVHlwZToiaHRtbCIsZGF0YTpifSkuZG9uZShmdW5jdGlvbihhKXtlPWFyZ3VtZW50cyxnLmh0bWwoZD9tKCI8ZGl2PiIpLmFwcGVuZChtLnBhcnNlSFRNTChhKSkuZmluZChkKTphKX0pLmNvbXBsZXRlKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGMsZXx8W2EucmVzcG9uc2VUZXh0LGIsYV0pfSksdGhpc30sbS5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXttLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksbS5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZ3JlcChtLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH07dmFyIGNjPWEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2Z1bmN0aW9uIGRjKGEpe3JldHVybiBtLmlzV2luZG93KGEpP2E6OT09PWEubm9kZVR5cGU/YS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3c6ITF9bS5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosaz1tLmNzcyhhLCJwb3NpdGlvbiIpLGw9bShhKSxuPXt9OyJzdGF0aWMiPT09ayYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaD1sLm9mZnNldCgpLGY9bS5jc3MoYSwidG9wIiksaT1tLmNzcyhhLCJsZWZ0Iiksaj0oImFic29sdXRlIj09PWt8fCJmaXhlZCI9PT1rKSYmbS5pbkFycmF5KCJhdXRvIixbZixpXSk+LTEsaj8oZD1sLnBvc2l0aW9uKCksZz1kLnRvcCxlPWQubGVmdCk6KGc9cGFyc2VGbG9hdChmKXx8MCxlPXBhcnNlRmxvYXQoaSl8fDApLG0uaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsYyxoKSksbnVsbCE9Yi50b3AmJihuLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihuLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxuKTpsLmNzcyhuKX19LG0uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXttLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXt0b3A6MCxsZWZ0OjB9LGU9dGhpc1swXSxmPWUmJmUub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG0uY29udGFpbnMoYixlKT8odHlwZW9mIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09SyYmKGQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1kYyhmKSx7dG9wOmQudG9wKyhjLnBhZ2VZT2Zmc2V0fHxiLnNjcm9sbFRvcCktKGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoYy5wYWdlWE9mZnNldHx8Yi5zY3JvbGxMZWZ0KS0oYi5jbGllbnRMZWZ0fHwwKX0pOmR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsYixjPXt0b3A6MCxsZWZ0OjB9LGQ9dGhpc1swXTtyZXR1cm4iZml4ZWQiPT09bS5jc3MoZCwicG9zaXRpb24iKT9iPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGE9dGhpcy5vZmZzZXRQYXJlbnQoKSxiPXRoaXMub2Zmc2V0KCksbS5ub2RlTmFtZShhWzBdLCJodG1sIil8fChjPWEub2Zmc2V0KCkpLGMudG9wKz1tLmNzcyhhWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLGMubGVmdCs9bS5jc3MoYVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6Yi50b3AtYy50b3AtbS5jc3MoZCwibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtYy5sZWZ0LW0uY3NzKGQsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8Y2M7d2hpbGUoYSYmIW0ubm9kZU5hbWUoYSwiaHRtbCIpJiYic3RhdGljIj09PW0uY3NzKGEsInBvc2l0aW9uIikpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYXx8Y2N9KX19KSxtLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz0vWS8udGVzdChiKTttLmZuW2FdPWZ1bmN0aW9uKGQpe3JldHVybiBWKHRoaXMsZnVuY3Rpb24oYSxkLGUpe3ZhciBmPWRjKGEpO3JldHVybiB2b2lkIDA9PT1lP2Y/YiBpbiBmP2ZbYl06Zi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZF06YVtkXTp2b2lkKGY/Zi5zY3JvbGxUbyhjP20oZikuc2Nyb2xsTGVmdCgpOmUsYz9lOm0oZikuc2Nyb2xsVG9wKCkpOmFbZF09ZSl9LGEsZCxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLG0uZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYl09TGEoay5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGM/KGM9SmEoYSxiKSxIYS50ZXN0KGMpP20oYSkucG9zaXRpb24oKVtiXSsicHgiOmMpOnZvaWQgMH0pfSksbS5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxiKXttLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7bS5mbltkXT1mdW5jdGlvbihkLGUpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBkKSxnPWN8fChkPT09ITB8fGU9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihiLGMsZCl7dmFyIGU7cmV0dXJuIG0uaXNXaW5kb3coYik/Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGU9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGVbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGVbIm9mZnNldCIrYV0sZVsiY2xpZW50IithXSkpOnZvaWQgMD09PWQ/bS5jc3MoYixjLGcpOm0uc3R5bGUoYixjLGQsZyl9LGIsZj9kOnZvaWQgMCxmLG51bGwpfX0pfSksbS5mbi5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSxtLmZuLmFuZFNlbGY9bS5mbi5hZGRCYWNrLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBtfSk7dmFyIGVjPWEualF1ZXJ5LGZjPWEuJDtyZXR1cm4gbS5ub0NvbmZsaWN0PWZ1bmN0aW9uKGIpe3JldHVybiBhLiQ9PT1tJiYoYS4kPWZjKSxiJiZhLmpRdWVyeT09PW0mJihhLmpRdWVyeT1lYyksbX0sdHlwZW9mIGI9PT1LJiYoYS5qUXVlcnk9YS4kPW0pLG19KTsNCg=="></script>
<link href="data:text/css;charset=utf-8,%2Ejqstooltip%20%7B%0A%2Dwebkit%2Dbox%2Dsizing%3A%20content%2Dbox%3B%0A%2Dmoz%2Dbox%2Dsizing%3A%20content%2Dbox%3B%0Abox%2Dsizing%3A%20content%2Dbox%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyoqDQoqDQoqIGpxdWVyeS5zcGFya2xpbmUuanMNCioNCiogdkBWRVJTSU9OQA0KKiAoYykgU3BsdW5rLCBJbmMNCiogQ29udGFjdDogR2FyZXRoIFdhdHRzIChnYXJldGhAc3BsdW5rLmNvbSkNCiogaHR0cDovL29tbmlwb3RlbnQubmV0L2pxdWVyeS5zcGFya2xpbmUvDQoqDQoqIEdlbmVyYXRlcyBpbmxpbmUgc3BhcmtsaW5lIGNoYXJ0cyBmcm9tIGRhdGEgc3VwcGxpZWQgZWl0aGVyIHRvIHRoZSBtZXRob2QNCiogb3IgaW5saW5lIGluIEhUTUwNCioNCiogQ29tcGF0aWJsZSB3aXRoIEludGVybmV0IEV4cGxvcmVyIDYuMCsgYW5kIG1vZGVybiBicm93c2VycyBlcXVpcHBlZCB3aXRoIHRoZSBjYW52YXMgdGFnDQoqIChGaXJlZm94IDIuMCssIFNhZmFyaSwgT3BlcmEsIGV0YykNCioNCiogTGljZW5zZTogTmV3IEJTRCBMaWNlbnNlDQoqDQoqIENvcHlyaWdodCAoYykgMjAxMiwgU3BsdW5rIEluYy4NCiogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCioNCiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwNCiogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0Og0KKg0KKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQoqICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQoqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCiogICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbg0KKiAgICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCiogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBTcGx1bmsgSW5jIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkNCiogICAgICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dA0KKiAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQoqDQoqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZDQoqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUw0KKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVA0KKiBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UDQoqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pDQoqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwNCiogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUw0KKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCioNCioNCiogVXNhZ2U6DQoqICAkKHNlbGVjdG9yKS5zcGFya2xpbmUodmFsdWVzLCBvcHRpb25zKQ0KKg0KKiBJZiB2YWx1ZXMgaXMgdW5kZWZpbmVkIG9yIHNldCB0byAnaHRtbCcgdGhlbiB0aGUgZGF0YSB2YWx1ZXMgYXJlIHJlYWQgZnJvbSB0aGUgc3BlY2lmaWVkIHRhZzoNCiogICA8cD5TcGFya2xpbmU6IDxzcGFuIGNsYXNzPSJzcGFya2xpbmUiPjEsNCw2LDYsOCw1LDMsNTwvc3Bhbj48L3A+DQoqICAgJCgnLnNwYXJrbGluZScpLnNwYXJrbGluZSgpOw0KKiBUaGVyZSBtdXN0IGJlIG5vIHNwYWNlcyBpbiB0aGUgZW5jbG9zZWQgZGF0YSBzZXQNCioNCiogT3RoZXJ3aXNlIHZhbHVlcyBtdXN0IGJlIGFuIGFycmF5IG9mIG51bWJlcnMgb3IgbnVsbCB2YWx1ZXMNCiogICAgPHA+U3BhcmtsaW5lOiA8c3BhbiBpZD0ic3BhcmtsaW5lMSI+VGhpcyB0ZXh0IHJlcGxhY2VkIGlmIHRoZSBicm93c2VyIGlzIGNvbXBhdGlibGU8L3NwYW4+PC9wPg0KKiAgICAkKCcjc3BhcmtsaW5lMScpLnNwYXJrbGluZShbMSw0LDYsNiw4LDUsMyw1XSkNCiogICAgJCgnI3NwYXJrbGluZTInKS5zcGFya2xpbmUoWzEsNCw2LG51bGwsbnVsbCw1LDMsNV0pDQoqDQoqIFZhbHVlcyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgaW4gYW4gSFRNTCBjb21tZW50LCBvciBhcyBhIHZhbHVlcyBhdHRyaWJ1dGU6DQoqICAgIDxwPlNwYXJrbGluZTogPHNwYW4gY2xhc3M9InNwYXJrbGluZSI+PCEtLTEsNCw2LDYsOCw1LDMsNSAtLT48L3NwYW4+PC9wPg0KKiAgICA8cD5TcGFya2xpbmU6IDxzcGFuIGNsYXNzPSJzcGFya2xpbmUiIHZhbHVlcz0iMSw0LDYsNiw4LDUsMyw1Ij48L3NwYW4+PC9wPg0KKiAgICAkKCcuc3BhcmtsaW5lJykuc3BhcmtsaW5lKCk7DQoqDQoqIEZvciBsaW5lIGNoYXJ0cywgeCB2YWx1ZXMgY2FuIGFsc28gYmUgc3BlY2lmaWVkOg0KKiAgIDxwPlNwYXJrbGluZTogPHNwYW4gY2xhc3M9InNwYXJrbGluZSI+MToxLDIuNzo0LDMuNDo2LDU6Niw2OjgsOC43OjUsOTozLDEwOjU8L3NwYW4+PC9wPg0KKiAgICAkKCcjc3BhcmtsaW5lMScpLnNwYXJrbGluZShbIFsxLDFdLCBbMi43LDRdLCBbMy40LDZdLCBbNSw2XSwgWzYsOF0sIFs4LjcsNV0sIFs5LDNdLCBbMTAsNV0gXSkNCioNCiogQnkgZGVmYXVsdCwgb3B0aW9ucyBzaG91bGQgYmUgcGFzc2VkIGluIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIHNwYXJrbGluZSBmdW5jdGlvbjoNCiogICAkKCcuc3BhcmtsaW5lJykuc3BhcmtsaW5lKFsxLDIsMyw0XSwge3R5cGU6ICdiYXInfSkNCioNCiogT3B0aW9ucyBjYW4gYWxzbyBiZSBzZXQgYnkgcGFzc2luZyB0aGVtIG9uIHRoZSB0YWcgaXRzZWxmLiAgVGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgdGhvdWdoDQoqIGFzIHRoZXJlJ3MgYSBzbGlnaHQgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQ6DQoqICAgJCgnLnNwYXJrbGluZScpLnNwYXJrbGluZShbMSwyLDMsNF0sIHtlbmFibGVUYWdPcHRpb25zOiB0cnVlfSkNCiogICA8cD5TcGFya2xpbmU6IDxzcGFuIGNsYXNzPSJzcGFya2xpbmUiIHNwYXJrVHlwZT0iYmFyIiBzcGFya0JhckNvbG9yPSJyZWQiPmxvYWRpbmc8L3NwYW4+PC9wPg0KKiBQcmVmaXggYWxsIG9wdGlvbnMgc3VwcGxpZWQgYXMgdGFnIGF0dHJpYnV0ZSB3aXRoICJzcGFyayIgKGNvbmZpZ3VyYWJsZSBieSBzZXR0aW5nIHRhZ09wdGlvbnNQcmVmaXgpDQoqDQoqIFN1cHBvcnRlZCBvcHRpb25zOg0KKiAgIGxpbmVDb2xvciAtIENvbG9yIG9mIHRoZSBsaW5lIHVzZWQgZm9yIHRoZSBjaGFydA0KKiAgIGZpbGxDb2xvciAtIENvbG9yIHVzZWQgdG8gZmlsbCBpbiB0aGUgY2hhcnQgLSBTZXQgdG8gJycgb3IgZmFsc2UgZm9yIGEgdHJhbnNwYXJlbnQgY2hhcnQNCiogICB3aWR0aCAtIFdpZHRoIG9mIHRoZSBjaGFydCAtIERlZmF1bHRzIHRvIDMgdGltZXMgdGhlIG51bWJlciBvZiB2YWx1ZXMgaW4gcGl4ZWxzDQoqICAgaGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjaGFydCAtIERlZmF1bHRzIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGNvbnRhaW5pbmcgZWxlbWVudA0KKiAgIGNoYXJ0UmFuZ2VNaW4gLSBTcGVjaWZ5IHRoZSBtaW5pbXVtIHZhbHVlIHRvIHVzZSBmb3IgdGhlIFkgcmFuZ2Ugb2YgdGhlIGNoYXJ0IC0gRGVmYXVsdHMgdG8gdGhlIG1pbmltdW0gdmFsdWUgc3VwcGxpZWQNCiogICBjaGFydFJhbmdlTWF4IC0gU3BlY2lmeSB0aGUgbWF4aW11bSB2YWx1ZSB0byB1c2UgZm9yIHRoZSBZIHJhbmdlIG9mIHRoZSBjaGFydCAtIERlZmF1bHRzIHRvIHRoZSBtYXhpbXVtIHZhbHVlIHN1cHBsaWVkDQoqICAgY2hhcnRSYW5nZUNsaXAgLSBDbGlwIG91dCBvZiByYW5nZSB2YWx1ZXMgdG8gdGhlIG1heC9taW4gc3BlY2lmaWVkIGJ5IGNoYXJ0UmFuZ2VNaW4gYW5kIGNoYXJ0UmFuZ2VNYXgNCiogICBjaGFydFJhbmdlTWluWCAtIFNwZWNpZnkgdGhlIG1pbmltdW0gdmFsdWUgdG8gdXNlIGZvciB0aGUgWCByYW5nZSBvZiB0aGUgY2hhcnQgLSBEZWZhdWx0cyB0byB0aGUgbWluaW11bSB2YWx1ZSBzdXBwbGllZA0KKiAgIGNoYXJ0UmFuZ2VNYXhYIC0gU3BlY2lmeSB0aGUgbWF4aW11bSB2YWx1ZSB0byB1c2UgZm9yIHRoZSBYIHJhbmdlIG9mIHRoZSBjaGFydCAtIERlZmF1bHRzIHRvIHRoZSBtYXhpbXVtIHZhbHVlIHN1cHBsaWVkDQoqICAgY29tcG9zaXRlIC0gSWYgdHJ1ZSB0aGVuIGRvbid0IGVyYXNlIGFueSBleGlzdGluZyBjaGFydCBhdHRhY2hlZCB0byB0aGUgdGFnLCBidXQgZHJhdw0KKiAgICAgICAgICAgYW5vdGhlciBjaGFydCBvdmVyIHRoZSB0b3AgLSBOb3RlIHRoYXQgd2lkdGggYW5kIGhlaWdodCBhcmUgaWdub3JlZCBpZiBhbg0KKiAgICAgICAgICAgZXhpc3RpbmcgY2hhcnQgaXMgZGV0ZWN0ZWQuDQoqICAgdGFnVmFsdWVzQXR0cmlidXRlIC0gTmFtZSBvZiB0YWcgYXR0cmlidXRlIHRvIGNoZWNrIGZvciBkYXRhIHZhbHVlcyAtIERlZmF1bHRzIHRvICd2YWx1ZXMnDQoqICAgZW5hYmxlVGFnT3B0aW9ucyAtIFdoZXRoZXIgdG8gY2hlY2sgdGFncyBmb3Igc3BhcmtsaW5lIG9wdGlvbnMNCiogICB0YWdPcHRpb25zUHJlZml4IC0gUHJlZml4IHVzZWQgZm9yIG9wdGlvbnMgc3VwcGxpZWQgYXMgdGFnIGF0dHJpYnV0ZXMgLSBEZWZhdWx0cyB0byAnc3BhcmsnDQoqICAgZGlzYWJsZUhpZGRlbkNoZWNrIC0gSWYgc2V0IHRvIHRydWUsIHRoZW4gdGhlIHBsdWdpbiB3aWxsIGFzc3VtZSB0aGF0IGNoYXJ0cyB3aWxsIG5ldmVyIGJlIGRyYXduIGludG8gYQ0KKiAgICAgICAgICAgaGlkZGVuIGRvbSBlbGVtZW50LCBhdm9pZGluZyBhIGJyb3dzZXIgcmVmbG93DQoqICAgZGlzYWJsZUludGVyYWN0aW9uIC0gSWYgc2V0IHRvIHRydWUgdGhlbiBhbGwgbW91c2VvdmVyL2NsaWNrIGludGVyYWN0aW9uIGJlaGF2aW91ciB3aWxsIGJlIGRpc2FibGVkLA0KKiAgICAgICBtYWtpbmcgdGhlIHBsdWdpbiBwZXJmb3JtIG11Y2ggbGlrZSBpdCBkaWQgaW4gMS54DQoqICAgZGlzYWJsZVRvb2x0aXBzIC0gSWYgc2V0IHRvIHRydWUgdGhlbiB0b29sdGlwcyB3aWxsIGJlIGRpc2FibGVkIC0gRGVmYXVsdHMgdG8gZmFsc2UgKHRvb2x0aXBzIGVuYWJsZWQpDQoqICAgZGlzYWJsZUhpZ2hsaWdodCAtIElmIHNldCB0byB0cnVlIHRoZW4gaGlnaGxpZ2h0aW5nIG9mIHNlbGVjdGVkIGNoYXJ0IGVsZW1lbnRzIG9uIG1vdXNlb3ZlciB3aWxsIGJlIGRpc2FibGVkDQoqICAgICAgICAgICBkZWZhdWx0cyB0byBmYWxzZSAoaGlnaGxpZ2h0cyBlbmFibGVkKQ0KKiAgIGhpZ2hsaWdodExpZ2h0ZW4gLSBGYWN0b3IgdG8gbGlnaHRlbi9kYXJrZW4gaGlnaGxpZ2h0ZWQgY2hhcnQgdmFsdWVzIGJ5IC0gRGVmYXVsdHMgdG8gMS40IGZvciBhIDQwJSBpbmNyZWFzZQ0KKiAgIHRvb2x0aXBDb250YWluZXIgLSBTcGVjaWZ5IHdoaWNoIERPTSBlbGVtZW50IHRoZSB0b29sdGlwIHNob3VsZCBiZSByZW5kZXJlZCBpbnRvIC0gZGVmYXVsdHMgdG8gZG9jdW1lbnQuYm9keQ0KKiAgIHRvb2x0aXBDbGFzc25hbWUgLSBPcHRpb25hbCBDU1MgY2xhc3NuYW1lIHRvIGFwcGx5IHRvIHRvb2x0aXBzIC0gSWYgbm90IHNwZWNpZmllZCB0aGVuIGEgZGVmYXVsdCBzdHlsZSB3aWxsIGJlIGFwcGxpZWQNCiogICB0b29sdGlwT2Zmc2V0WCAtIEhvdyBtYW55IHBpeGVscyBhd2F5IGZyb20gdGhlIG1vdXNlIHBvaW50ZXIgdG8gcmVuZGVyIHRoZSB0b29sdGlwIG9uIHRoZSBYIGF4aXMNCiogICB0b29sdGlwT2Zmc2V0WSAtIEhvdyBtYW55IHBpeGVscyBhd2F5IGZyb20gdGhlIG1vdXNlIHBvaW50ZXIgdG8gcmVuZGVyIHRoZSB0b29sdGlwIG9uIHRoZSByIGF4aXMNCiogICB0b29sdGlwRm9ybWF0dGVyICAtIE9wdGlvbmFsIGNhbGxiYWNrIHRoYXQgYWxsb3dzIHlvdSB0byBvdmVycmlkZSB0aGUgSFRNTCBkaXNwbGF5ZWQgaW4gdGhlIHRvb2x0aXANCiogICAgICAgICAgIGNhbGxiYWNrIGlzIGdpdmVuIGFyZ3VtZW50cyBvZiAoc3BhcmtsaW5lLCBvcHRpb25zLCBmaWVsZHMpDQoqICAgdG9vbHRpcENoYXJ0VGl0bGUgLSBJZiBzcGVjaWZpZWQgdGhlbiB0aGUgdG9vbHRpcCB1c2VzIHRoZSBzdHJpbmcgc3BlY2lmaWVkIGJ5IHRoaXMgc2V0dGluZyBhcyBhIHRpdGxlDQoqICAgdG9vbHRpcEZvcm1hdCAtIEEgZm9ybWF0IHN0cmluZyBvciBTUEZvcm1hdCBvYmplY3QgIChvciBhbiBhcnJheSB0aGVyZW9mIGZvciBtdWx0aXBsZSBlbnRyaWVzKQ0KKiAgICAgICAgICAgdG8gY29udHJvbCB0aGUgZm9ybWF0IG9mIHRoZSB0b29sdGlwDQoqICAgdG9vbHRpcFByZWZpeCAtIEEgc3RyaW5nIHRvIHByZXBlbmQgdG8gZWFjaCBmaWVsZCBkaXNwbGF5ZWQgaW4gYSB0b29sdGlwDQoqICAgdG9vbHRpcFN1ZmZpeCAtIEEgc3RyaW5nIHRvIGFwcGVuZCB0byBlYWNoIGZpZWxkIGRpc3BsYXllZCBpbiBhIHRvb2x0aXANCiogICB0b29sdGlwUHJlZml4QmluTGFiZWxzIC0gQW4gYXJyYXkgb2YgQmluIExhYmVscyBmb3IgZWFjaCBvZmZzZXQgdmFsdWUgdG8gYWRkIGFzIHRoZSBzdGFydA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdG9vbHRpcCBwcmVmaXguICBFeGFtcGxlOg0KKiAgICAgICAgdmFyIGdpYW50c19nYW1lX3Jlc3VsdHMgPSBbMSwtMSwxLC0xLC0xLC0xLDEsMSwxLC0xLDEsLTEsLTEsMSwxLDEsMSwxLDEsMV0sDQoqICAgICAgICAgICAgZ2lhbnRzX2dhbWVfZGF0ZXMgID0gWyI5LzMwIiwgIjEwLzEiLCAiMTAvMiIsICIxMC8zIiwgIjEwLzYiLCAiMTAvNyIsICIxMC85IiwgIjEwLzEwIiwgIjEwLzExIiwgIjEwLzE0IiwgIjEwLzE1IiwNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwLzE3IiwgIjEwLzE4IiwgIjEwLzE5IiwgIjEwLzIxIiwgIjEwLzIyIiwgIjEwLzI0IiwgIjEwLzI1IiwgIjEwLzI3IiwgIjEwLzI4Il07DQoqICAgICAgICAkKCcjZ2lhbnRzJykuc3BhcmtsaW5lKGdpYW50c19yZXN1bHRzLCB7dHlwZTogJ3RyaXN0YXRlJywgdG9vbHRpcFByZWZpeEJpbkxhYmVsczogZ2lhbnRzX2RhdGVzLCB0b29sdGlwUHJlZml4OiAnIC0gJ307DQoqICAgdG9vbHRpcFN1ZmZpeEJpbkxhYmVscyAtIEFuIGFycmF5IG9mIEJpbiBMYWJlbHMgZm9yIGVhY2ggb2Zmc2V0IHZhbHVlIHRvIGFkZCBhcyB0aGUgZW5kDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB0b29sdGlwIHN1ZmZpeC4NCiogICB0b29sdGlwU2tpcE51bGwgLSBJZiB0cnVlIHRoZW4gbnVsbCB2YWx1ZXMgd2lsbCBub3QgaGF2ZSBhIHRvb2x0aXAgZGlzcGxheWVkIChkZWZhdWx0cyB0byB0cnVlKQ0KKiAgIHRvb2x0aXBWYWx1ZUxvb2t1cHMgLSBBbiBvYmplY3Qgb3IgcmFuZ2UgbWFwIHRvIG1hcCBmaWVsZCB2YWx1ZXMgdG8gdG9vbHRpcCBzdHJpbmdzDQoqICAgICAgICAgICAgICAgICAgICAgICAgIChlZy4gdG8gbWFwIC0xIHRvICJMb3N0IiwgMCB0byAiRHJhdyIsIGFuZCAxIHRvICJXaW4iKQ0KKiAgIHRvb2xUaXBQb3NpdGlvbiAtIERpc3BsYXkgdG9vbHRpcCB0byB0aGUgJ2xlZnQnIG9yICdyaWdodCcgb2YgdGhlIG1vdXNlIC0gRGVmYXVsdHMgdG8gInJpZ2h0Ig0KKiAgIG51bWJlckZvcm1hdHRlciAtIE9wdGlvbmFsIGNhbGxiYWNrIGZvciBmb3JtYXR0aW5nIG51bWJlcnMgaW4gdG9vbHRpcHMNCiogICBudW1iZXJEaWdpdEdyb3VwU2VwIC0gQ2hhcmFjdGVyIHRvIHVzZSBmb3IgZ3JvdXAgc2VwYXJhdG9yIGluIG51bWJlcnMgIjEsMjM0IiAtIERlZmF1bHRzIHRvICIsIg0KKiAgIG51bWJlckRlY2ltYWxNYXJrIC0gQ2hhcmFjdGVyIHRvIHVzZSBmb3IgdGhlIGRlY2ltYWwgcG9pbnQgd2hlbiBmb3JtYXR0aW5nIG51bWJlcnMgLSBEZWZhdWx0cyB0byAiLiINCiogICBudW1iZXJEaWdpdEdyb3VwQ291bnQgLSBOdW1iZXIgb2YgZGlnaXRzIGJldHdlZW4gZ3JvdXAgc2VwYXJhdG9yIC0gRGVmYXVsdHMgdG8gMw0KKg0KKiBUaGVyZSBhcmUgOCB0eXBlcyBvZiBzcGFya2xpbmUsIHNlbGVjdGVkIGJ5IHN1cHBseWluZyBhICJ0eXBlIiBvcHRpb24gb2YgJ2xpbmUnIChkZWZhdWx0KSwNCiogJ2JhcicsICd0cmlzdGF0ZScsICdidWxsZXQnLCAnZGlzY3JldGUnLCAncGllJywgJ2JveCcgb3IgJ3N0YWNrJw0KKiAgICBsaW5lIC0gTGluZSBjaGFydC4gIE9wdGlvbnM6DQoqICAgICAgIHNwb3RDb2xvciAtIFNldCB0byAnJyB0byBub3QgZW5kIGVhY2ggbGluZSBpbiBhIGNpcmN1bGFyIHNwb3QNCiogICAgICAgbWluU3BvdENvbG9yIC0gSWYgc2V0LCBjb2xvciBvZiBzcG90IGF0IG1pbmltdW0gdmFsdWUNCiogICAgICAgbWF4U3BvdENvbG9yIC0gSWYgc2V0LCBjb2xvciBvZiBzcG90IGF0IG1heGltdW0gdmFsdWUNCiogICAgICAgc3BvdFJhZGl1cyAtIFJhZGl1cyBpbiBwaXhlbHMNCiogICAgICAgbGluZVdpZHRoIC0gV2lkdGggb2YgbGluZSBpbiBwaXhlbHMNCiogICAgICAgbm9ybWFsUmFuZ2VNaW4NCiogICAgICAgbm9ybWFsUmFuZ2VNYXggLSBJZiBzZXQgZHJhd3MgYSBmaWxsZWQgaG9yaXpvbnRhbCBiYXIgYmV0d2VlbiB0aGVzZSB0d28gdmFsdWVzIG1hcmtpbmcgdGhlICJub3JtYWwiDQoqICAgICAgICAgICAgICAgICAgICAgICAgb3IgZXhwZWN0ZWQgcmFuZ2Ugb2YgdmFsdWVzDQoqICAgICAgIG5vcm1hbFJhbmdlQ29sb3IgLSBDb2xvciB0byB1c2UgZm9yIHRoZSBhYm92ZSBiYXINCiogICAgICAgZHJhd05vcm1hbE9uVG9wIC0gRHJhdyB0aGUgbm9ybWFsIHJhbmdlIGFib3ZlIHRoZSBjaGFydCBmaWxsIGNvbG9yIGlmIHRydWUNCiogICAgICAgZGVmYXVsdFBpeGVsc1BlclZhbHVlIC0gRGVmYXVsdHMgdG8gMyBwaXhlbHMgb2Ygd2lkdGggZm9yIGVhY2ggdmFsdWUgaW4gdGhlIGNoYXJ0DQoqICAgICAgIGhpZ2hsaWdodFNwb3RDb2xvciAtIFRoZSBjb2xvciB0byB1c2UgZm9yIGRyYXdpbmcgYSBoaWdobGlnaHQgc3BvdCBvbiBtb3VzZW92ZXIgLSBTZXQgdG8gbnVsbCB0byBkaXNhYmxlDQoqICAgICAgIGhpZ2hsaWdodExpbmVDb2xvciAtIFRoZSBjb2xvciB0byB1c2UgZm9yIGRyYXdpbmcgYSBoaWdobGlnaHQgbGluZSBvbiBtb3VzZW92ZXIgLSBTZXQgdG8gbnVsbCB0byBkaXNhYmxlDQoqICAgICAgIHZhbHVlU3BvdHMgLSBTcGVjaWZ5IHdoaWNoIHBvaW50cyB0byBkcmF3IHNwb3RzIG9uLCBhbmQgaW4gd2hpY2ggY29sb3IuICBBY2NlcHRzIGEgcmFuZ2UgbWFwDQoqDQoqICAgYmFyIC0gQmFyIGNoYXJ0LiAgT3B0aW9uczoNCiogICAgICAgYmFyQ29sb3IgLSBDb2xvciBvZiBiYXJzIGZvciBwb3NpdGl2ZSB2YWx1ZXMNCiogICAgICAgbmVnQmFyQ29sb3IgLSBDb2xvciBvZiBiYXJzIGZvciBuZWdhdGl2ZSB2YWx1ZXMNCiogICAgICAgemVyb0NvbG9yIC0gQ29sb3Igb2YgYmFycyB3aXRoIHplcm8gdmFsdWVzDQoqICAgICAgIG51bGxDb2xvciAtIENvbG9yIG9mIGJhcnMgd2l0aCBudWxsIHZhbHVlcyAtIERlZmF1bHRzIHRvIG9taXR0aW5nIHRoZSBiYXIgZW50aXJlbHkNCiogICAgICAgYmFyV2lkdGggLSBXaWR0aCBvZiBiYXJzIGluIHBpeGVscw0KKiAgICAgICBjb2xvck1hcCAtIE9wdGlvbmFsIG1hcHBpbmcgb2YgdmFsdWVzIHRvIGNvbG9ycyB0byBvdmVycmlkZSB0aGUgKkJhckNvbG9yIHZhbHVlcyBhYm92ZQ0KKiAgICAgICAgICAgICAgICAgIGNhbiBiZSBhbiBBcnJheSBvZiB2YWx1ZXMgdG8gY29udHJvbCB0aGUgY29sb3Igb2YgaW5kaXZpZHVhbCBiYXJzIG9yIGEgcmFuZ2UgbWFwDQoqICAgICAgICAgICAgICAgICAgdG8gc3BlY2lmeSBjb2xvcnMgZm9yIGluZGl2aWR1YWwgcmFuZ2VzIG9mIHZhbHVlcw0KKiAgICAgICBiYXJTcGFjaW5nIC0gR2FwIGJldHdlZW4gYmFycyBpbiBwaXhlbHMNCiogICAgICAgemVyb0F4aXMgLSBDZW50ZXJzIHRoZSB5LWF4aXMgYXJvdW5kIHplcm8gaWYgdHJ1ZQ0KKg0KKiAgIHRyaXN0YXRlIC0gQ2hhcnRzIHZhbHVlcyBvZiB3aW4gKD4wKSwgbG9zZSAoPDApIG9yIGRyYXcgKD0wKQ0KKiAgICAgICBwb3NCYXJDb2xvciAtIENvbG9yIG9mIHdpbiB2YWx1ZXMNCiogICAgICAgbmVnQmFyQ29sb3IgLSBDb2xvciBvZiBsb3NlIHZhbHVlcw0KKiAgICAgICB6ZXJvQmFyQ29sb3IgLSBDb2xvciBvZiBkcmF3IHZhbHVlcw0KKiAgICAgICBiYXJXaWR0aCAtIFdpZHRoIG9mIGJhcnMgaW4gcGl4ZWxzDQoqICAgICAgIGJhclNwYWNpbmcgLSBHYXAgYmV0d2VlbiBiYXJzIGluIHBpeGVscw0KKiAgICAgICBjb2xvck1hcCAtIE9wdGlvbmFsIG1hcHBpbmcgb2YgdmFsdWVzIHRvIGNvbG9ycyB0byBvdmVycmlkZSB0aGUgKkJhckNvbG9yIHZhbHVlcyBhYm92ZQ0KKiAgICAgICAgICAgICAgICAgIGNhbiBiZSBhbiBBcnJheSBvZiB2YWx1ZXMgdG8gY29udHJvbCB0aGUgY29sb3Igb2YgaW5kaXZpZHVhbCBiYXJzIG9yIGEgcmFuZ2UgbWFwDQoqICAgICAgICAgICAgICAgICAgdG8gc3BlY2lmeSBjb2xvcnMgZm9yIGluZGl2aWR1YWwgcmFuZ2VzIG9mIHZhbHVlcw0KKg0KKiAgIGRpc2NyZXRlIC0gT3B0aW9uczoNCiogICAgICAgbGluZUhlaWdodCAtIEhlaWdodCBvZiBlYWNoIGxpbmUgaW4gcGl4ZWxzIC0gRGVmYXVsdHMgdG8gMzAlIG9mIHRoZSBncmFwaCBoZWlnaHQNCiogICAgICAgdGhlc2hvbGRWYWx1ZSAtIFZhbHVlcyBsZXNzIHRoYW4gdGhpcyB2YWx1ZSB3aWxsIGJlIGRyYXduIHVzaW5nIHRocmVzaG9sZENvbG9yIGluc3RlYWQgb2YgbGluZUNvbG9yDQoqICAgICAgIHRocmVzaG9sZENvbG9yDQoqDQoqICAgYnVsbGV0IC0gVmFsdWVzIGZvciBidWxsZXQgZ3JhcGhzIG1zdXQgYmUgaW4gdGhlIG9yZGVyOiB0YXJnZXQsIHBlcmZvcm1hbmNlLCByYW5nZTEsIHJhbmdlMiwgcmFuZ2UzLCAuLi4NCiogICAgICAgb3B0aW9uczoNCiogICAgICAgdGFyZ2V0Q29sb3IgLSBUaGUgY29sb3Igb2YgdGhlIHZlcnRpY2FsIHRhcmdldCBtYXJrZXINCiogICAgICAgdGFyZ2V0V2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHRhcmdldCBtYXJrZXIgaW4gcGl4ZWxzDQoqICAgICAgIHBlcmZvcm1hbmNlQ29sb3IgLSBUaGUgY29sb3Igb2YgdGhlIHBlcmZvcm1hbmNlIG1lYXN1cmUgaG9yaXpvbnRhbCBiYXINCiogICAgICAgcmFuZ2VDb2xvcnMgLSBDb2xvcnMgdG8gdXNlIGZvciBlYWNoIHF1YWxpdGF0aXZlIHJhbmdlIGJhY2tncm91bmQgY29sb3INCioNCiogICBwaWUgLSBQaWUgY2hhcnQuIE9wdGlvbnM6DQoqICAgICAgIHNsaWNlQ29sb3JzIC0gQW4gYXJyYXkgb2YgY29sb3JzIHRvIHVzZSBmb3IgcGllIHNsaWNlcw0KKiAgICAgICBvZmZzZXQgLSBBbmdsZSBpbiBkZWdyZWVzIHRvIG9mZnNldCB0aGUgZmlyc3Qgc2xpY2UgLSBUcnkgLTkwIG9yICs5MA0KKiAgICAgICBib3JkZXJXaWR0aCAtIFdpZHRoIG9mIGJvcmRlciB0byBkcmF3IGFyb3VuZCB0aGUgcGllIGNoYXJ0LCBpbiBwaXhlbHMgLSBEZWZhdWx0cyB0byAwIChubyBib3JkZXIpDQoqICAgICAgIGJvcmRlckNvbG9yIC0gQ29sb3IgdG8gdXNlIGZvciB0aGUgcGllIGNoYXJ0IGJvcmRlciAtIERlZmF1bHRzIHRvICMwMDANCiogICBzdGFjayAtIEhvcml6b250YWwgc3RhY2sgY2hhcnQuIE9wdGlvbnM6DQoqICAgICAgIHNsaWNlQ29sb3JzIC0gQW4gYXJyYXkgb2YgY29sb3JzIHRvIHVzZSBmb3IgcGllIHNsaWNlcw0KKg0KKiAgIGJveCAtIEJveCBwbG90LiBPcHRpb25zOg0KKiAgICAgICByYXcgLSBTZXQgdG8gdHJ1ZSB0byBzdXBwbHkgcHJlLWNvbXB1dGVkIHBsb3QgcG9pbnRzIGFzIHZhbHVlcw0KKiAgICAgICAgICAgICB2YWx1ZXMgc2hvdWxkIGJlOiBsb3dfb3V0bGllciwgbG93X3doaXNrZXIsIHExLCBtZWRpYW4sIHEzLCBoaWdoX3doaXNrZXIsIGhpZ2hfb3V0bGllcg0KKiAgICAgICAgICAgICBXaGVuIHNldCB0byBmYWxzZSB5b3UgY2FuIHN1cHBseSBhbnkgbnVtYmVyIG9mIHZhbHVlcyBhbmQgdGhlIGJveCBwbG90IHdpbGwNCiogICAgICAgICAgICAgYmUgY29tcHV0ZWQgZm9yIHlvdS4gIERlZmF1bHQgaXMgZmFsc2UuDQoqICAgICAgIHNob3dPdXRsaWVycyAtIFNldCB0byB0cnVlIChkZWZhdWx0KSB0byBkaXNwbGF5IG91dGxpZXJzIGFzIGNpcmNsZXMNCiogICAgICAgb3V0bGllcklRUiAtIEludGVycXVhcnRpbGUgcmFuZ2UgdXNlZCB0byBkZXRlcm1pbmUgb3V0bGllcnMuICBEZWZhdWx0IDEuNQ0KKiAgICAgICBib3hMaW5lQ29sb3IgLSBPdXRsaW5lIGNvbG9yIG9mIHRoZSBib3gNCiogICAgICAgYm94RmlsbENvbG9yIC0gRmlsbCBjb2xvciBmb3IgdGhlIGJveA0KKiAgICAgICB3aGlza2VyQ29sb3IgLSBMaW5lIGNvbG9yIHVzZWQgZm9yIHdoaXNrZXJzDQoqICAgICAgIG91dGxpZXJMaW5lQ29sb3IgLSBPdXRsaW5lIGNvbG9yIG9mIG91dGxpZXIgY2lyY2xlcw0KKiAgICAgICBvdXRsaWVyRmlsbENvbG9yIC0gRmlsbCBjb2xvciBvZiB0aGUgb3V0bGllciBjaXJjbGVzDQoqICAgICAgIHNwb3RSYWRpdXMgLSBSYWRpdXMgb2Ygb3V0bGllciBjaXJjbGVzDQoqICAgICAgIG1lZGlhbkNvbG9yIC0gTGluZSBjb2xvciBvZiB0aGUgbWVkaWFuIGxpbmUNCiogICAgICAgdGFyZ2V0IC0gRHJhdyBhIHRhcmdldCBjcm9zcyBoYWlyIGF0IHRoZSBzdXBwbGllZCB2YWx1ZSAoZGVmYXVsdCB1bmRlZmluZWQpDQoqDQoqDQoqDQoqICAgRXhhbXBsZXM6DQoqICAgJCgnI3NwYXJrbGluZTEnKS5zcGFya2xpbmUobXl2YWx1ZXMsIHsgbGluZUNvbG9yOiAnI2YwMCcsIGZpbGxDb2xvcjogZmFsc2UgfSk7DQoqICAgJCgnLmJhcnNwYXJrcycpLnNwYXJrbGluZSgnaHRtbCcsIHsgdHlwZTonYmFyJywgaGVpZ2h0Oic0MHB4JywgYmFyV2lkdGg6NSB9KTsNCiogICAkKCcjdHJpc3RhdGUnKS5zcGFya2xpbmUoWzEsMSwtMSwxLDAsMCwtMV0sIHsgdHlwZTondHJpc3RhdGUnIH0pOg0KKiAgICQoJyNkaXNjcmV0ZScpLnNwYXJrbGluZShbMSwzLDQsNSw1LDMsNCw1XSwgeyB0eXBlOidkaXNjcmV0ZScgfSk7DQoqICAgJCgnI2J1bGxldCcpLnNwYXJrbGluZShbMTAsMTIsMTIsOSw3XSwgeyB0eXBlOididWxsZXQnIH0pOw0KKiAgICQoJyNwaWUnKS5zcGFya2xpbmUoWzEsMSwyXSwgeyB0eXBlOidwaWUnIH0pOw0KKi8NCg0KLypqc2xpbnQgcmVnZXhwOiB0cnVlLCBicm93c2VyOiB0cnVlLCBqcXVlcnk6IHRydWUsIHdoaXRlOiB0cnVlLCBub21lbjogZmFsc2UsIHBsdXNwbHVzOiBmYWxzZSwgbWF4ZXJyOiA1MDAsIGluZGVudDogNCAqLw0KDQooZnVuY3Rpb24oZG9jdW1lbnQsIE1hdGgsIHVuZGVmaW5lZCkgeyAvLyBwZXJmb3JtYW5jZS9taW5pZmllZC1zaXplIG9wdGltaXphdGlvbg0KKGZ1bmN0aW9uKGZhY3RvcnkpIHsNCiAgICBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsNCiAgICAgICAgZGVmaW5lKCdqcXVlcnkuc3BhcmtsaW5lJywgWydqcXVlcnknXSwgZmFjdG9yeSk7DQogICAgfSBlbHNlIGlmIChqUXVlcnkgJiYgIWpRdWVyeS5mbi5zcGFya2xpbmUpIHsNCiAgICAgICAgZmFjdG9yeShqUXVlcnkpOw0KICAgIH0NCn0NCihmdW5jdGlvbigkKSB7DQogICAgJ3VzZSBzdHJpY3QnOw0KDQogICAgLy8gQ1VTVE9NIE1PRDogbWVkaWFuIHZhciBhZGRlZA0KICAgIHZhciBVTlNFVF9PUFRJT04gPSB7fSwNCiAgICAgICAgZ2V0RGVmYXVsdHMsIGNyZWF0ZUNsYXNzLCBTUEZvcm1hdCwgY2xpcHZhbCwgbWVkaWFuLCBxdWFydGlsZSwgbm9ybWFsaXplVmFsdWUsIG5vcm1hbGl6ZVZhbHVlcywNCiAgICAgICAgcmVtb3ZlLCBpc051bWJlciwgYWxsLCBzdW0sIGFkZENTUywgZW5zdXJlQXJyYXksIGZvcm1hdE51bWJlciwgUmFuZ2VNYXAsDQogICAgICAgIE1vdXNlSGFuZGxlciwgVG9vbHRpcCwgYmFySGlnaGxpZ2h0TWl4aW4sDQogICAgICAgIGxpbmUsIGJhciwgdHJpc3RhdGUsIGRpc2NyZXRlLCBidWxsZXQsIHBpZSwgc3RhY2ssIGJveCwgdGltZWxpbmUsIGRlZmF1bHRTdHlsZXMsIGluaXRTdHlsZXMsDQogICAgICAgIFZTaGFwZSwgVkNhbnZhc19iYXNlLCBWQ2FudmFzX2NhbnZhcywgVkNhbnZhc192bWwsIHBlbmRpbmcsIHNoYXBlQ291bnQgPSAwOw0KDQoNCiAgICAvKioNCiAgICAgKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MNCiAgICAgKi8NCiAgICBnZXREZWZhdWx0cyA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIC8vIFNldHRpbmdzIGNvbW1vbiB0byBtb3N0L2FsbCBjaGFydCB0eXBlcw0KICAgICAgICAgICAgY29tbW9uOiB7DQogICAgICAgICAgICAgICAgdHlwZTogJ2xpbmUnLA0KICAgICAgICAgICAgICAgIGxpbmVDb2xvcjogJyMwMGYnLA0KICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJyNjZGYnLA0KICAgICAgICAgICAgICAgIGRlZmF1bHRQaXhlbHNQZXJWYWx1ZTogMywNCiAgICAgICAgICAgICAgICB3aWR0aDogJ2F1dG8nLA0KICAgICAgICAgICAgICAgIGhlaWdodDogJ2F1dG8nLA0KICAgICAgICAgICAgICAgIGNvbXBvc2l0ZTogZmFsc2UsDQogICAgICAgICAgICAgICAgdGFnVmFsdWVzQXR0cmlidXRlOiAndmFsdWVzJywNCiAgICAgICAgICAgICAgICB0YWdPcHRpb25zUHJlZml4OiAnc3BhcmsnLA0KICAgICAgICAgICAgICAgIGVuYWJsZVRhZ09wdGlvbnM6IGZhbHNlLA0KICAgICAgICAgICAgICAgIGVuYWJsZUhpZ2hsaWdodDogdHJ1ZSwNCiAgICAgICAgICAgICAgICBoaWdobGlnaHRMaWdodGVuOiAxLjQsDQogICAgICAgICAgICAgICAgdG9vbHRpcFNraXBOdWxsOiB0cnVlLA0KICAgICAgICAgICAgICAgIHRvb2x0aXBQcmVmaXg6ICcnLA0KICAgICAgICAgICAgICAgIHRvb2x0aXBTdWZmaXg6ICcnLA0KICAgICAgICAgICAgICAgIGRpc2FibGVIaWRkZW5DaGVjazogZmFsc2UsDQogICAgICAgICAgICAgICAgbnVtYmVyRm9ybWF0dGVyOiBmYWxzZSwNCiAgICAgICAgICAgICAgICBudW1iZXJEaWdpdEdyb3VwQ291bnQ6IDMsDQogICAgICAgICAgICAgICAgbnVtYmVyRGlnaXRHcm91cFNlcDogJywnLA0KICAgICAgICAgICAgICAgIG51bWJlckRlY2ltYWxNYXJrOiAnLicsDQogICAgICAgICAgICAgICAgZGlzYWJsZVRvb2x0aXBzOiBmYWxzZSwNCiAgICAgICAgICAgICAgICBkaXNhYmxlSW50ZXJhY3Rpb246IGZhbHNlDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgLy8gRGVmYXVsdHMgZm9yIGxpbmUgY2hhcnRzDQogICAgICAgICAgICBsaW5lOiB7DQogICAgICAgICAgICAgICAgc3BvdENvbG9yOiAnI2Y4MCcsDQogICAgICAgICAgICAgICAgaGlnaGxpZ2h0U3BvdENvbG9yOiAnIzVmNScsDQogICAgICAgICAgICAgICAgaGlnaGxpZ2h0TGluZUNvbG9yOiAnI2YyMicsDQogICAgICAgICAgICAgICAgcmVmTGluZUNvbG9yOiAnI2YyMicsDQogICAgICAgICAgICAgICAgLy8gcmVmTGluZVg6IG51bGwsDQogICAgICAgICAgICAgICAgLy8gcmVmTGluZVk6IG51bGwsDQogICAgICAgICAgICAgICAgc3BvdFJhZGl1czogMS41LA0KICAgICAgICAgICAgICAgIG1pblNwb3RDb2xvcjogJyNmODAnLA0KICAgICAgICAgICAgICAgIG1heFNwb3RDb2xvcjogJyNmODAnLA0KICAgICAgICAgICAgICAgIGxpbmVXaWR0aDogMSwNCiAgICAgICAgICAgICAgICBub3JtYWxSYW5nZU1pbjogdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgIG5vcm1hbFJhbmdlTWF4OiB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgbm9ybWFsUmFuZ2VDb2xvcjogJyNjY2MnLA0KICAgICAgICAgICAgICAgIGRyYXdOb3JtYWxPblRvcDogZmFsc2UsDQogICAgICAgICAgICAgICAgY2hhcnRSYW5nZU1pbjogdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgIGNoYXJ0UmFuZ2VNYXg6IHVuZGVmaW5lZCwNCiAgICAgICAgICAgICAgICBjaGFydFJhbmdlTWluWDogdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgIGNoYXJ0UmFuZ2VNYXhYOiB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgdG9vbHRpcEZvcm1hdDogbmV3IFNQRm9ybWF0KCc8c3BhbiBzdHlsZT0iY29sb3I6IHt7Y29sb3J9fSI+JiM5Njc5Ozwvc3Bhbj4ge3twcmVmaXh9fXt7eX19e3tzdWZmaXh9fScpDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgLy8gRGVmYXVsdHMgZm9yIGJhciBjaGFydHMNCiAgICAgICAgICAgIGJhcjogew0KICAgICAgICAgICAgICAgIGJhckNvbG9yOiAnIzMzNjZjYycsDQogICAgICAgICAgICAgICAgbmVnQmFyQ29sb3I6ICcjZjQ0JywNCiAgICAgICAgICAgICAgICBzdGFja2VkQmFyQ29sb3I6IFsnIzMzNjZjYycsICcjZGMzOTEyJywgJyNmZjk5MDAnLCAnIzEwOTYxOCcsICcjNjZhYTAwJywNCiAgICAgICAgICAgICAgICAgICAgJyNkZDQ0NzcnLCAnIzAwOTljNicsICcjOTkwMDk5J10sDQogICAgICAgICAgICAgICAgemVyb0NvbG9yOiB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgbnVsbENvbG9yOiB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgemVyb0F4aXM6IHRydWUsDQogICAgICAgICAgICAgICAgYmFyV2lkdGg6IDQsDQogICAgICAgICAgICAgICAgYmFyU3BhY2luZzogMSwNCiAgICAgICAgICAgICAgICBjaGFydFJhbmdlTWF4OiB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgY2hhcnRSYW5nZU1pbjogdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgIGNoYXJ0UmFuZ2VDbGlwOiBmYWxzZSwNCiAgICAgICAgICAgICAgICBjb2xvck1hcDogdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgIHRvb2x0aXBGb3JtYXQ6IG5ldyBTUEZvcm1hdCgnPHNwYW4gc3R5bGU9ImNvbG9yOiB7e2NvbG9yfX0iPiYjOTY3OTs8L3NwYW4+IHt7cHJlZml4fX17e3ZhbHVlfX17e3N1ZmZpeH19JykNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICAvLyBEZWZhdWx0cyBmb3IgdGltZWxpbmUgY2hhcnRzDQogICAgICAgICAgICB0aW1lbGluZTogew0KICAgICAgICAgICAgICAgIHdpZHRoOiAxMjAsDQogICAgICAgICAgICAgICAgaGVpZ2h0OiAzLA0KICAgICAgICAgICAgICAgIGxpbmVDb2xvcjogJyM2NzkyYzYnLA0KICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJyNiYWQ3ZmInLA0KICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcsIC8vIG9yICd2ZXJ0aWNhbCcNCiAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgbWludXRlcyB0byBtb2R1bGF0ZSB0aW1lIG1hcmtlcnMgZnJvbSBiZWdpbiBvcHRpb24NCiAgICAgICAgICAgICAgICB0aW1lTWFya0ludGVydmFsOiAwLA0KICAgICAgICAgICAgICAgIC8vIG1pbmltdW0gZGF0ZS90aW1lIHRvIHNob3cgaW4gdGltZWxpbmUNCiAgICAgICAgICAgICAgICBiZWdpbjogbmV3IERhdGUoMjAwMCwgMSwgMSwgMCwgMCksDQogICAgICAgICAgICAgICAgLy8gbWF4aW11bSBkYXRlL3RpbWUgdG8gc2hvdyBpbiB0aW1lbGluZQ0KICAgICAgICAgICAgICAgIGZpbmlzaDogbmV3IERhdGUoMjAwMCwgMSwgMSwgMjMsIDU5KSwNCiAgICAgICAgICAgICAgICAvLyBhbGxvdyB1c2VyIHRvIHByb3ZpZGUgdGhlaXIgb3duIGRhdGUgcGFyc2luZyBhYmlsaXRpZXMNCiAgICAgICAgICAgICAgICAvLyBkYXRhIG11c3QgcHJvdmlkZSBiZWdpbiwgZmluaXNoLCB0aXRsZSBhbmQgY29sb3IgaGFzaCBvYmplY3QNCiAgICAgICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4ge2JlZ2luOiBuZXcgRGF0ZShkYXRhLmJlZ2luKSwgZmluaXNoOiBuZXcgRGF0ZShkYXRhLmZpbmlzaCksIHRpdGxlOiBkYXRhLnRpdGxlLCBjb2xvcjogZGF0YS5jb2xvcn07IH0sDQogICAgICAgICAgICAgICAgdG9vbHRpcEZvcm1hdDogbmV3IFNQRm9ybWF0KCc8c3BhbiBzdHlsZT0iY29sb3I6IHt7Y29sb3J9fSI+JiM5Njc5Ozwvc3Bhbj4ge3t0aXRsZX19OiB7e2JlZ2lufX0gLyB7e2ZpbmlzaH19JykNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICAvLyBEZWZhdWx0cyBmb3IgdHJpc3RhdGUgY2hhcnRzDQogICAgICAgICAgICB0cmlzdGF0ZTogew0KICAgICAgICAgICAgICAgIGJhcldpZHRoOiA0LA0KICAgICAgICAgICAgICAgIGJhclNwYWNpbmc6IDEsDQogICAgICAgICAgICAgICAgcG9zQmFyQ29sb3I6ICcjNmY2JywNCiAgICAgICAgICAgICAgICBuZWdCYXJDb2xvcjogJyNmNDQnLA0KICAgICAgICAgICAgICAgIHplcm9CYXJDb2xvcjogJyM5OTknLA0KICAgICAgICAgICAgICAgIGNvbG9yTWFwOiB7fSwNCiAgICAgICAgICAgICAgICB0b29sdGlwRm9ybWF0OiBuZXcgU1BGb3JtYXQoJzxzcGFuIHN0eWxlPSJjb2xvcjoge3tjb2xvcn19Ij4mIzk2Nzk7PC9zcGFuPiB7e3ByZWZpeH19e3t2YWx1ZTptYXB9fXt7c3VmZml4fX0nKSwNCiAgICAgICAgICAgICAgICB0b29sdGlwVmFsdWVMb29rdXBzOiB7IG1hcDogeyAnLTEnOiAnTG9zcycsICcwJzogJ0RyYXcnLCAnMSc6ICdXaW4nIH0gfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIC8vIERlZmF1bHRzIGZvciBkaXNjcmV0ZSBjaGFydHMNCiAgICAgICAgICAgIGRpc2NyZXRlOiB7DQogICAgICAgICAgICAgICAgbGluZUhlaWdodDogJ2F1dG8nLA0KICAgICAgICAgICAgICAgIHRocmVzaG9sZENvbG9yOiB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgdGhyZXNob2xkVmFsdWU6IDAsDQogICAgICAgICAgICAgICAgY2hhcnRSYW5nZU1heDogdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgIGNoYXJ0UmFuZ2VNaW46IHVuZGVmaW5lZCwNCiAgICAgICAgICAgICAgICBjaGFydFJhbmdlQ2xpcDogZmFsc2UsDQogICAgICAgICAgICAgICAgdG9vbHRpcEZvcm1hdDogbmV3IFNQRm9ybWF0KCd7e3ByZWZpeH19e3t2YWx1ZX19e3tzdWZmaXh9fScpDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgLy8gRGVmYXVsdHMgZm9yIGJ1bGxldCBjaGFydHMNCiAgICAgICAgICAgIGJ1bGxldDogew0KICAgICAgICAgICAgICAgIHRhcmdldENvbG9yOiAnI2YzMycsDQogICAgICAgICAgICAgICAgdGFyZ2V0V2lkdGg6IDMsIC8vIHdpZHRoIG9mIHRoZSB0YXJnZXQgYmFyIGluIHBpeGVscw0KICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlQ29sb3I6ICcjMzNmJywNCiAgICAgICAgICAgICAgICByYW5nZUNvbG9yczogWycjZDNkYWZlJywgJyNhOGI2ZmYnLCAnIzdmOTRmZiddLA0KICAgICAgICAgICAgICAgIGJhc2U6IHVuZGVmaW5lZCwgLy8gc2V0IHRoaXMgdG8gYSBudW1iZXIgdG8gY2hhbmdlIHRoZSBiYXNlIHN0YXJ0IG51bWJlcg0KICAgICAgICAgICAgICAgIHRvb2x0aXBGb3JtYXQ6IG5ldyBTUEZvcm1hdCgne3tmaWVsZGtleTpmaWVsZHN9fSAtIHt7dmFsdWV9fScpLA0KICAgICAgICAgICAgICAgIHRvb2x0aXBWYWx1ZUxvb2t1cHM6IHsgZmllbGRzOiB7cjogJ1JhbmdlJywgcDogJ1BlcmZvcm1hbmNlJywgdDogJ1RhcmdldCd9IH0NCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICAvLyBEZWZhdWx0cyBmb3IgcGllIGNoYXJ0cw0KICAgICAgICAgICAgcGllOiB7DQogICAgICAgICAgICAgICAgb2Zmc2V0OiAwLA0KICAgICAgICAgICAgICAgIHNsaWNlQ29sb3JzOiBbJyMzMzY2Y2MnLCAnI2RjMzkxMicsICcjZmY5OTAwJywgJyMxMDk2MTgnLCAnIzY2YWEwMCcsDQogICAgICAgICAgICAgICAgICAgICcjZGQ0NDc3JywgJyMwMDk5YzYnLCAnIzk5MDA5OSddLA0KICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoOiAwLA0KICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAnIzAwMCcsDQogICAgICAgICAgICAgICAgdG9vbHRpcEZvcm1hdDogbmV3IFNQRm9ybWF0KCc8c3BhbiBzdHlsZT0iY29sb3I6IHt7Y29sb3J9fSI+JiM5Njc5Ozwvc3Bhbj4ge3twcmVmaXh9fXt7dmFsdWV9fSAoe3twZXJjZW50LjF9fSUpe3tzdWZmaXh9fScpDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgLy8gRGVmYXVsdHMgZm9yIHN0YWNrIGNoYXJ0cw0KICAgICAgICAgICAgc3RhY2s6IHsNCiAgICAgICAgICAgICAgICBvZmZzZXQ6IDAsDQogICAgICAgICAgICAgICAgc2xpY2VDb2xvcnM6IFsnIzMzNjZjYycsICcjZGMzOTEyJywgJyNmZjk5MDAnLCAnIzEwOTYxOCcsICcjNjZhYTAwJywNCiAgICAgICAgICAgICAgICAgICAgJyNkZDQ0NzcnLCAnIzAwOTljNicsICcjOTkwMDk5J10sDQogICAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6IDAsDQogICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICcjMDAwJywNCiAgICAgICAgICAgICAgICB0b29sdGlwRm9ybWF0OiBuZXcgU1BGb3JtYXQoJzxzcGFuIHN0eWxlPSJjb2xvcjoge3tjb2xvcn19Ij4mIzk2Nzk7PC9zcGFuPiB7e3ZhbHVlfX0gKHt7cGVyY2VudC4xfX0lKScpDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgLy8gRGVmYXVsdHMgZm9yIGJveCBwbG90cw0KICAgICAgICAgICAgYm94OiB7DQogICAgICAgICAgICAgICAgcmF3OiBmYWxzZSwNCiAgICAgICAgICAgICAgICBib3hMaW5lQ29sb3I6ICcjMDAwJywNCiAgICAgICAgICAgICAgICBib3hGaWxsQ29sb3I6ICcjY2RmJywNCiAgICAgICAgICAgICAgICB3aGlza2VyQ29sb3I6ICcjMDAwJywNCiAgICAgICAgICAgICAgICBvdXRsaWVyTGluZUNvbG9yOiAnIzMzMycsDQogICAgICAgICAgICAgICAgb3V0bGllckZpbGxDb2xvcjogJyNmZmYnLA0KICAgICAgICAgICAgICAgIG1lZGlhbkNvbG9yOiAnI2YwMCcsDQogICAgICAgICAgICAgICAgc2hvd091dGxpZXJzOiB0cnVlLA0KICAgICAgICAgICAgICAgIG91dGxpZXJJUVI6IDEuNSwNCiAgICAgICAgICAgICAgICBzcG90UmFkaXVzOiAxLjUsDQogICAgICAgICAgICAgICAgdGFyZ2V0OiB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgdGFyZ2V0Q29sb3I6ICcjNGEyJywNCiAgICAgICAgICAgICAgICBjaGFydFJhbmdlTWF4OiB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgY2hhcnRSYW5nZU1pbjogdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgIHRvb2x0aXBGb3JtYXQ6IG5ldyBTUEZvcm1hdCgne3tmaWVsZDpmaWVsZHN9fToge3t2YWx1ZX19JyksDQogICAgICAgICAgICAgICAgdG9vbHRpcEZvcm1hdEZpZWxkbGlzdEtleTogJ2ZpZWxkJywNCiAgICAgICAgICAgICAgICB0b29sdGlwVmFsdWVMb29rdXBzOiB7IGZpZWxkczogeyBscTogJ0xvd2VyIFF1YXJ0aWxlJywgbWVkOiAnTWVkaWFuJywNCiAgICAgICAgICAgICAgICAgICAgdXE6ICdVcHBlciBRdWFydGlsZScsIGxvOiAnTGVmdCBPdXRsaWVyJywgcm86ICdSaWdodCBPdXRsaWVyJywNCiAgICAgICAgICAgICAgICAgICAgbHc6ICdMZWZ0IFdoaXNrZXInLCBydzogJ1JpZ2h0IFdoaXNrZXInfSB9DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgfTsNCg0KICAgIC8vIEJvb3RzdHJhcCBhZGRzIGJveC1zaXppbmcgdGhhdCBtZXNzZXMgd2l0aCBhbGlnbm1lbnQgaW4gdGhlIHRvb2x0aXAuDQogICAgdmFyIGJveF9zaXppbmcgPSAnLXdlYmtpdC1ib3gtc2l6aW5nOiBjb250ZW50LWJveCAhaW1wb3J0YW50OycgKw0KICAgICAgICAgICctbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7JyArDQogICAgICAgICAgJ2JveC1zaXppbmc6IGNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7JzsNCg0KICAgIC8vIFlvdSBjYW4gaGF2ZSB0b29sdGlwcyB1c2UgYSBjc3MgY2xhc3Mgb3RoZXIgdGhhbiBqcXN0b29sdGlwIGJ5IHNwZWNpZnlpbmcgdG9vbHRpcENsYXNzbmFtZQ0KICAgIGRlZmF1bHRTdHlsZXMgPSAnLmpxc3Rvb2x0aXAgeyAnICsNCiAgICAgICAgICAgICdwb3NpdGlvbjogYWJzb2x1dGU7JyArDQogICAgICAgICAgICAnbGVmdDogMHB4OycgKw0KICAgICAgICAgICAgJ3RvcDogMHB4OycgKw0KICAgICAgICAgICAgJ3Zpc2liaWxpdHk6IGhpZGRlbjsnICsNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kOiByZ2IoMCwgMCwgMCkgdHJhbnNwYXJlbnQ7JyArDQogICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwLjYpOycgKw0KICAgICAgICAgICAgJ2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0jOTkwMDAwMDAsIGVuZENvbG9yc3RyPSM5OTAwMDAwMCk7JyArDQogICAgICAgICAgICAnLW1zLWZpbHRlcjogInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPSM5OTAwMDAwMCwgZW5kQ29sb3JzdHI9Izk5MDAwMDAwKSI7JyArDQogICAgICAgICAgICAnY29sb3I6IHdoaXRlOycgKw0KICAgICAgICAgICAgJ2ZvbnQ6IDEwcHggYXJpYWwsIHNhbiBzZXJpZjsnICsNCiAgICAgICAgICAgICd0ZXh0LWFsaWduOiBsZWZ0OycgKw0KICAgICAgICAgICAgJ3doaXRlLXNwYWNlOiBub3dyYXA7JyArDQogICAgICAgICAgICAncGFkZGluZzogNXB4OycgKw0KICAgICAgICAgICAgJ2JvcmRlcjogMXB4IHNvbGlkIHdoaXRlOycgKw0KICAgICAgICAgICAgJ3otaW5kZXg6IDEwMDAwOycgKw0KICAgICAgICAgICAgYm94X3NpemluZyArDQogICAgICAgICAgICAnfScgKw0KICAgICAgICAgICAgJy5qcXNmaWVsZCB7ICcgKw0KICAgICAgICAgICAgJ2NvbG9yOiB3aGl0ZTsnICsNCiAgICAgICAgICAgICdmb250OiAxMHB4IGFyaWFsLCBzYW4gc2VyaWY7JyArDQogICAgICAgICAgICAndGV4dC1hbGlnbjogbGVmdDsnICsNCiAgICAgICAgICAgICd9JyArDQogICAgICAgICAgICAnLmpxc3Rvb2x0aXA6YmVmb3JlLCAuanFzdG9vbHRpcDphZnRlciB7ICcgKw0KICAgICAgICAgICAgYm94X3NpemluZyArDQogICAgICAgICAgICAnfSc7DQoNCiAgICAvKioNCiAgICAgKiBVdGlsaXRpZXMNCiAgICAgKi8NCg0KICAgIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKC8qIFtiYXNlY2xhc3MsIFttaXhpbiwgLi4uXV0sIGRlZmluaXRpb24gKi8pIHsNCiAgICAgICAgdmFyIENsYXNzLCBhcmdzOw0KICAgICAgICBDbGFzcyA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHRoaXMuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICB9Ow0KICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsNCiAgICAgICAgICAgIGlmIChhcmd1bWVudHNbMF0pIHsNCiAgICAgICAgICAgICAgICBDbGFzcy5wcm90b3R5cGUgPSAkLmV4dGVuZChuZXcgYXJndW1lbnRzWzBdKCksIGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0pOw0KICAgICAgICAgICAgICAgIENsYXNzLl9zdXBlciA9IGFyZ3VtZW50c1swXS5wcm90b3R5cGU7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIENsYXNzLnByb3RvdHlwZSA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV07DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHsNCiAgICAgICAgICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxLCAtMSk7DQogICAgICAgICAgICAgICAgYXJncy51bnNoaWZ0KENsYXNzLnByb3RvdHlwZSk7DQogICAgICAgICAgICAgICAgJC5leHRlbmQuYXBwbHkoJCwgYXJncyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBDbGFzcy5wcm90b3R5cGUgPSBhcmd1bWVudHNbMF07DQogICAgICAgIH0NCiAgICAgICAgQ2xhc3MucHJvdG90eXBlLmNscyA9IENsYXNzOw0KICAgICAgICByZXR1cm4gQ2xhc3M7DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIFdyYXBzIGEgZm9ybWF0IHN0cmluZyBmb3IgdG9vbHRpcHMNCiAgICAgKiB7e3h9fQ0KICAgICAqIHt7eC4yfQ0KICAgICAqIHt7eDptb250aHN9fQ0KICAgICAqLw0KICAgICQuU1BGb3JtYXRDbGFzcyA9IFNQRm9ybWF0ID0gY3JlYXRlQ2xhc3Moew0KICAgICAgICBmcmU6IC9ce1x7KFtcdy5dKz8pKDooLis/KSk/XH1cfS9nLA0KICAgICAgICBwcmVjcmU6IC8oXHcrKVwuKFxkKykvLA0KDQogICAgICAgIGluaXQ6IGZ1bmN0aW9uIChmb3JtYXQsIGZjbGFzcykgew0KICAgICAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7DQogICAgICAgICAgICB0aGlzLmZjbGFzcyA9IGZjbGFzczsNCiAgICAgICAgfSwNCg0KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIChmaWVsZHNldCwgbG9va3Vwcywgb3B0aW9ucykgew0KICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzLA0KICAgICAgICAgICAgICAgIGZpZWxkcyA9IGZpZWxkc2V0LA0KICAgICAgICAgICAgICAgIG1hdGNoLCB0b2tlbiwgbG9va3Vwa2V5LCBmaWVsZHZhbHVlLCBwcmVjOw0KDQogICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQucmVwbGFjZSh0aGlzLmZyZSwgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIHZhciBsb29rdXA7DQogICAgICAgICAgICAgICAgdG9rZW4gPSBhcmd1bWVudHNbMV07DQogICAgICAgICAgICAgICAgbG9va3Vwa2V5ID0gYXJndW1lbnRzWzNdOw0KICAgICAgICAgICAgICAgIG1hdGNoID0gc2VsZi5wcmVjcmUuZXhlYyh0b2tlbik7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgICAgIHByZWMgPSBtYXRjaFsyXTsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBtYXRjaFsxXTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBwcmVjID0gZmFsc2U7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZpZWxkdmFsdWUgPSBmaWVsZHNbdG9rZW5dOw0KICAgICAgICAgICAgICAgIGlmIChmaWVsZHZhbHVlID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAobG9va3Vwa2V5ICYmIGxvb2t1cHMgJiYgbG9va3Vwc1tsb29rdXBrZXldKSB7DQogICAgICAgICAgICAgICAgICAgIGxvb2t1cCA9IGxvb2t1cHNbbG9va3Vwa2V5XTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvb2t1cC5nZXQpIHsgLy8gUmFuZ2VNYXANCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb29rdXBzW2xvb2t1cGtleV0uZ2V0KGZpZWxkdmFsdWUpIHx8IGZpZWxkdmFsdWU7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9va3Vwc1tsb29rdXBrZXldW2ZpZWxkdmFsdWVdIHx8IGZpZWxkdmFsdWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGZpZWxkdmFsdWUpKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmdldCgnbnVtYmVyRm9ybWF0dGVyJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkdmFsdWUgPSBvcHRpb25zLmdldCgnbnVtYmVyRm9ybWF0dGVyJykoZmllbGR2YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHZhbHVlID0gZm9ybWF0TnVtYmVyKGZpZWxkdmFsdWUsIHByZWMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoJ251bWJlckRpZ2l0R3JvdXBDb3VudCcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0KCdudW1iZXJEaWdpdEdyb3VwU2VwJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoJ251bWJlckRlY2ltYWxNYXJrJykpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZHZhbHVlOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIC8vIGNvbnZlbmllbmNlIG1ldGhvZCB0byBhdm9pZCBuZWVkaW5nIHRoZSBuZXcgb3BlcmF0b3INCiAgICAkLnNwZm9ybWF0ID0gZnVuY3Rpb24gKGZvcm1hdCwgZmNsYXNzKSB7DQogICAgICAgIHJldHVybiBuZXcgU1BGb3JtYXQoZm9ybWF0LCBmY2xhc3MpOw0KICAgIH07DQoNCiAgICBjbGlwdmFsID0gZnVuY3Rpb24gKHZhbCwgbWluLCBtYXgpIHsNCiAgICAgICAgaWYgKHZhbCA8IG1pbikgew0KICAgICAgICAgICAgcmV0dXJuIG1pbjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodmFsID4gbWF4KSB7DQogICAgICAgICAgICByZXR1cm4gbWF4Ow0KICAgICAgICB9DQogICAgICAgIHJldHVybiB2YWw7DQogICAgfTsNCg0KICAgIC8vIENVU1RPTSBNT0Q6IGNvbXBsZXRlbHkgbmV3IG1lZGlhbiBmdW5jdGlvbg0KICAgIG1lZGlhbiA9IGZ1bmN0aW9uICh2YWx1ZXMpIHsNCiAgICAgICAgdmFyIHJldCwgaWR4Ow0KICAgICAgICBpZiAoMCA9PT0gdmFsdWVzLmxlbmd0aCAlIDIpIHsNCiAgICAgICAgICAgIHZhciB2MSwgdjI7DQogICAgICAgICAgICBpZHggPSB2YWx1ZXMubGVuZ3RoIC8gMjsNCiAgICAgICAgICAgIHYxID0gdmFsdWVzW2lkeCAtIDFdOw0KICAgICAgICAgICAgdjIgPSB2YWx1ZXNbaWR4XTsNCiAgICAgICAgICAgIHJldCA9ICh2MSArIHYyKSAvIDI7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBpZHggPSBwYXJzZUludCh2YWx1ZXMubGVuZ3RoIC8gMik7DQogICAgICAgICAgICByZXQgPSB2YWx1ZXNbaWR4XTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB7IA0KICAgICAgICAgICAgbTogcmV0LCANCiAgICAgICAgICAgIGlkeDogaWR4IA0KICAgICAgICB9Ow0KICAgIH07DQoNCiAgICAvLyBDVVNUT00gTU9EOiBjb21wbGV0ZWx5IHJld3JpdHRlbiBxdWFydGlsZSBmdW5jdGlvbg0KICAgIHF1YXJ0aWxlID0gZnVuY3Rpb24gKHZhbHVlcywgcSkgew0KICAgICAgICB2YXIgcmV0LCBtLCBtZWQ7DQogICAgICAgIG0gPSBtZWRpYW4odmFsdWVzKTsNCg0KICAgICAgICBpZiAocSA9PT0gMikgew0KICAgICAgICAgICAgcmV0ID0gbS5tOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdmFyIGFyciA9IFtdOw0KICAgICAgICAgICAgbWVkID0gbS5tOw0KDQogICAgICAgICAgICBpZiAobWVkICE9IG51bGwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGpzaGludCBpZ25vcmU6bGluZQ0KICAgICAgICAgICAgICAgIHZhciBpID0gMDsNCiAgICAgICAgICAgICAgICBpZiAocSA9PT0gMSkgew0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IG0uaWR4KSB7DQogICAgICAgICAgICAgICAgICAgICAgYXJyW2ldID0gdmFsdWVzW2ldOw0KICAgICAgICAgICAgICAgICAgICAgIGkrKzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoIWFyci5sZW5ndGgpDQogICAgICAgICAgICAgICAgICAgICAgYXJyID0gWyB2YWx1ZXNbMF0gXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAocSA9PT0gMykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgaiA9IHZhbHVlcy5sZW5ndGggLSAxOw0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaiA+IG0uaWR4KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhcnJbaV0gPSB2YWx1ZXNbal07DQogICAgICAgICAgICAgICAgICAgICAgICBpKys7DQogICAgICAgICAgICAgICAgICAgICAgICBqLS07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnIubGVuZ3RoKQ0KICAgICAgICAgICAgICAgICAgICAgIGFyciA9IFsgdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXSBdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG0gPSBtZWRpYW4oYXJyKTsNCiAgICAgICAgICAgIHJldCA9IG0ubTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcmV0Ow0KICAgIH07DQoNCiAgICBub3JtYWxpemVWYWx1ZSA9IGZ1bmN0aW9uICh2YWwpIHsNCiAgICAgICAgdmFyIG5mOw0KICAgICAgICBzd2l0Y2ggKHZhbCkgew0KICAgICAgICBjYXNlICd1bmRlZmluZWQnOg0KICAgICAgICAgICAgdmFsID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ251bGwnOg0KICAgICAgICAgICAgdmFsID0gbnVsbDsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICd0cnVlJzoNCiAgICAgICAgICAgIHZhbCA9IHRydWU7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnZmFsc2UnOg0KICAgICAgICAgICAgdmFsID0gZmFsc2U7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIG5mID0gcGFyc2VGbG9hdCh2YWwpOw0KICAgICAgICAgICAgaWYgKHZhbCA9PSBuZikgew0KICAgICAgICAgICAgICAgIHZhbCA9IG5mOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiB2YWw7DQogICAgfTsNCg0KICAgIG5vcm1hbGl6ZVZhbHVlcyA9IGZ1bmN0aW9uICh2YWxzKSB7DQogICAgICAgIHZhciBpLCByZXN1bHQgPSBbXTsNCiAgICAgICAgZm9yIChpID0gdmFscy5sZW5ndGg7IGktLTspIHsNCiAgICAgICAgICAgIHJlc3VsdFtpXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHNbaV0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCg0KICAgIHJlbW92ZSA9IGZ1bmN0aW9uICh2YWxzLCBmaWx0ZXIpIHsNCiAgICAgICAgdmFyIGksIHZsLCByZXN1bHQgPSBbXTsNCiAgICAgICAgZm9yIChpID0gMCwgdmwgPSB2YWxzLmxlbmd0aDsgaSA8IHZsOyBpKyspIHsNCiAgICAgICAgICAgIGlmICh2YWxzW2ldICE9PSBmaWx0ZXIpIHsNCiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh2YWxzW2ldKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgIH07DQoNCiAgICBpc051bWJlciA9IGZ1bmN0aW9uIChudW0pIHsNCiAgICAgICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KG51bSkpICYmIGlzRmluaXRlKG51bSk7DQogICAgfTsNCg0KICAgIGZvcm1hdE51bWJlciA9IGZ1bmN0aW9uIChudW0sIHByZWMsIGdyb3Vwc2l6ZSwgZ3JvdXBzZXAsIGRlY3NlcCkgew0KICAgICAgICB2YXIgcCwgaTsNCiAgICAgICAgbnVtID0gKHByZWMgPT09IGZhbHNlID8gcGFyc2VGbG9hdChudW0pLnRvU3RyaW5nKCkgOiBudW0udG9GaXhlZChwcmVjKSkuc3BsaXQoJycpOw0KICAgICAgICBwID0gKHAgPSAkLmluQXJyYXkoJy4nLCBudW0pKSA8IDAgPyBudW0ubGVuZ3RoIDogcDsNCiAgICAgICAgaWYgKHAgPCBudW0ubGVuZ3RoKSB7DQogICAgICAgICAgICBudW1bcF0gPSBkZWNzZXA7DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpID0gcCAtIGdyb3Vwc2l6ZTsgaSA+IDA7IGkgLT0gZ3JvdXBzaXplKSB7DQogICAgICAgICAgICBudW0uc3BsaWNlKGksIDAsIGdyb3Vwc2VwKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbnVtLmpvaW4oJycpOw0KICAgIH07DQoNCiAgICAvLyBkZXRlcm1pbmUgaWYgYWxsIHZhbHVlcyBvZiBhbiBhcnJheSBtYXRjaCBhIHZhbHVlDQogICAgLy8gcmV0dXJucyB0cnVlIGlmIHRoZSBhcnJheSBpcyBlbXB0eQ0KICAgIGFsbCA9IGZ1bmN0aW9uICh2YWwsIGFyciwgaWdub3JlTnVsbCkgew0KICAgICAgICB2YXIgaTsNCiAgICAgICAgZm9yIChpID0gYXJyLmxlbmd0aDsgaS0tOyApIHsNCiAgICAgICAgICAgIGlmIChpZ25vcmVOdWxsICYmIGFycltpXSA9PT0gbnVsbCkgY29udGludWU7DQogICAgICAgICAgICBpZiAoYXJyW2ldICE9PSB2YWwpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfTsNCg0KICAgIC8vIHN1bXMgdGhlIG51bWVyaWMgdmFsdWVzIGluIGFuIGFycmF5LCBpZ25vcmluZyBvdGhlciB2YWx1ZXMNCiAgICBzdW0gPSBmdW5jdGlvbiAodmFscykgew0KICAgICAgICB2YXIgdG90YWwgPSAwLCBpOw0KICAgICAgICBmb3IgKGkgPSB2YWxzLmxlbmd0aDsgaS0tOykgew0KICAgICAgICAgICAgdG90YWwgKz0gdHlwZW9mIHZhbHNbaV0gPT09ICdudW1iZXInID8gdmFsc1tpXSA6IDA7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRvdGFsOw0KICAgIH07DQoNCiAgICBlbnN1cmVBcnJheSA9IGZ1bmN0aW9uICh2YWwpIHsNCiAgICAgICAgcmV0dXJuICQuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07DQogICAgfTsNCg0KICAgIC8vIGh0dHA6Ly9wYXVsaXJpc2guY29tLzIwMDgvYm9va21hcmtsZXQtaW5qZWN0LW5ldy1jc3MtcnVsZXMvDQogICAgYWRkQ1NTID0gZnVuY3Rpb24gKGNzcykgew0KICAgICAgICB2YXIgdGFnLCBpZWZhaWw7DQogICAgICAgIGlmIChkb2N1bWVudC5jcmVhdGVTdHlsZVNoZWV0KSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZVN0eWxlU2hlZXQoKS5jc3NUZXh0ID0gY3NzOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICAvLyBJRSA8PSA5IG1heGVzIG91dCBhdCAzMSBzdHlsZXNoZWV0czsgaW5qZWN0IGludG8gcGFnZSBpbnN0ZWFkLg0KICAgICAgICAgICAgICAgIGllZmFpbCA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCiAgICAgICAgdGFnLnR5cGUgPSAndGV4dC9jc3MnOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHRhZyk7DQogICAgICAgIGlmIChpZWZhaWwpIHsNCiAgICAgICAgICAgIGRvY3VtZW50LnN0eWxlU2hlZXRzW2RvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aCAtIDFdLmNzc1RleHQgPSBjc3M7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0YWdbKHR5cGVvZiBkb2N1bWVudC5ib2R5LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UgPT0gJ3N0cmluZycpIC8qIHdlYmtpdCBvbmx5ICovID8gJ2lubmVyVGV4dCcgOiAnaW5uZXJIVE1MJ10gPSBjc3M7DQogICAgICAgIH0NCiAgICB9Ow0KDQoNCiAgICAvLyBQcm92aWRlIGEgY3Jvc3MtYnJvd3NlciBpbnRlcmZhY2UgdG8gYSBmZXcgc2ltcGxlIGRyYXdpbmcgcHJpbWl0aXZlcw0KICAgICQuZm4uc2ltcGxlZHJhdyA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0LCB1c2VFeGlzdGluZywgaW50ZXJhY3QpIHsNCiAgICAgICAgdmFyIHRhcmdldCwgbWhhbmRsZXI7DQogICAgICAgIGlmICh1c2VFeGlzdGluZyAmJiAodGFyZ2V0ID0gdGhpcy5kYXRhKCdfanFzX3ZjYW52YXMnKSkpIHsNCiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoJC5mbi5zcGFya2xpbmUuY2FudmFzID09PSBmYWxzZSkgew0KICAgICAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQgbmVpdGhlciBDYW52YXMgbm9yIFZNTCBhcmUgYXZhaWxhYmxlDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0gZWxzZSBpZiAoJC5mbi5zcGFya2xpbmUuY2FudmFzID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgIC8vIE5vIGZ1bmN0aW9uIGRlZmluZWQgeWV0IC0tIG5lZWQgdG8gc2VlIGlmIHdlIHN1cHBvcnQgQ2FudmFzIG9yIFZNTA0KICAgICAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7DQogICAgICAgICAgICBpZiAoISEoZWwuZ2V0Q29udGV4dCAmJiBlbC5nZXRDb250ZXh0KCcyZCcpKSkgew0KICAgICAgICAgICAgICAgIC8vIENhbnZhcyBpcyBhdmFpbGFibGUNCiAgICAgICAgICAgICAgICAkLmZuLnNwYXJrbGluZS5jYW52YXMgPSBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0LCB0YXJnZXQsIGludGVyYWN0KSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVkNhbnZhc19jYW52YXMod2lkdGgsIGhlaWdodCwgdGFyZ2V0LCBpbnRlcmFjdCk7DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQubmFtZXNwYWNlcyAmJiAhZG9jdW1lbnQubmFtZXNwYWNlcy52KSB7DQogICAgICAgICAgICAgICAgLy8gVk1MIGlzIGF2YWlsYWJsZQ0KICAgICAgICAgICAgICAgIGRvY3VtZW50Lm5hbWVzcGFjZXMuYWRkKCd2JywgJ3VybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sJywgJyNkZWZhdWx0I1ZNTCcpOw0KICAgICAgICAgICAgICAgICQuZm4uc3BhcmtsaW5lLmNhbnZhcyA9IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQsIHRhcmdldCwgaW50ZXJhY3QpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWQ2FudmFzX3ZtbCh3aWR0aCwgaGVpZ2h0LCB0YXJnZXQpOw0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIC8vIE5laXRoZXIgQ2FudmFzIG5vciBWTUwgYXJlIGF2YWlsYWJsZQ0KICAgICAgICAgICAgICAgICQuZm4uc3BhcmtsaW5lLmNhbnZhcyA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICB3aWR0aCA9ICQodGhpcykuaW5uZXJXaWR0aCgpOw0KICAgICAgICB9DQogICAgICAgIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgaGVpZ2h0ID0gJCh0aGlzKS5pbm5lckhlaWdodCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgdGFyZ2V0ID0gJC5mbi5zcGFya2xpbmUuY2FudmFzKHdpZHRoLCBoZWlnaHQsIHRoaXMsIGludGVyYWN0KTsNCg0KICAgICAgICBtaGFuZGxlciA9ICQodGhpcykuZGF0YSgnX2pxc19taGFuZGxlcicpOw0KICAgICAgICBpZiAobWhhbmRsZXIpIHsNCiAgICAgICAgICAgIG1oYW5kbGVyLnJlZ2lzdGVyQ2FudmFzKHRhcmdldCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRhcmdldDsNCiAgICB9Ow0KDQogICAgJC5mbi5jbGVhcmRyYXcgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLmRhdGEoJ19qcXNfdmNhbnZhcycpOw0KICAgICAgICBpZiAodGFyZ2V0KSB7DQogICAgICAgICAgICB0YXJnZXQucmVzZXQoKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCg0KICAgICQuUmFuZ2VNYXBDbGFzcyA9IFJhbmdlTWFwID0gY3JlYXRlQ2xhc3Moew0KICAgICAgICBpbml0OiBmdW5jdGlvbiAobWFwKSB7DQogICAgICAgICAgICB2YXIga2V5LCByYW5nZSwgcmFuZ2VsaXN0ID0gW107DQogICAgICAgICAgICBmb3IgKGtleSBpbiBtYXApIHsNCiAgICAgICAgICAgICAgICBpZiAobWFwLmhhc093blByb3BlcnR5KGtleSkgJiYgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5LmluZGV4T2YoJzonKSA+IC0xKSB7DQogICAgICAgICAgICAgICAgICAgIHJhbmdlID0ga2V5LnNwbGl0KCc6Jyk7DQogICAgICAgICAgICAgICAgICAgIHJhbmdlWzBdID0gcmFuZ2VbMF0ubGVuZ3RoID09PSAwID8gLUluZmluaXR5IDogcGFyc2VGbG9hdChyYW5nZVswXSk7DQogICAgICAgICAgICAgICAgICAgIHJhbmdlWzFdID0gcmFuZ2VbMV0ubGVuZ3RoID09PSAwID8gSW5maW5pdHkgOiBwYXJzZUZsb2F0KHJhbmdlWzFdKTsNCiAgICAgICAgICAgICAgICAgICAgcmFuZ2VbMl0gPSBtYXBba2V5XTsNCiAgICAgICAgICAgICAgICAgICAgcmFuZ2VsaXN0LnB1c2gocmFuZ2UpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMubWFwID0gbWFwOw0KICAgICAgICAgICAgdGhpcy5yYW5nZWxpc3QgPSByYW5nZWxpc3QgfHwgZmFsc2U7DQogICAgICAgIH0sDQoNCiAgICAgICAgZ2V0OiBmdW5jdGlvbiAodmFsdWUpIHsNCiAgICAgICAgICAgIHZhciByYW5nZWxpc3QgPSB0aGlzLnJhbmdlbGlzdCwNCiAgICAgICAgICAgICAgICBpLCByYW5nZSwgcmVzdWx0Ow0KICAgICAgICAgICAgaWYgKChyZXN1bHQgPSB0aGlzLm1hcFt2YWx1ZV0pICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJhbmdlbGlzdCkgew0KICAgICAgICAgICAgICAgIGZvciAoaSA9IHJhbmdlbGlzdC5sZW5ndGg7IGktLTspIHsNCiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSByYW5nZWxpc3RbaV07DQogICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZVswXSA8PSB2YWx1ZSAmJiByYW5nZVsxXSA+PSB2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlWzJdOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsNCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24NCiAgICAkLnJhbmdlX21hcCA9IGZ1bmN0aW9uKG1hcCkgew0KICAgICAgICByZXR1cm4gbmV3IFJhbmdlTWFwKG1hcCk7DQogICAgfTsNCg0KDQogICAgTW91c2VIYW5kbGVyID0gY3JlYXRlQ2xhc3Moew0KICAgICAgICBpbml0OiBmdW5jdGlvbiAoZWwsIG9wdGlvbnMpIHsNCiAgICAgICAgICAgIHZhciAkZWwgPSAkKGVsKTsNCiAgICAgICAgICAgIHRoaXMuJGVsID0gJGVsOw0KICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2VYID0gMDsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2VZID0gMDsNCiAgICAgICAgICAgIHRoaXMuZWwgPSBlbDsNCiAgICAgICAgICAgIHRoaXMuc3BsaXN0ID0gW107DQogICAgICAgICAgICB0aGlzLnRvb2x0aXAgPSBudWxsOw0KICAgICAgICAgICAgdGhpcy5vdmVyID0gZmFsc2U7DQogICAgICAgICAgICB0aGlzLmRpc3BsYXlUb29sdGlwcyA9ICFvcHRpb25zLmdldCgnZGlzYWJsZVRvb2x0aXBzJyk7DQogICAgICAgICAgICB0aGlzLmhpZ2hsaWdodEVuYWJsZWQgPSAhb3B0aW9ucy5nZXQoJ2Rpc2FibGVIaWdobGlnaHQnKTsNCiAgICAgICAgfSwNCg0KICAgICAgICByZWdpc3RlclNwYXJrbGluZTogZnVuY3Rpb24gKHNwKSB7DQogICAgICAgICAgICB0aGlzLnNwbGlzdC5wdXNoKHNwKTsNCiAgICAgICAgICAgIGlmICh0aGlzLm92ZXIpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXkoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCg0KICAgICAgICByZWdpc3RlckNhbnZhczogZnVuY3Rpb24gKGNhbnZhcykgew0KICAgICAgICAgICAgdmFyICRjYW52YXMgPSAkKGNhbnZhcy5jYW52YXMpOw0KICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXM7DQogICAgICAgICAgICB0aGlzLiRjYW52YXMgPSAkY2FudmFzOw0KICAgICAgICAgICAgJGNhbnZhcy5tb3VzZWVudGVyKCQucHJveHkodGhpcy5tb3VzZWVudGVyLCB0aGlzKSk7DQogICAgICAgICAgICAkY2FudmFzLm1vdXNlbGVhdmUoJC5wcm94eSh0aGlzLm1vdXNlbGVhdmUsIHRoaXMpKTsNCiAgICAgICAgICAgICRjYW52YXMuY2xpY2soJC5wcm94eSh0aGlzLm1vdXNlY2xpY2ssIHRoaXMpKTsNCiAgICAgICAgfSwNCg0KICAgICAgICByZXNldDogZnVuY3Rpb24gKHJlbW92ZVRvb2x0aXApIHsNCiAgICAgICAgICAgIHRoaXMuc3BsaXN0ID0gW107DQogICAgICAgICAgICBpZiAodGhpcy50b29sdGlwICYmIHJlbW92ZVRvb2x0aXApIHsNCiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAucmVtb3ZlKCk7DQogICAgICAgICAgICAgICAgdGhpcy50b29sdGlwID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIG1vdXNlY2xpY2s6IGZ1bmN0aW9uIChlKSB7DQogICAgICAgICAgICB2YXIgY2xpY2tFdmVudCA9ICQuRXZlbnQoJ3NwYXJrbGluZUNsaWNrJyk7DQogICAgICAgICAgICBjbGlja0V2ZW50Lm9yaWdpbmFsRXZlbnQgPSBlOw0KICAgICAgICAgICAgY2xpY2tFdmVudC5zcGFya2xpbmVzID0gdGhpcy5zcGxpc3Q7DQogICAgICAgICAgICB0aGlzLiRlbC50cmlnZ2VyKGNsaWNrRXZlbnQpOw0KICAgICAgICB9LA0KDQogICAgICAgIG1vdXNlZW50ZXI6IGZ1bmN0aW9uIChlKSB7DQogICAgICAgICAgICAkKGRvY3VtZW50LmJvZHkpLnVuYmluZCgnbW91c2Vtb3ZlLmpxcycpOw0KICAgICAgICAgICAgJChkb2N1bWVudC5ib2R5KS5iaW5kKCdtb3VzZW1vdmUuanFzJywgJC5wcm94eSh0aGlzLm1vdXNlbW92ZSwgdGhpcykpOw0KICAgICAgICAgICAgdGhpcy5vdmVyID0gdHJ1ZTsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2VYID0gZS5wYWdlWDsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2VZID0gZS5wYWdlWTsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudEVsID0gZS50YXJnZXQ7DQogICAgICAgICAgICBpZiAoIXRoaXMudG9vbHRpcCAmJiB0aGlzLmRpc3BsYXlUb29sdGlwcykgew0KICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcCA9IG5ldyBUb29sdGlwKHRoaXMub3B0aW9ucyk7DQogICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnVwZGF0ZVBvc2l0aW9uKGUucGFnZVgsIGUucGFnZVkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgbW91c2VsZWF2ZTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgJChkb2N1bWVudC5ib2R5KS51bmJpbmQoJ21vdXNlbW92ZS5qcXMnKTsNCiAgICAgICAgICAgIHZhciBzcGxpc3QgPSB0aGlzLnNwbGlzdCwNCiAgICAgICAgICAgICAgICAgc3Bjb3VudCA9IHNwbGlzdC5sZW5ndGgsDQogICAgICAgICAgICAgICAgIG5lZWRzUmVmcmVzaCA9IGZhbHNlLA0KICAgICAgICAgICAgICAgICBzcCwgaTsNCiAgICAgICAgICAgIHRoaXMub3ZlciA9IGZhbHNlOw0KICAgICAgICAgICAgdGhpcy5jdXJyZW50RWwgPSBudWxsOw0KDQogICAgICAgICAgICBpZiAodGhpcy50b29sdGlwKSB7DQogICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnJlbW92ZSgpOw0KICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcCA9IG51bGw7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcGNvdW50OyBpKyspIHsNCiAgICAgICAgICAgICAgICBzcCA9IHNwbGlzdFtpXTsNCiAgICAgICAgICAgICAgICBpZiAoc3AuY2xlYXJSZWdpb25IaWdobGlnaHQoKSkgew0KICAgICAgICAgICAgICAgICAgICBuZWVkc1JlZnJlc2ggPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKG5lZWRzUmVmcmVzaCkgew0KICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLnJlbmRlcigpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIG1vdXNlbW92ZTogZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2VYID0gZS5wYWdlWDsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2VZID0gZS5wYWdlWTsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudEVsID0gZS50YXJnZXQ7DQogICAgICAgICAgICBpZiAodGhpcy50b29sdGlwKSB7DQogICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnVwZGF0ZVBvc2l0aW9uKGUucGFnZVgsIGUucGFnZVkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgdXBkYXRlRGlzcGxheTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHNwbGlzdCA9IHRoaXMuc3BsaXN0LA0KICAgICAgICAgICAgICAgICBzcGNvdW50ID0gc3BsaXN0Lmxlbmd0aCwNCiAgICAgICAgICAgICAgICAgbmVlZHNSZWZyZXNoID0gZmFsc2UsDQogICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuJGNhbnZhcy5vZmZzZXQoKSwNCiAgICAgICAgICAgICAgICAgbG9jYWxYID0gTWF0aC5yb3VuZCh0aGlzLmN1cnJlbnRQYWdlWCAtIG9mZnNldC5sZWZ0KSwNCiAgICAgICAgICAgICAgICAgbG9jYWxZID0gTWF0aC5yb3VuZCh0aGlzLmN1cnJlbnRQYWdlWSAtIG9mZnNldC50b3ApLA0KICAgICAgICAgICAgICAgICB0b29sdGlwaHRtbCwgc3AsIGksIHJlc3VsdCwgY2hhbmdlRXZlbnQ7DQogICAgICAgICAgICAvLyBsb2NhbFgvbG9jYWxZIGZpeCBpc3N1ZSAjNTAgd2l0aCBHb29nbGUgQ2hyb21lDQogICAgICAgICAgICAvLyBhbmQgc3VicGl4ZWwgcmVuZGVyaW5nDQoNCiAgICAgICAgICAgIGlmICghdGhpcy5vdmVyKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNwY291bnQ7IGkrKykgew0KICAgICAgICAgICAgICAgIHNwID0gc3BsaXN0W2ldOw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNwLnNldFJlZ2lvbkhpZ2hsaWdodCh0aGlzLmN1cnJlbnRFbCwgbG9jYWxYLCBsb2NhbFkpOw0KICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsNCiAgICAgICAgICAgICAgICAgICAgbmVlZHNSZWZyZXNoID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobmVlZHNSZWZyZXNoKSB7DQogICAgICAgICAgICAgICAgY2hhbmdlRXZlbnQgPSAkLkV2ZW50KCdzcGFya2xpbmVSZWdpb25DaGFuZ2UnKTsNCiAgICAgICAgICAgICAgICBjaGFuZ2VFdmVudC5zcGFya2xpbmVzID0gdGhpcy5zcGxpc3Q7DQogICAgICAgICAgICAgICAgdGhpcy4kZWwudHJpZ2dlcihjaGFuZ2VFdmVudCk7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMudG9vbHRpcCkgew0KICAgICAgICAgICAgICAgICAgICB0b29sdGlwaHRtbCA9ICcnOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3Bjb3VudDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBzcCA9IHNwbGlzdFtpXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBodG1sICs9IHNwLmdldEN1cnJlbnRSZWdpb25Ub29sdGlwKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnNldENvbnRlbnQodG9vbHRpcGh0bWwpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZUhpZ2hsaWdodCkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhcy5yZW5kZXIoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7DQogICAgICAgICAgICAgICAgdGhpcy5tb3VzZWxlYXZlKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KDQogICAgVG9vbHRpcCA9IGNyZWF0ZUNsYXNzKHsNCiAgICAgICAgc2l6ZVN0eWxlOiAncG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50OycgKw0KICAgICAgICAgICAgJ2Rpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7JyArDQogICAgICAgICAgICAndmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7JyArDQogICAgICAgICAgICAnZmxvYXQ6IGxlZnQgIWltcG9ydGFudDsnLA0KDQogICAgICAgIGluaXQ6IGZ1bmN0aW9uIChvcHRpb25zKSB7DQogICAgICAgICAgICB2YXIgdG9vbHRpcENsYXNzbmFtZSA9IG9wdGlvbnMuZ2V0KCd0b29sdGlwQ2xhc3NuYW1lJywgJ2pxc3Rvb2x0aXAnKSwNCiAgICAgICAgICAgICAgICBzaXpldGlwU3R5bGUgPSB0aGlzLnNpemVTdHlsZSwNCiAgICAgICAgICAgICAgICBvZmZzZXQ7DQogICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG9wdGlvbnMuZ2V0KCd0b29sdGlwQ29udGFpbmVyJykgfHwgZG9jdW1lbnQuYm9keTsNCiAgICAgICAgICAgIHRoaXMudG9vbHRpcE9mZnNldFggPSBvcHRpb25zLmdldCgndG9vbHRpcE9mZnNldFgnLCAxMCk7DQogICAgICAgICAgICB0aGlzLnRvb2x0aXBPZmZzZXRZID0gb3B0aW9ucy5nZXQoJ3Rvb2x0aXBPZmZzZXRZJywgMTIpOw0KICAgICAgICAgICAgdGhpcy5kaXNwbGF5T25MZWZ0ICA9IG9wdGlvbnMuZ2V0KCd0b29sVGlwUG9zaXRpb24nKSA9PT0gJ2xlZnQnOw0KICAgICAgICAgICAgLy8gcmVtb3ZlIGFueSBwcmV2aW91cyBsaW5nZXJpbmcgdG9vbHRpcA0KICAgICAgICAgICAgJCgnI2pxc3NpemV0aXAnKS5yZW1vdmUoKTsNCiAgICAgICAgICAgICQoJyNqcXN0b29sdGlwJykucmVtb3ZlKCk7DQogICAgICAgICAgICB0aGlzLnNpemV0aXAgPSAkKCc8ZGl2Lz4nLCB7DQogICAgICAgICAgICAgICAgaWQ6ICdqcXNzaXpldGlwJywNCiAgICAgICAgICAgICAgICBzdHlsZTogc2l6ZXRpcFN0eWxlLA0KICAgICAgICAgICAgICAgICdjbGFzcyc6IHRvb2x0aXBDbGFzc25hbWUNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgdGhpcy50b29sdGlwID0gJCgnPGRpdi8+Jywgew0KICAgICAgICAgICAgICAgIGlkOiAnanFzdG9vbHRpcCcsDQogICAgICAgICAgICAgICAgJ2NsYXNzJzogdG9vbHRpcENsYXNzbmFtZQ0KICAgICAgICAgICAgfSkuYXBwZW5kVG8odGhpcy5jb250YWluZXIpOw0KICAgICAgICAgICAgLy8gYWNjb3VudCBmb3IgdGhlIGNvbnRhaW5lcidzIGxvY2F0aW9uDQogICAgICAgICAgICBvZmZzZXQgPSB0aGlzLnRvb2x0aXAub2Zmc2V0KCk7DQogICAgICAgICAgICB0aGlzLm9mZnNldExlZnQgPSBvZmZzZXQubGVmdDsNCiAgICAgICAgICAgIHRoaXMub2Zmc2V0VG9wID0gb2Zmc2V0LnRvcDsNCiAgICAgICAgICAgIHRoaXMuaGlkZGVuID0gdHJ1ZTsNCiAgICAgICAgICAgICQod2luZG93KS51bmJpbmQoJ3Jlc2l6ZS5qcXMgc2Nyb2xsLmpxcycpOw0KICAgICAgICAgICAgJCh3aW5kb3cpLmJpbmQoJ3Jlc2l6ZS5qcXMgc2Nyb2xsLmpxcycsICQucHJveHkodGhpcy51cGRhdGVXaW5kb3dEaW1zLCB0aGlzKSk7DQogICAgICAgICAgICB0aGlzLnVwZGF0ZVdpbmRvd0RpbXMoKTsNCiAgICAgICAgfSwNCg0KICAgICAgICB1cGRhdGVXaW5kb3dEaW1zOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB0aGlzLnNjcm9sbFRvcCA9ICQod2luZG93KS5zY3JvbGxUb3AoKTsNCiAgICAgICAgICAgIHRoaXMuc2Nyb2xsTGVmdCA9ICQod2luZG93KS5zY3JvbGxMZWZ0KCk7DQogICAgICAgICAgICB0aGlzLnNjcm9sbFJpZ2h0ID0gdGhpcy5zY3JvbGxMZWZ0ICsgJCh3aW5kb3cpLndpZHRoKCk7DQogICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgZ2V0U2l6ZTogZnVuY3Rpb24gKGNvbnRlbnQpIHsNCiAgICAgICAgICAgIHRoaXMuc2l6ZXRpcC5odG1sKGNvbnRlbnQpLmFwcGVuZFRvKHRoaXMuY29udGFpbmVyKTsNCiAgICAgICAgICAgIHZhciBscGFkZGluZyA9IHBhcnNlSW50KHRoaXMuc2l6ZXRpcC5jc3MoJ3BhZGRpbmctbGVmdCcpLCAxMCk7DQogICAgICAgICAgICB2YXIgcnBhZGRpbmcgPSBwYXJzZUludCh0aGlzLnNpemV0aXAuY3NzKCdwYWRkaW5nLXJpZ2h0JyksIDEwKTsNCiAgICAgICAgICAgIHRoaXMucGFkZGluZyA9IGxwYWRkaW5nICsgcnBhZGRpbmcgKyAxOw0KICAgICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMuc2l6ZXRpcC53aWR0aCgpICsgMTsNCiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5zaXpldGlwLmhlaWdodCgpOw0KICAgICAgICAgICAgdGhpcy5zaXpldGlwLnJlbW92ZSgpOw0KICAgICAgICB9LA0KDQogICAgICAgIHNldENvbnRlbnQ6IGZ1bmN0aW9uIChjb250ZW50KSB7DQogICAgICAgICAgICBpZiAoIWNvbnRlbnQpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpOw0KICAgICAgICAgICAgICAgIHRoaXMuaGlkZGVuID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmdldFNpemUoY29udGVudCk7DQogICAgICAgICAgICB0aGlzLnRvb2x0aXAuaHRtbChjb250ZW50KQ0KICAgICAgICAgICAgICAgIC5jc3Moew0KICAgICAgICAgICAgICAgICAgICAnd2lkdGgnOiB0aGlzLndpZHRoLA0KICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0JzogdGhpcy5oZWlnaHQsDQogICAgICAgICAgICAgICAgICAgICd2aXNpYmlsaXR5JzogJ3Zpc2libGUnDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBpZiAodGhpcy5oaWRkZW4pIHsNCiAgICAgICAgICAgICAgICB0aGlzLmhpZGRlbiA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCg0KICAgICAgICB1cGRhdGVQb3NpdGlvbjogZnVuY3Rpb24gKHgsIHkpIHsNCiAgICAgICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5tb3VzZXggPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHggPSB0aGlzLm1vdXNleCAtIHRoaXMub2Zmc2V0TGVmdDsNCiAgICAgICAgICAgICAgICB5ID0gdGhpcy5tb3VzZXkgLSB0aGlzLm9mZnNldFRvcDsNCg0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aGlzLm1vdXNleCA9IHggPSB4IC0gdGhpcy5vZmZzZXRMZWZ0Ow0KICAgICAgICAgICAgICAgIHRoaXMubW91c2V5ID0geSA9IHkgLSB0aGlzLm9mZnNldFRvcDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICghdGhpcy5oZWlnaHQgfHwgIXRoaXMud2lkdGggfHwgdGhpcy5oaWRkZW4pIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHkgLT0gdGhpcy5oZWlnaHQgKyB0aGlzLnRvb2x0aXBPZmZzZXRZOw0KICAgICAgICAgICAgaWYgKHkgPCB0aGlzLnNjcm9sbFRvcCkgew0KICAgICAgICAgICAgICAgIHkgPSB0aGlzLnNjcm9sbFRvcDsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHRoaXMuZGlzcGxheU9uTGVmdCkgew0KICAgICAgICAgICAgICAgIHggLT0gdGhpcy50b29sdGlwT2Zmc2V0WCArIHRoaXMud2lkdGggKyB0aGlzLnBhZGRpbmc7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHggKz0gdGhpcy50b29sdGlwT2Zmc2V0WDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh4IDwgdGhpcy5zY3JvbGxMZWZ0KSB7DQogICAgICAgICAgICAgICAgeCA9IHRoaXMuc2Nyb2xsTGVmdDsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoeCArIHRoaXMud2lkdGggPiB0aGlzLnNjcm9sbFJpZ2h0KSB7DQogICAgICAgICAgICAgICAgeCA9IHRoaXMuc2Nyb2xsUmlnaHQgLSB0aGlzLndpZHRoOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0aGlzLnRvb2x0aXAuY3NzKHsNCiAgICAgICAgICAgICAgICAnbGVmdCc6IHgsDQogICAgICAgICAgICAgICAgJ3RvcCc6IHkNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9LA0KDQogICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdGhpcy50b29sdGlwLnJlbW92ZSgpOw0KICAgICAgICAgICAgdGhpcy5zaXpldGlwLnJlbW92ZSgpOw0KICAgICAgICAgICAgdGhpcy5zaXpldGlwID0gdGhpcy50b29sdGlwID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgJCh3aW5kb3cpLnVuYmluZCgncmVzaXplLmpxcyBzY3JvbGwuanFzJyk7DQogICAgICAgIH0NCiAgICB9KTsNCg0KDQogICAgaW5pdFN0eWxlcyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBhZGRDU1MoZGVmYXVsdFN0eWxlcyk7DQogICAgfTsNCg0KICAgICQoaW5pdFN0eWxlcyk7DQoNCiAgICBwZW5kaW5nID0gW107DQogICAgJC5mbi5zcGFya2xpbmUgPSBmdW5jdGlvbiAodXNlclZhbHVlcywgdXNlck9wdGlvbnMpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IG5ldyAkLmZuLnNwYXJrbGluZS5vcHRpb25zKHRoaXMsIHVzZXJPcHRpb25zKSwNCiAgICAgICAgICAgICAgICAgJHRoaXMgPSAkKHRoaXMpLA0KICAgICAgICAgICAgICAgICByZW5kZXIsIGk7DQogICAgICAgICAgICByZW5kZXIgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgdmFyIHZhbHVlcywgd2lkdGgsIGhlaWdodCwgdG1wLCBtaGFuZGxlciwgc3AsIHZhbHM7DQogICAgICAgICAgICAgICAgaWYgKHVzZXJWYWx1ZXMgPT09ICdodG1sJyB8fCB1c2VyVmFsdWVzID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFscyA9IHRoaXMuZ2V0QXR0cmlidXRlKG9wdGlvbnMuZ2V0KCd0YWdWYWx1ZXNBdHRyaWJ1dGUnKSk7DQogICAgICAgICAgICAgICAgICAgIGlmICh2YWxzID09PSB1bmRlZmluZWQgfHwgdmFscyA9PT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFscyA9ICR0aGlzLmh0bWwoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWxzLnJlcGxhY2UoLyheXHMqPCEtLSl8KC0tPlxzKiQpfFxzKy9nLCAnJykuc3BsaXQoJywnKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB1c2VyVmFsdWVzOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHdpZHRoID0gb3B0aW9ucy5nZXQoJ3dpZHRoJykgPT09ICdhdXRvJyA/IHZhbHVlcy5sZW5ndGggKiBvcHRpb25zLmdldCgnZGVmYXVsdFBpeGVsc1BlclZhbHVlJykgOiBvcHRpb25zLmdldCgnd2lkdGgnKTsNCiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ2hlaWdodCcpID09PSAnYXV0bycpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmdldCgnY29tcG9zaXRlJykgfHwgISQuZGF0YSh0aGlzLCAnX2pxc192Y2FudmFzJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgYSBiZXR0ZXIgd2F5IHRvIGdldCB0aGUgbGluZSBoZWlnaHQNCiAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRtcC5pbm5lckhUTUwgPSAnYSc7DQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy5odG1sKHRtcCk7DQogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAkKHRtcCkuaW5uZXJIZWlnaHQoKSB8fCAkKHRtcCkuaGVpZ2h0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAkKHRtcCkucmVtb3ZlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gb3B0aW9ucy5nZXQoJ2hlaWdodCcpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5nZXQoJ2Rpc2FibGVJbnRlcmFjdGlvbicpKSB7DQogICAgICAgICAgICAgICAgICAgIG1oYW5kbGVyID0gJC5kYXRhKHRoaXMsICdfanFzX21oYW5kbGVyJyk7DQogICAgICAgICAgICAgICAgICAgIGlmICghbWhhbmRsZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1oYW5kbGVyID0gbmV3IE1vdXNlSGFuZGxlcih0aGlzLCBvcHRpb25zKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICQuZGF0YSh0aGlzLCAnX2pxc19taGFuZGxlcicsIG1oYW5kbGVyKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghb3B0aW9ucy5nZXQoJ2NvbXBvc2l0ZScpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBtaGFuZGxlci5yZXNldCgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgbWhhbmRsZXIgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ2NvbXBvc2l0ZScpICYmICEkLmRhdGEodGhpcywgJ19qcXNfdmNhbnZhcycpKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghJC5kYXRhKHRoaXMsICdfanFzX2Vycm5vdGlmeScpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhbGVydCgnQXR0ZW1wdGVkIHRvIGF0dGFjaCBhIGNvbXBvc2l0ZSBzcGFya2xpbmUgdG8gYW4gZWxlbWVudCB3aXRoIG5vIGV4aXN0aW5nIHNwYXJrbGluZScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgJC5kYXRhKHRoaXMsICdfanFzX2Vycm5vdGlmeScsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBzcCA9IG5ldyAkLmZuLnNwYXJrbGluZVtvcHRpb25zLmdldCgndHlwZScpXSh0aGlzLCB2YWx1ZXMsIG9wdGlvbnMsIHdpZHRoLCBoZWlnaHQpOw0KDQogICAgICAgICAgICAgICAgc3AucmVuZGVyKCk7DQoNCiAgICAgICAgICAgICAgICBpZiAobWhhbmRsZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgbWhhbmRsZXIucmVnaXN0ZXJTcGFya2xpbmUoc3ApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBpZiAoKCQodGhpcykuaHRtbCgpICYmICFvcHRpb25zLmdldCgnZGlzYWJsZUhpZGRlbkNoZWNrJykgJiYgJCh0aGlzKS5pcygnOmhpZGRlbicpKSB8fCAhJCh0aGlzKS5wYXJlbnRzKCdib2R5JykubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmdldCgnY29tcG9zaXRlJykgJiYgJC5kYXRhKHRoaXMsICdfanFzX3BlbmRpbmcnKSkgew0KICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgYW55IGV4aXN0aW5nIHJlZmVyZW5jZXMgdG8gdGhlIGVsZW1lbnQNCiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gcGVuZGluZy5sZW5ndGg7IGk7IGktLSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdbaSAtIDFdWzBdID09IHRoaXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLnNwbGljZShpIC0gMSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcGVuZGluZy5wdXNoKFt0aGlzLCByZW5kZXJdKTsNCiAgICAgICAgICAgICAgICAkLmRhdGEodGhpcywgJ19qcXNfcGVuZGluZycsIHRydWUpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZW5kZXIuY2FsbCh0aGlzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfTsNCg0KICAgICQuZm4uc3BhcmtsaW5lLmRlZmF1bHRzID0gZ2V0RGVmYXVsdHMoKTsNCg0KDQogICAgJC5zcGFya2xpbmVfZGlzcGxheV92aXNpYmxlID0gZnVuY3Rpb24gKCkgew0KICAgICAgICB2YXIgZWwsIGksIHBsOw0KICAgICAgICB2YXIgZG9uZSA9IFtdOw0KICAgICAgICBmb3IgKGkgPSAwLCBwbCA9IHBlbmRpbmcubGVuZ3RoOyBpIDwgcGw7IGkrKykgew0KICAgICAgICAgICAgZWwgPSBwZW5kaW5nW2ldWzBdOw0KICAgICAgICAgICAgaWYgKCQoZWwpLmlzKCc6dmlzaWJsZScpICYmICEkKGVsKS5wYXJlbnRzKCkuaXMoJzpoaWRkZW4nKSkgew0KICAgICAgICAgICAgICAgIHBlbmRpbmdbaV1bMV0uY2FsbChlbCk7DQogICAgICAgICAgICAgICAgJC5kYXRhKHBlbmRpbmdbaV1bMF0sICdfanFzX3BlbmRpbmcnLCBmYWxzZSk7DQogICAgICAgICAgICAgICAgZG9uZS5wdXNoKGkpOw0KICAgICAgICAgICAgfSBlbHNlIGlmICghJChlbCkuY2xvc2VzdCgnaHRtbCcpLmxlbmd0aCAmJiAhJC5kYXRhKGVsLCAnX2pxc19wZW5kaW5nJykpIHsNCiAgICAgICAgICAgICAgICAvLyBlbGVtZW50IGhhcyBiZWVuIGluc2VydGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIERPTQ0KICAgICAgICAgICAgICAgIC8vIElmIGl0IHdhcyBub3QgeWV0IGluc2VydGVkIGludG8gdGhlIGRvbSB0aGVuIHRoZSAuZGF0YSByZXF1ZXN0DQogICAgICAgICAgICAgICAgLy8gd2lsbCByZXR1cm4gdHJ1ZS4NCiAgICAgICAgICAgICAgICAvLyByZW1vdmluZyBmcm9tIHRoZSBkb20gY2F1c2VzIHRoZSBkYXRhIHRvIGJlIHJlbW92ZWQuDQogICAgICAgICAgICAgICAgJC5kYXRhKHBlbmRpbmdbaV1bMF0sICdfanFzX3BlbmRpbmcnLCBmYWxzZSk7DQogICAgICAgICAgICAgICAgZG9uZS5wdXNoKGkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAoaSA9IGRvbmUubGVuZ3RoOyBpOyBpLS0pIHsNCiAgICAgICAgICAgIHBlbmRpbmcuc3BsaWNlKGRvbmVbaSAtIDFdLCAxKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCg0KICAgIC8qKg0KICAgICAqIFVzZXIgb3B0aW9uIGhhbmRsZXINCiAgICAgKi8NCiAgICAkLmZuLnNwYXJrbGluZS5vcHRpb25zID0gY3JlYXRlQ2xhc3Moew0KICAgICAgICBpbml0OiBmdW5jdGlvbiAodGFnLCB1c2VyT3B0aW9ucykgew0KICAgICAgICAgICAgdmFyIGV4dGVuZGVkT3B0aW9ucywgZGVmYXVsdHMsIGJhc2UsIHRhZ09wdGlvblR5cGU7DQogICAgICAgICAgICB0aGlzLnVzZXJPcHRpb25zID0gdXNlck9wdGlvbnMgPSB1c2VyT3B0aW9ucyB8fCB7fTsNCiAgICAgICAgICAgIHRoaXMudGFnID0gdGFnOw0KICAgICAgICAgICAgdGhpcy50YWdWYWxDYWNoZSA9IHt9Ow0KICAgICAgICAgICAgZGVmYXVsdHMgPSAkLmZuLnNwYXJrbGluZS5kZWZhdWx0czsNCiAgICAgICAgICAgIGJhc2UgPSBkZWZhdWx0cy5jb21tb247DQogICAgICAgICAgICB0aGlzLnRhZ09wdGlvbnNQcmVmaXggPSB1c2VyT3B0aW9ucy5lbmFibGVUYWdPcHRpb25zICYmICh1c2VyT3B0aW9ucy50YWdPcHRpb25zUHJlZml4IHx8IGJhc2UudGFnT3B0aW9uc1ByZWZpeCk7DQoNCiAgICAgICAgICAgIHRhZ09wdGlvblR5cGUgPSB0aGlzLmdldFRhZ1NldHRpbmcoJ3R5cGUnKTsNCiAgICAgICAgICAgIGlmICh0YWdPcHRpb25UeXBlID09PSBVTlNFVF9PUFRJT04pIHsNCiAgICAgICAgICAgICAgICBleHRlbmRlZE9wdGlvbnMgPSBkZWZhdWx0c1t1c2VyT3B0aW9ucy50eXBlIHx8IGJhc2UudHlwZV07DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGV4dGVuZGVkT3B0aW9ucyA9IGRlZmF1bHRzW3RhZ09wdGlvblR5cGVdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5tZXJnZWRPcHRpb25zID0gJC5leHRlbmQoe30sIGJhc2UsIGV4dGVuZGVkT3B0aW9ucywgdXNlck9wdGlvbnMpOw0KICAgICAgICB9LA0KDQoNCiAgICAgICAgZ2V0VGFnU2V0dGluZzogZnVuY3Rpb24gKGtleSkgew0KICAgICAgICAgICAgdmFyIHByZWZpeCA9IHRoaXMudGFnT3B0aW9uc1ByZWZpeCwNCiAgICAgICAgICAgICAgICB2YWwsIGksIHBhaXJzLCBrZXl2YWw7DQogICAgICAgICAgICBpZiAocHJlZml4ID09PSBmYWxzZSB8fCBwcmVmaXggPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgIHJldHVybiBVTlNFVF9PUFRJT047DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodGhpcy50YWdWYWxDYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7DQogICAgICAgICAgICAgICAgdmFsID0gdGhpcy50YWdWYWxDYWNoZS5rZXk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhbCA9IHRoaXMudGFnLmdldEF0dHJpYnV0ZShwcmVmaXggKyBrZXkpOw0KICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCB2YWwgPT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFsID0gVU5TRVRfT1BUSU9OOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsLnN1YnN0cigwLCAxKSA9PT0gJ1snKSB7DQogICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zdWJzdHIoMSwgdmFsLmxlbmd0aCAtIDIpLnNwbGl0KCcsJyk7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IHZhbC5sZW5ndGg7IGktLTspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbFtpXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbFtpXS5yZXBsYWNlKC8oXlxzKil8KFxzKiQpL2csICcnKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbC5zdWJzdHIoMCwgMSkgPT09ICd7Jykgew0KICAgICAgICAgICAgICAgICAgICBwYWlycyA9IHZhbC5zdWJzdHIoMSwgdmFsLmxlbmd0aCAtIDIpLnNwbGl0KCcsJyk7DQogICAgICAgICAgICAgICAgICAgIHZhbCA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBwYWlycy5sZW5ndGg7IGktLTspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGtleXZhbCA9IHBhaXJzW2ldLnNwbGl0KCc6JywgMik7DQogICAgICAgICAgICAgICAgICAgICAgICB2YWxba2V5dmFsWzBdLnJlcGxhY2UoLyheXHMqKXwoXHMqJCkvZywgJycpXSA9IG5vcm1hbGl6ZVZhbHVlKGtleXZhbFsxXS5yZXBsYWNlKC8oXlxzKil8KFxzKiQpL2csICcnKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB2YWwgPSBub3JtYWxpemVWYWx1ZSh2YWwpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0aGlzLnRhZ1ZhbENhY2hlLmtleSA9IHZhbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB2YWw7DQogICAgICAgIH0sDQoNCiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoa2V5LCBkZWZhdWx0dmFsKSB7DQogICAgICAgICAgICB2YXIgdGFnT3B0aW9uID0gdGhpcy5nZXRUYWdTZXR0aW5nKGtleSksDQogICAgICAgICAgICAgICAgcmVzdWx0Ow0KICAgICAgICAgICAgaWYgKHRhZ09wdGlvbiAhPT0gVU5TRVRfT1BUSU9OKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRhZ09wdGlvbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAocmVzdWx0ID0gdGhpcy5tZXJnZWRPcHRpb25zW2tleV0pID09PSB1bmRlZmluZWQgPyBkZWZhdWx0dmFsIDogcmVzdWx0Ow0KICAgICAgICB9DQogICAgfSk7DQoNCg0KICAgICQuZm4uc3BhcmtsaW5lLl9iYXNlID0gY3JlYXRlQ2xhc3Moew0KICAgICAgICBkaXNhYmxlZDogZmFsc2UsDQoNCiAgICAgICAgaW5pdDogZnVuY3Rpb24gKGVsLCB2YWx1ZXMsIG9wdGlvbnMsIHdpZHRoLCBoZWlnaHQpIHsNCiAgICAgICAgICAgIHRoaXMuZWwgPSBlbDsNCiAgICAgICAgICAgIHRoaXMuJGVsID0gJChlbCk7DQogICAgICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlczsNCiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7DQogICAgICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7DQogICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFJlZ2lvbiA9IHVuZGVmaW5lZDsNCiAgICAgICAgfSwNCg0KICAgICAgICAvKioNCiAgICAgICAgICogU2V0dXAgdGhlIGNhbnZhcw0KICAgICAgICAgKi8NCiAgICAgICAgaW5pdFRhcmdldDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIGludGVyYWN0aXZlID0gIXRoaXMub3B0aW9ucy5nZXQoJ2Rpc2FibGVJbnRlcmFjdGlvbicpOw0KICAgICAgICAgICAgaWYgKCEodGhpcy50YXJnZXQgPSB0aGlzLiRlbC5zaW1wbGVkcmF3KHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCB0aGlzLm9wdGlvbnMuZ2V0KCdjb21wb3NpdGUnKSwgaW50ZXJhY3RpdmUpKSkgew0KICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1dpZHRoID0gdGhpcy50YXJnZXQucGl4ZWxXaWR0aDsNCiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc0hlaWdodCA9IHRoaXMudGFyZ2V0LnBpeGVsSGVpZ2h0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIC8qKg0KICAgICAgICAgKiBTZXR1cCBjb2xvck1hcCBmcm9tIG9wdGlvbnMNCiAgICAgICAgICovDQogICAgICAgIGluaXRDb2xvck1hcDogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgY29sb3JNYXAgPSB0aGlzLm9wdGlvbnMuZ2V0KCdjb2xvck1hcCcpOw0KICAgICAgICAgICAgaWYgKCQuaXNGdW5jdGlvbihjb2xvck1hcCkpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmNvbG9yTWFwRnVuY3Rpb24gPSBjb2xvck1hcDsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoJC5pc0FycmF5KGNvbG9yTWFwKSkgew0KICAgICAgICAgICAgICAgIHRoaXMuY29sb3JNYXBGdW5jdGlvbiA9IGZ1bmN0aW9uKHNwYXJrbGluZSwgb3B0aW9ucywgaW5kZXgsIHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IGNvbG9yTWFwLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yTWFwW2luZGV4XTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHVuZGVmaW5lZA0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNvbG9yTWFwKSB7DQogICAgICAgICAgICAgICAgaWYgKGNvbG9yTWFwLmdldCA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yTWFwID0gbmV3IFJhbmdlTWFwKGNvbG9yTWFwKTsgDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoaXMuY29sb3JNYXBGdW5jdGlvbiA9IGZ1bmN0aW9uKHNwYXJrbGluZSwgb3B0aW9ucywgaW5kZXgsIHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvck1hcC5nZXQodmFsdWUpOw0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICAgICAgLyoqDQogICAgICAgICAqIEFjdHVhbGx5IHJlbmRlciB0aGUgY2hhcnQgdG8gdGhlIGNhbnZhcw0KICAgICAgICAgKi8NCiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgew0KICAgICAgICAgICAgICAgIHRoaXMuZWwuaW5uZXJIVE1MID0gJyc7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0sDQoNCiAgICAgICAgLyoqDQogICAgICAgICAqIFJldHVybiBhIHJlZ2lvbiBpZCBmb3IgYSBnaXZlbiB4L3kgY28tb3JkaW5hdGUNCiAgICAgICAgICovDQogICAgICAgIGdldFJlZ2lvbjogZnVuY3Rpb24gKHgsIHkpIHsNCiAgICAgICAgfSwNCg0KICAgICAgICAvKioNCiAgICAgICAgICogSGlnaGxpZ2h0IGFuIGl0ZW0gYmFzZWQgb24gdGhlIG1vdXNlZC1vdmVyIHgseSBjby1vcmRpbmF0ZQ0KICAgICAgICAgKi8NCiAgICAgICAgc2V0UmVnaW9uSGlnaGxpZ2h0OiBmdW5jdGlvbiAoZWwsIHgsIHkpIHsNCiAgICAgICAgICAgIHZhciBjdXJyZW50UmVnaW9uID0gdGhpcy5jdXJyZW50UmVnaW9uLA0KICAgICAgICAgICAgICAgIGhpZ2hsaWdodEVuYWJsZWQgPSAhdGhpcy5vcHRpb25zLmdldCgnZGlzYWJsZUhpZ2hsaWdodCcpLA0KICAgICAgICAgICAgICAgIG5ld1JlZ2lvbjsNCiAgICAgICAgICAgIC8vIENVU1RPTSBNT0Q6IHByb3BlciBob3ZlciBkZXRlY3Rpb24gY29uc2lkZXJpbmcgcGFkZGluZyBhcyB3ZWxsDQogICAgICAgICAgICB2YXIgY1cgPSAkKCdjYW52YXMnLHRoaXMuZWwpLndpZHRoKCkgKyBwYXJzZUludCgkKCdjYW52YXMnLHRoaXMuZWwpLmNzcygncGFkZGluZy1sZWZ0JykpICsgcGFyc2VJbnQoJCgnY2FudmFzJyx0aGlzLmVsKS5jc3MoJ3BhZGRpbmctcmlnaHQnKSkNCiAgICAgICAgICAgIC8vIGlmICh4ID4gdGhpcy5jYW52YXNXaWR0aCB8fCB5ID4gdGhpcy5jYW52YXNIZWlnaHQgfHwgeCA8IDAgfHwgeSA8IDApIHsNCiAgICAgICAgICAgIGlmICh4ID4gY1cgfHwgeSA+IHRoaXMuY2FudmFzSGVpZ2h0IHx8IHggPCAwIHx8IHkgPCAwKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBuZXdSZWdpb24gPSB0aGlzLmdldFJlZ2lvbihlbCwgeCwgeSk7DQogICAgICAgICAgICBpZiAoY3VycmVudFJlZ2lvbiAhPT0gbmV3UmVnaW9uKSB7DQogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRSZWdpb24gIT09IHVuZGVmaW5lZCAmJiBoaWdobGlnaHRFbmFibGVkKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFJlZ2lvbiA9IG5ld1JlZ2lvbjsNCiAgICAgICAgICAgICAgICBpZiAobmV3UmVnaW9uICE9PSB1bmRlZmluZWQgJiYgaGlnaGxpZ2h0RW5hYmxlZCkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckhpZ2hsaWdodCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfSwNCg0KICAgICAgICAvKioNCiAgICAgICAgICogUmVzZXQgYW55IGN1cnJlbnRseSBoaWdobGlnaHRlZCBpdGVtDQogICAgICAgICAqLw0KICAgICAgICBjbGVhclJlZ2lvbkhpZ2hsaWdodDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFJlZ2lvbiAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHQoKTsNCiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRSZWdpb24gPSB1bmRlZmluZWQ7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0sDQoNCiAgICAgICAgcmVuZGVySGlnaGxpZ2h0OiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB0aGlzLmNoYW5nZUhpZ2hsaWdodCh0cnVlKTsNCiAgICAgICAgfSwNCg0KICAgICAgICByZW1vdmVIaWdobGlnaHQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHRoaXMuY2hhbmdlSGlnaGxpZ2h0KGZhbHNlKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBjaGFuZ2VIaWdobGlnaHQ6IGZ1bmN0aW9uIChoaWdobGlnaHQpICB7fSwNCg0KICAgICAgICAvKioNCiAgICAgICAgICogRmV0Y2ggdGhlIEhUTUwgdG8gZGlzcGxheSBhcyBhIHRvb2x0aXANCiAgICAgICAgICovDQogICAgICAgIGdldEN1cnJlbnRSZWdpb25Ub29sdGlwOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywNCiAgICAgICAgICAgICAgICBoZWFkZXIgPSAnJywNCiAgICAgICAgICAgICAgICBlbnRyaWVzID0gW10sDQogICAgICAgICAgICAgICAgZmllbGRzLCBmb3JtYXRzLCBmb3JtYXRsZW4sIGZjbGFzcywgdGV4dCwgaSwNCiAgICAgICAgICAgICAgICBzaG93RmllbGRzLCBzaG93RmllbGRzS2V5LCBuZXdGaWVsZHMsIGZ2LA0KICAgICAgICAgICAgICAgIGZvcm1hdHRlciwgZm9ybWF0LCBmaWVsZGxlbiwgaiwNCiAgICAgICAgICAgICAgICBsYWJlbF9wcmVmaXgsIGxhYmVsX3N1ZmZpeDsNCiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRSZWdpb24gPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgIHJldHVybiAnJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZpZWxkcyA9IHRoaXMuZ2V0Q3VycmVudFJlZ2lvbkZpZWxkcygpOw0KICAgICAgICAgICAgZm9ybWF0dGVyID0gb3B0aW9ucy5nZXQoJ3Rvb2x0aXBGb3JtYXR0ZXInKTsNCiAgICAgICAgICAgIGlmIChmb3JtYXR0ZXIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0dGVyKHRoaXMsIG9wdGlvbnMsIGZpZWxkcyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ3Rvb2x0aXBDaGFydFRpdGxlJykpIHsNCiAgICAgICAgICAgICAgICBoZWFkZXIgKz0gJzxkaXYgY2xhc3M9ImpxcyBqcXN0aXRsZSI+JyArIG9wdGlvbnMuZ2V0KCd0b29sdGlwQ2hhcnRUaXRsZScpICsgJzwvZGl2PlxuJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvcm1hdHMgPSB0aGlzLm9wdGlvbnMuZ2V0KCd0b29sdGlwRm9ybWF0Jyk7DQogICAgICAgICAgICBpZiAoIWZvcm1hdHMpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gJyc7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoISQuaXNBcnJheShmb3JtYXRzKSkgew0KICAgICAgICAgICAgICAgIGZvcm1hdHMgPSBbZm9ybWF0c107DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoISQuaXNBcnJheShmaWVsZHMpKSB7DQogICAgICAgICAgICAgICAgZmllbGRzID0gW2ZpZWxkc107DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzaG93RmllbGRzID0gdGhpcy5vcHRpb25zLmdldCgndG9vbHRpcEZvcm1hdEZpZWxkbGlzdCcpOw0KICAgICAgICAgICAgc2hvd0ZpZWxkc0tleSA9IHRoaXMub3B0aW9ucy5nZXQoJ3Rvb2x0aXBGb3JtYXRGaWVsZGxpc3RLZXknKTsNCiAgICAgICAgICAgIGlmIChzaG93RmllbGRzICYmIHNob3dGaWVsZHNLZXkpIHsNCiAgICAgICAgICAgICAgICAvLyB1c2VyLXNlbGVjdGVkIG9yZGVyaW5nIG9mIGZpZWxkcw0KICAgICAgICAgICAgICAgIG5ld0ZpZWxkcyA9IFtdOw0KICAgICAgICAgICAgICAgIGZvciAoaSA9IGZpZWxkcy5sZW5ndGg7IGktLTspIHsNCiAgICAgICAgICAgICAgICAgICAgZnYgPSBmaWVsZHNbaV1bc2hvd0ZpZWxkc0tleV07DQogICAgICAgICAgICAgICAgICAgIGlmICgoaiA9ICQuaW5BcnJheShmdiwgc2hvd0ZpZWxkcykpICE9IC0xKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBuZXdGaWVsZHNbal0gPSBmaWVsZHNbaV07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZmllbGRzID0gbmV3RmllbGRzOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9ybWF0bGVuID0gZm9ybWF0cy5sZW5ndGg7DQogICAgICAgICAgICBmaWVsZGxlbiA9IGZpZWxkcy5sZW5ndGg7DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZm9ybWF0bGVuOyBpKyspIHsNCiAgICAgICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXRzW2ldOw0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm9ybWF0ID09PSAnc3RyaW5nJykgew0KICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBuZXcgU1BGb3JtYXQoZm9ybWF0KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZmNsYXNzID0gZm9ybWF0LmZjbGFzcyB8fCAnanFzZmllbGQnOw0KDQogICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGZpZWxkbGVuOyBqKyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZHNbal0uaXNOdWxsIHx8ICFvcHRpb25zLmdldCgndG9vbHRpcFNraXBOdWxsJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX3ByZWZpeCA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfc3VmZml4ID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ3Rvb2x0aXBQcmVmaXhCaW5MYWJlbHMnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChvcHRpb25zLmdldCgndG9vbHRpcFByZWZpeEJpbkxhYmVscycpLmxlbmd0aCA+IGZpZWxkc1tqXS5vZmZzZXQpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfcHJlZml4ID0gb3B0aW9ucy5nZXQoJ3Rvb2x0aXBQcmVmaXhCaW5MYWJlbHMnKVtmaWVsZHNbal0ub2Zmc2V0XTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmdldCgndG9vbHRpcFN1ZmZpeEJpbkxhYmVscycpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG9wdGlvbnMuZ2V0KCd0b29sdGlwU3VmZml4QmluTGFiZWxzJykubGVuZ3RoID4gZmllbGRzW2pdLm9mZnNldCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9zdWZmaXggPSBvcHRpb25zLmdldCgndG9vbHRpcFN1ZmZpeEJpbkxhYmVscycpW2ZpZWxkc1tqXS5vZmZzZXRdOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgJC5leHRlbmQoZmllbGRzW2pdLCB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4OiBsYWJlbF9wcmVmaXggKyBvcHRpb25zLmdldCgndG9vbHRpcFByZWZpeCcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeDogb3B0aW9ucy5nZXQoJ3Rvb2x0aXBTdWZmaXgnKSArIGxhYmVsX3N1ZmZpeA0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBmb3JtYXQucmVuZGVyKGZpZWxkc1tqXSwgb3B0aW9ucy5nZXQoJ3Rvb2x0aXBWYWx1ZUxvb2t1cHMnKSwgb3B0aW9ucyk7DQogICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goJzxkaXYgY2xhc3M9IicgKyBmY2xhc3MgKyAnIj4nICsgdGV4dCArICc8L2Rpdj4nKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgIHJldHVybiBoZWFkZXIgKyBlbnRyaWVzLmpvaW4oJ1xuJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gJyc7DQogICAgICAgIH0sDQoNCiAgICAgICAgZ2V0Q3VycmVudFJlZ2lvbkZpZWxkczogZnVuY3Rpb24gKCkge30sDQoNCiAgICAgICAgY2FsY0hpZ2hsaWdodENvbG9yOiBmdW5jdGlvbiAoY29sb3IsIG9wdGlvbnMpIHsNCiAgICAgICAgICAgIHZhciBoaWdobGlnaHRDb2xvciA9IG9wdGlvbnMuZ2V0KCdoaWdobGlnaHRDb2xvcicpLA0KICAgICAgICAgICAgICAgIGxpZ2h0ZW4gPSBvcHRpb25zLmdldCgnaGlnaGxpZ2h0TGlnaHRlbicpLA0KICAgICAgICAgICAgICAgIHBhcnNlLCBtdWx0LCByZ2JuZXcsIGk7DQogICAgICAgICAgICBpZiAoaGlnaGxpZ2h0Q29sb3IpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gaGlnaGxpZ2h0Q29sb3I7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobGlnaHRlbikgew0KICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgUkdCIHZhbHVlcw0KICAgICAgICAgICAgICAgIHBhcnNlID0gL14jKFswLTlhLWZdKShbMC05YS1mXSkoWzAtOWEtZl0pJC9pLmV4ZWMoY29sb3IpIHx8IC9eIyhbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KSQvaS5leGVjKGNvbG9yKTsNCiAgICAgICAgICAgICAgICBpZiAocGFyc2UpIHsNCiAgICAgICAgICAgICAgICAgICAgcmdibmV3ID0gW107DQogICAgICAgICAgICAgICAgICAgIG11bHQgPSBjb2xvci5sZW5ndGggPT09IDQgPyAxNiA6IDE7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJnYm5ld1tpXSA9IGNsaXB2YWwoTWF0aC5yb3VuZChwYXJzZUludChwYXJzZVtpICsgMV0sIDE2KSAqIG11bHQgKiBsaWdodGVuKSwgMCwgMjU1KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3JnYignICsgcmdibmV3LmpvaW4oJywnKSArICcpJzsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBjb2xvcjsNCiAgICAgICAgfQ0KDQogICAgfSk7DQoNCiAgICBiYXJIaWdobGlnaHRNaXhpbiA9IHsNCiAgICAgICAgY2hhbmdlSGlnaGxpZ2h0OiBmdW5jdGlvbiAoaGlnaGxpZ2h0KSB7DQogICAgICAgICAgICB2YXIgY3VycmVudFJlZ2lvbiA9IHRoaXMuY3VycmVudFJlZ2lvbiwNCiAgICAgICAgICAgICAgICB0YXJnZXQgPSB0aGlzLnRhcmdldCwNCiAgICAgICAgICAgICAgICBzaGFwZWlkcyA9IHRoaXMucmVnaW9uU2hhcGVzW2N1cnJlbnRSZWdpb25dLA0KICAgICAgICAgICAgICAgIG5ld1NoYXBlczsNCiAgICAgICAgICAgIC8vIHdpbGwgYmUgbnVsbCBpZiB0aGUgcmVnaW9uIHZhbHVlIHdhcyBudWxsDQogICAgICAgICAgICBpZiAoc2hhcGVpZHMgPj0gMCkgew0KICAgICAgICAgICAgICAgIG5ld1NoYXBlcyA9IHRoaXMucmVuZGVyUmVnaW9uKGN1cnJlbnRSZWdpb24sIGhpZ2hsaWdodCk7DQogICAgICAgICAgICAgICAgaWYgKCQuaXNBcnJheShuZXdTaGFwZXMpIHx8ICQuaXNBcnJheShzaGFwZWlkcykpIHsNCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnJlcGxhY2VXaXRoU2hhcGVzKHNoYXBlaWRzLCBuZXdTaGFwZXMpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lvblNoYXBlc1tjdXJyZW50UmVnaW9uXSA9ICQubWFwKG5ld1NoYXBlcywgZnVuY3Rpb24gKG5ld1NoYXBlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3U2hhcGUuaWQ7DQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHRhcmdldC5yZXBsYWNlV2l0aFNoYXBlKHNoYXBlaWRzLCBuZXdTaGFwZXMpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lvblNoYXBlc1tjdXJyZW50UmVnaW9uXSA9IG5ld1NoYXBlcy5pZDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy52YWx1ZXMsDQogICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcy50YXJnZXQsDQogICAgICAgICAgICAgICAgcmVnaW9uU2hhcGVzID0gdGhpcy5yZWdpb25TaGFwZXMsDQogICAgICAgICAgICAgICAgc2hhcGVzLCBpZHMsIGksIGo7DQoNCiAgICAgICAgICAgIGlmICghdGhpcy5jbHMuX3N1cGVyLnJlbmRlci5jYWxsKHRoaXMpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChpID0gdmFsdWVzLmxlbmd0aDsgaS0tOykgew0KICAgICAgICAgICAgICAgIHNoYXBlcyA9IHRoaXMucmVuZGVyUmVnaW9uKGkpOw0KICAgICAgICAgICAgICAgIGlmIChzaGFwZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCQuaXNBcnJheShzaGFwZXMpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZHMgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IHNoYXBlcy5sZW5ndGg7IGotLTspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZXNbal0uYXBwZW5kKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzLnB1c2goc2hhcGVzW2pdLmlkKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvblNoYXBlc1tpXSA9IGlkczsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlcy5hcHBlbmQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvblNoYXBlc1tpXSA9IHNoYXBlcy5pZDsgLy8gc3RvcmUganVzdCB0aGUgc2hhcGVpZA0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gbnVsbCB2YWx1ZQ0KICAgICAgICAgICAgICAgICAgICByZWdpb25TaGFwZXNbaV0gPSBudWxsOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRhcmdldC5yZW5kZXIoKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCg0KICAgIC8qKg0KICAgICAqIExpbmUgY2hhcnRzDQogICAgICovDQogICAgJC5mbi5zcGFya2xpbmUubGluZSA9IGxpbmUgPSBjcmVhdGVDbGFzcygkLmZuLnNwYXJrbGluZS5fYmFzZSwgew0KICAgICAgICB0eXBlOiAnbGluZScsDQoNCiAgICAgICAgaW5pdDogZnVuY3Rpb24gKGVsLCB2YWx1ZXMsIG9wdGlvbnMsIHdpZHRoLCBoZWlnaHQpIHsNCiAgICAgICAgICAgIGxpbmUuX3N1cGVyLmluaXQuY2FsbCh0aGlzLCBlbCwgdmFsdWVzLCBvcHRpb25zLCB3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgICAgIHRoaXMudmVydGljZXMgPSBbXTsNCiAgICAgICAgICAgIHRoaXMucmVnaW9uTWFwID0gW107DQogICAgICAgICAgICB0aGlzLnh2YWx1ZXMgPSBbXTsNCiAgICAgICAgICAgIHRoaXMueXZhbHVlcyA9IFtdOw0KICAgICAgICAgICAgdGhpcy55bWlubWF4ID0gW107DQogICAgICAgICAgICB0aGlzLmhpZ2h0bGlnaHRTcG90SWQgPSBudWxsOw0KICAgICAgICAgICAgdGhpcy5sYXN0U2hhcGVJZCA9IG51bGw7DQogICAgICAgICAgICB0aGlzLmluaXRUYXJnZXQoKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBnZXRSZWdpb246IGZ1bmN0aW9uIChlbCwgeCwgeSkgew0KICAgICAgICAgICAgdmFyIGksDQogICAgICAgICAgICAgICAgcmVnaW9uTWFwID0gdGhpcy5yZWdpb25NYXA7IC8vIG1hcHMgcmVnaW9ucyB0byB2YWx1ZSBwb3NpdGlvbnMNCiAgICAgICAgICAgIGZvciAoaSA9IHJlZ2lvbk1hcC5sZW5ndGg7IGktLTspIHsNCiAgICAgICAgICAgICAgICBpZiAocmVnaW9uTWFwW2ldICE9PSBudWxsICYmIHggKiB0aGlzLnRhcmdldC5yYXRpbyA+PSByZWdpb25NYXBbaV1bMF0gJiYgeCAqIHRoaXMudGFyZ2V0LnJhdGlvIDw9IHJlZ2lvbk1hcFtpXVsxXSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnaW9uTWFwW2ldWzJdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7DQogICAgICAgIH0sDQoNCiAgICAgICAgZ2V0Q3VycmVudFJlZ2lvbkZpZWxkczogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIGN1cnJlbnRSZWdpb24gPSB0aGlzLmN1cnJlbnRSZWdpb247DQogICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgIGlzTnVsbDogdGhpcy55dmFsdWVzW2N1cnJlbnRSZWdpb25dID09PSBudWxsLA0KICAgICAgICAgICAgICAgIHg6IHRoaXMueHZhbHVlc1tjdXJyZW50UmVnaW9uXSwNCiAgICAgICAgICAgICAgICB5OiB0aGlzLnl2YWx1ZXNbY3VycmVudFJlZ2lvbl0sDQogICAgICAgICAgICAgICAgY29sb3I6IHRoaXMub3B0aW9ucy5nZXQoJ2xpbmVDb2xvcicpLA0KICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogdGhpcy5vcHRpb25zLmdldCgnZmlsbENvbG9yJyksDQogICAgICAgICAgICAgICAgb2Zmc2V0OiBjdXJyZW50UmVnaW9uDQogICAgICAgICAgICB9Ow0KICAgICAgICB9LA0KDQogICAgICAgIHJlbmRlckhpZ2hsaWdodDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIGN1cnJlbnRSZWdpb24gPSB0aGlzLmN1cnJlbnRSZWdpb24sDQogICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcy50YXJnZXQsDQogICAgICAgICAgICAgICAgdmVydGV4ID0gdGhpcy52ZXJ0aWNlc1tjdXJyZW50UmVnaW9uXSwNCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLA0KICAgICAgICAgICAgICAgIHNwb3RSYWRpdXMgPSBvcHRpb25zLmdldCgnc3BvdFJhZGl1cycpLA0KICAgICAgICAgICAgICAgIGhpZ2hsaWdodFNwb3RDb2xvciA9IG9wdGlvbnMuZ2V0KCdoaWdobGlnaHRTcG90Q29sb3InKSwNCiAgICAgICAgICAgICAgICBoaWdobGlnaHRMaW5lQ29sb3IgPSBvcHRpb25zLmdldCgnaGlnaGxpZ2h0TGluZUNvbG9yJyksDQogICAgICAgICAgICAgICAgaGlnaGxpZ2h0U3BvdCwgaGlnaGxpZ2h0TGluZTsNCg0KICAgICAgICAgICAgaWYgKCF2ZXJ0ZXgpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoc3BvdFJhZGl1cyAmJiBoaWdobGlnaHRTcG90Q29sb3IpIHsNCiAgICAgICAgICAgICAgICBoaWdobGlnaHRTcG90ID0gdGFyZ2V0LmRyYXdDaXJjbGUodmVydGV4WzBdLCB2ZXJ0ZXhbMV0sDQogICAgICAgICAgICAgICAgICAgIHNwb3RSYWRpdXMsIHVuZGVmaW5lZCwgaGlnaGxpZ2h0U3BvdENvbG9yKTsNCiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodFNwb3RJZCA9IGhpZ2hsaWdodFNwb3QuaWQ7DQogICAgICAgICAgICAgICAgdGFyZ2V0Lmluc2VydEFmdGVyU2hhcGUodGhpcy5sYXN0U2hhcGVJZCwgaGlnaGxpZ2h0U3BvdCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoaGlnaGxpZ2h0TGluZUNvbG9yKSB7DQogICAgICAgICAgICAgICAgaGlnaGxpZ2h0TGluZSA9IHRhcmdldC5kcmF3TGluZSh2ZXJ0ZXhbMF0sIHRoaXMuY2FudmFzVG9wLCB2ZXJ0ZXhbMF0sDQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzVG9wICsgdGhpcy5jYW52YXNIZWlnaHQsIGhpZ2hsaWdodExpbmVDb2xvcik7DQogICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRMaW5lSWQgPSBoaWdobGlnaHRMaW5lLmlkOw0KICAgICAgICAgICAgICAgIHRhcmdldC5pbnNlcnRBZnRlclNoYXBlKHRoaXMubGFzdFNoYXBlSWQsIGhpZ2hsaWdodExpbmUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIHJlbW92ZUhpZ2hsaWdodDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMudGFyZ2V0Ow0KICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0U3BvdElkKSB7DQogICAgICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZVNoYXBlSWQodGhpcy5oaWdobGlnaHRTcG90SWQpOw0KICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0U3BvdElkID0gbnVsbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodExpbmVJZCkgew0KICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVTaGFwZUlkKHRoaXMuaGlnaGxpZ2h0TGluZUlkKTsNCiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodExpbmVJZCA9IG51bGw7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICAgICAgc2NhblZhbHVlczogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsdWVzLA0KICAgICAgICAgICAgICAgIHZhbGNvdW50ID0gdmFsdWVzLmxlbmd0aCwNCiAgICAgICAgICAgICAgICB4dmFsdWVzID0gdGhpcy54dmFsdWVzLA0KICAgICAgICAgICAgICAgIHl2YWx1ZXMgPSB0aGlzLnl2YWx1ZXMsDQogICAgICAgICAgICAgICAgeW1pbm1heCA9IHRoaXMueW1pbm1heCwNCiAgICAgICAgICAgICAgICBpLCB2YWwsIGlzU3RyLCBpc0FycmF5LCBzcDsNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2YWxjb3VudDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFsID0gdmFsdWVzW2ldOw0KICAgICAgICAgICAgICAgIGlzU3RyID0gdHlwZW9mKHZhbHVlc1tpXSkgPT09ICdzdHJpbmcnOw0KICAgICAgICAgICAgICAgIGlzQXJyYXkgPSB0eXBlb2YodmFsdWVzW2ldKSA9PT0gJ29iamVjdCcgJiYgdmFsdWVzW2ldIGluc3RhbmNlb2YgQXJyYXk7DQogICAgICAgICAgICAgICAgc3AgPSBpc1N0ciAmJiB2YWx1ZXNbaV0uc3BsaXQoJzonKTsNCiAgICAgICAgICAgICAgICBpZiAoaXNTdHIgJiYgc3AubGVuZ3RoID09PSAyKSB7IC8vIHg6eQ0KICAgICAgICAgICAgICAgICAgICB4dmFsdWVzLnB1c2goTnVtYmVyKHNwWzBdKSk7DQogICAgICAgICAgICAgICAgICAgIHl2YWx1ZXMucHVzaChOdW1iZXIoc3BbMV0pKTsNCiAgICAgICAgICAgICAgICAgICAgeW1pbm1heC5wdXNoKE51bWJlcihzcFsxXSkpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheSkgew0KICAgICAgICAgICAgICAgICAgICB4dmFsdWVzLnB1c2godmFsWzBdKTsNCiAgICAgICAgICAgICAgICAgICAgeXZhbHVlcy5wdXNoKHZhbFsxXSk7DQogICAgICAgICAgICAgICAgICAgIHltaW5tYXgucHVzaCh2YWxbMV0pOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHh2YWx1ZXMucHVzaChpKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlc1tpXSA9PT0gbnVsbCB8fCB2YWx1ZXNbaV0gPT09ICdudWxsJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgeXZhbHVlcy5wdXNoKG51bGwpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgeXZhbHVlcy5wdXNoKE51bWJlcih2YWwpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHltaW5tYXgucHVzaChOdW1iZXIodmFsKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmdldCgneHZhbHVlcycpKSB7DQogICAgICAgICAgICAgICAgeHZhbHVlcyA9IHRoaXMub3B0aW9ucy5nZXQoJ3h2YWx1ZXMnKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy5tYXh5ID0gdGhpcy5tYXh5b3JnID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgeW1pbm1heCk7DQogICAgICAgICAgICB0aGlzLm1pbnkgPSB0aGlzLm1pbnlvcmcgPSBNYXRoLm1pbi5hcHBseShNYXRoLCB5bWlubWF4KTsNCg0KICAgICAgICAgICAgdGhpcy5tYXh4ID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgeHZhbHVlcyk7DQogICAgICAgICAgICB0aGlzLm1pbnggPSBNYXRoLm1pbi5hcHBseShNYXRoLCB4dmFsdWVzKTsNCg0KICAgICAgICAgICAgdGhpcy54dmFsdWVzID0geHZhbHVlczsNCiAgICAgICAgICAgIHRoaXMueXZhbHVlcyA9IHl2YWx1ZXM7DQogICAgICAgICAgICB0aGlzLnltaW5tYXggPSB5bWlubWF4Ow0KICAgICAgICB9LA0KDQogICAgICAgIHByb2Nlc3NSYW5nZU9wdGlvbnM6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLA0KICAgICAgICAgICAgICAgIG5vcm1hbFJhbmdlTWluID0gb3B0aW9ucy5nZXQoJ25vcm1hbFJhbmdlTWluJyksDQogICAgICAgICAgICAgICAgbm9ybWFsUmFuZ2VNYXggPSBvcHRpb25zLmdldCgnbm9ybWFsUmFuZ2VNYXgnKTsNCg0KICAgICAgICAgICAgaWYgKG5vcm1hbFJhbmdlTWluICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICBpZiAobm9ybWFsUmFuZ2VNaW4gPCB0aGlzLm1pbnkpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW55ID0gbm9ybWFsUmFuZ2VNaW47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChub3JtYWxSYW5nZU1heCA+IHRoaXMubWF4eSkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLm1heHkgPSBub3JtYWxSYW5nZU1heDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ2NoYXJ0UmFuZ2VNaW4nKSAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLmdldCgnY2hhcnRSYW5nZUNsaXAnKSB8fCBvcHRpb25zLmdldCgnY2hhcnRSYW5nZU1pbicpIDwgdGhpcy5taW55KSkgew0KICAgICAgICAgICAgICAgIHRoaXMubWlueSA9IG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWluJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ2NoYXJ0UmFuZ2VNYXgnKSAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLmdldCgnY2hhcnRSYW5nZUNsaXAnKSB8fCBvcHRpb25zLmdldCgnY2hhcnRSYW5nZU1heCcpID4gdGhpcy5tYXh5KSkgew0KICAgICAgICAgICAgICAgIHRoaXMubWF4eSA9IG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWF4Jyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ2NoYXJ0UmFuZ2VNaW5YJykgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5nZXQoJ2NoYXJ0UmFuZ2VDbGlwWCcpIHx8IG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWluWCcpIDwgdGhpcy5taW54KSkgew0KICAgICAgICAgICAgICAgIHRoaXMubWlueCA9IG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWluWCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWF4WCcpICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlQ2xpcFgnKSB8fCBvcHRpb25zLmdldCgnY2hhcnRSYW5nZU1heFgnKSA+IHRoaXMubWF4eCkpIHsNCiAgICAgICAgICAgICAgICB0aGlzLm1heHggPSBvcHRpb25zLmdldCgnY2hhcnRSYW5nZU1heFgnKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICB9LA0KDQogICAgICAgIGRyYXdOb3JtYWxSYW5nZTogZnVuY3Rpb24gKGNhbnZhc0xlZnQsIGNhbnZhc1RvcCwgY2FudmFzSGVpZ2h0LCBjYW52YXNXaWR0aCwgcmFuZ2V5KSB7DQogICAgICAgICAgICB2YXIgbm9ybWFsUmFuZ2VNaW4gPSB0aGlzLm9wdGlvbnMuZ2V0KCdub3JtYWxSYW5nZU1pbicpLA0KICAgICAgICAgICAgICAgIG5vcm1hbFJhbmdlTWF4ID0gdGhpcy5vcHRpb25zLmdldCgnbm9ybWFsUmFuZ2VNYXgnKSwNCiAgICAgICAgICAgICAgICB5dG9wID0gY2FudmFzVG9wICsgTWF0aC5yb3VuZChjYW52YXNIZWlnaHQgLSAoY2FudmFzSGVpZ2h0ICogKChub3JtYWxSYW5nZU1heCAtIHRoaXMubWlueSkgLyByYW5nZXkpKSksDQogICAgICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5yb3VuZCgoY2FudmFzSGVpZ2h0ICogKG5vcm1hbFJhbmdlTWF4IC0gbm9ybWFsUmFuZ2VNaW4pKSAvIHJhbmdleSk7DQogICAgICAgICAgICB0aGlzLnRhcmdldC5kcmF3UmVjdChjYW52YXNMZWZ0LCB5dG9wLCBjYW52YXNXaWR0aCwgaGVpZ2h0LCB1bmRlZmluZWQsIHRoaXMub3B0aW9ucy5nZXQoJ25vcm1hbFJhbmdlQ29sb3InKSkuYXBwZW5kKCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywNCiAgICAgICAgICAgICAgICB0YXJnZXQgPSB0aGlzLnRhcmdldCwNCiAgICAgICAgICAgICAgICBjYW52YXNXaWR0aCA9IHRoaXMuY2FudmFzV2lkdGgsDQogICAgICAgICAgICAgICAgY2FudmFzSGVpZ2h0ID0gdGhpcy5jYW52YXNIZWlnaHQsDQogICAgICAgICAgICAgICAgdmVydGljZXMgPSB0aGlzLnZlcnRpY2VzLA0KICAgICAgICAgICAgICAgIHNwb3RSYWRpdXMgPSBvcHRpb25zLmdldCgnc3BvdFJhZGl1cycpLA0KICAgICAgICAgICAgICAgIHJlZ2lvbk1hcCA9IHRoaXMucmVnaW9uTWFwLA0KICAgICAgICAgICAgICAgIHJhbmdleCwgcmFuZ2V5LCB5dmFsbGFzdCwNCiAgICAgICAgICAgICAgICBjYW52YXNUb3AsIGNhbnZhc0xlZnQsDQogICAgICAgICAgICAgICAgdmVydGV4LCBwYXRoLCBwYXRocywgeCwgeSwgeG5leHQsIHhwb3MsIHhwb3NuZXh0LA0KICAgICAgICAgICAgICAgIGxhc3QsIG5leHQsIHl2YWxjb3VudCwgbGluZVNoYXBlcywgZmlsbFNoYXBlcywgcGxlbiwNCiAgICAgICAgICAgICAgICB2YWx1ZVNwb3RzLCBobFNwb3RzRW5hYmxlZCwgY29sb3IsIHh2YWx1ZXMsIHl2YWx1ZXMsIGk7DQoNCiAgICAgICAgICAgIGlmICghbGluZS5fc3VwZXIucmVuZGVyLmNhbGwodGhpcykpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRoaXMuc2NhblZhbHVlcygpOw0KICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmFuZ2VPcHRpb25zKCk7DQoNCiAgICAgICAgICAgIHh2YWx1ZXMgPSB0aGlzLnh2YWx1ZXM7DQogICAgICAgICAgICB5dmFsdWVzID0gdGhpcy55dmFsdWVzOw0KDQogICAgICAgICAgICBpZiAoIXRoaXMueW1pbm1heC5sZW5ndGggfHwgdGhpcy55dmFsdWVzLmxlbmd0aCA8IDIpIHsNCiAgICAgICAgICAgICAgICAvLyBlbXB0eSBvciBhbGwgbnVsbCB2YWx1ZXNzDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjYW52YXNUb3AgPSBjYW52YXNMZWZ0ID0gMDsNCg0KICAgICAgICAgICAgcmFuZ2V4ID0gdGhpcy5tYXh4IC0gdGhpcy5taW54ID09PSAwID8gMSA6IHRoaXMubWF4eCAtIHRoaXMubWlueDsNCiAgICAgICAgICAgIHJhbmdleSA9IHRoaXMubWF4eSAtIHRoaXMubWlueSA9PT0gMCA/IDEgOiB0aGlzLm1heHkgLSB0aGlzLm1pbnk7DQogICAgICAgICAgICB5dmFsbGFzdCA9IHRoaXMueXZhbHVlcy5sZW5ndGggLSAxOw0KDQogICAgICAgICAgICBpZiAoc3BvdFJhZGl1cyAmJiAoY2FudmFzV2lkdGggPCAoc3BvdFJhZGl1cyAqIDQpIHx8IGNhbnZhc0hlaWdodCA8IChzcG90UmFkaXVzICogNCkpKSB7DQogICAgICAgICAgICAgICAgc3BvdFJhZGl1cyA9IDA7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoc3BvdFJhZGl1cykgew0KICAgICAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgY2FudmFzIHNpemUgYXMgcmVxdWlyZWQgc28gdGhhdCBzcG90cyB3aWxsIGZpdA0KICAgICAgICAgICAgICAgIGhsU3BvdHNFbmFibGVkID0gb3B0aW9ucy5nZXQoJ2hpZ2hsaWdodFNwb3RDb2xvcicpICYmICAhb3B0aW9ucy5nZXQoJ2Rpc2FibGVJbnRlcmFjdGlvbicpOw0KICAgICAgICAgICAgICAgIGlmIChobFNwb3RzRW5hYmxlZCB8fCBvcHRpb25zLmdldCgnbWluU3BvdENvbG9yJykgfHwgKG9wdGlvbnMuZ2V0KCdzcG90Q29sb3InKSAmJiB5dmFsdWVzW3l2YWxsYXN0XSA9PT0gdGhpcy5taW55KSkgew0KICAgICAgICAgICAgICAgICAgICBjYW52YXNIZWlnaHQgLT0gTWF0aC5jZWlsKHNwb3RSYWRpdXMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoaGxTcG90c0VuYWJsZWQgfHwgb3B0aW9ucy5nZXQoJ21heFNwb3RDb2xvcicpIHx8IChvcHRpb25zLmdldCgnc3BvdENvbG9yJykgJiYgeXZhbHVlc1t5dmFsbGFzdF0gPT09IHRoaXMubWF4eSkpIHsNCiAgICAgICAgICAgICAgICAgICAgY2FudmFzSGVpZ2h0IC09IE1hdGguY2VpbChzcG90UmFkaXVzKTsNCiAgICAgICAgICAgICAgICAgICAgY2FudmFzVG9wICs9IE1hdGguY2VpbChzcG90UmFkaXVzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKGhsU3BvdHNFbmFibGVkIHx8DQogICAgICAgICAgICAgICAgICAgICAoKG9wdGlvbnMuZ2V0KCdtaW5TcG90Q29sb3InKSB8fCBvcHRpb25zLmdldCgnbWF4U3BvdENvbG9yJykpICYmICh5dmFsdWVzWzBdID09PSB0aGlzLm1pbnkgfHwgeXZhbHVlc1swXSA9PT0gdGhpcy5tYXh5KSkpIHsNCiAgICAgICAgICAgICAgICAgICAgY2FudmFzTGVmdCArPSBNYXRoLmNlaWwoc3BvdFJhZGl1cyk7DQogICAgICAgICAgICAgICAgICAgIGNhbnZhc1dpZHRoIC09IE1hdGguY2VpbChzcG90UmFkaXVzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKGhsU3BvdHNFbmFibGVkIHx8IG9wdGlvbnMuZ2V0KCdzcG90Q29sb3InKSB8fA0KICAgICAgICAgICAgICAgICAgICAob3B0aW9ucy5nZXQoJ21pblNwb3RDb2xvcicpIHx8IG9wdGlvbnMuZ2V0KCdtYXhTcG90Q29sb3InKSAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgKHl2YWx1ZXNbeXZhbGxhc3RdID09PSB0aGlzLm1pbnkgfHwgeXZhbHVlc1t5dmFsbGFzdF0gPT09IHRoaXMubWF4eSkpKSB7DQogICAgICAgICAgICAgICAgICAgIGNhbnZhc1dpZHRoIC09IE1hdGguY2VpbChzcG90UmFkaXVzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgY2FudmFzSGVpZ2h0LS07DQoNCiAgICAgICAgICAgIGlmIChvcHRpb25zLmdldCgnbm9ybWFsUmFuZ2VNaW4nKSAhPT0gdW5kZWZpbmVkICYmICFvcHRpb25zLmdldCgnZHJhd05vcm1hbE9uVG9wJykpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmRyYXdOb3JtYWxSYW5nZShjYW52YXNMZWZ0LCBjYW52YXNUb3AsIGNhbnZhc0hlaWdodCwgY2FudmFzV2lkdGgsIHJhbmdleSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHBhdGggPSBbXTsNCiAgICAgICAgICAgIHBhdGhzID0gW3BhdGhdOw0KICAgICAgICAgICAgbGFzdCA9IG5leHQgPSBudWxsOw0KICAgICAgICAgICAgeXZhbGNvdW50ID0geXZhbHVlcy5sZW5ndGg7DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgeXZhbGNvdW50OyBpKyspIHsNCiAgICAgICAgICAgICAgICB4ID0geHZhbHVlc1tpXTsNCiAgICAgICAgICAgICAgICB4bmV4dCA9IHh2YWx1ZXNbaSArIDFdOw0KICAgICAgICAgICAgICAgIHkgPSB5dmFsdWVzW2ldOw0KICAgICAgICAgICAgICAgIHhwb3MgPSBjYW52YXNMZWZ0ICsgTWF0aC5yb3VuZCgoeCAtIHRoaXMubWlueCkgKiAoY2FudmFzV2lkdGggLyByYW5nZXgpKTsNCiAgICAgICAgICAgICAgICB4cG9zbmV4dCA9IGkgPCB5dmFsY291bnQgLSAxID8gY2FudmFzTGVmdCArIE1hdGgucm91bmQoKHhuZXh0IC0gdGhpcy5taW54KSAqIChjYW52YXNXaWR0aCAvIHJhbmdleCkpIDogY2FudmFzV2lkdGg7DQogICAgICAgICAgICAgICAgbmV4dCA9IHhwb3MgKyAoKHhwb3NuZXh0IC0geHBvcykgLyAyKTsNCiAgICAgICAgICAgICAgICByZWdpb25NYXBbaV0gPSBbbGFzdCB8fCAwLCBuZXh0LCBpXTsNCiAgICAgICAgICAgICAgICBsYXN0ID0gbmV4dDsNCiAgICAgICAgICAgICAgICBpZiAoeSA9PT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoaSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHl2YWx1ZXNbaSAtIDFdICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFtdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2gocGF0aCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKG51bGwpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPCB0aGlzLm1pbnkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB0aGlzLm1pbnk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiB0aGlzLm1heHkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB0aGlzLm1heHk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXRoLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdmFsdWUgd2FzIG51bGwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucHVzaChbeHBvcywgY2FudmFzVG9wICsgY2FudmFzSGVpZ2h0XSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmVydGV4ID0gW3hwb3MsIGNhbnZhc1RvcCArIE1hdGgucm91bmQoY2FudmFzSGVpZ2h0IC0gKGNhbnZhc0hlaWdodCAqICgoeSAtIHRoaXMubWlueSkgLyByYW5nZXkpKSldOw0KICAgICAgICAgICAgICAgICAgICBwYXRoLnB1c2godmVydGV4KTsNCiAgICAgICAgICAgICAgICAgICAgdmVydGljZXMucHVzaCh2ZXJ0ZXgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbGluZVNoYXBlcyA9IFtdOw0KICAgICAgICAgICAgZmlsbFNoYXBlcyA9IFtdOw0KICAgICAgICAgICAgcGxlbiA9IHBhdGhzLmxlbmd0aDsNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwbGVuOyBpKyspIHsNCiAgICAgICAgICAgICAgICBwYXRoID0gcGF0aHNbaV07DQogICAgICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmdldCgnZmlsbENvbG9yJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucHVzaChbcGF0aFtwYXRoLmxlbmd0aCAtIDFdWzBdLCAoY2FudmFzVG9wICsgY2FudmFzSGVpZ2h0KV0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFNoYXBlcy5wdXNoKHBhdGguc2xpY2UoMCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5wb3AoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIG9ubHkgYSBzaW5nbGUgcG9pbnQgaW4gdGhpcyBwYXRoLCB0aGVuIHdlIHdhbnQgdG8gZGlzcGxheSBpdA0KICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIHZlcnRpY2FsIGxpbmUgd2hpY2ggbWVhbnMgd2Uga2VlcCBwYXRoWzBdICBhcyBpcw0KICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGggPiAyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHdlIHdhbnQgdGhlIGZpcnN0IHZhbHVlDQogICAgICAgICAgICAgICAgICAgICAgICBwYXRoWzBdID0gW3BhdGhbMF1bMF0sIHBhdGhbMV1bMV1dOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGxpbmVTaGFwZXMucHVzaChwYXRoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIGZpbGwgZmlyc3QsIHRoZW4gb3B0aW9uYWxseSB0aGUgbm9ybWFsIHJhbmdlLCB0aGVuIHRoZSBsaW5lIG9uIHRvcCBvZiB0aGF0DQogICAgICAgICAgICBwbGVuID0gZmlsbFNoYXBlcy5sZW5ndGg7DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGxlbjsgaSsrKSB7DQogICAgICAgICAgICAgICAgdGFyZ2V0LmRyYXdTaGFwZShmaWxsU2hhcGVzW2ldLA0KICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmdldCgnZmlsbENvbG9yJyksIG9wdGlvbnMuZ2V0KCdmaWxsQ29sb3InKSkuYXBwZW5kKCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChvcHRpb25zLmdldCgnbm9ybWFsUmFuZ2VNaW4nKSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuZ2V0KCdkcmF3Tm9ybWFsT25Ub3AnKSkgew0KICAgICAgICAgICAgICAgIHRoaXMuZHJhd05vcm1hbFJhbmdlKGNhbnZhc0xlZnQsIGNhbnZhc1RvcCwgY2FudmFzSGVpZ2h0LCBjYW52YXNXaWR0aCwgcmFuZ2V5KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcGxlbiA9IGxpbmVTaGFwZXMubGVuZ3RoOw0KICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsZW47IGkrKykgew0KICAgICAgICAgICAgICAgIHRhcmdldC5kcmF3U2hhcGUobGluZVNoYXBlc1tpXSwgb3B0aW9ucy5nZXQoJ2xpbmVDb2xvcicpLCB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0KCdsaW5lV2lkdGgnKSkuYXBwZW5kKCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChzcG90UmFkaXVzICYmIG9wdGlvbnMuZ2V0KCd2YWx1ZVNwb3RzJykpIHsNCiAgICAgICAgICAgICAgICB2YWx1ZVNwb3RzID0gb3B0aW9ucy5nZXQoJ3ZhbHVlU3BvdHMnKTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWVTcG90cy5nZXQgPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgICAgICB2YWx1ZVNwb3RzID0gbmV3IFJhbmdlTWFwKHZhbHVlU3BvdHMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgeXZhbGNvdW50OyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSB2YWx1ZVNwb3RzLmdldCh5dmFsdWVzW2ldKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZHJhd0NpcmNsZShjYW52YXNMZWZ0ICsgTWF0aC5yb3VuZCgoeHZhbHVlc1tpXSAtIHRoaXMubWlueCkgKiAoY2FudmFzV2lkdGggLyByYW5nZXgpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXNUb3AgKyBNYXRoLnJvdW5kKGNhbnZhc0hlaWdodCAtIChjYW52YXNIZWlnaHQgKiAoKHl2YWx1ZXNbaV0gLSB0aGlzLm1pbnkpIC8gcmFuZ2V5KSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwb3RSYWRpdXMsIHVuZGVmaW5lZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcikuYXBwZW5kKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChzcG90UmFkaXVzICYmIG9wdGlvbnMuZ2V0KCdzcG90Q29sb3InKSAmJiB5dmFsdWVzW3l2YWxsYXN0XSAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIHRhcmdldC5kcmF3Q2lyY2xlKGNhbnZhc0xlZnQgKyBNYXRoLnJvdW5kKCh4dmFsdWVzW3h2YWx1ZXMubGVuZ3RoIC0gMV0gLSB0aGlzLm1pbngpICogKGNhbnZhc1dpZHRoIC8gcmFuZ2V4KSksDQogICAgICAgICAgICAgICAgICAgIGNhbnZhc1RvcCArIE1hdGgucm91bmQoY2FudmFzSGVpZ2h0IC0gKGNhbnZhc0hlaWdodCAqICgoeXZhbHVlc1t5dmFsbGFzdF0gLSB0aGlzLm1pbnkpIC8gcmFuZ2V5KSkpLA0KICAgICAgICAgICAgICAgICAgICBzcG90UmFkaXVzLCB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0KCdzcG90Q29sb3InKSkuYXBwZW5kKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodGhpcy5tYXh5ICE9PSB0aGlzLm1pbnlvcmcpIHsNCiAgICAgICAgICAgICAgICBpZiAoc3BvdFJhZGl1cyAmJiBvcHRpb25zLmdldCgnbWluU3BvdENvbG9yJykpIHsNCiAgICAgICAgICAgICAgICAgICAgeCA9IHh2YWx1ZXNbJC5pbkFycmF5KHRoaXMubWlueW9yZywgeXZhbHVlcyldOw0KICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZHJhd0NpcmNsZShjYW52YXNMZWZ0ICsgTWF0aC5yb3VuZCgoeCAtIHRoaXMubWlueCkgKiAoY2FudmFzV2lkdGggLyByYW5nZXgpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc1RvcCArIE1hdGgucm91bmQoY2FudmFzSGVpZ2h0IC0gKGNhbnZhc0hlaWdodCAqICgodGhpcy5taW55b3JnIC0gdGhpcy5taW55KSAvIHJhbmdleSkpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHNwb3RSYWRpdXMsIHVuZGVmaW5lZCwNCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0KCdtaW5TcG90Q29sb3InKSkuYXBwZW5kKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChzcG90UmFkaXVzICYmIG9wdGlvbnMuZ2V0KCdtYXhTcG90Q29sb3InKSkgew0KICAgICAgICAgICAgICAgICAgICB4ID0geHZhbHVlc1skLmluQXJyYXkodGhpcy5tYXh5b3JnLCB5dmFsdWVzKV07DQogICAgICAgICAgICAgICAgICAgIHRhcmdldC5kcmF3Q2lyY2xlKGNhbnZhc0xlZnQgKyBNYXRoLnJvdW5kKCh4IC0gdGhpcy5taW54KSAqIChjYW52YXNXaWR0aCAvIHJhbmdleCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzVG9wICsgTWF0aC5yb3VuZChjYW52YXNIZWlnaHQgLSAoY2FudmFzSGVpZ2h0ICogKCh0aGlzLm1heHlvcmcgLSB0aGlzLm1pbnkpIC8gcmFuZ2V5KSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgc3BvdFJhZGl1cywgdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoJ21heFNwb3RDb2xvcicpKS5hcHBlbmQoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgY29tcGFyZSB0aGUgcmVmTGluZVgvWSBvcHRpb24gdmFsdWVzIHdpdGggJ251bGwnIGFzIG51bWVyaWMgemVybygwKSBzaG91bGQgcGxvdCBhIHJlZi1saW5lIGF0IHplcm8hDQogICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ3JlZkxpbmVYJykgIT0gbnVsbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGpzaGludCBpZ25vcmU6bGluZQ0KICAgICAgICAgICAgICAgIHkgPSBNYXRoLnJvdW5kKHRoaXMuY2FudmFzSGVpZ2h0IC0gKG9wdGlvbnMuZ2V0KCdyZWZMaW5lWCcpIC0gdGhpcy5taW55KSAqICh0aGlzLmNhbnZhc0hlaWdodC9yYW5nZXkpKTsNCiAgICAgICAgICAgICAgICB0YXJnZXQuZHJhd0xpbmUoMCwgeSwgdGhpcy5jYW52YXNXaWR0aCwgeSwgb3B0aW9ucy5nZXQoJ3JlZkxpbmVDb2xvcicpKS5hcHBlbmQoKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuZ2V0KCdyZWZMaW5lWScpICE9IG51bGwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqc2hpbnQgaWdub3JlOmxpbmUNCiAgICAgICAgICAgICAgICB4ID0gTWF0aC5yb3VuZCgob3B0aW9ucy5nZXQoJ3JlZkxpbmVZJykgLSB0aGlzLm1pbngpICogKHRoaXMuY2FudmFzV2lkdGgvcmFuZ2V4KSk7DQogICAgICAgICAgICAgICAgdGFyZ2V0LmRyYXdMaW5lKHgsIHRoaXMuY2FudmFzSGVpZ2h0LCB4LCAwLCBvcHRpb25zLmdldCgncmVmTGluZUNvbG9yJykpLmFwcGVuZCgpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0aGlzLmxhc3RTaGFwZUlkID0gdGFyZ2V0LmdldExhc3RTaGFwZUlkKCk7DQogICAgICAgICAgICB0aGlzLmNhbnZhc1RvcCA9IGNhbnZhc1RvcDsNCiAgICAgICAgICAgIHRhcmdldC5yZW5kZXIoKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KDQoNCiAgICAvKioNCiAgICAgKiBCYXIgY2hhcnRzDQogICAgICovDQogICAgJC5mbi5zcGFya2xpbmUuYmFyID0gYmFyID0gY3JlYXRlQ2xhc3MoJC5mbi5zcGFya2xpbmUuX2Jhc2UsIGJhckhpZ2hsaWdodE1peGluLCB7DQogICAgICAgIHR5cGU6ICdiYXInLA0KDQogICAgICAgIGluaXQ6IGZ1bmN0aW9uIChlbCwgdmFsdWVzLCBvcHRpb25zLCB3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgICAgICB2YXIgYmFyV2lkdGggPSBwYXJzZUludChvcHRpb25zLmdldCgnYmFyV2lkdGgnKSwgMTApLA0KICAgICAgICAgICAgICAgIGJhclNwYWNpbmcgPSBwYXJzZUludChvcHRpb25zLmdldCgnYmFyU3BhY2luZycpLCAxMCksDQogICAgICAgICAgICAgICAgY2hhcnRSYW5nZU1pbiA9IG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWluJyksDQogICAgICAgICAgICAgICAgY2hhcnRSYW5nZU1heCA9IG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWF4JyksDQogICAgICAgICAgICAgICAgY2hhcnRSYW5nZUNsaXAgPSBvcHRpb25zLmdldCgnY2hhcnRSYW5nZUNsaXAnKSwNCiAgICAgICAgICAgICAgICBzdGFja01pbiA9IEluZmluaXR5LA0KICAgICAgICAgICAgICAgIHN0YWNrTWF4ID0gLUluZmluaXR5LA0KICAgICAgICAgICAgICAgIGlzU3RhY2tTdHJpbmcsIGdyb3VwTWluLCBncm91cE1heCwgc3RhY2tSYW5nZXMsIHN0YWNrUmFuZ2VzTmVnLCBzdGFja1RvdGFscywgYWN0dWFsTWluLCBhY3R1YWxNYXgsDQogICAgICAgICAgICAgICAgbnVtVmFsdWVzLCBpLCB2bGVuLCByYW5nZSwgemVyb0F4aXMsIHhheGlzT2Zmc2V0LCBtaW4sIG1heCwgY2xpcE1pbiwgY2xpcE1heCwNCiAgICAgICAgICAgICAgICBzdGFja2VkLCB2bGlzdCwgaiwgc2xlbiwgc3ZhbHMsIHZhbCwgeW9mZnNldCwgeU1heENhbGMsIGNhbnZhc0hlaWdodEVmOw0KICAgICAgICAgICAgYmFyLl9zdXBlci5pbml0LmNhbGwodGhpcywgZWwsIHZhbHVlcywgb3B0aW9ucywgd2lkdGgsIGhlaWdodCk7DQoNCiAgICAgICAgICAgIC8vIHNjYW4gdmFsdWVzIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHN0YWNrIGJhcnMNCiAgICAgICAgICAgIGZvciAoaSA9IDAsIHZsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpIDwgdmxlbjsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFsID0gdmFsdWVzW2ldOw0KICAgICAgICAgICAgICAgIGlzU3RhY2tTdHJpbmcgPSB0eXBlb2YodmFsKSA9PT0gJ3N0cmluZycgJiYgdmFsLmluZGV4T2YoJzonKSA+IC0xOw0KICAgICAgICAgICAgICAgIGlmIChpc1N0YWNrU3RyaW5nIHx8ICQuaXNBcnJheSh2YWwpKSB7DQogICAgICAgICAgICAgICAgICAgIHN0YWNrZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdGFja1N0cmluZykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsdWVzW2ldID0gbm9ybWFsaXplVmFsdWVzKHZhbC5zcGxpdCgnOicpKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB2YWwgPSByZW1vdmUodmFsLCBudWxsKTsgLy8gbWluL21heCB3aWxsIHRyZWF0IG51bGwgYXMgemVybw0KICAgICAgICAgICAgICAgICAgICBncm91cE1pbiA9IE1hdGgubWluLmFwcGx5KE1hdGgsIHZhbCk7DQogICAgICAgICAgICAgICAgICAgIGdyb3VwTWF4ID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgdmFsKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwTWluIDwgc3RhY2tNaW4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTWluID0gZ3JvdXBNaW47DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwTWF4ID4gc3RhY2tNYXgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTWF4ID0gZ3JvdXBNYXg7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgIC
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment