Skip to content

Instantly share code, notes, and snippets.

@krisl
Last active July 31, 2016 07:05
Show Gist options
  • Save krisl/39cbe0c4995668b38098a89d1c02c2a4 to your computer and use it in GitHub Desktop.
Save krisl/39cbe0c4995668b38098a89d1c02c2a4 to your computer and use it in GitHub Desktop.
requirebin sketch
// Welcome! require() some modules from npm (like you were using browserify)
// and then hit Run Code to run your code on the right side.
// Modules get downloaded from browserify-cdn and bundled in your browser.
const yo = require('yo-yo');
const {observable, autorun, computed} = require("mobx");
const appState = observable({
total: function() { console.log('TOT'); return sumChildren(this.sections) },
sections: [
{
name: 'section 1',
open: true,
values: function() { console.log('ZZ'); return sumChildren(this.categories) },
categories: [
{
name: 'category 1',
open: true,
values: function() { console.log('YY'); return sumChildren(this.extendeds) },
extendeds: [
{
name: 'extended 1',
values: [1,2,3,4,5,6,7,8,9,10,11,12]
},
{
name: 'extended 2',
values: [1,2,3,4,5,6,7,8,9,10,11,12]
},
{
name: 'extended 3',
values: [1,2,3,4,5,6,7,8,9,10,11,12]
},
]
}
]
},
{
name: 'section 2',
open: true,
values: function() { console.log('SEC'); return sumChildren(this.categories) },
categories: [
{
name: 'category 1',
open: true,
values: function() { console.log('CAT'); return sumChildren(this.extendeds) },
extendeds: [
{
name: 'extended 1',
values: [1,2,3,4,5,6,7,8,9,10,11,12]
},
{
name: 'extended 2',
values: [1,2,3,4,5,6,7,8,9,10,11,12]
},
{
name: 'extended 3',
values: [1,2,3,4,5,6,7,8,9,10,11,12]
},
]
}
]
},
]
});
const sumChildren = (children) =>
children
.map(node => node.values)
.reduce((vals1, vals2) =>
vals1.map((v,i) => (v || 0) + (vals2[i] || 0) ), [0,0,0,0,0,0,0,0,0,0,0,0]
)
const onClick = (node, ev) => {
//console.log(computed);
node.open = !node.open
ev.preventDefault()
ev.stopPropagation()
}
const makeRow = (node, klass) =>
yo`<ol>
${[1,2,3,4,5,6,7,8,9,10,11,12].map(month =>
yo`<li>
${klass === 'extended'
? yo`<input value="${node.values[month-1] || 0}" oninput=${ev => node.values[month-1] = parseFloat(ev.target.value) || 0}>`
: node.values[month-1] || 0
}
</li>`
)}
</ol>`
const makeNewChild = (parent, parentClass, e) => {
if(e) e.stopPropagation();
if(parentClass==='category') parent.extendeds.push({name: 'ext', values:Array(12)});
if(parentClass==='section') parent.categories.push({
name: 'cat',
open: true,
values:function() { console.log('CATN', this); return sumChildren(this.extendeds) },
extendeds: []
});
if(parentClass==='root') parent.sections.push({
name: 'sec',
open: true,
values: function() { console.log('ZZ'); return sumChildren(this.categories) },
categories: []
})
}
const renderTitle = () =>
yo`<div class='title'>
Budget Smuggler
</div>`
const renderMonths = () =>
yo`<div class='header'>
<div class='nav'>
<span class='name'>Months</span>
</div>
<div class='new'>
<button class='section' onclick=${makeNewChild.bind(null, appState, 'root')}>+</button>
</div>
<div class='months'>
${makeRow({values:['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']})}
</div>
</div>
`
const makeNode = (node, klass, children) =>
yo`<div class=${klass} onclick=${onClick.bind(null, node)}>
<div class='nav'>
<span class='name'>${node.name}</span>
</div>
<div class='new'>
<button class=${klass} onclick=${makeNewChild.bind(null, node, klass)}>+</button>
</div>
<div class='months'>
${makeRow(node, klass)}
</div>
<div class='children'>
${children || undefined}
</div>
</div>`
const renderTree = sections =>
yo`<div class='root'>
${sections.map(section =>
makeNode(section, 'section',
section.open && section.categories.map(category =>
makeNode(category, 'category',
category.open && category.extendeds && category.extendeds.map(extended =>
makeNode(extended, 'extended')
)
)
)
)
)}
</div>`
const inputComp = state =>
yo`<input value="${state.name}" oninput=${ev => state.name = ev.target.value}>`
const buttonComp = state =>
yo`<button onclick=${ev => state.age++}>Age up!</button>`;
const appComp = state => yo`<div>
<div class='budget'>
${renderTitle()}
${renderMonths()}
${renderTree(state.sections)}
${makeNode({name: 'Total', values: state.total}, 'section total')}
</div>
</div>`;
const ref = document.body.appendChild(document.createElement('div'));
const x = autorun(() => yo.update(ref, appComp(appState)));
//console.log('donex', x);
setTimeout(function(){
;require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
},{}],2:[function(require,module,exports){
var document = require('global/document')
var hyperx = require('hyperx')
var onload = require('on-load')
var SVGNS = 'http://www.w3.org/2000/svg'
var BOOL_PROPS = {
autofocus: 1,
checked: 1,
defaultchecked: 1,
disabled: 1,
formnovalidate: 1,
indeterminate: 1,
readonly: 1,
required: 1,
selected: 1,
willvalidate: 1
}
var SVG_TAGS = [
'svg',
'altGlyph', 'altGlyphDef', 'altGlyphItem', 'animate', 'animateColor',
'animateMotion', 'animateTransform', 'circle', 'clipPath', 'color-profile',
'cursor', 'defs', 'desc', 'ellipse', 'feBlend', 'feColorMatrix',
'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting',
'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB',
'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode',
'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting',
'feSpotLight', 'feTile', 'feTurbulence', 'filter', 'font', 'font-face',
'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri',
'foreignObject', 'g', 'glyph', 'glyphRef', 'hkern', 'image', 'line',
'linearGradient', 'marker', 'mask', 'metadata', 'missing-glyph', 'mpath',
'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect',
'set', 'stop', 'switch', 'symbol', 'text', 'textPath', 'title', 'tref',
'tspan', 'use', 'view', 'vkern'
]
function belCreateElement (tag, props, children) {
var el
// If an svg tag, it needs a namespace
if (SVG_TAGS.indexOf(tag) !== -1) {
props.namespace = SVGNS
}
// If we are using a namespace
var ns = false
if (props.namespace) {
ns = props.namespace
delete props.namespace
}
// Create the element
if (ns) {
el = document.createElementNS(ns, tag)
} else {
el = document.createElement(tag)
}
// If adding onload events
if (props.onload || props.onunload) {
var load = props.onload || function () {}
var unload = props.onunload || function () {}
onload(el, function bel_onload () {
load(el)
}, function bel_onunload () {
unload(el)
},
// We have to use non-standard `caller` to find who invokes `belCreateElement`
belCreateElement.caller.caller.caller)
delete props.onload
delete props.onunload
}
// Create the properties
for (var p in props) {
if (props.hasOwnProperty(p)) {
var key = p.toLowerCase()
var val = props[p]
// Normalize className
if (key === 'classname') {
key = 'class'
p = 'class'
}
// The for attribute gets transformed to htmlFor, but we just set as for
if (p === 'htmlFor') {
p = 'for'
}
// If a property is boolean, set itself to the key
if (BOOL_PROPS[key]) {
if (val === 'true') val = key
else if (val === 'false') continue
}
// If a property prefers being set directly vs setAttribute
if (key.slice(0, 2) === 'on') {
el[p] = val
} else {
if (ns) {
el.setAttributeNS(null, p, val)
} else {
el.setAttribute(p, val)
}
}
}
}
function appendChild (childs) {
if (!Array.isArray(childs)) return
for (var i = 0; i < childs.length; i++) {
var node = childs[i]
if (Array.isArray(node)) {
appendChild(node)
continue
}
if (typeof node === 'number' ||
typeof node === 'boolean' ||
node instanceof Date ||
node instanceof RegExp) {
node = node.toString()
}
if (typeof node === 'string') {
if (el.lastChild && el.lastChild.nodeName === '#text') {
el.lastChild.nodeValue += node
continue
}
node = document.createTextNode(node)
}
if (node && node.nodeType) {
el.appendChild(node)
}
}
}
appendChild(children)
return el
}
module.exports = hyperx(belCreateElement)
module.exports.createElement = belCreateElement
},{"global/document":3,"hyperx":5,"on-load":7}],3:[function(require,module,exports){
(function (global){
var topLevel = typeof global !== 'undefined' ? global :
typeof window !== 'undefined' ? window : {}
var minDoc = require('min-document');
if (typeof document !== 'undefined') {
module.exports = document;
} else {
var doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];
if (!doccy) {
doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;
}
module.exports = doccy;
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9iZWwvbm9kZV9tb2R1bGVzL2dsb2JhbC9kb2N1bWVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbInZhciB0b3BMZXZlbCA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDpcbiAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHt9XG52YXIgbWluRG9jID0gcmVxdWlyZSgnbWluLWRvY3VtZW50Jyk7XG5cbmlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBkb2N1bWVudDtcbn0gZWxzZSB7XG4gICAgdmFyIGRvY2N5ID0gdG9wTGV2ZWxbJ19fR0xPQkFMX0RPQ1VNRU5UX0NBQ0hFQDQnXTtcblxuICAgIGlmICghZG9jY3kpIHtcbiAgICAgICAgZG9jY3kgPSB0b3BMZXZlbFsnX19HTE9CQUxfRE9DVU1FTlRfQ0FDSEVANCddID0gbWluRG9jO1xuICAgIH1cblxuICAgIG1vZHVsZS5leHBvcnRzID0gZG9jY3k7XG59XG4iXX0=
},{"min-document":1}],4:[function(require,module,exports){
(function (global){
if (typeof window !== "undefined") {
module.exports = window;
} else if (typeof global !== "undefined") {
module.exports = global;
} else if (typeof self !== "undefined"){
module.exports = self;
} else {
module.exports = {};
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9iZWwvbm9kZV9tb2R1bGVzL2dsb2JhbC93aW5kb3cuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWw7XG59IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiKXtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHNlbGY7XG59IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0ge307XG59XG4iXX0=
},{}],5:[function(require,module,exports){
var attrToProp = require('hyperscript-attribute-to-property')
var VAR = 0, TEXT = 1, OPEN = 2, CLOSE = 3, ATTR = 4
var ATTR_KEY = 5, ATTR_KEY_W = 6
var ATTR_VALUE_W = 7, ATTR_VALUE = 8
var ATTR_VALUE_SQ = 9, ATTR_VALUE_DQ = 10
var ATTR_EQ = 11, ATTR_BREAK = 12
module.exports = function (h, opts) {
h = attrToProp(h)
if (!opts) opts = {}
var concat = opts.concat || function (a, b) {
return String(a) + String(b)
}
return function (strings) {
var state = TEXT, reg = ''
var arglen = arguments.length
var parts = []
for (var i = 0; i < strings.length; i++) {
if (i < arglen - 1) {
var arg = arguments[i+1]
var p = parse(strings[i])
var xstate = state
if (xstate === ATTR_VALUE_DQ) xstate = ATTR_VALUE
if (xstate === ATTR_VALUE_SQ) xstate = ATTR_VALUE
if (xstate === ATTR_VALUE_W) xstate = ATTR_VALUE
if (xstate === ATTR) xstate = ATTR_KEY
p.push([ VAR, xstate, arg ])
parts.push.apply(parts, p)
} else parts.push.apply(parts, parse(strings[i]))
}
var tree = [null,{},[]]
var stack = [[tree,-1]]
for (var i = 0; i < parts.length; i++) {
var cur = stack[stack.length-1][0]
var p = parts[i], s = p[0]
if (s === OPEN && /^\//.test(p[1])) {
var ix = stack[stack.length-1][1]
if (stack.length > 1) {
stack.pop()
stack[stack.length-1][0][2][ix] = h(
cur[0], cur[1], cur[2].length ? cur[2] : undefined
)
}
} else if (s === OPEN) {
var c = [p[1],{},[]]
cur[2].push(c)
stack.push([c,cur[2].length-1])
} else if (s === ATTR_KEY || (s === VAR && p[1] === ATTR_KEY)) {
var key = ''
var copyKey
for (; i < parts.length; i++) {
if (parts[i][0] === ATTR_KEY) {
key = concat(key, parts[i][1])
} else if (parts[i][0] === VAR && parts[i][1] === ATTR_KEY) {
if (typeof parts[i][2] === 'object' && !key) {
for (copyKey in parts[i][2]) {
if (parts[i][2].hasOwnProperty(copyKey) && !cur[1][copyKey]) {
cur[1][copyKey] = parts[i][2][copyKey]
}
}
} else {
key = concat(key, parts[i][2])
}
} else break
}
if (parts[i][0] === ATTR_EQ) i++
var j = i
for (; i < parts.length; i++) {
if (parts[i][0] === ATTR_VALUE || parts[i][0] === ATTR_KEY) {
if (!cur[1][key]) cur[1][key] = strfn(parts[i][1])
else cur[1][key] = concat(cur[1][key], parts[i][1])
} else if (parts[i][0] === VAR
&& (parts[i][1] === ATTR_VALUE || parts[i][1] === ATTR_KEY)) {
if (!cur[1][key]) cur[1][key] = strfn(parts[i][2])
else cur[1][key] = concat(cur[1][key], parts[i][2])
} else {
if (key.length && !cur[1][key] && i === j
&& (parts[i][0] === CLOSE || parts[i][0] === ATTR_BREAK)) {
// https://html.spec.whatwg.org/multipage/infrastructure.html#boolean-attributes
// empty string is falsy, not well behaved value in browser
cur[1][key] = key.toLowerCase()
}
break
}
}
} else if (s === ATTR_KEY) {
cur[1][p[1]] = true
} else if (s === VAR && p[1] === ATTR_KEY) {
cur[1][p[2]] = true
} else if (s === CLOSE) {
if (selfClosing(cur[0]) && stack.length) {
var ix = stack[stack.length-1][1]
stack.pop()
stack[stack.length-1][0][2][ix] = h(
cur[0], cur[1], cur[2].length ? cur[2] : undefined
)
}
} else if (s === VAR && p[1] === TEXT) {
if (p[2] === undefined || p[2] === null) p[2] = ''
else if (!p[2]) p[2] = concat('', p[2])
if (Array.isArray(p[2][0])) {
cur[2].push.apply(cur[2], p[2])
} else {
cur[2].push(p[2])
}
} else if (s === TEXT) {
cur[2].push(p[1])
} else if (s === ATTR_EQ || s === ATTR_BREAK) {
// no-op
} else {
throw new Error('unhandled: ' + s)
}
}
if (tree[2].length > 1 && /^\s*$/.test(tree[2][0])) {
tree[2].shift()
}
if (tree[2].length > 2
|| (tree[2].length === 2 && /\S/.test(tree[2][1]))) {
throw new Error(
'multiple root elements must be wrapped in an enclosing tag'
)
}
if (Array.isArray(tree[2][0]) && typeof tree[2][0][0] === 'string'
&& Array.isArray(tree[2][0][2])) {
tree[2][0] = h(tree[2][0][0], tree[2][0][1], tree[2][0][2])
}
return tree[2][0]
function parse (str) {
var res = []
if (state === ATTR_VALUE_W) state = ATTR
for (var i = 0; i < str.length; i++) {
var c = str.charAt(i)
if (state === TEXT && c === '<') {
if (reg.length) res.push([TEXT, reg])
reg = ''
state = OPEN
} else if (c === '>' && !quot(state)) {
if (state === OPEN) {
res.push([OPEN,reg])
} else if (state === ATTR_KEY) {
res.push([ATTR_KEY,reg])
} else if (state === ATTR_VALUE && reg.length) {
res.push([ATTR_VALUE,reg])
}
res.push([CLOSE])
reg = ''
state = TEXT
} else if (state === TEXT) {
reg += c
} else if (state === OPEN && /\s/.test(c)) {
res.push([OPEN, reg])
reg = ''
state = ATTR
} else if (state === OPEN) {
reg += c
} else if (state === ATTR && /[\w-]/.test(c)) {
state = ATTR_KEY
reg = c
} else if (state === ATTR && /\s/.test(c)) {
if (reg.length) res.push([ATTR_KEY,reg])
res.push([ATTR_BREAK])
} else if (state === ATTR_KEY && /\s/.test(c)) {
res.push([ATTR_KEY,reg])
reg = ''
state = ATTR_KEY_W
} else if (state === ATTR_KEY && c === '=') {
res.push([ATTR_KEY,reg],[ATTR_EQ])
reg = ''
state = ATTR_VALUE_W
} else if (state === ATTR_KEY) {
reg += c
} else if ((state === ATTR_KEY_W || state === ATTR) && c === '=') {
res.push([ATTR_EQ])
state = ATTR_VALUE_W
} else if ((state === ATTR_KEY_W || state === ATTR) && !/\s/.test(c)) {
res.push([ATTR_BREAK])
if (/[\w-]/.test(c)) {
reg += c
state = ATTR_KEY
} else state = ATTR
} else if (state === ATTR_VALUE_W && c === '"') {
state = ATTR_VALUE_DQ
} else if (state === ATTR_VALUE_W && c === "'") {
state = ATTR_VALUE_SQ
} else if (state === ATTR_VALUE_DQ && c === '"') {
res.push([ATTR_VALUE,reg],[ATTR_BREAK])
reg = ''
state = ATTR
} else if (state === ATTR_VALUE_SQ && c === "'") {
res.push([ATTR_VALUE,reg],[ATTR_BREAK])
reg = ''
state = ATTR
} else if (state === ATTR_VALUE_W && !/\s/.test(c)) {
state = ATTR_VALUE
i--
} else if (state === ATTR_VALUE && /\s/.test(c)) {
res.push([ATTR_VALUE,reg],[ATTR_BREAK])
reg = ''
state = ATTR
} else if (state === ATTR_VALUE || state === ATTR_VALUE_SQ
|| state === ATTR_VALUE_DQ) {
reg += c
}
}
if (state === TEXT && reg.length) {
res.push([TEXT,reg])
reg = ''
} else if (state === ATTR_VALUE && reg.length) {
res.push([ATTR_VALUE,reg])
reg = ''
} else if (state === ATTR_VALUE_DQ && reg.length) {
res.push([ATTR_VALUE,reg])
reg = ''
} else if (state === ATTR_VALUE_SQ && reg.length) {
res.push([ATTR_VALUE,reg])
reg = ''
} else if (state === ATTR_KEY) {
res.push([ATTR_KEY,reg])
reg = ''
}
return res
}
}
function strfn (x) {
if (typeof x === 'function') return x
else if (typeof x === 'string') return x
else if (x && typeof x === 'object') return x
else return concat('', x)
}
}
function quot (state) {
return state === ATTR_VALUE_SQ || state === ATTR_VALUE_DQ
}
var hasOwn = Object.prototype.hasOwnProperty
function has (obj, key) { return hasOwn.call(obj, key) }
var closeRE = RegExp('^(' + [
'area', 'base', 'basefont', 'bgsound', 'br', 'col', 'command', 'embed',
'frame', 'hr', 'img', 'input', 'isindex', 'keygen', 'link', 'meta', 'param',
'source', 'track', 'wbr',
// SVG TAGS
'animate', 'animateTransform', 'circle', 'cursor', 'desc', 'ellipse',
'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite',
'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap',
'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR',
'feGaussianBlur', 'feImage', 'feMergeNode', 'feMorphology',
'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile',
'feTurbulence', 'font-face-format', 'font-face-name', 'font-face-uri',
'glyph', 'glyphRef', 'hkern', 'image', 'line', 'missing-glyph', 'mpath',
'path', 'polygon', 'polyline', 'rect', 'set', 'stop', 'tref', 'use', 'view',
'vkern'
].join('|') + ')(?:[\.#][a-zA-Z0-9\u007F-\uFFFF_:-]+)*$')
function selfClosing (tag) { return closeRE.test(tag) }
},{"hyperscript-attribute-to-property":6}],6:[function(require,module,exports){
module.exports = attributeToProperty
var transform = {
'class': 'className',
'for': 'htmlFor',
'http-equiv': 'httpEquiv'
}
function attributeToProperty (h) {
return function (tagName, attrs, children) {
for (var attr in attrs) {
if (attr in transform) {
attrs[transform[attr]] = attrs[attr]
delete attrs[attr]
}
}
return h(tagName, attrs, children)
}
}
},{}],7:[function(require,module,exports){
/* global MutationObserver */
var document = require('global/document')
var window = require('global/window')
var watch = Object.create(null)
var KEY_ID = 'onloadid' + (new Date() % 9e6).toString(36)
var KEY_ATTR = 'data-' + KEY_ID
var INDEX = 0
if (window && window.MutationObserver) {
var observer = new MutationObserver(function (mutations) {
if (Object.keys(watch).length < 1) return
for (var i = 0; i < mutations.length; i++) {
if (mutations[i].attributeName === KEY_ATTR) {
eachAttr(mutations[i], turnon, turnoff)
continue
}
eachMutation(mutations[i].removedNodes, turnoff)
eachMutation(mutations[i].addedNodes, turnon)
}
})
observer.observe(document.body, {
childList: true,
subtree: true,
attributes: true,
attributeOldValue: true,
attributeFilter: [KEY_ATTR]
})
}
module.exports = function onload (el, on, off, caller) {
on = on || function () {}
off = off || function () {}
el.setAttribute(KEY_ATTR, 'o' + INDEX)
watch['o' + INDEX] = [on, off, 0, caller || onload.caller]
INDEX += 1
return el
}
function turnon (index, el) {
if (watch[index][0] && watch[index][2] === 0) {
watch[index][0](el)
watch[index][2] = 1
}
}
function turnoff (index, el) {
if (watch[index][1] && watch[index][2] === 1) {
watch[index][1](el)
watch[index][2] = 0
}
}
function eachAttr (mutation, on, off) {
var newValue = mutation.target.getAttribute(KEY_ATTR)
if (sameOrigin(mutation.oldValue, newValue)) {
watch[newValue] = watch[mutation.oldValue]
return
}
if (watch[mutation.oldValue]) {
off(mutation.oldValue, mutation.target)
}
if (watch[newValue]) {
on(newValue, mutation.target)
}
}
function sameOrigin (oldValue, newValue) {
if (!oldValue || !newValue) return false
return watch[oldValue][3] === watch[newValue][3]
}
function eachMutation (nodes, fn) {
var keys = Object.keys(watch)
for (var i = 0; i < nodes.length; i++) {
if (nodes[i] && nodes[i].getAttribute && nodes[i].getAttribute(KEY_ATTR)) {
var onloadid = nodes[i].getAttribute(KEY_ATTR)
keys.forEach(function (k) {
if (onloadid === k) {
fn(k, nodes[i])
}
})
}
if (nodes[i].childNodes.length > 0) {
eachMutation(nodes[i].childNodes, fn)
}
}
}
},{"global/document":3,"global/window":4}],8:[function(require,module,exports){
// Create a range object for efficently rendering strings to elements.
var range;
var testEl = (typeof document !== 'undefined') ?
document.body || document.createElement('div') :
{};
var XHTML = 'http://www.w3.org/1999/xhtml';
var ELEMENT_NODE = 1;
var TEXT_NODE = 3;
var COMMENT_NODE = 8;
// Fixes <https://github.com/patrick-steele-idem/morphdom/issues/32>
// (IE7+ support) <=IE7 does not support el.hasAttribute(name)
var hasAttributeNS;
if (testEl.hasAttributeNS) {
hasAttributeNS = function(el, namespaceURI, name) {
return el.hasAttributeNS(namespaceURI, name);
};
} else if (testEl.hasAttribute) {
hasAttributeNS = function(el, namespaceURI, name) {
return el.hasAttribute(name);
};
} else {
hasAttributeNS = function(el, namespaceURI, name) {
return !!el.getAttributeNode(name);
};
}
function empty(o) {
for (var k in o) {
if (o.hasOwnProperty(k)) {
return false;
}
}
return true;
}
function toElement(str) {
if (!range && document.createRange) {
range = document.createRange();
range.selectNode(document.body);
}
var fragment;
if (range && range.createContextualFragment) {
fragment = range.createContextualFragment(str);
} else {
fragment = document.createElement('body');
fragment.innerHTML = str;
}
return fragment.childNodes[0];
}
var specialElHandlers = {
/**
* Needed for IE. Apparently IE doesn't think that "selected" is an
* attribute when reading over the attributes using selectEl.attributes
*/
OPTION: function(fromEl, toEl) {
fromEl.selected = toEl.selected;
if (fromEl.selected) {
fromEl.setAttribute('selected', '');
} else {
fromEl.removeAttribute('selected', '');
}
},
/**
* The "value" attribute is special for the <input> element since it sets
* the initial value. Changing the "value" attribute without changing the
* "value" property will have no effect since it is only used to the set the
* initial value. Similar for the "checked" attribute, and "disabled".
*/
INPUT: function(fromEl, toEl) {
fromEl.checked = toEl.checked;
if (fromEl.checked) {
fromEl.setAttribute('checked', '');
} else {
fromEl.removeAttribute('checked');
}
if (fromEl.value !== toEl.value) {
fromEl.value = toEl.value;
}
if (!hasAttributeNS(toEl, null, 'value')) {
fromEl.removeAttribute('value');
}
fromEl.disabled = toEl.disabled;
if (fromEl.disabled) {
fromEl.setAttribute('disabled', '');
} else {
fromEl.removeAttribute('disabled');
}
},
TEXTAREA: function(fromEl, toEl) {
var newValue = toEl.value;
if (fromEl.value !== newValue) {
fromEl.value = newValue;
}
if (fromEl.firstChild) {
fromEl.firstChild.nodeValue = newValue;
}
}
};
function noop() {}
/**
* Returns true if two node's names and namespace URIs are the same.
*
* @param {Element} a
* @param {Element} b
* @return {boolean}
*/
var compareNodeNames = function(a, b) {
return a.nodeName === b.nodeName &&
a.namespaceURI === b.namespaceURI;
};
/**
* Create an element, optionally with a known namespace URI.
*
* @param {string} name the element name, e.g. 'div' or 'svg'
* @param {string} [namespaceURI] the element's namespace URI, i.e. the value of
* its `xmlns` attribute or its inferred namespace.
*
* @return {Element}
*/
function createElementNS(name, namespaceURI) {
return !namespaceURI || namespaceURI === XHTML ?
document.createElement(name) :
document.createElementNS(namespaceURI, name);
}
/**
* Loop over all of the attributes on the target node and make sure the original
* DOM node has the same attributes. If an attribute found on the original node
* is not on the new node then remove it from the original node.
*
* @param {Element} fromNode
* @param {Element} toNode
*/
function morphAttrs(fromNode, toNode) {
var attrs = toNode.attributes;
var i;
var attr;
var attrName;
var attrNamespaceURI;
var attrValue;
var fromValue;
for (i = attrs.length - 1; i >= 0; i--) {
attr = attrs[i];
attrName = attr.name;
attrValue = attr.value;
attrNamespaceURI = attr.namespaceURI;
if (attrNamespaceURI) {
attrName = attr.localName || attrName;
fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName);
} else {
fromValue = fromNode.getAttribute(attrName);
}
if (fromValue !== attrValue) {
if (attrNamespaceURI) {
fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue);
} else {
fromNode.setAttribute(attrName, attrValue);
}
}
}
// Remove any extra attributes found on the original DOM element that
// weren't found on the target element.
attrs = fromNode.attributes;
for (i = attrs.length - 1; i >= 0; i--) {
attr = attrs[i];
if (attr.specified !== false) {
attrName = attr.name;
attrNamespaceURI = attr.namespaceURI;
if (!hasAttributeNS(toNode, attrNamespaceURI, attrNamespaceURI ? attrName = attr.localName || attrName : attrName)) {
if (attrNamespaceURI) {
fromNode.removeAttributeNS(attrNamespaceURI, attr.localName);
} else {
fromNode.removeAttribute(attrName);
}
}
}
}
}
/**
* Copies the children of one DOM element to another DOM element
*/
function moveChildren(fromEl, toEl) {
var curChild = fromEl.firstChild;
while (curChild) {
var nextChild = curChild.nextSibling;
toEl.appendChild(curChild);
curChild = nextChild;
}
return toEl;
}
function defaultGetNodeKey(node) {
return node.id;
}
function morphdom(fromNode, toNode, options) {
if (!options) {
options = {};
}
if (typeof toNode === 'string') {
if (fromNode.nodeName === '#document' || fromNode.nodeName === 'HTML') {
var toNodeHtml = toNode;
toNode = document.createElement('html');
toNode.innerHTML = toNodeHtml;
} else {
toNode = toElement(toNode);
}
}
// XXX optimization: if the nodes are equal, don't morph them
/*
if (fromNode.isEqualNode(toNode)) {
return fromNode;
}
*/
var savedEls = {}; // Used to save off DOM elements with IDs
var unmatchedEls = {};
var getNodeKey = options.getNodeKey || defaultGetNodeKey;
var onBeforeNodeAdded = options.onBeforeNodeAdded || noop;
var onNodeAdded = options.onNodeAdded || noop;
var onBeforeElUpdated = options.onBeforeElUpdated || options.onBeforeMorphEl || noop;
var onElUpdated = options.onElUpdated || noop;
var onBeforeNodeDiscarded = options.onBeforeNodeDiscarded || noop;
var onNodeDiscarded = options.onNodeDiscarded || noop;
var onBeforeElChildrenUpdated = options.onBeforeElChildrenUpdated || options.onBeforeMorphElChildren || noop;
var childrenOnly = options.childrenOnly === true;
var movedEls = [];
function removeNodeHelper(node, nestedInSavedEl) {
var id = getNodeKey(node);
// If the node has an ID then save it off since we will want
// to reuse it in case the target DOM tree has a DOM element
// with the same ID
if (id) {
savedEls[id] = node;
} else if (!nestedInSavedEl) {
// If we are not nested in a saved element then we know that this node has been
// completely discarded and will not exist in the final DOM.
onNodeDiscarded(node);
}
if (node.nodeType === ELEMENT_NODE) {
var curChild = node.firstChild;
while (curChild) {
removeNodeHelper(curChild, nestedInSavedEl || id);
curChild = curChild.nextSibling;
}
}
}
function walkDiscardedChildNodes(node) {
if (node.nodeType === ELEMENT_NODE) {
var curChild = node.firstChild;
while (curChild) {
if (!getNodeKey(curChild)) {
// We only want to handle nodes that don't have an ID to avoid double
// walking the same saved element.
onNodeDiscarded(curChild);
// Walk recursively
walkDiscardedChildNodes(curChild);
}
curChild = curChild.nextSibling;
}
}
}
function removeNode(node, parentNode, alreadyVisited) {
if (onBeforeNodeDiscarded(node) === false) {
return;
}
parentNode.removeChild(node);
if (alreadyVisited) {
if (!getNodeKey(node)) {
onNodeDiscarded(node);
walkDiscardedChildNodes(node);
}
} else {
removeNodeHelper(node);
}
}
function morphEl(fromEl, toEl, alreadyVisited, childrenOnly) {
var toElKey = getNodeKey(toEl);
if (toElKey) {
// If an element with an ID is being morphed then it is will be in the final
// DOM so clear it out of the saved elements collection
delete savedEls[toElKey];
}
if (!childrenOnly) {
if (onBeforeElUpdated(fromEl, toEl) === false) {
return;
}
morphAttrs(fromEl, toEl);
onElUpdated(fromEl);
if (onBeforeElChildrenUpdated(fromEl, toEl) === false) {
return;
}
}
if (fromEl.nodeName !== 'TEXTAREA') {
var curToNodeChild = toEl.firstChild;
var curFromNodeChild = fromEl.firstChild;
var curToNodeId;
var fromNextSibling;
var toNextSibling;
var savedEl;
var unmatchedEl;
outer: while (curToNodeChild) {
toNextSibling = curToNodeChild.nextSibling;
curToNodeId = getNodeKey(curToNodeChild);
while (curFromNodeChild) {
var curFromNodeId = getNodeKey(curFromNodeChild);
fromNextSibling = curFromNodeChild.nextSibling;
if (!alreadyVisited) {
if (curFromNodeId && (unmatchedEl = unmatchedEls[curFromNodeId])) {
unmatchedEl.parentNode.replaceChild(curFromNodeChild, unmatchedEl);
morphEl(curFromNodeChild, unmatchedEl, alreadyVisited);
curFromNodeChild = fromNextSibling;
continue;
}
}
var curFromNodeType = curFromNodeChild.nodeType;
if (curFromNodeType === curToNodeChild.nodeType) {
var isCompatible = false;
// Both nodes being compared are Element nodes
if (curFromNodeType === ELEMENT_NODE) {
if (compareNodeNames(curFromNodeChild, curToNodeChild)) {
// We have compatible DOM elements
if (curFromNodeId || curToNodeId) {
// If either DOM element has an ID then we
// handle those differently since we want to
// match up by ID
if (curToNodeId === curFromNodeId) {
isCompatible = true;
}
} else {
isCompatible = true;
}
}
if (isCompatible) {
// We found compatible DOM elements so transform
// the current "from" node to match the current
// target DOM node.
morphEl(curFromNodeChild, curToNodeChild, alreadyVisited);
}
// Both nodes being compared are Text or Comment nodes
} else if (curFromNodeType === TEXT_NODE || curFromNodeType == COMMENT_NODE) {
isCompatible = true;
// Simply update nodeValue on the original node to
// change the text value
curFromNodeChild.nodeValue = curToNodeChild.nodeValue;
}
if (isCompatible) {
curToNodeChild = toNextSibling;
curFromNodeChild = fromNextSibling;
continue outer;
}
}
// No compatible match so remove the old node from the DOM
// and continue trying to find a match in the original DOM
removeNode(curFromNodeChild, fromEl, alreadyVisited);
curFromNodeChild = fromNextSibling;
}
if (curToNodeId) {
if ((savedEl = savedEls[curToNodeId])) {
if (compareNodeNames(savedEl, curToNodeChild)) {
morphEl(savedEl, curToNodeChild, true);
// We want to append the saved element instead
curToNodeChild = savedEl;
} else {
delete savedEls[curToNodeId];
onNodeDiscarded(savedEl);
}
} else {
// The current DOM element in the target tree has an ID
// but we did not find a match in any of the
// corresponding siblings. We just put the target
// element in the old DOM tree but if we later find an
// element in the old DOM tree that has a matching ID
// then we will replace the target element with the
// corresponding old element and morph the old element
unmatchedEls[curToNodeId] = curToNodeChild;
}
}
// If we got this far then we did not find a candidate match for
// our "to node" and we exhausted all of the children "from"
// nodes. Therefore, we will just append the current "to node"
// to the end
if (onBeforeNodeAdded(curToNodeChild) !== false) {
fromEl.appendChild(curToNodeChild);
onNodeAdded(curToNodeChild);
}
if (curToNodeChild.nodeType === ELEMENT_NODE &&
(curToNodeId || curToNodeChild.firstChild)) {
// The element that was just added to the original DOM may
// have some nested elements with a key/ID that needs to be
// matched up with other elements. We'll add the element to
// a list so that we can later process the nested elements
// if there are any unmatched keyed elements that were
// discarded
movedEls.push(curToNodeChild);
}
curToNodeChild = toNextSibling;
curFromNodeChild = fromNextSibling;
}
// We have processed all of the "to nodes". If curFromNodeChild is
// non-null then we still have some from nodes left over that need
// to be removed
while (curFromNodeChild) {
fromNextSibling = curFromNodeChild.nextSibling;
removeNode(curFromNodeChild, fromEl, alreadyVisited);
curFromNodeChild = fromNextSibling;
}
}
var specialElHandler = specialElHandlers[fromEl.nodeName];
if (specialElHandler) {
specialElHandler(fromEl, toEl);
}
} // END: morphEl(...)
var morphedNode = fromNode;
var morphedNodeType = morphedNode.nodeType;
var toNodeType = toNode.nodeType;
if (!childrenOnly) {
// Handle the case where we are given two DOM nodes that are not
// compatible (e.g. <div> --> <span> or <div> --> TEXT)
if (morphedNodeType === ELEMENT_NODE) {
if (toNodeType === ELEMENT_NODE) {
if (!compareNodeNames(fromNode, toNode)) {
onNodeDiscarded(fromNode);
morphedNode = moveChildren(fromNode, createElementNS(toNode.nodeName, toNode.namespaceURI));
}
} else {
// Going from an element node to a text node
morphedNode = toNode;
}
} else if (morphedNodeType === TEXT_NODE || morphedNodeType === COMMENT_NODE) { // Text or comment node
if (toNodeType === morphedNodeType) {
morphedNode.nodeValue = toNode.nodeValue;
return morphedNode;
} else {
// Text node to something else
morphedNode = toNode;
}
}
}
if (morphedNode === toNode) {
// The "to node" was not compatible with the "from node" so we had to
// toss out the "from node" and use the "to node"
onNodeDiscarded(fromNode);
} else {
morphEl(morphedNode, toNode, false, childrenOnly);
/**
* What we will do here is walk the tree for the DOM element that was
* moved from the target DOM tree to the original DOM tree and we will
* look for keyed elements that could be matched to keyed elements that
* were earlier discarded. If we find a match then we will move the
* saved element into the final DOM tree.
*/
var handleMovedEl = function(el) {
var curChild = el.firstChild;
while (curChild) {
var nextSibling = curChild.nextSibling;
var key = getNodeKey(curChild);
if (key) {
var savedEl = savedEls[key];
if (savedEl && compareNodeNames(curChild, savedEl)) {
curChild.parentNode.replaceChild(savedEl, curChild);
// true: already visited the saved el tree
morphEl(savedEl, curChild, true);
curChild = nextSibling;
if (empty(savedEls)) {
return false;
}
continue;
}
}
if (curChild.nodeType === ELEMENT_NODE) {
handleMovedEl(curChild);
}
curChild = nextSibling;
}
};
// The loop below is used to possibly match up any discarded
// elements in the original DOM tree with elemenets from the
// target tree that were moved over without visiting their
// children
if (!empty(savedEls)) {
handleMovedElsLoop:
while (movedEls.length) {
var movedElsTemp = movedEls;
movedEls = [];
for (var i=0; i<movedElsTemp.length; i++) {
if (handleMovedEl(movedElsTemp[i]) === false) {
// There are no more unmatched elements so completely end
// the loop
break handleMovedElsLoop;
}
}
}
}
// Fire the "onNodeDiscarded" event for any saved elements
// that never found a new home in the morphed DOM
for (var savedElId in savedEls) {
if (savedEls.hasOwnProperty(savedElId)) {
var savedEl = savedEls[savedElId];
onNodeDiscarded(savedEl);
walkDiscardedChildNodes(savedEl);
}
}
}
if (!childrenOnly && morphedNode !== fromNode && fromNode.parentNode) {
// If we had to swap out the from node with a new node because the old
// node was not compatible with the target node then we need to
// replace the old DOM node in the original DOM tree. This is only
// possible if the original DOM node was part of a DOM tree which
// we know is the case if it has a parent node.
fromNode.parentNode.replaceChild(morphedNode, fromNode);
}
return morphedNode;
}
module.exports = morphdom;
},{}],9:[function(require,module,exports){
module.exports = [
// attribute events (can be set with attributes)
'onclick',
'ondblclick',
'onmousedown',
'onmouseup',
'onmouseover',
'onmousemove',
'onmouseout',
'ondragstart',
'ondrag',
'ondragenter',
'ondragleave',
'ondragover',
'ondrop',
'ondragend',
'onkeydown',
'onkeypress',
'onkeyup',
'onunload',
'onabort',
'onerror',
'onresize',
'onscroll',
'onselect',
'onchange',
'onsubmit',
'onreset',
'onfocus',
'onblur',
'oninput',
// other common events
'oncontextmenu',
'onfocusin',
'onfocusout'
]
},{}],"yo-yo":[function(require,module,exports){
var bel = require('bel') // turns template tag into DOM elements
var morphdom = require('morphdom') // efficiently diffs + morphs two DOM elements
var defaultEvents = require('./update-events.js') // default events to be copied when dom elements update
module.exports = bel
// TODO move this + defaultEvents to a new module once we receive more feedback
module.exports.update = function (fromNode, toNode, opts) {
if (!opts) opts = {}
if (opts.events !== false) {
if (!opts.onBeforeMorphEl) opts.onBeforeMorphEl = copier
}
return morphdom(fromNode, toNode, opts)
// morphdom only copies attributes. we decided we also wanted to copy events
// that can be set via attributes
function copier (f, t) {
// copy events:
var events = opts.events || defaultEvents
for (var i = 0; i < events.length; i++) {
var ev = events[i]
if (t[ev]) { // if new element has a whitelisted attribute
f[ev] = t[ev] // update existing element
} else if (f[ev]) { // if existing element has it and new one doesnt
f[ev] = undefined // remove it from existing element
}
}
// copy values for form elements
if ((f.nodeName === 'INPUT' && f.type !== 'file') || f.nodeName === 'TEXTAREA' || f.nodeName === 'SELECT') {
if (t.getAttribute('value') === null) t.value = f.value
}
}
}
},{"./update-events.js":9,"bel":2,"morphdom":8}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcmVzb2x2ZS9lbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9iZWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYmVsL25vZGVfbW9kdWxlcy9nbG9iYWwvZG9jdW1lbnQuanMiLCJub2RlX21vZHVsZXMvYmVsL25vZGVfbW9kdWxlcy9nbG9iYWwvd2luZG93LmpzIiwibm9kZV9tb2R1bGVzL2JlbC9ub2RlX21vZHVsZXMvaHlwZXJ4L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2JlbC9ub2RlX21vZHVsZXMvaHlwZXJ4L25vZGVfbW9kdWxlcy9oeXBlcnNjcmlwdC1hdHRyaWJ1dGUtdG8tcHJvcGVydHkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYmVsL25vZGVfbW9kdWxlcy9vbi1sb2FkL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21vcnBoZG9tL2xpYi9pbmRleC5qcyIsInVwZGF0ZS1ldmVudHMuanMiLCJpbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNya0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsbnVsbCwidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnZ2xvYmFsL2RvY3VtZW50JylcbnZhciBoeXBlcnggPSByZXF1aXJlKCdoeXBlcngnKVxudmFyIG9ubG9hZCA9IHJlcXVpcmUoJ29uLWxvYWQnKVxuXG52YXIgU1ZHTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnXG52YXIgQk9PTF9QUk9QUyA9IHtcbiAgYXV0b2ZvY3VzOiAxLFxuICBjaGVja2VkOiAxLFxuICBkZWZhdWx0Y2hlY2tlZDogMSxcbiAgZGlzYWJsZWQ6IDEsXG4gIGZvcm1ub3ZhbGlkYXRlOiAxLFxuICBpbmRldGVybWluYXRlOiAxLFxuICByZWFkb25seTogMSxcbiAgcmVxdWlyZWQ6IDEsXG4gIHNlbGVjdGVkOiAxLFxuICB3aWxsdmFsaWRhdGU6IDFcbn1cbnZhciBTVkdfVEFHUyA9IFtcbiAgJ3N2ZycsXG4gICdhbHRHbHlwaCcsICdhbHRHbHlwaERlZicsICdhbHRHbHlwaEl0ZW0nLCAnYW5pbWF0ZScsICdhbmltYXRlQ29sb3InLFxuICAnYW5pbWF0ZU1vdGlvbicsICdhbmltYXRlVHJhbnNmb3JtJywgJ2NpcmNsZScsICdjbGlwUGF0aCcsICdjb2xvci1wcm9maWxlJyxcbiAgJ2N1cnNvcicsICdkZWZzJywgJ2Rlc2MnLCAnZWxsaXBzZScsICdmZUJsZW5kJywgJ2ZlQ29sb3JNYXRyaXgnLFxuICAnZmVDb21wb25lbnRUcmFuc2ZlcicsICdmZUNvbXBvc2l0ZScsICdmZUNvbnZvbHZlTWF0cml4JywgJ2ZlRGlmZnVzZUxpZ2h0aW5nJyxcbiAgJ2ZlRGlzcGxhY2VtZW50TWFwJywgJ2ZlRGlzdGFudExpZ2h0JywgJ2ZlRmxvb2QnLCAnZmVGdW5jQScsICdmZUZ1bmNCJyxcbiAgJ2ZlRnVuY0cnLCAnZmVGdW5jUicsICdmZUdhdXNzaWFuQmx1cicsICdmZUltYWdlJywgJ2ZlTWVyZ2UnLCAnZmVNZXJnZU5vZGUnLFxuICAnZmVNb3JwaG9sb2d5JywgJ2ZlT2Zmc2V0JywgJ2ZlUG9pbnRMaWdodCcsICdmZVNwZWN1bGFyTGlnaHRpbmcnLFxuICAnZmVTcG90TGlnaHQnLCAnZmVUaWxlJywgJ2ZlVHVyYnVsZW5jZScsICdmaWx0ZXInLCAnZm9udCcsICdmb250LWZhY2UnLFxuICAnZm9udC1mYWNlLWZvcm1hdCcsICdmb250LWZhY2UtbmFtZScsICdmb250LWZhY2Utc3JjJywgJ2ZvbnQtZmFjZS11cmknLFxuICAnZm9yZWlnbk9iamVjdCcsICdnJywgJ2dseXBoJywgJ2dseXBoUmVmJywgJ2hrZXJuJywgJ2ltYWdlJywgJ2xpbmUnLFxuICAnbGluZWFyR3JhZGllbnQnLCAnbWFya2VyJywgJ21hc2snLCAnbWV0YWRhdGEnLCAnbWlzc2luZy1nbHlwaCcsICdtcGF0aCcsXG4gICdwYXRoJywgJ3BhdHRlcm4nLCAncG9seWdvbicsICdwb2x5bGluZScsICdyYWRpYWxHcmFkaWVudCcsICdyZWN0JyxcbiAgJ3NldCcsICdzdG9wJywgJ3N3aXRjaCcsICdzeW1ib2wnLCAndGV4dCcsICd0ZXh0UGF0aCcsICd0aXRsZScsICd0cmVmJyxcbiAgJ3RzcGFuJywgJ3VzZScsICd2aWV3JywgJ3ZrZXJuJ1xuXVxuXG5mdW5jdGlvbiBiZWxDcmVhdGVFbGVtZW50ICh0YWcsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgZWxcblxuICAvLyBJZiBhbiBzdmcgdGFnLCBpdCBuZWVkcyBhIG5hbWVzcGFjZVxuICBpZiAoU1ZHX1RBR1MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgIHByb3BzLm5hbWVzcGFjZSA9IFNWR05TXG4gIH1cblxuICAvLyBJZiB3ZSBhcmUgdXNpbmcgYSBuYW1lc3BhY2VcbiAgdmFyIG5zID0gZmFsc2VcbiAgaWYgKHByb3BzLm5hbWVzcGFjZSkge1xuICAgIG5zID0gcHJvcHMubmFtZXNwYWNlXG4gICAgZGVsZXRlIHByb3BzLm5hbWVzcGFjZVxuICB9XG5cbiAgLy8gQ3JlYXRlIHRoZSBlbGVtZW50XG4gIGlmIChucykge1xuICAgIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5zLCB0YWcpXG4gIH0gZWxzZSB7XG4gICAgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZylcbiAgfVxuXG4gIC8vIElmIGFkZGluZyBvbmxvYWQgZXZlbnRzXG4gIGlmIChwcm9wcy5vbmxvYWQgfHwgcHJvcHMub251bmxvYWQpIHtcbiAgICB2YXIgbG9hZCA9IHByb3BzLm9ubG9hZCB8fCBmdW5jdGlvbiAoKSB7fVxuICAgIHZhciB1bmxvYWQgPSBwcm9wcy5vbnVubG9hZCB8fCBmdW5jdGlvbiAoKSB7fVxuICAgIG9ubG9hZChlbCwgZnVuY3Rpb24gYmVsX29ubG9hZCAoKSB7XG4gICAgICBsb2FkKGVsKVxuICAgIH0sIGZ1bmN0aW9uIGJlbF9vbnVubG9hZCAoKSB7XG4gICAgICB1bmxvYWQoZWwpXG4gICAgfSxcbiAgICAvLyBXZSBoYXZlIHRvIHVzZSBub24tc3RhbmRhcmQgYGNhbGxlcmAgdG8gZmluZCB3aG8gaW52b2tlcyBgYmVsQ3JlYXRlRWxlbWVudGBcbiAgICBiZWxDcmVhdGVFbGVtZW50LmNhbGxlci5jYWxsZXIuY2FsbGVyKVxuICAgIGRlbGV0ZSBwcm9wcy5vbmxvYWRcbiAgICBkZWxldGUgcHJvcHMub251bmxvYWRcbiAgfVxuXG4gIC8vIENyZWF0ZSB0aGUgcHJvcGVydGllc1xuICBmb3IgKHZhciBwIGluIHByb3BzKSB7XG4gICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KHApKSB7XG4gICAgICB2YXIga2V5ID0gcC50b0xvd2VyQ2FzZSgpXG4gICAgICB2YXIgdmFsID0gcHJvcHNbcF1cbiAgICAgIC8vIE5vcm1hbGl6ZSBjbGFzc05hbWVcbiAgICAgIGlmIChrZXkgPT09ICdjbGFzc25hbWUnKSB7XG4gICAgICAgIGtleSA9ICdjbGFzcydcbiAgICAgICAgcCA9ICdjbGFzcydcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBmb3IgYXR0cmlidXRlIGdldHMgdHJhbnNmb3JtZWQgdG8gaHRtbEZvciwgYnV0IHdlIGp1c3Qgc2V0IGFzIGZvclxuICAgICAgaWYgKHAgPT09ICdodG1sRm9yJykge1xuICAgICAgICBwID0gJ2ZvcidcbiAgICAgIH1cbiAgICAgIC8vIElmIGEgcHJvcGVydHkgaXMgYm9vbGVhbiwgc2V0IGl0c2VsZiB0byB0aGUga2V5XG4gICAgICBpZiAoQk9PTF9QUk9QU1trZXldKSB7XG4gICAgICAgIGlmICh2YWwgPT09ICd0cnVlJykgdmFsID0ga2V5XG4gICAgICAgIGVsc2UgaWYgKHZhbCA9PT0gJ2ZhbHNlJykgY29udGludWVcbiAgICAgIH1cbiAgICAgIC8vIElmIGEgcHJvcGVydHkgcHJlZmVycyBiZWluZyBzZXQgZGlyZWN0bHkgdnMgc2V0QXR0cmlidXRlXG4gICAgICBpZiAoa2V5LnNsaWNlKDAsIDIpID09PSAnb24nKSB7XG4gICAgICAgIGVsW3BdID0gdmFsXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobnMpIHtcbiAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBwLCB2YWwpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWwuc2V0QXR0cmlidXRlKHAsIHZhbClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGVuZENoaWxkIChjaGlsZHMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRzKSkgcmV0dXJuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gY2hpbGRzW2ldXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgICAgICBhcHBlbmRDaGlsZChub2RlKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG5vZGUgPT09ICdudW1iZXInIHx8XG4gICAgICAgIHR5cGVvZiBub2RlID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgbm9kZSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgbm9kZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICBub2RlID0gbm9kZS50b1N0cmluZygpXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKGVsLmxhc3RDaGlsZCAmJiBlbC5sYXN0Q2hpbGQubm9kZU5hbWUgPT09ICcjdGV4dCcpIHtcbiAgICAgICAgICBlbC5sYXN0Q2hpbGQubm9kZVZhbHVlICs9IG5vZGVcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShub2RlKVxuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSAmJiBub2RlLm5vZGVUeXBlKSB7XG4gICAgICAgIGVsLmFwcGVuZENoaWxkKG5vZGUpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGFwcGVuZENoaWxkKGNoaWxkcmVuKVxuXG4gIHJldHVybiBlbFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGh5cGVyeChiZWxDcmVhdGVFbGVtZW50KVxubW9kdWxlLmV4cG9ydHMuY3JlYXRlRWxlbWVudCA9IGJlbENyZWF0ZUVsZW1lbnRcbiIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcbnZhciB0b3BMZXZlbCA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDpcbiAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHt9XG52YXIgbWluRG9jID0gcmVxdWlyZSgnbWluLWRvY3VtZW50Jyk7XG5cbmlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBkb2N1bWVudDtcbn0gZWxzZSB7XG4gICAgdmFyIGRvY2N5ID0gdG9wTGV2ZWxbJ19fR0xPQkFMX0RPQ1VNRU5UX0NBQ0hFQDQnXTtcblxuICAgIGlmICghZG9jY3kpIHtcbiAgICAgICAgZG9jY3kgPSB0b3BMZXZlbFsnX19HTE9CQUxfRE9DVU1FTlRfQ0FDSEVANCddID0gbWluRG9jO1xuICAgIH1cblxuICAgIG1vZHVsZS5leHBvcnRzID0gZG9jY3k7XG59XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW01dlpHVmZiVzlrZFd4bGN5OWlaV3d2Ym05a1pWOXRiMlIxYkdWekwyZHNiMkpoYkM5a2IyTjFiV1Z1ZEM1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU8wRkJRVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFaUxDSm1hV3hsSWpvaVoyVnVaWEpoZEdWa0xtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJblpoY2lCMGIzQk1aWFpsYkNBOUlIUjVjR1Z2WmlCbmJHOWlZV3dnSVQwOUlDZDFibVJsWm1sdVpXUW5JRDhnWjJ4dlltRnNJRHBjYmlBZ0lDQjBlWEJsYjJZZ2QybHVaRzkzSUNFOVBTQW5kVzVrWldacGJtVmtKeUEvSUhkcGJtUnZkeUE2SUh0OVhHNTJZWElnYldsdVJHOWpJRDBnY21WeGRXbHlaU2duYldsdUxXUnZZM1Z0Wlc1MEp5azdYRzVjYm1sbUlDaDBlWEJsYjJZZ1pHOWpkVzFsYm5RZ0lUMDlJQ2QxYm1SbFptbHVaV1FuS1NCN1hHNGdJQ0FnYlc5a2RXeGxMbVY0Y0c5eWRITWdQU0JrYjJOMWJXVnVkRHRjYm4wZ1pXeHpaU0I3WEc0Z0lDQWdkbUZ5SUdSdlkyTjVJRDBnZEc5d1RHVjJaV3hiSjE5ZlIweFBRa0ZNWDBSUFExVk5SVTVVWDBOQlEwaEZRRFFuWFR0Y2JseHVJQ0FnSUdsbUlDZ2haRzlqWTNrcElIdGNiaUFnSUNBZ0lDQWdaRzlqWTNrZ1BTQjBiM0JNWlhabGJGc25YMTlIVEU5Q1FVeGZSRTlEVlUxRlRsUmZRMEZEU0VWQU5DZGRJRDBnYldsdVJHOWpPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1pHOWpZM2s3WEc1OVhHNGlYWDA9IiwiKGZ1bmN0aW9uIChnbG9iYWwpe1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBzZWxmO1xufSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHt9O1xufVxuXG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltNXZaR1ZmYlc5a2RXeGxjeTlpWld3dmJtOWtaVjl0YjJSMWJHVnpMMmRzYjJKaGJDOTNhVzVrYjNjdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqdEJRVUZCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CSWl3aVptbHNaU0k2SW1kbGJtVnlZWFJsWkM1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SnBaaUFvZEhsd1pXOW1JSGRwYm1SdmR5QWhQVDBnWENKMWJtUmxabWx1WldSY0lpa2dlMXh1SUNBZ0lHMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ2QybHVaRzkzTzF4dWZTQmxiSE5sSUdsbUlDaDBlWEJsYjJZZ1oyeHZZbUZzSUNFOVBTQmNJblZ1WkdWbWFXNWxaRndpS1NCN1hHNGdJQ0FnYlc5a2RXeGxMbVY0Y0c5eWRITWdQU0JuYkc5aVlXdzdYRzU5SUdWc2MyVWdhV1lnS0hSNWNHVnZaaUJ6Wld4bUlDRTlQU0JjSW5WdVpHVm1hVzVsWkZ3aUtYdGNiaUFnSUNCdGIyUjFiR1V1Wlhod2IzSjBjeUE5SUhObGJHWTdYRzU5SUdWc2MyVWdlMXh1SUNBZ0lHMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ2UzMDdYRzU5WEc0aVhYMD0iLCJ2YXIgYXR0clRvUHJvcCA9IHJlcXVpcmUoJ2h5cGVyc2NyaXB0LWF0dHJpYnV0ZS10by1wcm9wZXJ0eScpXG5cbnZhciBWQVIgPSAwLCBURVhUID0gMSwgT1BFTiA9IDIsIENMT1NFID0gMywgQVRUUiA9IDRcbnZhciBBVFRSX0tFWSA9IDUsIEFUVFJfS0VZX1cgPSA2XG52YXIgQVRUUl9WQUxVRV9XID0gNywgQVRUUl9WQUxVRSA9IDhcbnZhciBBVFRSX1ZBTFVFX1NRID0gOSwgQVRUUl9WQUxVRV9EUSA9IDEwXG52YXIgQVRUUl9FUSA9IDExLCBBVFRSX0JSRUFLID0gMTJcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaCwgb3B0cykge1xuICBoID0gYXR0clRvUHJvcChoKVxuICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuICB2YXIgY29uY2F0ID0gb3B0cy5jb25jYXQgfHwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gU3RyaW5nKGEpICsgU3RyaW5nKGIpXG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKHN0cmluZ3MpIHtcbiAgICB2YXIgc3RhdGUgPSBURVhULCByZWcgPSAnJ1xuICAgIHZhciBhcmdsZW4gPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgdmFyIHBhcnRzID0gW11cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGkgPCBhcmdsZW4gLSAxKSB7XG4gICAgICAgIHZhciBhcmcgPSBhcmd1bWVudHNbaSsxXVxuICAgICAgICB2YXIgcCA9IHBhcnNlKHN0cmluZ3NbaV0pXG4gICAgICAgIHZhciB4c3RhdGUgPSBzdGF0ZVxuICAgICAgICBpZiAoeHN0YXRlID09PSBBVFRSX1ZBTFVFX0RRKSB4c3RhdGUgPSBBVFRSX1ZBTFVFXG4gICAgICAgIGlmICh4c3RhdGUgPT09IEFUVFJfVkFMVUVfU1EpIHhzdGF0ZSA9IEFUVFJfVkFMVUVcbiAgICAgICAgaWYgKHhzdGF0ZSA9PT0gQVRUUl9WQUxVRV9XKSB4c3RhdGUgPSBBVFRSX1ZBTFVFXG4gICAgICAgIGlmICh4c3RhdGUgPT09IEFUVFIpIHhzdGF0ZSA9IEFUVFJfS0VZXG4gICAgICAgIHAucHVzaChbIFZBUiwgeHN0YXRlLCBhcmcgXSlcbiAgICAgICAgcGFydHMucHVzaC5hcHBseShwYXJ0cywgcClcbiAgICAgIH0gZWxzZSBwYXJ0cy5wdXNoLmFwcGx5KHBhcnRzLCBwYXJzZShzdHJpbmdzW2ldKSlcbiAgICB9XG5cbiAgICB2YXIgdHJlZSA9IFtudWxsLHt9LFtdXVxuICAgIHZhciBzdGFjayA9IFtbdHJlZSwtMV1dXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGN1ciA9IHN0YWNrW3N0YWNrLmxlbmd0aC0xXVswXVxuICAgICAgdmFyIHAgPSBwYXJ0c1tpXSwgcyA9IHBbMF1cbiAgICAgIGlmIChzID09PSBPUEVOICYmIC9eXFwvLy50ZXN0KHBbMV0pKSB7XG4gICAgICAgIHZhciBpeCA9IHN0YWNrW3N0YWNrLmxlbmd0aC0xXVsxXVxuICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gMSkge1xuICAgICAgICAgIHN0YWNrLnBvcCgpXG4gICAgICAgICAgc3RhY2tbc3RhY2subGVuZ3RoLTFdWzBdWzJdW2l4XSA9IGgoXG4gICAgICAgICAgICBjdXJbMF0sIGN1clsxXSwgY3VyWzJdLmxlbmd0aCA/IGN1clsyXSA6IHVuZGVmaW5lZFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzID09PSBPUEVOKSB7XG4gICAgICAgIHZhciBjID0gW3BbMV0se30sW11dXG4gICAgICAgIGN1clsyXS5wdXNoKGMpXG4gICAgICAgIHN0YWNrLnB1c2goW2MsY3VyWzJdLmxlbmd0aC0xXSlcbiAgICAgIH0gZWxzZSBpZiAocyA9PT0gQVRUUl9LRVkgfHwgKHMgPT09IFZBUiAmJiBwWzFdID09PSBBVFRSX0tFWSkpIHtcbiAgICAgICAgdmFyIGtleSA9ICcnXG4gICAgICAgIHZhciBjb3B5S2V5XG4gICAgICAgIGZvciAoOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAocGFydHNbaV1bMF0gPT09IEFUVFJfS0VZKSB7XG4gICAgICAgICAgICBrZXkgPSBjb25jYXQoa2V5LCBwYXJ0c1tpXVsxXSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHBhcnRzW2ldWzBdID09PSBWQVIgJiYgcGFydHNbaV1bMV0gPT09IEFUVFJfS0VZKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcnRzW2ldWzJdID09PSAnb2JqZWN0JyAmJiAha2V5KSB7XG4gICAgICAgICAgICAgIGZvciAoY29weUtleSBpbiBwYXJ0c1tpXVsyXSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0c1tpXVsyXS5oYXNPd25Qcm9wZXJ0eShjb3B5S2V5KSAmJiAhY3VyWzFdW2NvcHlLZXldKSB7XG4gICAgICAgICAgICAgICAgICBjdXJbMV1bY29weUtleV0gPSBwYXJ0c1tpXVsyXVtjb3B5S2V5XVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAga2V5ID0gY29uY2F0KGtleSwgcGFydHNbaV1bMl0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRzW2ldWzBdID09PSBBVFRSX0VRKSBpKytcbiAgICAgICAgdmFyIGogPSBpXG4gICAgICAgIGZvciAoOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAocGFydHNbaV1bMF0gPT09IEFUVFJfVkFMVUUgfHwgcGFydHNbaV1bMF0gPT09IEFUVFJfS0VZKSB7XG4gICAgICAgICAgICBpZiAoIWN1clsxXVtrZXldKSBjdXJbMV1ba2V5XSA9IHN0cmZuKHBhcnRzW2ldWzFdKVxuICAgICAgICAgICAgZWxzZSBjdXJbMV1ba2V5XSA9IGNvbmNhdChjdXJbMV1ba2V5XSwgcGFydHNbaV1bMV0pXG4gICAgICAgICAgfSBlbHNlIGlmIChwYXJ0c1tpXVswXSA9PT0gVkFSXG4gICAgICAgICAgJiYgKHBhcnRzW2ldWzFdID09PSBBVFRSX1ZBTFVFIHx8IHBhcnRzW2ldWzFdID09PSBBVFRSX0tFWSkpIHtcbiAgICAgICAgICAgIGlmICghY3VyWzFdW2tleV0pIGN1clsxXVtrZXldID0gc3RyZm4ocGFydHNbaV1bMl0pXG4gICAgICAgICAgICBlbHNlIGN1clsxXVtrZXldID0gY29uY2F0KGN1clsxXVtrZXldLCBwYXJ0c1tpXVsyXSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGtleS5sZW5ndGggJiYgIWN1clsxXVtrZXldICYmIGkgPT09IGpcbiAgICAgICAgICAgICYmIChwYXJ0c1tpXVswXSA9PT0gQ0xPU0UgfHwgcGFydHNbaV1bMF0gPT09IEFUVFJfQlJFQUspKSB7XG4gICAgICAgICAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZnJhc3RydWN0dXJlLmh0bWwjYm9vbGVhbi1hdHRyaWJ1dGVzXG4gICAgICAgICAgICAgIC8vIGVtcHR5IHN0cmluZyBpcyBmYWxzeSwgbm90IHdlbGwgYmVoYXZlZCB2YWx1ZSBpbiBicm93c2VyXG4gICAgICAgICAgICAgIGN1clsxXVtrZXldID0ga2V5LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHMgPT09IEFUVFJfS0VZKSB7XG4gICAgICAgIGN1clsxXVtwWzFdXSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAocyA9PT0gVkFSICYmIHBbMV0gPT09IEFUVFJfS0VZKSB7XG4gICAgICAgIGN1clsxXVtwWzJdXSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAocyA9PT0gQ0xPU0UpIHtcbiAgICAgICAgaWYgKHNlbGZDbG9zaW5nKGN1clswXSkgJiYgc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGl4ID0gc3RhY2tbc3RhY2subGVuZ3RoLTFdWzFdXG4gICAgICAgICAgc3RhY2sucG9wKClcbiAgICAgICAgICBzdGFja1tzdGFjay5sZW5ndGgtMV1bMF1bMl1baXhdID0gaChcbiAgICAgICAgICAgIGN1clswXSwgY3VyWzFdLCBjdXJbMl0ubGVuZ3RoID8gY3VyWzJdIDogdW5kZWZpbmVkXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHMgPT09IFZBUiAmJiBwWzFdID09PSBURVhUKSB7XG4gICAgICAgIGlmIChwWzJdID09PSB1bmRlZmluZWQgfHwgcFsyXSA9PT0gbnVsbCkgcFsyXSA9ICcnXG4gICAgICAgIGVsc2UgaWYgKCFwWzJdKSBwWzJdID0gY29uY2F0KCcnLCBwWzJdKVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwWzJdWzBdKSkge1xuICAgICAgICAgIGN1clsyXS5wdXNoLmFwcGx5KGN1clsyXSwgcFsyXSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJbMl0ucHVzaChwWzJdKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHMgPT09IFRFWFQpIHtcbiAgICAgICAgY3VyWzJdLnB1c2gocFsxXSlcbiAgICAgIH0gZWxzZSBpZiAocyA9PT0gQVRUUl9FUSB8fCBzID09PSBBVFRSX0JSRUFLKSB7XG4gICAgICAgIC8vIG5vLW9wXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuaGFuZGxlZDogJyArIHMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRyZWVbMl0ubGVuZ3RoID4gMSAmJiAvXlxccyokLy50ZXN0KHRyZWVbMl1bMF0pKSB7XG4gICAgICB0cmVlWzJdLnNoaWZ0KClcbiAgICB9XG5cbiAgICBpZiAodHJlZVsyXS5sZW5ndGggPiAyXG4gICAgfHwgKHRyZWVbMl0ubGVuZ3RoID09PSAyICYmIC9cXFMvLnRlc3QodHJlZVsyXVsxXSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdtdWx0aXBsZSByb290IGVsZW1lbnRzIG11c3QgYmUgd3JhcHBlZCBpbiBhbiBlbmNsb3NpbmcgdGFnJ1xuICAgICAgKVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0cmVlWzJdWzBdKSAmJiB0eXBlb2YgdHJlZVsyXVswXVswXSA9PT0gJ3N0cmluZydcbiAgICAmJiBBcnJheS5pc0FycmF5KHRyZWVbMl1bMF1bMl0pKSB7XG4gICAgICB0cmVlWzJdWzBdID0gaCh0cmVlWzJdWzBdWzBdLCB0cmVlWzJdWzBdWzFdLCB0cmVlWzJdWzBdWzJdKVxuICAgIH1cbiAgICByZXR1cm4gdHJlZVsyXVswXVxuXG4gICAgZnVuY3Rpb24gcGFyc2UgKHN0cikge1xuICAgICAgdmFyIHJlcyA9IFtdXG4gICAgICBpZiAoc3RhdGUgPT09IEFUVFJfVkFMVUVfVykgc3RhdGUgPSBBVFRSXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYyA9IHN0ci5jaGFyQXQoaSlcbiAgICAgICAgaWYgKHN0YXRlID09PSBURVhUICYmIGMgPT09ICc8Jykge1xuICAgICAgICAgIGlmIChyZWcubGVuZ3RoKSByZXMucHVzaChbVEVYVCwgcmVnXSlcbiAgICAgICAgICByZWcgPSAnJ1xuICAgICAgICAgIHN0YXRlID0gT1BFTlxuICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICc+JyAmJiAhcXVvdChzdGF0ZSkpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IE9QRU4pIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKFtPUEVOLHJlZ10pXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gQVRUUl9LRVkpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKFtBVFRSX0tFWSxyZWddKVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IEFUVFJfVkFMVUUgJiYgcmVnLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVzLnB1c2goW0FUVFJfVkFMVUUscmVnXSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzLnB1c2goW0NMT1NFXSlcbiAgICAgICAgICByZWcgPSAnJ1xuICAgICAgICAgIHN0YXRlID0gVEVYVFxuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBURVhUKSB7XG4gICAgICAgICAgcmVnICs9IGNcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gT1BFTiAmJiAvXFxzLy50ZXN0KGMpKSB7XG4gICAgICAgICAgcmVzLnB1c2goW09QRU4sIHJlZ10pXG4gICAgICAgICAgcmVnID0gJydcbiAgICAgICAgICBzdGF0ZSA9IEFUVFJcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gT1BFTikge1xuICAgICAgICAgIHJlZyArPSBjXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IEFUVFIgJiYgL1tcXHctXS8udGVzdChjKSkge1xuICAgICAgICAgIHN0YXRlID0gQVRUUl9LRVlcbiAgICAgICAgICByZWcgPSBjXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IEFUVFIgJiYgL1xccy8udGVzdChjKSkge1xuICAgICAgICAgIGlmIChyZWcubGVuZ3RoKSByZXMucHVzaChbQVRUUl9LRVkscmVnXSlcbiAgICAgICAgICByZXMucHVzaChbQVRUUl9CUkVBS10pXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IEFUVFJfS0VZICYmIC9cXHMvLnRlc3QoYykpIHtcbiAgICAgICAgICByZXMucHVzaChbQVRUUl9LRVkscmVnXSlcbiAgICAgICAgICByZWcgPSAnJ1xuICAgICAgICAgIHN0YXRlID0gQVRUUl9LRVlfV1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBBVFRSX0tFWSAmJiBjID09PSAnPScpIHtcbiAgICAgICAgICByZXMucHVzaChbQVRUUl9LRVkscmVnXSxbQVRUUl9FUV0pXG4gICAgICAgICAgcmVnID0gJydcbiAgICAgICAgICBzdGF0ZSA9IEFUVFJfVkFMVUVfV1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBBVFRSX0tFWSkge1xuICAgICAgICAgIHJlZyArPSBjXG4gICAgICAgIH0gZWxzZSBpZiAoKHN0YXRlID09PSBBVFRSX0tFWV9XIHx8IHN0YXRlID09PSBBVFRSKSAmJiBjID09PSAnPScpIHtcbiAgICAgICAgICByZXMucHVzaChbQVRUUl9FUV0pXG4gICAgICAgICAgc3RhdGUgPSBBVFRSX1ZBTFVFX1dcbiAgICAgICAgfSBlbHNlIGlmICgoc3RhdGUgPT09IEFUVFJfS0VZX1cgfHwgc3RhdGUgPT09IEFUVFIpICYmICEvXFxzLy50ZXN0KGMpKSB7XG4gICAgICAgICAgcmVzLnB1c2goW0FUVFJfQlJFQUtdKVxuICAgICAgICAgIGlmICgvW1xcdy1dLy50ZXN0KGMpKSB7XG4gICAgICAgICAgICByZWcgKz0gY1xuICAgICAgICAgICAgc3RhdGUgPSBBVFRSX0tFWVxuICAgICAgICAgIH0gZWxzZSBzdGF0ZSA9IEFUVFJcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gQVRUUl9WQUxVRV9XICYmIGMgPT09ICdcIicpIHtcbiAgICAgICAgICBzdGF0ZSA9IEFUVFJfVkFMVUVfRFFcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gQVRUUl9WQUxVRV9XICYmIGMgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBBVFRSX1ZBTFVFX1NRXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IEFUVFJfVkFMVUVfRFEgJiYgYyA9PT0gJ1wiJykge1xuICAgICAgICAgIHJlcy5wdXNoKFtBVFRSX1ZBTFVFLHJlZ10sW0FUVFJfQlJFQUtdKVxuICAgICAgICAgIHJlZyA9ICcnXG4gICAgICAgICAgc3RhdGUgPSBBVFRSXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IEFUVFJfVkFMVUVfU1EgJiYgYyA9PT0gXCInXCIpIHtcbiAgICAgICAgICByZXMucHVzaChbQVRUUl9WQUxVRSxyZWddLFtBVFRSX0JSRUFLXSlcbiAgICAgICAgICByZWcgPSAnJ1xuICAgICAgICAgIHN0YXRlID0gQVRUUlxuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBBVFRSX1ZBTFVFX1cgJiYgIS9cXHMvLnRlc3QoYykpIHtcbiAgICAgICAgICBzdGF0ZSA9IEFUVFJfVkFMVUVcbiAgICAgICAgICBpLS1cbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gQVRUUl9WQUxVRSAmJiAvXFxzLy50ZXN0KGMpKSB7XG4gICAgICAgICAgcmVzLnB1c2goW0FUVFJfVkFMVUUscmVnXSxbQVRUUl9CUkVBS10pXG4gICAgICAgICAgcmVnID0gJydcbiAgICAgICAgICBzdGF0ZSA9IEFUVFJcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gQVRUUl9WQUxVRSB8fCBzdGF0ZSA9PT0gQVRUUl9WQUxVRV9TUVxuICAgICAgICB8fCBzdGF0ZSA9PT0gQVRUUl9WQUxVRV9EUSkge1xuICAgICAgICAgIHJlZyArPSBjXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZSA9PT0gVEVYVCAmJiByZWcubGVuZ3RoKSB7XG4gICAgICAgIHJlcy5wdXNoKFtURVhULHJlZ10pXG4gICAgICAgIHJlZyA9ICcnXG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBBVFRSX1ZBTFVFICYmIHJlZy5sZW5ndGgpIHtcbiAgICAgICAgcmVzLnB1c2goW0FUVFJfVkFMVUUscmVnXSlcbiAgICAgICAgcmVnID0gJydcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IEFUVFJfVkFMVUVfRFEgJiYgcmVnLmxlbmd0aCkge1xuICAgICAgICByZXMucHVzaChbQVRUUl9WQUxVRSxyZWddKVxuICAgICAgICByZWcgPSAnJ1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gQVRUUl9WQUxVRV9TUSAmJiByZWcubGVuZ3RoKSB7XG4gICAgICAgIHJlcy5wdXNoKFtBVFRSX1ZBTFVFLHJlZ10pXG4gICAgICAgIHJlZyA9ICcnXG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBBVFRSX0tFWSkge1xuICAgICAgICByZXMucHVzaChbQVRUUl9LRVkscmVnXSlcbiAgICAgICAgcmVnID0gJydcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdHJmbiAoeCkge1xuICAgIGlmICh0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHhcbiAgICBlbHNlIGlmICh0eXBlb2YgeCA9PT0gJ3N0cmluZycpIHJldHVybiB4XG4gICAgZWxzZSBpZiAoeCAmJiB0eXBlb2YgeCA9PT0gJ29iamVjdCcpIHJldHVybiB4XG4gICAgZWxzZSByZXR1cm4gY29uY2F0KCcnLCB4KVxuICB9XG59XG5cbmZ1bmN0aW9uIHF1b3QgKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZSA9PT0gQVRUUl9WQUxVRV9TUSB8fCBzdGF0ZSA9PT0gQVRUUl9WQUxVRV9EUVxufVxuXG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxuZnVuY3Rpb24gaGFzIChvYmosIGtleSkgeyByZXR1cm4gaGFzT3duLmNhbGwob2JqLCBrZXkpIH1cblxudmFyIGNsb3NlUkUgPSBSZWdFeHAoJ14oJyArIFtcbiAgJ2FyZWEnLCAnYmFzZScsICdiYXNlZm9udCcsICdiZ3NvdW5kJywgJ2JyJywgJ2NvbCcsICdjb21tYW5kJywgJ2VtYmVkJyxcbiAgJ2ZyYW1lJywgJ2hyJywgJ2ltZycsICdpbnB1dCcsICdpc2luZGV4JywgJ2tleWdlbicsICdsaW5rJywgJ21ldGEnLCAncGFyYW0nLFxuICAnc291cmNlJywgJ3RyYWNrJywgJ3dicicsXG4gIC8vIFNWRyBUQUdTXG4gICdhbmltYXRlJywgJ2FuaW1hdGVUcmFuc2Zvcm0nLCAnY2lyY2xlJywgJ2N1cnNvcicsICdkZXNjJywgJ2VsbGlwc2UnLFxuICAnZmVCbGVuZCcsICdmZUNvbG9yTWF0cml4JywgJ2ZlQ29tcG9uZW50VHJhbnNmZXInLCAnZmVDb21wb3NpdGUnLFxuICAnZmVDb252b2x2ZU1hdHJpeCcsICdmZURpZmZ1c2VMaWdodGluZycsICdmZURpc3BsYWNlbWVudE1hcCcsXG4gICdmZURpc3RhbnRMaWdodCcsICdmZUZsb29kJywgJ2ZlRnVuY0EnLCAnZmVGdW5jQicsICdmZUZ1bmNHJywgJ2ZlRnVuY1InLFxuICAnZmVHYXVzc2lhbkJsdXInLCAnZmVJbWFnZScsICdmZU1lcmdlTm9kZScsICdmZU1vcnBob2xvZ3knLFxuICAnZmVPZmZzZXQnLCAnZmVQb2ludExpZ2h0JywgJ2ZlU3BlY3VsYXJMaWdodGluZycsICdmZVNwb3RMaWdodCcsICdmZVRpbGUnLFxuICAnZmVUdXJidWxlbmNlJywgJ2ZvbnQtZmFjZS1mb3JtYXQnLCAnZm9udC1mYWNlLW5hbWUnLCAnZm9udC1mYWNlLXVyaScsXG4gICdnbHlwaCcsICdnbHlwaFJlZicsICdoa2VybicsICdpbWFnZScsICdsaW5lJywgJ21pc3NpbmctZ2x5cGgnLCAnbXBhdGgnLFxuICAncGF0aCcsICdwb2x5Z29uJywgJ3BvbHlsaW5lJywgJ3JlY3QnLCAnc2V0JywgJ3N0b3AnLCAndHJlZicsICd1c2UnLCAndmlldycsXG4gICd2a2Vybidcbl0uam9pbignfCcpICsgJykoPzpbXFwuI11bYS16QS1aMC05XFx1MDA3Ri1cXHVGRkZGXzotXSspKiQnKVxuZnVuY3Rpb24gc2VsZkNsb3NpbmcgKHRhZykgeyByZXR1cm4gY2xvc2VSRS50ZXN0KHRhZykgfVxuIiwibW9kdWxlLmV4cG9ydHMgPSBhdHRyaWJ1dGVUb1Byb3BlcnR5XG5cbnZhciB0cmFuc2Zvcm0gPSB7XG4gICdjbGFzcyc6ICdjbGFzc05hbWUnLFxuICAnZm9yJzogJ2h0bWxGb3InLFxuICAnaHR0cC1lcXVpdic6ICdodHRwRXF1aXYnXG59XG5cbmZ1bmN0aW9uIGF0dHJpYnV0ZVRvUHJvcGVydHkgKGgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YWdOYW1lLCBhdHRycywgY2hpbGRyZW4pIHtcbiAgICBmb3IgKHZhciBhdHRyIGluIGF0dHJzKSB7XG4gICAgICBpZiAoYXR0ciBpbiB0cmFuc2Zvcm0pIHtcbiAgICAgICAgYXR0cnNbdHJhbnNmb3JtW2F0dHJdXSA9IGF0dHJzW2F0dHJdXG4gICAgICAgIGRlbGV0ZSBhdHRyc1thdHRyXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaCh0YWdOYW1lLCBhdHRycywgY2hpbGRyZW4pXG4gIH1cbn1cbiIsIi8qIGdsb2JhbCBNdXRhdGlvbk9ic2VydmVyICovXG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCdnbG9iYWwvZG9jdW1lbnQnKVxudmFyIHdpbmRvdyA9IHJlcXVpcmUoJ2dsb2JhbC93aW5kb3cnKVxudmFyIHdhdGNoID0gT2JqZWN0LmNyZWF0ZShudWxsKVxudmFyIEtFWV9JRCA9ICdvbmxvYWRpZCcgKyAobmV3IERhdGUoKSAlIDllNikudG9TdHJpbmcoMzYpXG52YXIgS0VZX0FUVFIgPSAnZGF0YS0nICsgS0VZX0lEXG52YXIgSU5ERVggPSAwXG5cbmlmICh3aW5kb3cgJiYgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKG11dGF0aW9ucykge1xuICAgIGlmIChPYmplY3Qua2V5cyh3YXRjaCkubGVuZ3RoIDwgMSkgcmV0dXJuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdXRhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChtdXRhdGlvbnNbaV0uYXR0cmlidXRlTmFtZSA9PT0gS0VZX0FUVFIpIHtcbiAgICAgICAgZWFjaEF0dHIobXV0YXRpb25zW2ldLCB0dXJub24sIHR1cm5vZmYpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBlYWNoTXV0YXRpb24obXV0YXRpb25zW2ldLnJlbW92ZWROb2RlcywgdHVybm9mZilcbiAgICAgIGVhY2hNdXRhdGlvbihtdXRhdGlvbnNbaV0uYWRkZWROb2RlcywgdHVybm9uKVxuICAgIH1cbiAgfSlcbiAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7XG4gICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgIHN1YnRyZWU6IHRydWUsXG4gICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICBhdHRyaWJ1dGVPbGRWYWx1ZTogdHJ1ZSxcbiAgICBhdHRyaWJ1dGVGaWx0ZXI6IFtLRVlfQVRUUl1cbiAgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBvbmxvYWQgKGVsLCBvbiwgb2ZmLCBjYWxsZXIpIHtcbiAgb24gPSBvbiB8fCBmdW5jdGlvbiAoKSB7fVxuICBvZmYgPSBvZmYgfHwgZnVuY3Rpb24gKCkge31cbiAgZWwuc2V0QXR0cmlidXRlKEtFWV9BVFRSLCAnbycgKyBJTkRFWClcbiAgd2F0Y2hbJ28nICsgSU5ERVhdID0gW29uLCBvZmYsIDAsIGNhbGxlciB8fCBvbmxvYWQuY2FsbGVyXVxuICBJTkRFWCArPSAxXG4gIHJldHVybiBlbFxufVxuXG5mdW5jdGlvbiB0dXJub24gKGluZGV4LCBlbCkge1xuICBpZiAod2F0Y2hbaW5kZXhdWzBdICYmIHdhdGNoW2luZGV4XVsyXSA9PT0gMCkge1xuICAgIHdhdGNoW2luZGV4XVswXShlbClcbiAgICB3YXRjaFtpbmRleF1bMl0gPSAxXG4gIH1cbn1cblxuZnVuY3Rpb24gdHVybm9mZiAoaW5kZXgsIGVsKSB7XG4gIGlmICh3YXRjaFtpbmRleF1bMV0gJiYgd2F0Y2hbaW5kZXhdWzJdID09PSAxKSB7XG4gICAgd2F0Y2hbaW5kZXhdWzFdKGVsKVxuICAgIHdhdGNoW2luZGV4XVsyXSA9IDBcbiAgfVxufVxuXG5mdW5jdGlvbiBlYWNoQXR0ciAobXV0YXRpb24sIG9uLCBvZmYpIHtcbiAgdmFyIG5ld1ZhbHVlID0gbXV0YXRpb24udGFyZ2V0LmdldEF0dHJpYnV0ZShLRVlfQVRUUilcbiAgaWYgKHNhbWVPcmlnaW4obXV0YXRpb24ub2xkVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgIHdhdGNoW25ld1ZhbHVlXSA9IHdhdGNoW211dGF0aW9uLm9sZFZhbHVlXVxuICAgIHJldHVyblxuICB9XG4gIGlmICh3YXRjaFttdXRhdGlvbi5vbGRWYWx1ZV0pIHtcbiAgICBvZmYobXV0YXRpb24ub2xkVmFsdWUsIG11dGF0aW9uLnRhcmdldClcbiAgfVxuICBpZiAod2F0Y2hbbmV3VmFsdWVdKSB7XG4gICAgb24obmV3VmFsdWUsIG11dGF0aW9uLnRhcmdldClcbiAgfVxufVxuXG5mdW5jdGlvbiBzYW1lT3JpZ2luIChvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgaWYgKCFvbGRWYWx1ZSB8fCAhbmV3VmFsdWUpIHJldHVybiBmYWxzZVxuICByZXR1cm4gd2F0Y2hbb2xkVmFsdWVdWzNdID09PSB3YXRjaFtuZXdWYWx1ZV1bM11cbn1cblxuZnVuY3Rpb24gZWFjaE11dGF0aW9uIChub2RlcywgZm4pIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh3YXRjaClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChub2Rlc1tpXSAmJiBub2Rlc1tpXS5nZXRBdHRyaWJ1dGUgJiYgbm9kZXNbaV0uZ2V0QXR0cmlidXRlKEtFWV9BVFRSKSkge1xuICAgICAgdmFyIG9ubG9hZGlkID0gbm9kZXNbaV0uZ2V0QXR0cmlidXRlKEtFWV9BVFRSKVxuICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIGlmIChvbmxvYWRpZCA9PT0gaykge1xuICAgICAgICAgIGZuKGssIG5vZGVzW2ldKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAobm9kZXNbaV0uY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBlYWNoTXV0YXRpb24obm9kZXNbaV0uY2hpbGROb2RlcywgZm4pXG4gICAgfVxuICB9XG59XG4iLCIvLyBDcmVhdGUgYSByYW5nZSBvYmplY3QgZm9yIGVmZmljZW50bHkgcmVuZGVyaW5nIHN0cmluZ3MgdG8gZWxlbWVudHMuXG52YXIgcmFuZ2U7XG5cbnZhciB0ZXN0RWwgPSAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykgP1xuICAgIGRvY3VtZW50LmJvZHkgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykgOlxuICAgIHt9O1xuXG52YXIgWEhUTUwgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG52YXIgRUxFTUVOVF9OT0RFID0gMTtcbnZhciBURVhUX05PREUgPSAzO1xudmFyIENPTU1FTlRfTk9ERSA9IDg7XG5cbi8vIEZpeGVzIDxodHRwczovL2dpdGh1Yi5jb20vcGF0cmljay1zdGVlbGUtaWRlbS9tb3JwaGRvbS9pc3N1ZXMvMzI+XG4vLyAoSUU3KyBzdXBwb3J0KSA8PUlFNyBkb2VzIG5vdCBzdXBwb3J0IGVsLmhhc0F0dHJpYnV0ZShuYW1lKVxudmFyIGhhc0F0dHJpYnV0ZU5TO1xuXG5pZiAodGVzdEVsLmhhc0F0dHJpYnV0ZU5TKSB7XG4gICAgaGFzQXR0cmlidXRlTlMgPSBmdW5jdGlvbihlbCwgbmFtZXNwYWNlVVJJLCBuYW1lKSB7XG4gICAgICAgIHJldHVybiBlbC5oYXNBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVUkksIG5hbWUpO1xuICAgIH07XG59IGVsc2UgaWYgKHRlc3RFbC5oYXNBdHRyaWJ1dGUpIHtcbiAgICBoYXNBdHRyaWJ1dGVOUyA9IGZ1bmN0aW9uKGVsLCBuYW1lc3BhY2VVUkksIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGVsLmhhc0F0dHJpYnV0ZShuYW1lKTtcbiAgICB9O1xufSBlbHNlIHtcbiAgICBoYXNBdHRyaWJ1dGVOUyA9IGZ1bmN0aW9uKGVsLCBuYW1lc3BhY2VVUkksIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuICEhZWwuZ2V0QXR0cmlidXRlTm9kZShuYW1lKTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBlbXB0eShvKSB7XG4gICAgZm9yICh2YXIgayBpbiBvKSB7XG4gICAgICAgIGlmIChvLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHRvRWxlbWVudChzdHIpIHtcbiAgICBpZiAoIXJhbmdlICYmIGRvY3VtZW50LmNyZWF0ZVJhbmdlKSB7XG4gICAgICAgIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZShkb2N1bWVudC5ib2R5KTtcbiAgICB9XG5cbiAgICB2YXIgZnJhZ21lbnQ7XG4gICAgaWYgKHJhbmdlICYmIHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCkge1xuICAgICAgICBmcmFnbWVudCA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChzdHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYm9keScpO1xuICAgICAgICBmcmFnbWVudC5pbm5lckhUTUwgPSBzdHI7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG52YXIgc3BlY2lhbEVsSGFuZGxlcnMgPSB7XG4gICAgLyoqXG4gICAgICogTmVlZGVkIGZvciBJRS4gQXBwYXJlbnRseSBJRSBkb2Vzbid0IHRoaW5rIHRoYXQgXCJzZWxlY3RlZFwiIGlzIGFuXG4gICAgICogYXR0cmlidXRlIHdoZW4gcmVhZGluZyBvdmVyIHRoZSBhdHRyaWJ1dGVzIHVzaW5nIHNlbGVjdEVsLmF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBPUFRJT046IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICBmcm9tRWwuc2VsZWN0ZWQgPSB0b0VsLnNlbGVjdGVkO1xuICAgICAgICBpZiAoZnJvbUVsLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICBmcm9tRWwuc2V0QXR0cmlidXRlKCdzZWxlY3RlZCcsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUoJ3NlbGVjdGVkJywgJycpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBUaGUgXCJ2YWx1ZVwiIGF0dHJpYnV0ZSBpcyBzcGVjaWFsIGZvciB0aGUgPGlucHV0PiBlbGVtZW50IHNpbmNlIGl0IHNldHNcbiAgICAgKiB0aGUgaW5pdGlhbCB2YWx1ZS4gQ2hhbmdpbmcgdGhlIFwidmFsdWVcIiBhdHRyaWJ1dGUgd2l0aG91dCBjaGFuZ2luZyB0aGVcbiAgICAgKiBcInZhbHVlXCIgcHJvcGVydHkgd2lsbCBoYXZlIG5vIGVmZmVjdCBzaW5jZSBpdCBpcyBvbmx5IHVzZWQgdG8gdGhlIHNldCB0aGVcbiAgICAgKiBpbml0aWFsIHZhbHVlLiAgU2ltaWxhciBmb3IgdGhlIFwiY2hlY2tlZFwiIGF0dHJpYnV0ZSwgYW5kIFwiZGlzYWJsZWRcIi5cbiAgICAgKi9cbiAgICBJTlBVVDogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIGZyb21FbC5jaGVja2VkID0gdG9FbC5jaGVja2VkO1xuICAgICAgICBpZiAoZnJvbUVsLmNoZWNrZWQpIHtcbiAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoJ2NoZWNrZWQnLCAnJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcm9tRWwucmVtb3ZlQXR0cmlidXRlKCdjaGVja2VkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnJvbUVsLnZhbHVlICE9PSB0b0VsLnZhbHVlKSB7XG4gICAgICAgICAgICBmcm9tRWwudmFsdWUgPSB0b0VsLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoYXNBdHRyaWJ1dGVOUyh0b0VsLCBudWxsLCAndmFsdWUnKSkge1xuICAgICAgICAgICAgZnJvbUVsLnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZyb21FbC5kaXNhYmxlZCA9IHRvRWwuZGlzYWJsZWQ7XG4gICAgICAgIGlmIChmcm9tRWwuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnJvbUVsLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBURVhUQVJFQTogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IHRvRWwudmFsdWU7XG4gICAgICAgIGlmIChmcm9tRWwudmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICBmcm9tRWwudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmcm9tRWwuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgZnJvbUVsLmZpcnN0Q2hpbGQubm9kZVZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdHdvIG5vZGUncyBuYW1lcyBhbmQgbmFtZXNwYWNlIFVSSXMgYXJlIHRoZSBzYW1lLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gYVxuICogQHBhcmFtIHtFbGVtZW50fSBiXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG52YXIgY29tcGFyZU5vZGVOYW1lcyA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYS5ub2RlTmFtZSA9PT0gYi5ub2RlTmFtZSAmJlxuICAgICAgICAgICBhLm5hbWVzcGFjZVVSSSA9PT0gYi5uYW1lc3BhY2VVUkk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhbiBlbGVtZW50LCBvcHRpb25hbGx5IHdpdGggYSBrbm93biBuYW1lc3BhY2UgVVJJLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBlbGVtZW50IG5hbWUsIGUuZy4gJ2Rpdicgb3IgJ3N2ZydcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlVVJJXSB0aGUgZWxlbWVudCdzIG5hbWVzcGFjZSBVUkksIGkuZS4gdGhlIHZhbHVlIG9mXG4gKiBpdHMgYHhtbG5zYCBhdHRyaWJ1dGUgb3IgaXRzIGluZmVycmVkIG5hbWVzcGFjZS5cbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMobmFtZSwgbmFtZXNwYWNlVVJJKSB7XG4gICAgcmV0dXJuICFuYW1lc3BhY2VVUkkgfHwgbmFtZXNwYWNlVVJJID09PSBYSFRNTCA/XG4gICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSkgOlxuICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCBuYW1lKTtcbn1cblxuLyoqXG4gKiBMb29wIG92ZXIgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIG9uIHRoZSB0YXJnZXQgbm9kZSBhbmQgbWFrZSBzdXJlIHRoZSBvcmlnaW5hbFxuICogRE9NIG5vZGUgaGFzIHRoZSBzYW1lIGF0dHJpYnV0ZXMuIElmIGFuIGF0dHJpYnV0ZSBmb3VuZCBvbiB0aGUgb3JpZ2luYWwgbm9kZVxuICogaXMgbm90IG9uIHRoZSBuZXcgbm9kZSB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBvcmlnaW5hbCBub2RlLlxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGZyb21Ob2RlXG4gKiBAcGFyYW0gIHtFbGVtZW50fSB0b05vZGVcbiAqL1xuZnVuY3Rpb24gbW9ycGhBdHRycyhmcm9tTm9kZSwgdG9Ob2RlKSB7XG4gICAgdmFyIGF0dHJzID0gdG9Ob2RlLmF0dHJpYnV0ZXM7XG4gICAgdmFyIGk7XG4gICAgdmFyIGF0dHI7XG4gICAgdmFyIGF0dHJOYW1lO1xuICAgIHZhciBhdHRyTmFtZXNwYWNlVVJJO1xuICAgIHZhciBhdHRyVmFsdWU7XG4gICAgdmFyIGZyb21WYWx1ZTtcblxuICAgIGZvciAoaSA9IGF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGF0dHIgPSBhdHRyc1tpXTtcbiAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7XG4gICAgICAgIGF0dHJWYWx1ZSA9IGF0dHIudmFsdWU7XG4gICAgICAgIGF0dHJOYW1lc3BhY2VVUkkgPSBhdHRyLm5hbWVzcGFjZVVSSTtcblxuICAgICAgICBpZiAoYXR0ck5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLmxvY2FsTmFtZSB8fCBhdHRyTmFtZTtcbiAgICAgICAgICAgIGZyb21WYWx1ZSA9IGZyb21Ob2RlLmdldEF0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21WYWx1ZSA9IGZyb21Ob2RlLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnJvbVZhbHVlICE9PSBhdHRyVmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChhdHRyTmFtZXNwYWNlVVJJKSB7XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUuc2V0QXR0cmlidXRlTlMoYXR0ck5hbWVzcGFjZVVSSSwgYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbnkgZXh0cmEgYXR0cmlidXRlcyBmb3VuZCBvbiB0aGUgb3JpZ2luYWwgRE9NIGVsZW1lbnQgdGhhdFxuICAgIC8vIHdlcmVuJ3QgZm91bmQgb24gdGhlIHRhcmdldCBlbGVtZW50LlxuICAgIGF0dHJzID0gZnJvbU5vZGUuYXR0cmlidXRlcztcblxuICAgIGZvciAoaSA9IGF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGF0dHIgPSBhdHRyc1tpXTtcbiAgICAgICAgaWYgKGF0dHIuc3BlY2lmaWVkICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7XG4gICAgICAgICAgICBhdHRyTmFtZXNwYWNlVVJJID0gYXR0ci5uYW1lc3BhY2VVUkk7XG5cbiAgICAgICAgICAgIGlmICghaGFzQXR0cmlidXRlTlModG9Ob2RlLCBhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZXNwYWNlVVJJID8gYXR0ck5hbWUgPSBhdHRyLmxvY2FsTmFtZSB8fCBhdHRyTmFtZSA6IGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgIGlmIChhdHRyTmFtZXNwYWNlVVJJKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21Ob2RlLnJlbW92ZUF0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHIubG9jYWxOYW1lKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmcm9tTm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIGNoaWxkcmVuIG9mIG9uZSBET00gZWxlbWVudCB0byBhbm90aGVyIERPTSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIG1vdmVDaGlsZHJlbihmcm9tRWwsIHRvRWwpIHtcbiAgICB2YXIgY3VyQ2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICB3aGlsZSAoY3VyQ2hpbGQpIHtcbiAgICAgICAgdmFyIG5leHRDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICB0b0VsLmFwcGVuZENoaWxkKGN1ckNoaWxkKTtcbiAgICAgICAgY3VyQ2hpbGQgPSBuZXh0Q2hpbGQ7XG4gICAgfVxuICAgIHJldHVybiB0b0VsO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0R2V0Tm9kZUtleShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuaWQ7XG59XG5cbmZ1bmN0aW9uIG1vcnBoZG9tKGZyb21Ob2RlLCB0b05vZGUsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdG9Ob2RlID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoZnJvbU5vZGUubm9kZU5hbWUgPT09ICcjZG9jdW1lbnQnIHx8IGZyb21Ob2RlLm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICAgICAgICAgIHZhciB0b05vZGVIdG1sID0gdG9Ob2RlO1xuICAgICAgICAgICAgdG9Ob2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaHRtbCcpO1xuICAgICAgICAgICAgdG9Ob2RlLmlubmVySFRNTCA9IHRvTm9kZUh0bWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0b05vZGUgPSB0b0VsZW1lbnQodG9Ob2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFhYWCBvcHRpbWl6YXRpb246IGlmIHRoZSBub2RlcyBhcmUgZXF1YWwsIGRvbid0IG1vcnBoIHRoZW1cbiAgICAvKlxuICAgIGlmIChmcm9tTm9kZS5pc0VxdWFsTm9kZSh0b05vZGUpKSB7XG4gICAgICByZXR1cm4gZnJvbU5vZGU7XG4gICAgfVxuICAgICovXG5cbiAgICB2YXIgc2F2ZWRFbHMgPSB7fTsgLy8gVXNlZCB0byBzYXZlIG9mZiBET00gZWxlbWVudHMgd2l0aCBJRHNcbiAgICB2YXIgdW5tYXRjaGVkRWxzID0ge307XG4gICAgdmFyIGdldE5vZGVLZXkgPSBvcHRpb25zLmdldE5vZGVLZXkgfHwgZGVmYXVsdEdldE5vZGVLZXk7XG4gICAgdmFyIG9uQmVmb3JlTm9kZUFkZGVkID0gb3B0aW9ucy5vbkJlZm9yZU5vZGVBZGRlZCB8fCBub29wO1xuICAgIHZhciBvbk5vZGVBZGRlZCA9IG9wdGlvbnMub25Ob2RlQWRkZWQgfHwgbm9vcDtcbiAgICB2YXIgb25CZWZvcmVFbFVwZGF0ZWQgPSBvcHRpb25zLm9uQmVmb3JlRWxVcGRhdGVkIHx8IG9wdGlvbnMub25CZWZvcmVNb3JwaEVsIHx8IG5vb3A7XG4gICAgdmFyIG9uRWxVcGRhdGVkID0gb3B0aW9ucy5vbkVsVXBkYXRlZCB8fCBub29wO1xuICAgIHZhciBvbkJlZm9yZU5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uQmVmb3JlTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgIHZhciBvbk5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgIHZhciBvbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkID0gb3B0aW9ucy5vbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkIHx8IG9wdGlvbnMub25CZWZvcmVNb3JwaEVsQ2hpbGRyZW4gfHwgbm9vcDtcbiAgICB2YXIgY2hpbGRyZW5Pbmx5ID0gb3B0aW9ucy5jaGlsZHJlbk9ubHkgPT09IHRydWU7XG4gICAgdmFyIG1vdmVkRWxzID0gW107XG5cbiAgICBmdW5jdGlvbiByZW1vdmVOb2RlSGVscGVyKG5vZGUsIG5lc3RlZEluU2F2ZWRFbCkge1xuICAgICAgICB2YXIgaWQgPSBnZXROb2RlS2V5KG5vZGUpO1xuICAgICAgICAvLyBJZiB0aGUgbm9kZSBoYXMgYW4gSUQgdGhlbiBzYXZlIGl0IG9mZiBzaW5jZSB3ZSB3aWxsIHdhbnRcbiAgICAgICAgLy8gdG8gcmV1c2UgaXQgaW4gY2FzZSB0aGUgdGFyZ2V0IERPTSB0cmVlIGhhcyBhIERPTSBlbGVtZW50XG4gICAgICAgIC8vIHdpdGggdGhlIHNhbWUgSURcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBzYXZlZEVsc1tpZF0gPSBub2RlO1xuICAgICAgICB9IGVsc2UgaWYgKCFuZXN0ZWRJblNhdmVkRWwpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBub3QgbmVzdGVkIGluIGEgc2F2ZWQgZWxlbWVudCB0aGVuIHdlIGtub3cgdGhhdCB0aGlzIG5vZGUgaGFzIGJlZW5cbiAgICAgICAgICAgIC8vIGNvbXBsZXRlbHkgZGlzY2FyZGVkIGFuZCB3aWxsIG5vdCBleGlzdCBpbiB0aGUgZmluYWwgRE9NLlxuICAgICAgICAgICAgb25Ob2RlRGlzY2FyZGVkKG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgdmFyIGN1ckNoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTm9kZUhlbHBlcihjdXJDaGlsZCwgbmVzdGVkSW5TYXZlZEVsIHx8IGlkKTtcbiAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Fsa0Rpc2NhcmRlZENoaWxkTm9kZXMobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICB2YXIgY3VyQ2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICB3aGlsZSAoY3VyQ2hpbGQpIHtcblxuXG4gICAgICAgICAgICAgICAgaWYgKCFnZXROb2RlS2V5KGN1ckNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gaGFuZGxlIG5vZGVzIHRoYXQgZG9uJ3QgaGF2ZSBhbiBJRCB0byBhdm9pZCBkb3VibGVcbiAgICAgICAgICAgICAgICAgICAgLy8gd2Fsa2luZyB0aGUgc2FtZSBzYXZlZCBlbGVtZW50LlxuXG4gICAgICAgICAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChjdXJDaGlsZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2FsayByZWN1cnNpdmVseVxuICAgICAgICAgICAgICAgICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2RlcyhjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBjdXJDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZU5vZGUobm9kZSwgcGFyZW50Tm9kZSwgYWxyZWFkeVZpc2l0ZWQpIHtcbiAgICAgICAgaWYgKG9uQmVmb3JlTm9kZURpc2NhcmRlZChub2RlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICAgIGlmIChhbHJlYWR5VmlzaXRlZCkge1xuICAgICAgICAgICAgaWYgKCFnZXROb2RlS2V5KG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgb25Ob2RlRGlzY2FyZGVkKG5vZGUpO1xuICAgICAgICAgICAgICAgIHdhbGtEaXNjYXJkZWRDaGlsZE5vZGVzKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZUhlbHBlcihub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vcnBoRWwoZnJvbUVsLCB0b0VsLCBhbHJlYWR5VmlzaXRlZCwgY2hpbGRyZW5Pbmx5KSB7XG4gICAgICAgIHZhciB0b0VsS2V5ID0gZ2V0Tm9kZUtleSh0b0VsKTtcbiAgICAgICAgaWYgKHRvRWxLZXkpIHtcbiAgICAgICAgICAgIC8vIElmIGFuIGVsZW1lbnQgd2l0aCBhbiBJRCBpcyBiZWluZyBtb3JwaGVkIHRoZW4gaXQgaXMgd2lsbCBiZSBpbiB0aGUgZmluYWxcbiAgICAgICAgICAgIC8vIERPTSBzbyBjbGVhciBpdCBvdXQgb2YgdGhlIHNhdmVkIGVsZW1lbnRzIGNvbGxlY3Rpb25cbiAgICAgICAgICAgIGRlbGV0ZSBzYXZlZEVsc1t0b0VsS2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY2hpbGRyZW5Pbmx5KSB7XG4gICAgICAgICAgICBpZiAob25CZWZvcmVFbFVwZGF0ZWQoZnJvbUVsLCB0b0VsKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1vcnBoQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgIG9uRWxVcGRhdGVkKGZyb21FbCk7XG5cbiAgICAgICAgICAgIGlmIChvbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkKGZyb21FbCwgdG9FbCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyb21FbC5ub2RlTmFtZSAhPT0gJ1RFWFRBUkVBJykge1xuICAgICAgICAgICAgdmFyIGN1clRvTm9kZUNoaWxkID0gdG9FbC5maXJzdENoaWxkO1xuICAgICAgICAgICAgdmFyIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHZhciBjdXJUb05vZGVJZDtcblxuICAgICAgICAgICAgdmFyIGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIHZhciB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgdmFyIHNhdmVkRWw7XG4gICAgICAgICAgICB2YXIgdW5tYXRjaGVkRWw7XG5cbiAgICAgICAgICAgIG91dGVyOiB3aGlsZSAoY3VyVG9Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICB0b05leHRTaWJsaW5nID0gY3VyVG9Ob2RlQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgY3VyVG9Ob2RlSWQgPSBnZXROb2RlS2V5KGN1clRvTm9kZUNoaWxkKTtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJGcm9tTm9kZUNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjdXJGcm9tTm9kZUlkID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWFscmVhZHlWaXNpdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVJZCAmJiAodW5tYXRjaGVkRWwgPSB1bm1hdGNoZWRFbHNbY3VyRnJvbU5vZGVJZF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5tYXRjaGVkRWwucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoY3VyRnJvbU5vZGVDaGlsZCwgdW5tYXRjaGVkRWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcnBoRWwoY3VyRnJvbU5vZGVDaGlsZCwgdW5tYXRjaGVkRWwsIGFscmVhZHlWaXNpdGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGN1ckZyb21Ob2RlVHlwZSA9IGN1ckZyb21Ob2RlQ2hpbGQubm9kZVR5cGU7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlVHlwZSA9PT0gY3VyVG9Ob2RlQ2hpbGQubm9kZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc0NvbXBhdGlibGUgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBiZWluZyBjb21wYXJlZCBhcmUgRWxlbWVudCBub2Rlc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVOb2RlTmFtZXMoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgY29tcGF0aWJsZSBET00gZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlSWQgfHwgY3VyVG9Ob2RlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGVpdGhlciBET00gZWxlbWVudCBoYXMgYW4gSUQgdGhlbiB3ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHRob3NlIGRpZmZlcmVudGx5IHNpbmNlIHdlIHdhbnQgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoIHVwIGJ5IElEXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVG9Ob2RlSWQgPT09IGN1ckZyb21Ob2RlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbXBhdGlibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgY29tcGF0aWJsZSBET00gZWxlbWVudHMgc28gdHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IFwiZnJvbVwiIG5vZGUgdG8gbWF0Y2ggdGhlIGN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFyZ2V0IERPTSBub2RlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JwaEVsKGN1ckZyb21Ob2RlQ2hpbGQsIGN1clRvTm9kZUNoaWxkLCBhbHJlYWR5VmlzaXRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBiZWluZyBjb21wYXJlZCBhcmUgVGV4dCBvciBDb21tZW50IG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBURVhUX05PREUgfHwgY3VyRnJvbU5vZGVUeXBlID09IENPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGx5IHVwZGF0ZSBub2RlVmFsdWUgb24gdGhlIG9yaWdpbmFsIG5vZGUgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHRleHQgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUNoaWxkLm5vZGVWYWx1ZSA9IGN1clRvTm9kZUNoaWxkLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGF0aWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gdG9OZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTm8gY29tcGF0aWJsZSBtYXRjaCBzbyByZW1vdmUgdGhlIG9sZCBub2RlIGZyb20gdGhlIERPTVxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgY29udGludWUgdHJ5aW5nIHRvIGZpbmQgYSBtYXRjaCBpbiB0aGUgb3JpZ2luYWwgRE9NXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUoY3VyRnJvbU5vZGVDaGlsZCwgZnJvbUVsLCBhbHJlYWR5VmlzaXRlZCk7XG4gICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoc2F2ZWRFbCA9IHNhdmVkRWxzW2N1clRvTm9kZUlkXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wYXJlTm9kZU5hbWVzKHNhdmVkRWwsIGN1clRvTm9kZUNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcnBoRWwoc2F2ZWRFbCwgY3VyVG9Ob2RlQ2hpbGQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gYXBwZW5kIHRoZSBzYXZlZCBlbGVtZW50IGluc3RlYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHNhdmVkRWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzYXZlZEVsc1tjdXJUb05vZGVJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Ob2RlRGlzY2FyZGVkKHNhdmVkRWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQgaW4gdGhlIHRhcmdldCB0cmVlIGhhcyBhbiBJRFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHdlIGRpZCBub3QgZmluZCBhIG1hdGNoIGluIGFueSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgc2libGluZ3MuIFdlIGp1c3QgcHV0IHRoZSB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgaW4gdGhlIG9sZCBET00gdHJlZSBidXQgaWYgd2UgbGF0ZXIgZmluZCBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudCBpbiB0aGUgb2xkIERPTSB0cmVlIHRoYXQgaGFzIGEgbWF0Y2hpbmcgSURcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gd2Ugd2lsbCByZXBsYWNlIHRoZSB0YXJnZXQgZWxlbWVudCB3aXRoIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVzcG9uZGluZyBvbGQgZWxlbWVudCBhbmQgbW9ycGggdGhlIG9sZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICB1bm1hdGNoZWRFbHNbY3VyVG9Ob2RlSWRdID0gY3VyVG9Ob2RlQ2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBnb3QgdGhpcyBmYXIgdGhlbiB3ZSBkaWQgbm90IGZpbmQgYSBjYW5kaWRhdGUgbWF0Y2ggZm9yXG4gICAgICAgICAgICAgICAgLy8gb3VyIFwidG8gbm9kZVwiIGFuZCB3ZSBleGhhdXN0ZWQgYWxsIG9mIHRoZSBjaGlsZHJlbiBcImZyb21cIlxuICAgICAgICAgICAgICAgIC8vIG5vZGVzLiBUaGVyZWZvcmUsIHdlIHdpbGwganVzdCBhcHBlbmQgdGhlIGN1cnJlbnQgXCJ0byBub2RlXCJcbiAgICAgICAgICAgICAgICAvLyB0byB0aGUgZW5kXG4gICAgICAgICAgICAgICAgaWYgKG9uQmVmb3JlTm9kZUFkZGVkKGN1clRvTm9kZUNoaWxkKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbUVsLmFwcGVuZENoaWxkKGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgb25Ob2RlQWRkZWQoY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjdXJUb05vZGVDaGlsZC5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmXG4gICAgICAgICAgICAgICAgICAgIChjdXJUb05vZGVJZCB8fCBjdXJUb05vZGVDaGlsZC5maXJzdENoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZWxlbWVudCB0aGF0IHdhcyBqdXN0IGFkZGVkIHRvIHRoZSBvcmlnaW5hbCBET00gbWF5XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgc29tZSBuZXN0ZWQgZWxlbWVudHMgd2l0aCBhIGtleS9JRCB0aGF0IG5lZWRzIHRvIGJlXG4gICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoZWQgdXAgd2l0aCBvdGhlciBlbGVtZW50cy4gV2UnbGwgYWRkIHRoZSBlbGVtZW50IHRvXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgbGlzdCBzbyB0aGF0IHdlIGNhbiBsYXRlciBwcm9jZXNzIHRoZSBuZXN0ZWQgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIGFueSB1bm1hdGNoZWQga2V5ZWQgZWxlbWVudHMgdGhhdCB3ZXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIGRpc2NhcmRlZFxuICAgICAgICAgICAgICAgICAgICBtb3ZlZEVscy5wdXNoKGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG9mIHRoZSBcInRvIG5vZGVzXCIuIElmIGN1ckZyb21Ob2RlQ2hpbGQgaXNcbiAgICAgICAgICAgIC8vIG5vbi1udWxsIHRoZW4gd2Ugc3RpbGwgaGF2ZSBzb21lIGZyb20gbm9kZXMgbGVmdCBvdmVyIHRoYXQgbmVlZFxuICAgICAgICAgICAgLy8gdG8gYmUgcmVtb3ZlZFxuICAgICAgICAgICAgd2hpbGUgKGN1ckZyb21Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICBmcm9tTmV4dFNpYmxpbmcgPSBjdXJGcm9tTm9kZUNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUoY3VyRnJvbU5vZGVDaGlsZCwgZnJvbUVsLCBhbHJlYWR5VmlzaXRlZCk7XG4gICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzcGVjaWFsRWxIYW5kbGVyID0gc3BlY2lhbEVsSGFuZGxlcnNbZnJvbUVsLm5vZGVOYW1lXTtcbiAgICAgICAgaWYgKHNwZWNpYWxFbEhhbmRsZXIpIHtcbiAgICAgICAgICAgIHNwZWNpYWxFbEhhbmRsZXIoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgfVxuICAgIH0gLy8gRU5EOiBtb3JwaEVsKC4uLilcblxuICAgIHZhciBtb3JwaGVkTm9kZSA9IGZyb21Ob2RlO1xuICAgIHZhciBtb3JwaGVkTm9kZVR5cGUgPSBtb3JwaGVkTm9kZS5ub2RlVHlwZTtcbiAgICB2YXIgdG9Ob2RlVHlwZSA9IHRvTm9kZS5ub2RlVHlwZTtcblxuICAgIGlmICghY2hpbGRyZW5Pbmx5KSB7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBhcmUgZ2l2ZW4gdHdvIERPTSBub2RlcyB0aGF0IGFyZSBub3RcbiAgICAgICAgLy8gY29tcGF0aWJsZSAoZS5nLiA8ZGl2PiAtLT4gPHNwYW4+IG9yIDxkaXY+IC0tPiBURVhUKVxuICAgICAgICBpZiAobW9ycGhlZE5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgIGlmICh0b05vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbXBhcmVOb2RlTmFtZXMoZnJvbU5vZGUsIHRvTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb25Ob2RlRGlzY2FyZGVkKGZyb21Ob2RlKTtcbiAgICAgICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUgPSBtb3ZlQ2hpbGRyZW4oZnJvbU5vZGUsIGNyZWF0ZUVsZW1lbnROUyh0b05vZGUubm9kZU5hbWUsIHRvTm9kZS5uYW1lc3BhY2VVUkkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEdvaW5nIGZyb20gYW4gZWxlbWVudCBub2RlIHRvIGEgdGV4dCBub2RlXG4gICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUgPSB0b05vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobW9ycGhlZE5vZGVUeXBlID09PSBURVhUX05PREUgfHwgbW9ycGhlZE5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHsgLy8gVGV4dCBvciBjb21tZW50IG5vZGVcbiAgICAgICAgICAgIGlmICh0b05vZGVUeXBlID09PSBtb3JwaGVkTm9kZVR5cGUpIHtcbiAgICAgICAgICAgICAgICBtb3JwaGVkTm9kZS5ub2RlVmFsdWUgPSB0b05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGV4dCBub2RlIHRvIHNvbWV0aGluZyBlbHNlXG4gICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUgPSB0b05vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9ycGhlZE5vZGUgPT09IHRvTm9kZSkge1xuICAgICAgICAvLyBUaGUgXCJ0byBub2RlXCIgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIFwiZnJvbSBub2RlXCIgc28gd2UgaGFkIHRvXG4gICAgICAgIC8vIHRvc3Mgb3V0IHRoZSBcImZyb20gbm9kZVwiIGFuZCB1c2UgdGhlIFwidG8gbm9kZVwiXG4gICAgICAgIG9uTm9kZURpc2NhcmRlZChmcm9tTm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbW9ycGhFbChtb3JwaGVkTm9kZSwgdG9Ob2RlLCBmYWxzZSwgY2hpbGRyZW5Pbmx5KTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogV2hhdCB3ZSB3aWxsIGRvIGhlcmUgaXMgd2FsayB0aGUgdHJlZSBmb3IgdGhlIERPTSBlbGVtZW50IHRoYXQgd2FzXG4gICAgICAgICAqIG1vdmVkIGZyb20gdGhlIHRhcmdldCBET00gdHJlZSB0byB0aGUgb3JpZ2luYWwgRE9NIHRyZWUgYW5kIHdlIHdpbGxcbiAgICAgICAgICogbG9vayBmb3Iga2V5ZWQgZWxlbWVudHMgdGhhdCBjb3VsZCBiZSBtYXRjaGVkIHRvIGtleWVkIGVsZW1lbnRzIHRoYXRcbiAgICAgICAgICogd2VyZSBlYXJsaWVyIGRpc2NhcmRlZC4gIElmIHdlIGZpbmQgYSBtYXRjaCB0aGVuIHdlIHdpbGwgbW92ZSB0aGVcbiAgICAgICAgICogc2F2ZWQgZWxlbWVudCBpbnRvIHRoZSBmaW5hbCBET00gdHJlZS5cbiAgICAgICAgICovXG4gICAgICAgIHZhciBoYW5kbGVNb3ZlZEVsID0gZnVuY3Rpb24oZWwpIHtcbiAgICAgICAgICAgIHZhciBjdXJDaGlsZCA9IGVsLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICB3aGlsZSAoY3VyQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dFNpYmxpbmcgPSBjdXJDaGlsZC5uZXh0U2libGluZztcblxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGN1ckNoaWxkKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzYXZlZEVsID0gc2F2ZWRFbHNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNhdmVkRWwgJiYgY29tcGFyZU5vZGVOYW1lcyhjdXJDaGlsZCwgc2F2ZWRFbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ckNoaWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHNhdmVkRWwsIGN1ckNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRydWU6IGFscmVhZHkgdmlzaXRlZCB0aGUgc2F2ZWQgZWwgdHJlZVxuICAgICAgICAgICAgICAgICAgICAgICAgbW9ycGhFbChzYXZlZEVsLCBjdXJDaGlsZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5KHNhdmVkRWxzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGN1ckNoaWxkLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlTW92ZWRFbChjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBuZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBUaGUgbG9vcCBiZWxvdyBpcyB1c2VkIHRvIHBvc3NpYmx5IG1hdGNoIHVwIGFueSBkaXNjYXJkZWRcbiAgICAgICAgLy8gZWxlbWVudHMgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlIHdpdGggZWxlbWVuZXRzIGZyb20gdGhlXG4gICAgICAgIC8vIHRhcmdldCB0cmVlIHRoYXQgd2VyZSBtb3ZlZCBvdmVyIHdpdGhvdXQgdmlzaXRpbmcgdGhlaXJcbiAgICAgICAgLy8gY2hpbGRyZW5cbiAgICAgICAgaWYgKCFlbXB0eShzYXZlZEVscykpIHtcbiAgICAgICAgICAgIGhhbmRsZU1vdmVkRWxzTG9vcDpcbiAgICAgICAgICAgIHdoaWxlIChtb3ZlZEVscy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbW92ZWRFbHNUZW1wID0gbW92ZWRFbHM7XG4gICAgICAgICAgICAgICAgbW92ZWRFbHMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8bW92ZWRFbHNUZW1wLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVNb3ZlZEVsKG1vdmVkRWxzVGVtcFtpXSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgbm8gbW9yZSB1bm1hdGNoZWQgZWxlbWVudHMgc28gY29tcGxldGVseSBlbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsb29wXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBoYW5kbGVNb3ZlZEVsc0xvb3A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaXJlIHRoZSBcIm9uTm9kZURpc2NhcmRlZFwiIGV2ZW50IGZvciBhbnkgc2F2ZWQgZWxlbWVudHNcbiAgICAgICAgLy8gdGhhdCBuZXZlciBmb3VuZCBhIG5ldyBob21lIGluIHRoZSBtb3JwaGVkIERPTVxuICAgICAgICBmb3IgKHZhciBzYXZlZEVsSWQgaW4gc2F2ZWRFbHMpIHtcbiAgICAgICAgICAgIGlmIChzYXZlZEVscy5oYXNPd25Qcm9wZXJ0eShzYXZlZEVsSWQpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNhdmVkRWwgPSBzYXZlZEVsc1tzYXZlZEVsSWRdO1xuICAgICAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChzYXZlZEVsKTtcbiAgICAgICAgICAgICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2RlcyhzYXZlZEVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghY2hpbGRyZW5Pbmx5ICYmIG1vcnBoZWROb2RlICE9PSBmcm9tTm9kZSAmJiBmcm9tTm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIC8vIElmIHdlIGhhZCB0byBzd2FwIG91dCB0aGUgZnJvbSBub2RlIHdpdGggYSBuZXcgbm9kZSBiZWNhdXNlIHRoZSBvbGRcbiAgICAgICAgLy8gbm9kZSB3YXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgdGFyZ2V0IG5vZGUgdGhlbiB3ZSBuZWVkIHRvXG4gICAgICAgIC8vIHJlcGxhY2UgdGhlIG9sZCBET00gbm9kZSBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUuIFRoaXMgaXMgb25seVxuICAgICAgICAvLyBwb3NzaWJsZSBpZiB0aGUgb3JpZ2luYWwgRE9NIG5vZGUgd2FzIHBhcnQgb2YgYSBET00gdHJlZSB3aGljaFxuICAgICAgICAvLyB3ZSBrbm93IGlzIHRoZSBjYXNlIGlmIGl0IGhhcyBhIHBhcmVudCBub2RlLlxuICAgICAgICBmcm9tTm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChtb3JwaGVkTm9kZSwgZnJvbU5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtb3JwaGRvbTtcbiIsIm1vZHVsZS5leHBvcnRzID0gW1xuICAvLyBhdHRyaWJ1dGUgZXZlbnRzIChjYW4gYmUgc2V0IHdpdGggYXR0cmlidXRlcylcbiAgJ29uY2xpY2snLFxuICAnb25kYmxjbGljaycsXG4gICdvbm1vdXNlZG93bicsXG4gICdvbm1vdXNldXAnLFxuICAnb25tb3VzZW92ZXInLFxuICAnb25tb3VzZW1vdmUnLFxuICAnb25tb3VzZW91dCcsXG4gICdvbmRyYWdzdGFydCcsXG4gICdvbmRyYWcnLFxuICAnb25kcmFnZW50ZXInLFxuICAnb25kcmFnbGVhdmUnLFxuICAnb25kcmFnb3ZlcicsXG4gICdvbmRyb3AnLFxuICAnb25kcmFnZW5kJyxcbiAgJ29ua2V5ZG93bicsXG4gICdvbmtleXByZXNzJyxcbiAgJ29ua2V5dXAnLFxuICAnb251bmxvYWQnLFxuICAnb25hYm9ydCcsXG4gICdvbmVycm9yJyxcbiAgJ29ucmVzaXplJyxcbiAgJ29uc2Nyb2xsJyxcbiAgJ29uc2VsZWN0JyxcbiAgJ29uY2hhbmdlJyxcbiAgJ29uc3VibWl0JyxcbiAgJ29ucmVzZXQnLFxuICAnb25mb2N1cycsXG4gICdvbmJsdXInLFxuICAnb25pbnB1dCcsXG4gIC8vIG90aGVyIGNvbW1vbiBldmVudHNcbiAgJ29uY29udGV4dG1lbnUnLFxuICAnb25mb2N1c2luJyxcbiAgJ29uZm9jdXNvdXQnXG5dXG4iLCJ2YXIgYmVsID0gcmVxdWlyZSgnYmVsJykgLy8gdHVybnMgdGVtcGxhdGUgdGFnIGludG8gRE9NIGVsZW1lbnRzXG52YXIgbW9ycGhkb20gPSByZXF1aXJlKCdtb3JwaGRvbScpIC8vIGVmZmljaWVudGx5IGRpZmZzICsgbW9ycGhzIHR3byBET00gZWxlbWVudHNcbnZhciBkZWZhdWx0RXZlbnRzID0gcmVxdWlyZSgnLi91cGRhdGUtZXZlbnRzLmpzJykgLy8gZGVmYXVsdCBldmVudHMgdG8gYmUgY29waWVkIHdoZW4gZG9tIGVsZW1lbnRzIHVwZGF0ZVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJlbFxuXG4vLyBUT0RPIG1vdmUgdGhpcyArIGRlZmF1bHRFdmVudHMgdG8gYSBuZXcgbW9kdWxlIG9uY2Ugd2UgcmVjZWl2ZSBtb3JlIGZlZWRiYWNrXG5tb2R1bGUuZXhwb3J0cy51cGRhdGUgPSBmdW5jdGlvbiAoZnJvbU5vZGUsIHRvTm9kZSwgb3B0cykge1xuICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuICBpZiAob3B0cy5ldmVudHMgIT09IGZhbHNlKSB7XG4gICAgaWYgKCFvcHRzLm9uQmVmb3JlTW9ycGhFbCkgb3B0cy5vbkJlZm9yZU1vcnBoRWwgPSBjb3BpZXJcbiAgfVxuXG4gIHJldHVybiBtb3JwaGRvbShmcm9tTm9kZSwgdG9Ob2RlLCBvcHRzKVxuXG4gIC8vIG1vcnBoZG9tIG9ubHkgY29waWVzIGF0dHJpYnV0ZXMuIHdlIGRlY2lkZWQgd2UgYWxzbyB3YW50ZWQgdG8gY29weSBldmVudHNcbiAgLy8gdGhhdCBjYW4gYmUgc2V0IHZpYSBhdHRyaWJ1dGVzXG4gIGZ1bmN0aW9uIGNvcGllciAoZiwgdCkge1xuICAgIC8vIGNvcHkgZXZlbnRzOlxuICAgIHZhciBldmVudHMgPSBvcHRzLmV2ZW50cyB8fCBkZWZhdWx0RXZlbnRzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBldiA9IGV2ZW50c1tpXVxuICAgICAgaWYgKHRbZXZdKSB7IC8vIGlmIG5ldyBlbGVtZW50IGhhcyBhIHdoaXRlbGlzdGVkIGF0dHJpYnV0ZVxuICAgICAgICBmW2V2XSA9IHRbZXZdIC8vIHVwZGF0ZSBleGlzdGluZyBlbGVtZW50XG4gICAgICB9IGVsc2UgaWYgKGZbZXZdKSB7IC8vIGlmIGV4aXN0aW5nIGVsZW1lbnQgaGFzIGl0IGFuZCBuZXcgb25lIGRvZXNudFxuICAgICAgICBmW2V2XSA9IHVuZGVmaW5lZCAvLyByZW1vdmUgaXQgZnJvbSBleGlzdGluZyBlbGVtZW50XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNvcHkgdmFsdWVzIGZvciBmb3JtIGVsZW1lbnRzXG4gICAgaWYgKChmLm5vZGVOYW1lID09PSAnSU5QVVQnICYmIGYudHlwZSAhPT0gJ2ZpbGUnKSB8fCBmLm5vZGVOYW1lID09PSAnVEVYVEFSRUEnIHx8IGYubm9kZU5hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICBpZiAodC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykgPT09IG51bGwpIHQudmFsdWUgPSBmLnZhbHVlXG4gICAgfVxuICB9XG59XG4iXX0=
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"mobx":[function(require,module,exports){
(function (global){
"use strict";
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
registerGlobals();
exports.extras = {
allowStateChanges: allowStateChanges,
getAtom: getAtom,
getDebugName: getDebugName,
getDependencyTree: getDependencyTree,
getObserverTree: getObserverTree,
isComputingDerivation: isComputingDerivation,
isSpyEnabled: isSpyEnabled,
resetGlobalState: resetGlobalState,
spyReport: spyReport,
spyReportEnd: spyReportEnd,
spyReportStart: spyReportStart,
trackTransitions: trackTransitions
};
exports._ = {
getAdministration: getAdministration,
resetGlobalState: resetGlobalState
};
function autorun(arg1, arg2, arg3) {
var name, view, scope;
if (typeof arg1 === "string") {
name = arg1;
view = arg2;
scope = arg3;
}
else if (typeof arg1 === "function") {
name = arg1.name || ("Autorun@" + getNextId());
view = arg1;
scope = arg2;
}
assertUnwrapped(view, "autorun methods cannot have modifiers");
invariant(typeof view === "function", "autorun expects a function");
invariant(view.length === 0, "autorun expects a function without arguments");
if (scope)
view = view.bind(scope);
var reaction = new Reaction(name, function () {
this.track(view);
});
reaction.schedule();
return reaction.getDisposer();
}
exports.autorun = autorun;
function when(arg1, arg2, arg3, arg4) {
var name, predicate, effect, scope;
if (typeof arg1 === "string") {
name = arg1;
predicate = arg2;
effect = arg3;
scope = arg4;
}
else if (typeof arg1 === "function") {
name = ("When@" + getNextId());
predicate = arg1;
effect = arg2;
scope = arg3;
}
var disposeImmediately = false;
var disposer = autorun(name, function () {
if (predicate.call(scope)) {
if (disposer)
disposer();
else
disposeImmediately = true;
var prevUntracked = untrackedStart();
effect.call(scope);
untrackedEnd(prevUntracked);
}
});
if (disposeImmediately)
disposer();
return disposer;
}
exports.when = when;
function autorunUntil(predicate, effect, scope) {
deprecated("`autorunUntil` is deprecated, please use `when`.");
return when.apply(null, arguments);
}
exports.autorunUntil = autorunUntil;
function autorunAsync(arg1, arg2, arg3, arg4) {
var name, func, delay, scope;
if (typeof arg1 === "string") {
name = arg1;
func = arg2;
delay = arg3;
scope = arg4;
}
else if (typeof arg1 === "function") {
name = arg1.name || ("AutorunAsync@" + getNextId());
func = arg1;
delay = arg2;
scope = arg3;
}
if (delay === void 0)
delay = 1;
if (scope)
func = func.bind(scope);
var isScheduled = false;
var r = new Reaction(name, function () {
if (!isScheduled) {
isScheduled = true;
setTimeout(function () {
isScheduled = false;
if (!r.isDisposed)
r.track(func);
}, delay);
}
});
r.schedule();
return r.getDisposer();
}
exports.autorunAsync = autorunAsync;
function reaction(arg1, arg2, arg3, arg4, arg5, arg6) {
var name, expression, effect, fireImmediately, delay, scope;
if (typeof arg1 === "string") {
name = arg1;
expression = arg2;
effect = arg3;
fireImmediately = arg4;
delay = arg5;
scope = arg6;
}
else {
name = arg1.name || arg2.name || ("Reaction@" + getNextId());
expression = arg1;
effect = arg2;
fireImmediately = arg3;
delay = arg4;
scope = arg5;
}
if (fireImmediately === void 0)
fireImmediately = false;
if (delay === void 0)
delay = 0;
var _a = getValueModeFromValue(expression, ValueMode.Reference), valueMode = _a[0], unwrappedExpression = _a[1];
var compareStructural = valueMode === ValueMode.Structure;
if (scope) {
unwrappedExpression = unwrappedExpression.bind(scope);
effect = action(name, effect.bind(scope));
}
var firstTime = true;
var isScheduled = false;
var nextValue = undefined;
function reactionRunner() {
if (r.isDisposed)
return;
var changed = false;
r.track(function () {
var v = unwrappedExpression();
changed = valueDidChange(compareStructural, nextValue, v);
nextValue = v;
});
if (firstTime && fireImmediately)
effect(nextValue);
if (!firstTime && changed === true)
effect(nextValue);
if (firstTime)
firstTime = false;
}
var r = new Reaction(name, function () {
if (delay < 1) {
reactionRunner();
}
else if (!isScheduled) {
isScheduled = true;
setTimeout(function () {
isScheduled = false;
reactionRunner();
}, delay);
}
});
r.schedule();
return r.getDisposer();
}
exports.reaction = reaction;
var computedDecorator = createClassPropertyDecorator(function (target, name, _, decoratorArgs, originalDescriptor) {
var baseValue = originalDescriptor.get;
invariant(typeof baseValue === "function", "@computed can only be used on getter functions, like: '@computed get myProps() { return ...; }'");
var compareStructural = false;
if (decoratorArgs && decoratorArgs.length === 1 && decoratorArgs[0].asStructure === true)
compareStructural = true;
var adm = asObservableObject(target, undefined, ValueMode.Recursive);
defineObservableProperty(adm, name, compareStructural ? asStructure(baseValue) : baseValue, false);
}, function (name) {
return this.$mobx.values[name].get();
}, throwingComputedValueSetter, false, true);
function computed(targetOrExpr, keyOrScope, baseDescriptor, options) {
if (arguments.length < 3 && typeof targetOrExpr === "function")
return computedExpr(targetOrExpr, keyOrScope);
invariant(!baseDescriptor || !baseDescriptor.set, "@observable properties cannot have a setter: " + keyOrScope);
return computedDecorator.apply(null, arguments);
}
exports.computed = computed;
function computedExpr(expr, scope) {
var _a = getValueModeFromValue(expr, ValueMode.Recursive), mode = _a[0], value = _a[1];
return new ComputedValue(value, scope, mode === ValueMode.Structure, value.name);
}
function throwingComputedValueSetter() {
throw new Error("[ComputedValue] It is not allowed to assign new values to computed properties.");
}
function createTransformer(transformer, onCleanup) {
invariant(typeof transformer === "function" && transformer.length === 1, "createTransformer expects a function that accepts one argument");
var objectCache = {};
var resetId = globalState.resetId;
var Transformer = (function (_super) {
__extends(Transformer, _super);
function Transformer(sourceIdentifier, sourceObject) {
_super.call(this, function () { return transformer(sourceObject); }, null, false, "Transformer-" + transformer.name + "-" + sourceIdentifier);
this.sourceIdentifier = sourceIdentifier;
this.sourceObject = sourceObject;
}
Transformer.prototype.onBecomeUnobserved = function () {
var lastValue = this.value;
_super.prototype.onBecomeUnobserved.call(this);
delete objectCache[this.sourceIdentifier];
if (onCleanup)
onCleanup(lastValue, this.sourceObject);
};
return Transformer;
}(ComputedValue));
return function (object) {
if (resetId !== globalState.resetId) {
objectCache = {};
resetId = globalState.resetId;
}
var identifier = getMemoizationId(object);
var reactiveTransformer = objectCache[identifier];
if (reactiveTransformer)
return reactiveTransformer.get();
reactiveTransformer = objectCache[identifier] = new Transformer(identifier, object);
return reactiveTransformer.get();
};
}
exports.createTransformer = createTransformer;
function getMemoizationId(object) {
if (object === null || typeof object !== "object")
throw new Error("[mobx] transform expected some kind of object, got: " + object);
var tid = object.$transformId;
if (tid === undefined) {
tid = getNextId();
addHiddenProp(object, "$transformId", tid);
}
return tid;
}
function expr(expr, scope) {
if (!isComputingDerivation())
console.warn("[mobx.expr] 'expr' should only be used inside other reactive functions.");
return computed(expr, scope).get();
}
exports.expr = expr;
function extendObservable(target) {
var properties = [];
for (var _i = 1; _i < arguments.length; _i++) {
properties[_i - 1] = arguments[_i];
}
invariant(arguments.length >= 2, "extendObservable expected 2 or more arguments");
invariant(typeof target === "object", "extendObservable expects an object as first argument");
invariant(!(target instanceof ObservableMap), "extendObservable should not be used on maps, use map.merge instead");
properties.forEach(function (propSet) {
invariant(typeof propSet === "object", "all arguments of extendObservable should be objects");
extendObservableHelper(target, propSet, ValueMode.Recursive, null);
});
return target;
}
exports.extendObservable = extendObservable;
function extendObservableHelper(target, properties, mode, name) {
var adm = asObservableObject(target, name, mode);
for (var key in properties)
if (properties.hasOwnProperty(key)) {
if (target === properties && !isPropertyConfigurable(target, key))
continue;
setObservableObjectInstanceProperty(adm, key, properties[key]);
}
return target;
}
function getDependencyTree(thing, property) {
return nodeToDependencyTree(getAtom(thing, property));
}
function nodeToDependencyTree(node) {
var result = {
name: node.name
};
if (node.observing && node.observing.length > 0)
result.dependencies = unique(node.observing).map(nodeToDependencyTree);
return result;
}
function getObserverTree(thing, property) {
return nodeToObserverTree(getAtom(thing, property));
}
function nodeToObserverTree(node) {
var result = {
name: node.name
};
if (node.observers && node.observers.length > 0)
result.observers = node.observers.asArray().map(nodeToObserverTree);
return result;
}
function intercept(thing, propOrHandler, handler) {
if (typeof handler === "function")
return interceptProperty(thing, propOrHandler, handler);
else
return interceptInterceptable(thing, propOrHandler);
}
exports.intercept = intercept;
function interceptInterceptable(thing, handler) {
if (isPlainObject(thing) && !isObservableObject(thing)) {
deprecated("Passing plain objects to intercept / observe is deprecated and will be removed in 3.0");
return getAdministration(observable(thing)).intercept(handler);
}
return getAdministration(thing).intercept(handler);
}
function interceptProperty(thing, property, handler) {
if (isPlainObject(thing) && !isObservableObject(thing)) {
deprecated("Passing plain objects to intercept / observe is deprecated and will be removed in 3.0");
extendObservable(thing, {
property: thing[property]
});
return interceptProperty(thing, property, handler);
}
return getAdministration(thing, property).intercept(handler);
}
function isObservable(value, property) {
if (value === null || value === undefined)
return false;
if (property !== undefined) {
if (value instanceof ObservableMap || value instanceof ObservableArray)
throw new Error("[mobx.isObservable] isObservable(object, propertyName) is not supported for arrays and maps. Use map.has or array.length instead.");
else if (isObservableObject(value)) {
var o = value.$mobx;
return o.values && !!o.values[property];
}
return false;
}
return !!value.$mobx || value instanceof Atom || value instanceof Reaction || value instanceof ComputedValue;
}
exports.isObservable = isObservable;
var decoratorImpl = createClassPropertyDecorator(function (target, name, baseValue) {
var prevA = allowStateChangesStart(true);
if (typeof baseValue === "function")
baseValue = asReference(baseValue);
var adm = asObservableObject(target, undefined, ValueMode.Recursive);
defineObservableProperty(adm, name, baseValue, true);
allowStateChangesEnd(prevA);
}, function (name) {
return this.$mobx.values[name].get();
}, function (name, value) {
setPropertyValue(this, name, value);
}, true, false);
function observableDecorator(target, key, baseDescriptor) {
invariant(arguments.length >= 2 && arguments.length <= 3, "Illegal decorator config", key);
assertPropertyConfigurable(target, key);
invariant(!baseDescriptor || !baseDescriptor.get, "@observable can not be used on getters, use @computed instead");
return decoratorImpl.apply(null, arguments);
}
function observable(v, keyOrScope) {
if (v === void 0) { v = undefined; }
if (typeof arguments[1] === "string")
return observableDecorator.apply(null, arguments);
invariant(arguments.length < 3, "observable expects zero, one or two arguments");
if (isObservable(v))
return v;
var _a = getValueModeFromValue(v, ValueMode.Recursive), mode = _a[0], value = _a[1];
var sourceType = mode === ValueMode.Reference ? ValueType.Reference : getTypeOfValue(value);
switch (sourceType) {
case ValueType.Array:
case ValueType.PlainObject:
return makeChildObservable(value, mode);
case ValueType.Reference:
case ValueType.ComplexObject:
return new ObservableValue(value, mode);
case ValueType.ComplexFunction:
throw new Error("[mobx.observable] To be able to make a function reactive it should not have arguments. If you need an observable reference to a function, use `observable(asReference(f))`");
case ValueType.ViewFunction:
deprecated("Use `computed(expr)` instead of `observable(expr)`");
return computed(v, keyOrScope);
}
invariant(false, "Illegal State");
}
exports.observable = observable;
var ValueType;
(function (ValueType) {
ValueType[ValueType["Reference"] = 0] = "Reference";
ValueType[ValueType["PlainObject"] = 1] = "PlainObject";
ValueType[ValueType["ComplexObject"] = 2] = "ComplexObject";
ValueType[ValueType["Array"] = 3] = "Array";
ValueType[ValueType["ViewFunction"] = 4] = "ViewFunction";
ValueType[ValueType["ComplexFunction"] = 5] = "ComplexFunction";
})(ValueType || (ValueType = {}));
function getTypeOfValue(value) {
if (value === null || value === undefined)
return ValueType.Reference;
if (typeof value === "function")
return value.length ? ValueType.ComplexFunction : ValueType.ViewFunction;
if (Array.isArray(value) || value instanceof ObservableArray)
return ValueType.Array;
if (typeof value === "object")
return isPlainObject(value) ? ValueType.PlainObject : ValueType.ComplexObject;
return ValueType.Reference;
}
function observe(thing, propOrCb, cbOrFire, fireImmediately) {
if (typeof cbOrFire === "function")
return observeObservableProperty(thing, propOrCb, cbOrFire, fireImmediately);
else
return observeObservable(thing, propOrCb, cbOrFire);
}
exports.observe = observe;
function observeObservable(thing, listener, fireImmediately) {
if (isPlainObject(thing) && !isObservableObject(thing)) {
deprecated("Passing plain objects to intercept / observe is deprecated and will be removed in 3.0");
return getAdministration(observable(thing)).observe(listener, fireImmediately);
}
return getAdministration(thing).observe(listener, fireImmediately);
}
function observeObservableProperty(thing, property, listener, fireImmediately) {
if (isPlainObject(thing) && !isObservableObject(thing)) {
deprecated("Passing plain objects to intercept / observe is deprecated and will be removed in 3.0");
extendObservable(thing, {
property: thing[property]
});
return observeObservableProperty(thing, property, listener, fireImmediately);
}
return getAdministration(thing, property).observe(listener, fireImmediately);
}
function toJS(source, detectCycles, __alreadySeen) {
if (detectCycles === void 0) { detectCycles = true; }
if (__alreadySeen === void 0) { __alreadySeen = null; }
function cache(value) {
if (detectCycles)
__alreadySeen.push([source, value]);
return value;
}
if (source instanceof Date || source instanceof RegExp)
return source;
if (detectCycles && __alreadySeen === null)
__alreadySeen = [];
if (detectCycles && source !== null && typeof source === "object") {
for (var i = 0, l = __alreadySeen.length; i < l; i++)
if (__alreadySeen[i][0] === source)
return __alreadySeen[i][1];
}
if (!source)
return source;
if (Array.isArray(source) || source instanceof ObservableArray) {
var res = cache([]);
var toAdd = source.map(function (value) { return toJS(value, detectCycles, __alreadySeen); });
res.length = toAdd.length;
for (var i = 0, l = toAdd.length; i < l; i++)
res[i] = toAdd[i];
return res;
}
if (source instanceof ObservableMap) {
var res_1 = cache({});
source.forEach(function (value, key) { return res_1[key] = toJS(value, detectCycles, __alreadySeen); });
return res_1;
}
if (isObservable(source) && source.$mobx instanceof ObservableValue)
return toJS(source(), detectCycles, __alreadySeen);
if (source instanceof ObservableValue)
return toJS(source.get(), detectCycles, __alreadySeen);
if (typeof source === "object") {
var res = cache({});
for (var key in source)
res[key] = toJS(source[key], detectCycles, __alreadySeen);
return res;
}
return source;
}
exports.toJS = toJS;
function toJSON(source, detectCycles, __alreadySeen) {
if (detectCycles === void 0) { detectCycles = true; }
if (__alreadySeen === void 0) { __alreadySeen = null; }
deprecated("toJSON is deprecated. Use toJS instead");
return toJS.apply(null, arguments);
}
exports.toJSON = toJSON;
function log(msg) {
console.log(msg);
return msg;
}
function whyRun(thing, prop) {
switch (arguments.length) {
case 0:
thing = globalState.derivationStack[globalState.derivationStack.length - 1];
if (!thing)
return log("whyRun() can only be used if a derivation is active, or by passing an computed value / reaction explicitly. If you invoked whyRun from inside a computation; the computation is currently suspended but re-evaluating because somebody requested it's value.");
break;
case 2:
thing = getAtom(thing, prop);
break;
}
thing = getAtom(thing);
if (thing instanceof ComputedValue)
return log(thing.whyRun());
else if (thing instanceof Reaction)
return log(thing.whyRun());
else
invariant(false, "whyRun can only be used on reactions and computed values");
}
exports.whyRun = whyRun;
var actionFieldDecorator = createClassPropertyDecorator(function (target, key, value, args, originalDescriptor) {
var actionName = (args && args.length === 1) ? args[0] : (value.name || key || "<unnamed action>");
var wrappedAction = action(actionName, value);
addHiddenProp(target, key, wrappedAction);
}, function (key) {
return this[key];
}, function () {
invariant(false, "It is not allowed to assign new values to @action fields");
}, false, true);
function action(arg1, arg2, arg3, arg4) {
if (arguments.length === 1 && typeof arg1 === "function")
return actionImplementation(arg1.name || "<unnamed action>", arg1);
if (arguments.length === 2 && typeof arg2 === "function")
return actionImplementation(arg1, arg2);
if (arguments.length === 1 && typeof arg1 === "string")
return namedActionDecorator(arg1);
return namedActionDecorator(arg2).apply(null, arguments);
}
exports.action = action;
function namedActionDecorator(name) {
return function (target, prop, descriptor) {
if (descriptor && typeof descriptor.value === "function") {
descriptor.value = actionImplementation(name, descriptor.value);
descriptor.enumerable = false;
return descriptor;
}
return actionFieldDecorator(name).apply(this, arguments);
};
}
function isAction(thing) {
return typeof thing === "function" && thing.isMobxAction === true;
}
exports.isAction = isAction;
function runInAction(arg1, arg2, arg3) {
var actionName = typeof arg1 === "string" ? arg1 : arg1.name || "<unnamed action>";
var fn = typeof arg1 === "function" ? arg1 : arg2;
var scope = typeof arg1 === "function" ? arg2 : arg3;
invariant(typeof fn === "function", "`runInAction` expects a function");
invariant(fn.length === 0, "`runInAction` expects a function without arguments");
invariant(typeof actionName === "string" && actionName.length > 0, "actions should have valid names, got: '" + actionName + "'");
return executeWrapped(actionName, fn, scope, undefined);
}
exports.runInAction = runInAction;
function actionImplementation(actionName, fn) {
invariant(typeof fn === "function", "`action` can only be invoked on functions");
invariant(typeof actionName === "string" && actionName.length > 0, "actions should have valid names, got: '" + actionName + "'");
var res = function () {
return executeWrapped(actionName, fn, this, arguments);
};
res.isMobxAction = true;
return res;
}
function executeWrapped(actionName, fn, scope, args) {
var ds = globalState.derivationStack;
invariant(!(ds[ds.length - 1] instanceof ComputedValue), "Computed values or transformers should not invoke actions or trigger other side effects");
var notifySpy = isSpyEnabled();
var startTime;
if (notifySpy) {
startTime = Date.now();
var l = (args && args.length) || 0;
var flattendArgs = new Array(l);
if (l > 0)
for (var i = 0; i < l; i++)
flattendArgs[i] = args[i];
spyReportStart({
type: "action",
name: actionName,
fn: fn,
target: scope,
arguments: flattendArgs
});
}
var prevUntracked = untrackedStart();
transactionStart(actionName, scope, false);
var prevAllowStateChanges = allowStateChangesStart(true);
try {
return fn.apply(scope, args);
}
finally {
allowStateChangesEnd(prevAllowStateChanges);
transactionEnd(false);
untrackedEnd(prevUntracked);
if (notifySpy)
spyReportEnd({ time: Date.now() - startTime });
}
}
function useStrict(strict) {
invariant(globalState.derivationStack.length === 0, "It is not allowed to set `useStrict` when a derivation is running");
globalState.strictMode = strict;
globalState.allowStateChanges = !strict;
}
exports.useStrict = useStrict;
function allowStateChanges(allowStateChanges, func) {
var prev = allowStateChangesStart(allowStateChanges);
var res = func();
allowStateChangesEnd(prev);
return res;
}
function allowStateChangesStart(allowStateChanges) {
var prev = globalState.allowStateChanges;
globalState.allowStateChanges = allowStateChanges;
return prev;
}
function allowStateChangesEnd(prev) {
globalState.allowStateChanges = prev;
}
function propagateAtomReady(atom) {
invariant(atom.isDirty, "atom not dirty");
atom.isDirty = false;
propagateReadiness(atom, true);
}
var Atom = (function () {
function Atom(name, onBecomeObserved, onBecomeUnobserved) {
if (name === void 0) { name = "Atom@" + getNextId(); }
if (onBecomeObserved === void 0) { onBecomeObserved = noop; }
if (onBecomeUnobserved === void 0) { onBecomeUnobserved = noop; }
this.name = name;
this.onBecomeObserved = onBecomeObserved;
this.onBecomeUnobserved = onBecomeUnobserved;
this.isDirty = false;
this.staleObservers = [];
this.observers = new SimpleSet();
this.diffValue = 0;
this.lastAccessedBy = 0;
}
Atom.prototype.reportObserved = function () {
reportObserved(this);
};
Atom.prototype.reportChanged = function () {
if (!this.isDirty) {
this.reportStale();
this.reportReady();
}
};
Atom.prototype.reportStale = function () {
if (!this.isDirty) {
this.isDirty = true;
propagateStaleness(this);
}
};
Atom.prototype.reportReady = function () {
invariant(this.isDirty, "atom not dirty");
if (globalState.inTransaction > 0)
globalState.changedAtoms.push(this);
else {
propagateAtomReady(this);
runReactions();
}
};
Atom.prototype.toString = function () {
return this.name;
};
return Atom;
}());
exports.Atom = Atom;
var ComputedValue = (function () {
function ComputedValue(derivation, scope, compareStructural, name) {
this.derivation = derivation;
this.scope = scope;
this.compareStructural = compareStructural;
this.isLazy = true;
this.isComputing = false;
this.staleObservers = [];
this.observers = new SimpleSet();
this.observing = [];
this.diffValue = 0;
this.runId = 0;
this.lastAccessedBy = 0;
this.unboundDepsCount = 0;
this.__mapid = "#" + getNextId();
this.dependencyChangeCount = 0;
this.dependencyStaleCount = 0;
this.value = undefined;
this.name = name || "ComputedValue@" + getNextId();
}
ComputedValue.prototype.peek = function () {
this.isComputing = true;
var prevAllowStateChanges = allowStateChangesStart(false);
var res = this.derivation.call(this.scope);
allowStateChangesEnd(prevAllowStateChanges);
this.isComputing = false;
return res;
};
;
ComputedValue.prototype.onBecomeObserved = function () {
};
ComputedValue.prototype.onBecomeUnobserved = function () {
clearObserving(this);
this.isLazy = true;
this.value = undefined;
};
ComputedValue.prototype.onDependenciesReady = function () {
var changed = this.trackAndCompute();
return changed;
};
ComputedValue.prototype.get = function () {
invariant(!this.isComputing, "Cycle detected in computation " + this.name, this.derivation);
reportObserved(this);
if (this.dependencyStaleCount > 0) {
return this.peek();
}
if (this.isLazy) {
if (isComputingDerivation()) {
this.isLazy = false;
this.trackAndCompute();
}
else {
return this.peek();
}
}
return this.value;
};
ComputedValue.prototype.set = function (_) {
throw new Error("[ComputedValue '" + name + "'] It is not possible to assign a new value to a computed value.");
};
ComputedValue.prototype.trackAndCompute = function () {
if (isSpyEnabled()) {
spyReport({
object: this,
type: "compute",
fn: this.derivation,
target: this.scope
});
}
var oldValue = this.value;
var newValue = this.value = trackDerivedFunction(this, this.peek);
return valueDidChange(this.compareStructural, newValue, oldValue);
};
ComputedValue.prototype.observe = function (listener, fireImmediately) {
var _this = this;
var firstTime = true;
var prevValue = undefined;
return autorun(function () {
var newValue = _this.get();
if (!firstTime || fireImmediately) {
var prevU = untrackedStart();
listener(newValue, prevValue);
untrackedEnd(prevU);
}
firstTime = false;
prevValue = newValue;
});
};
ComputedValue.prototype.toJSON = function () {
return this.get();
};
ComputedValue.prototype.toString = function () {
return this.name + "[" + this.derivation.toString() + "]";
};
ComputedValue.prototype.whyRun = function () {
var isTracking = globalState.derivationStack.length > 0;
var observing = unique(this.observing).map(function (dep) { return dep.name; });
var observers = unique(this.observers.asArray()).map(function (dep) { return dep.name; });
var runReason = (this.isComputing
? isTracking
? this.observers.length > 0
? RunReason.INVALIDATED
: RunReason.REQUIRED
: RunReason.PEEK
: RunReason.NOT_RUNNING);
if (runReason === RunReason.REQUIRED) {
var requiredBy = globalState.derivationStack[globalState.derivationStack.length - 2];
if (requiredBy)
observers.push(requiredBy.name);
}
return (("\nWhyRun? computation '" + this.name + "':\n * Running because: " + runReasonTexts[runReason] + " " + ((runReason === RunReason.NOT_RUNNING) && this.dependencyStaleCount > 0 ? "(a next run is scheduled)" : "") + "\n") +
(this.isLazy
?
" * This computation is suspended (not in use by any reaction) and won't run automatically.\n\tDidn't expect this computation to be suspended at this point?\n\t 1. Make sure this computation is used by a reaction (reaction, autorun, observer).\n\t 2. Check whether you are using this computation synchronously (in the same stack as they reaction that needs it).\n"
:
" * This computation will re-run if any of the following observables changes:\n " + joinStrings(observing) + "\n " + ((this.isComputing && isTracking) ? " (... or any observable accessed during the remainder of the current run)" : "") + "\n\tMissing items in this list?\n\t 1. Check whether all used values are properly marked as observable (use isObservable to verify)\n\t 2. Make sure you didn't dereference values too early. MobX observes props, not primitives. E.g: use 'person.name' instead of 'name' in your computation.\n * If the outcome of this computation changes, the following observers will be re-run:\n " + joinStrings(observers) + "\n"));
};
return ComputedValue;
}());
var RunReason;
(function (RunReason) {
RunReason[RunReason["PEEK"] = 0] = "PEEK";
RunReason[RunReason["INVALIDATED"] = 1] = "INVALIDATED";
RunReason[RunReason["REQUIRED"] = 2] = "REQUIRED";
RunReason[RunReason["NOT_RUNNING"] = 3] = "NOT_RUNNING";
})(RunReason || (RunReason = {}));
var runReasonTexts = (_a = {},
_a[RunReason.PEEK] = "[peek] The value of this computed value was requested outside an reaction",
_a[RunReason.INVALIDATED] = "[invalidated] Some observables used by this computation did change",
_a[RunReason.REQUIRED] = "[started] This computation is required by another computed value / reaction",
_a[RunReason.NOT_RUNNING] = "[idle] This compution is currently not running",
_a
);
function isComputingDerivation() {
return globalState.derivationStack.length > 0
&& globalState.isTracking;
}
function checkIfStateModificationsAreAllowed() {
if (!globalState.allowStateChanges) {
invariant(false, globalState.strictMode
? "It is not allowed to create or change state outside an `action` when MobX is in strict mode. Wrap the current method in `action` if this state change is intended"
: "It is not allowed to change the state when a computed value or transformer is being evaluated. Use 'autorun' to create reactive functions with side-effects.");
}
}
function notifyDependencyStale(derivation) {
if (++derivation.dependencyStaleCount === 1) {
propagateStaleness(derivation);
}
}
function notifyDependencyReady(derivation, dependencyDidChange) {
invariant(derivation.dependencyStaleCount > 0, "unexpected ready notification");
if (dependencyDidChange)
derivation.dependencyChangeCount += 1;
if (--derivation.dependencyStaleCount === 0) {
if (derivation.dependencyChangeCount > 0) {
derivation.dependencyChangeCount = 0;
var changed = derivation.onDependenciesReady();
propagateReadiness(derivation, changed);
}
else {
propagateReadiness(derivation, false);
}
}
}
function trackDerivedFunction(derivation, f) {
var prevObserving = derivation.observing;
derivation.observing = new Array(prevObserving.length + 100);
derivation.unboundDepsCount = 0;
derivation.runId = ++globalState.runId;
globalState.derivationStack.push(derivation);
var prevTracking = globalState.isTracking;
globalState.isTracking = true;
var hasException = true;
var result;
try {
result = f.call(derivation);
hasException = false;
}
finally {
if (hasException) {
var message = ("[mobx] An uncaught exception occurred while calculating your computed value, autorun or transformer. Or inside the render() method of an observer based React component. " +
"These functions should never throw exceptions as MobX will not always be able to recover from them. " +
("Please fix the error reported after this message or enable 'Pause on (caught) exceptions' in your debugger to find the root cause. In: '" + derivation.name + "'"));
if (isSpyEnabled()) {
spyReport({
type: "error",
object: this,
message: message
});
}
console.warn(message);
derivation.unboundDepsCount = 0;
derivation.observing = prevObserving;
resetGlobalState();
}
else {
globalState.isTracking = prevTracking;
globalState.derivationStack.length -= 1;
bindDependencies(derivation, prevObserving);
}
}
return result;
}
function bindDependencies(derivation, prevObserving) {
var prevLength = prevObserving.length;
var observing = derivation.observing;
var newLength = observing.length = derivation.unboundDepsCount;
for (var i = 0; i < prevLength; i++)
prevObserving[i].diffValue = -1;
for (var i = 0; i < newLength; i++) {
var dep = observing[i];
if ((++dep.diffValue) > 0) {
dep.diffValue = 0;
addObserver(dep, derivation);
}
}
for (var i = 0; i < prevLength; i++) {
var dep = prevObserving[i];
if (dep.diffValue < 0) {
dep.diffValue = 0;
removeObserver(dep, derivation);
}
}
}
function clearObserving(derivation) {
var obs = derivation.observing;
var l = obs.length;
for (var i = 0; i < l; i++)
removeObserver(obs[i], derivation);
obs.length = 0;
}
function untracked(action) {
var prev = untrackedStart();
var res = action();
untrackedEnd(prev);
return res;
}
exports.untracked = untracked;
function untrackedStart() {
var prev = globalState.isTracking;
globalState.isTracking = false;
return prev;
}
function untrackedEnd(prev) {
globalState.isTracking = prev;
}
var persistentKeys = ["mobxGuid", "resetId", "spyListeners", "strictMode", "runId"];
var MobXGlobals = (function () {
function MobXGlobals() {
this.version = 3;
this.derivationStack = [];
this.runId = 0;
this.mobxGuid = 0;
this.inTransaction = 0;
this.isTracking = false;
this.isRunningReactions = false;
this.changedAtoms = [];
this.pendingReactions = [];
this.allowStateChanges = true;
this.strictMode = false;
this.resetId = 0;
this.spyListeners = [];
}
return MobXGlobals;
}());
var globalState = (function () {
var res = new MobXGlobals();
if (global.__mobservableTrackingStack || global.__mobservableViewStack)
throw new Error("[mobx] An incompatible version of mobservable is already loaded.");
if (global.__mobxGlobal && global.__mobxGlobal.version !== res.version)
throw new Error("[mobx] An incompatible version of mobx is already loaded.");
if (global.__mobxGlobal)
return global.__mobxGlobal;
return global.__mobxGlobal = res;
})();
function registerGlobals() {
}
function resetGlobalState() {
globalState.resetId++;
var defaultGlobals = new MobXGlobals();
for (var key in defaultGlobals)
if (persistentKeys.indexOf(key) === -1)
globalState[key] = defaultGlobals[key];
globalState.allowStateChanges = !globalState.strictMode;
}
function addObserver(observable, node) {
var wasEmpty = observable.observers.length === 0;
observable.observers.add(node);
if (wasEmpty)
observable.onBecomeObserved();
}
function removeObserver(observable, node) {
observable.observers.remove(node);
if (observable.observers.length === 0)
observable.onBecomeUnobserved();
}
function reportObserved(observable) {
if (globalState.isTracking === false)
return;
var derivation = globalState.derivationStack[globalState.derivationStack.length - 1];
if (derivation.runId !== observable.lastAccessedBy) {
observable.lastAccessedBy = derivation.runId;
derivation.observing[derivation.unboundDepsCount++] = observable;
}
}
function propagateStaleness(observable) {
var os = observable.observers.asArray();
var l = os.length;
for (var i = 0; i < l; i++)
notifyDependencyStale(os[i]);
observable.staleObservers = observable.staleObservers.concat(os);
}
function propagateReadiness(observable, valueDidActuallyChange) {
observable.staleObservers.splice(0).forEach(function (o) { return notifyDependencyReady(o, valueDidActuallyChange); });
}
var EMPTY_DERIVATION_SET;
var Reaction = (function () {
function Reaction(name, onInvalidate) {
if (name === void 0) { name = "Reaction@" + getNextId(); }
this.name = name;
this.onInvalidate = onInvalidate;
this.staleObservers = EMPTY_ARRAY;
this.observers = EMPTY_DERIVATION_SET || (EMPTY_DERIVATION_SET = new SimpleSet());
this.observing = [];
this.diffValue = 0;
this.runId = 0;
this.lastAccessedBy = 0;
this.unboundDepsCount = 0;
this.__mapid = "#" + getNextId();
this.dependencyChangeCount = 0;
this.dependencyStaleCount = 0;
this.isDisposed = false;
this._isScheduled = false;
this._isTrackPending = false;
this._isRunning = false;
}
Reaction.prototype.onBecomeObserved = function () {
};
Reaction.prototype.onBecomeUnobserved = function () {
};
Reaction.prototype.onDependenciesReady = function () {
this.schedule();
return false;
};
Reaction.prototype.schedule = function () {
if (!this._isScheduled) {
this._isScheduled = true;
globalState.pendingReactions.push(this);
runReactions();
}
};
Reaction.prototype.isScheduled = function () {
return this.dependencyStaleCount > 0 || this._isScheduled;
};
Reaction.prototype.runReaction = function () {
if (!this.isDisposed) {
this._isScheduled = false;
this._isTrackPending = true;
this.onInvalidate();
if (this._isTrackPending && isSpyEnabled()) {
spyReport({
object: this,
type: "scheduled-reaction"
});
}
}
};
Reaction.prototype.track = function (fn) {
var notify = isSpyEnabled();
var startTime;
if (notify) {
startTime = Date.now();
spyReportStart({
object: this,
type: "reaction",
fn: fn
});
}
this._isRunning = true;
trackDerivedFunction(this, fn);
this._isRunning = false;
this._isTrackPending = false;
if (this.isDisposed) {
clearObserving(this);
}
if (notify) {
spyReportEnd({
time: Date.now() - startTime
});
}
};
Reaction.prototype.dispose = function () {
if (!this.isDisposed) {
this.isDisposed = true;
if (!this._isRunning)
clearObserving(this);
}
};
Reaction.prototype.getDisposer = function () {
var r = this.dispose.bind(this);
r.$mobx = this;
return r;
};
Reaction.prototype.toString = function () {
return "Reaction[" + this.name + "]";
};
Reaction.prototype.whyRun = function () {
var observing = unique(this.observing).map(function (dep) { return dep.name; });
return ("\nWhyRun? reaction '" + this.name + "':\n * Status: [" + (this.isDisposed ? "stopped" : this._isRunning ? "running" : this.isScheduled() ? "scheduled" : "idle") + "]\n * This reaction will re-run if any of the following observables changes:\n " + joinStrings(observing) + "\n " + ((this._isRunning) ? " (... or any observable accessed during the remainder of the current run)" : "") + "\n\tMissing items in this list?\n\t 1. Check whether all used values are properly marked as observable (use isObservable to verify)\n\t 2. Make sure you didn't dereference values too early. MobX observes props, not primitives. E.g: use 'person.name' instead of 'name' in your computation.\n");
};
return Reaction;
}());
exports.Reaction = Reaction;
var MAX_REACTION_ITERATIONS = 100;
function runReactions() {
if (globalState.isRunningReactions === true || globalState.inTransaction > 0)
return;
globalState.isRunningReactions = true;
var allReactions = globalState.pendingReactions;
var iterations = 0;
while (allReactions.length > 0) {
if (++iterations === MAX_REACTION_ITERATIONS)
throw new Error("Reaction doesn't converge to a stable state. Probably there is a cycle in the reactive function: " + allReactions[0].toString());
var remainingReactions = allReactions.splice(0);
for (var i = 0, l = remainingReactions.length; i < l; i++)
remainingReactions[i].runReaction();
}
globalState.isRunningReactions = false;
}
var spyEnabled = false;
function isSpyEnabled() {
return spyEnabled;
}
function spyReport(event) {
if (!spyEnabled)
return false;
var listeners = globalState.spyListeners;
for (var i = 0, l = listeners.length; i < l; i++)
listeners[i](event);
}
function spyReportStart(event) {
var change = objectAssign({}, event, { spyReportStart: true });
spyReport(change);
}
var END_EVENT = { spyReportEnd: true };
function spyReportEnd(change) {
if (change)
spyReport(objectAssign({}, change, END_EVENT));
else
spyReport(END_EVENT);
}
function spy(listener) {
globalState.spyListeners.push(listener);
spyEnabled = globalState.spyListeners.length > 0;
return once(function () {
var idx = globalState.spyListeners.indexOf(listener);
if (idx !== -1)
globalState.spyListeners.splice(idx, 1);
spyEnabled = globalState.spyListeners.length > 0;
});
}
exports.spy = spy;
function trackTransitions(onReport) {
deprecated("trackTransitions is deprecated. Use mobx.spy instead");
if (typeof onReport === "boolean") {
deprecated("trackTransitions only takes a single callback function. If you are using the mobx-react-devtools, please update them first");
onReport = arguments[1];
}
if (!onReport) {
deprecated("trackTransitions without callback has been deprecated and is a no-op now. If you are using the mobx-react-devtools, please update them first");
return function () { };
}
return spy(onReport);
}
function transaction(action, thisArg, report) {
if (thisArg === void 0) { thisArg = undefined; }
if (report === void 0) { report = true; }
transactionStart((action.name) || "anonymous transaction", thisArg, report);
var res = action.call(thisArg);
transactionEnd(report);
return res;
}
exports.transaction = transaction;
function transactionStart(name, thisArg, report) {
if (thisArg === void 0) { thisArg = undefined; }
if (report === void 0) { report = true; }
globalState.inTransaction += 1;
if (report && isSpyEnabled()) {
spyReportStart({
type: "transaction",
target: thisArg,
name: name
});
}
}
function transactionEnd(report) {
if (report === void 0) { report = true; }
if (--globalState.inTransaction === 0) {
var values = globalState.changedAtoms.splice(0);
for (var i = 0, l = values.length; i < l; i++)
propagateAtomReady(values[i]);
runReactions();
}
if (report && isSpyEnabled())
spyReportEnd();
}
function hasInterceptors(interceptable) {
return (interceptable.interceptors && interceptable.interceptors.length > 0);
}
function registerInterceptor(interceptable, handler) {
var interceptors = interceptable.interceptors || (interceptable.interceptors = []);
interceptors.push(handler);
return once(function () {
var idx = interceptors.indexOf(handler);
if (idx !== -1)
interceptors.splice(idx, 1);
});
}
function interceptChange(interceptable, change) {
var prevU = untrackedStart();
var interceptors = interceptable.interceptors;
for (var i = 0, l = interceptors.length; i < l; i++) {
change = interceptors[i](change);
invariant(!change || change.type, "Intercept handlers should return nothing or a change object");
if (!change)
return null;
}
untrackedEnd(prevU);
return change;
}
function hasListeners(listenable) {
return listenable.changeListeners && listenable.changeListeners.length > 0;
}
function registerListener(listenable, handler) {
var listeners = listenable.changeListeners || (listenable.changeListeners = []);
listeners.push(handler);
return once(function () {
var idx = listeners.indexOf(handler);
if (idx !== -1)
listeners.splice(idx, 1);
});
}
function notifyListeners(listenable, change) {
var prevU = untrackedStart();
var listeners = listenable.changeListeners;
if (!listeners)
return;
listeners = listeners.slice();
for (var i = 0, l = listeners.length; i < l; i++) {
if (Array.isArray(change)) {
listeners[i].apply(null, change);
}
else {
listeners[i](change);
}
}
untrackedEnd(prevU);
}
var ValueMode;
(function (ValueMode) {
ValueMode[ValueMode["Recursive"] = 0] = "Recursive";
ValueMode[ValueMode["Reference"] = 1] = "Reference";
ValueMode[ValueMode["Structure"] = 2] = "Structure";
ValueMode[ValueMode["Flat"] = 3] = "Flat";
})(ValueMode || (ValueMode = {}));
function asReference(value) {
return new AsReference(value);
}
exports.asReference = asReference;
function asStructure(value) {
return new AsStructure(value);
}
exports.asStructure = asStructure;
function asFlat(value) {
return new AsFlat(value);
}
exports.asFlat = asFlat;
var AsReference = (function () {
function AsReference(value) {
this.value = value;
assertUnwrapped(value, "Modifiers are not allowed to be nested");
}
return AsReference;
}());
var AsStructure = (function () {
function AsStructure(value) {
this.value = value;
assertUnwrapped(value, "Modifiers are not allowed to be nested");
}
return AsStructure;
}());
var AsFlat = (function () {
function AsFlat(value) {
this.value = value;
assertUnwrapped(value, "Modifiers are not allowed to be nested");
}
return AsFlat;
}());
function asMap(data, modifierFunc) {
return map(data, modifierFunc);
}
exports.asMap = asMap;
function getValueModeFromValue(value, defaultMode) {
if (value instanceof AsReference)
return [ValueMode.Reference, value.value];
if (value instanceof AsStructure)
return [ValueMode.Structure, value.value];
if (value instanceof AsFlat)
return [ValueMode.Flat, value.value];
return [defaultMode, value];
}
function getValueModeFromModifierFunc(func) {
if (func === asReference)
return ValueMode.Reference;
else if (func === asStructure)
return ValueMode.Structure;
else if (func === asFlat)
return ValueMode.Flat;
invariant(func === undefined, "Cannot determine value mode from function. Please pass in one of these: mobx.asReference, mobx.asStructure or mobx.asFlat, got: " + func);
return ValueMode.Recursive;
}
function makeChildObservable(value, parentMode, name) {
var childMode;
if (isObservable(value))
return value;
switch (parentMode) {
case ValueMode.Reference:
return value;
case ValueMode.Flat:
assertUnwrapped(value, "Items inside 'asFlat' cannot have modifiers");
childMode = ValueMode.Reference;
break;
case ValueMode.Structure:
assertUnwrapped(value, "Items inside 'asStructure' cannot have modifiers");
childMode = ValueMode.Structure;
break;
case ValueMode.Recursive:
_a = getValueModeFromValue(value, ValueMode.Recursive), childMode = _a[0], value = _a[1];
break;
default:
invariant(false, "Illegal State");
}
if (Array.isArray(value))
return createObservableArray(value, childMode, name);
if (isPlainObject(value) && Object.isExtensible(value))
return extendObservableHelper(value, value, childMode, name);
return value;
var _a;
}
function assertUnwrapped(value, message) {
if (value instanceof AsReference || value instanceof AsStructure || value instanceof AsFlat)
throw new Error("[mobx] asStructure / asReference / asFlat cannot be used here. " + message);
}
var safariPrototypeSetterInheritanceBug = (function () {
var v = false;
var p = {};
Object.defineProperty(p, "0", { set: function () { v = true; } });
Object.create(p)["0"] = 1;
return v === false;
})();
var OBSERVABLE_ARRAY_BUFFER_SIZE = 0;
var StubArray = (function () {
function StubArray() {
}
return StubArray;
}());
StubArray.prototype = [];
var ObservableArrayAdministration = (function () {
function ObservableArrayAdministration(name, mode, array, owned) {
this.mode = mode;
this.array = array;
this.owned = owned;
this.lastKnownLength = 0;
this.interceptors = null;
this.changeListeners = null;
this.atom = new Atom(name || ("ObservableArray@" + getNextId()));
}
ObservableArrayAdministration.prototype.makeReactiveArrayItem = function (value) {
assertUnwrapped(value, "Array values cannot have modifiers");
if (this.mode === ValueMode.Flat || this.mode === ValueMode.Reference)
return value;
return makeChildObservable(value, this.mode, this.atom.name + "[..]");
};
ObservableArrayAdministration.prototype.intercept = function (handler) {
return registerInterceptor(this, handler);
};
ObservableArrayAdministration.prototype.observe = function (listener, fireImmediately) {
if (fireImmediately === void 0) { fireImmediately = false; }
if (fireImmediately) {
listener({
object: this.array,
type: "splice",
index: 0,
added: this.values.slice(),
addedCount: this.values.length,
removed: [],
removedCount: 0
});
}
return registerListener(this, listener);
};
ObservableArrayAdministration.prototype.getArrayLength = function () {
this.atom.reportObserved();
return this.values.length;
};
ObservableArrayAdministration.prototype.setArrayLength = function (newLength) {
if (typeof newLength !== "number" || newLength < 0)
throw new Error("[mobx.array] Out of range: " + newLength);
var currentLength = this.values.length;
if (newLength === currentLength)
return;
else if (newLength > currentLength)
this.spliceWithArray(currentLength, 0, new Array(newLength - currentLength));
else
this.spliceWithArray(newLength, currentLength - newLength);
};
ObservableArrayAdministration.prototype.updateArrayLength = function (oldLength, delta) {
if (oldLength !== this.lastKnownLength)
throw new Error("[mobx] Modification exception: the internal structure of an observable array was changed. Did you use peek() to change it?");
this.lastKnownLength += delta;
if (delta > 0 && oldLength + delta + 1 > OBSERVABLE_ARRAY_BUFFER_SIZE)
reserveArrayBuffer(oldLength + delta + 1);
};
ObservableArrayAdministration.prototype.spliceWithArray = function (index, deleteCount, newItems) {
checkIfStateModificationsAreAllowed();
var length = this.values.length;
if (index === undefined)
index = 0;
else if (index > length)
index = length;
else if (index < 0)
index = Math.max(0, length + index);
if (arguments.length === 1)
deleteCount = length - index;
else if (deleteCount === undefined || deleteCount === null)
deleteCount = 0;
else
deleteCount = Math.max(0, Math.min(deleteCount, length - index));
if (newItems === undefined)
newItems = [];
if (hasInterceptors(this)) {
var change = interceptChange(this, {
object: this.array,
type: "splice",
index: index,
removedCount: deleteCount,
added: newItems
});
if (!change)
return EMPTY_ARRAY;
deleteCount = change.removedCount;
newItems = change.added;
}
newItems = newItems.map(this.makeReactiveArrayItem, this);
var lengthDelta = newItems.length - deleteCount;
this.updateArrayLength(length, lengthDelta);
var res = (_a = this.values).splice.apply(_a, [index, deleteCount].concat(newItems));
if (deleteCount !== 0 || newItems.length !== 0)
this.notifyArraySplice(index, newItems, res);
return res;
var _a;
};
ObservableArrayAdministration.prototype.notifyArrayChildUpdate = function (index, newValue, oldValue) {
var notifySpy = !this.owned && isSpyEnabled();
var notify = hasListeners(this);
var change = notify || notifySpy ? {
object: this.array,
type: "update",
index: index, newValue: newValue, oldValue: oldValue
} : null;
if (notifySpy)
spyReportStart(change);
this.atom.reportChanged();
if (notify)
notifyListeners(this, change);
if (notifySpy)
spyReportEnd();
};
ObservableArrayAdministration.prototype.notifyArraySplice = function (index, added, removed) {
var notifySpy = !this.owned && isSpyEnabled();
var notify = hasListeners(this);
var change = notify || notifySpy ? {
object: this.array,
type: "splice",
index: index, removed: removed, added: added,
removedCount: removed.length,
addedCount: added.length
} : null;
if (notifySpy)
spyReportStart(change);
this.atom.reportChanged();
if (notify)
notifyListeners(this, change);
if (notifySpy)
spyReportEnd();
};
return ObservableArrayAdministration;
}());
var ObservableArray = (function (_super) {
__extends(ObservableArray, _super);
function ObservableArray(initialValues, mode, name, owned) {
if (owned === void 0) { owned = false; }
_super.call(this);
var adm = new ObservableArrayAdministration(name, mode, this, owned);
addHiddenFinalProp(this, "$mobx", adm);
if (initialValues && initialValues.length) {
adm.updateArrayLength(0, initialValues.length);
adm.values = initialValues.map(adm.makeReactiveArrayItem, adm);
adm.notifyArraySplice(0, adm.values.slice(), EMPTY_ARRAY);
}
else {
adm.values = [];
}
if (safariPrototypeSetterInheritanceBug) {
Object.defineProperty(adm.array, "0", ENTRY_0);
}
}
ObservableArray.prototype.intercept = function (handler) {
return this.$mobx.intercept(handler);
};
ObservableArray.prototype.observe = function (listener, fireImmediately) {
if (fireImmediately === void 0) { fireImmediately = false; }
return this.$mobx.observe(listener, fireImmediately);
};
ObservableArray.prototype.clear = function () {
return this.splice(0);
};
ObservableArray.prototype.replace = function (newItems) {
return this.$mobx.spliceWithArray(0, this.$mobx.values.length, newItems);
};
ObservableArray.prototype.toJS = function () {
return this.slice();
};
ObservableArray.prototype.toJSON = function () {
return this.toJS();
};
ObservableArray.prototype.peek = function () {
return this.$mobx.values;
};
ObservableArray.prototype.find = function (predicate, thisArg, fromIndex) {
if (fromIndex === void 0) { fromIndex = 0; }
this.$mobx.atom.reportObserved();
var items = this.$mobx.values, l = items.length;
for (var i = fromIndex; i < l; i++)
if (predicate.call(thisArg, items[i], i, this))
return items[i];
return undefined;
};
ObservableArray.prototype.splice = function (index, deleteCount) {
var newItems = [];
for (var _i = 2; _i < arguments.length; _i++) {
newItems[_i - 2] = arguments[_i];
}
switch (arguments.length) {
case 0:
return [];
case 1:
return this.$mobx.spliceWithArray(index);
case 2:
return this.$mobx.spliceWithArray(index, deleteCount);
}
return this.$mobx.spliceWithArray(index, deleteCount, newItems);
};
ObservableArray.prototype.push = function () {
var items = [];
for (var _i = 0; _i < arguments.length; _i++) {
items[_i - 0] = arguments[_i];
}
var adm = this.$mobx;
adm.spliceWithArray(adm.values.length, 0, items);
return adm.values.length;
};
ObservableArray.prototype.pop = function () {
return this.splice(Math.max(this.$mobx.values.length - 1, 0), 1)[0];
};
ObservableArray.prototype.shift = function () {
return this.splice(0, 1)[0];
};
ObservableArray.prototype.unshift = function () {
var items = [];
for (var _i = 0; _i < arguments.length; _i++) {
items[_i - 0] = arguments[_i];
}
var adm = this.$mobx;
adm.spliceWithArray(0, 0, items);
return adm.values.length;
};
ObservableArray.prototype.reverse = function () {
this.$mobx.atom.reportObserved();
var clone = this.slice();
return clone.reverse.apply(clone, arguments);
};
ObservableArray.prototype.sort = function (compareFn) {
this.$mobx.atom.reportObserved();
var clone = this.slice();
return clone.sort.apply(clone, arguments);
};
ObservableArray.prototype.remove = function (value) {
var idx = this.$mobx.values.indexOf(value);
if (idx > -1) {
this.splice(idx, 1);
return true;
}
return false;
};
ObservableArray.prototype.toString = function () {
return "[mobx.array] " + Array.prototype.toString.apply(this.$mobx.values, arguments);
};
ObservableArray.prototype.toLocaleString = function () {
return "[mobx.array] " + Array.prototype.toLocaleString.apply(this.$mobx.values, arguments);
};
return ObservableArray;
}(StubArray));
declareIterator(ObservableArray.prototype, function () {
return arrayAsIterator(this.slice());
});
makeNonEnumerable(ObservableArray.prototype, [
"constructor",
"observe",
"clear",
"replace",
"toJSON",
"peek",
"find",
"splice",
"push",
"pop",
"shift",
"unshift",
"reverse",
"sort",
"remove",
"toString",
"toLocaleString"
]);
Object.defineProperty(ObservableArray.prototype, "length", {
enumerable: false,
configurable: true,
get: function () {
return this.$mobx.getArrayLength();
},
set: function (newLength) {
this.$mobx.setArrayLength(newLength);
}
});
[
"concat",
"every",
"filter",
"forEach",
"indexOf",
"join",
"lastIndexOf",
"map",
"reduce",
"reduceRight",
"slice",
"some"
].forEach(function (funcName) {
var baseFunc = Array.prototype[funcName];
addHiddenProp(ObservableArray.prototype, funcName, function () {
this.$mobx.atom.reportObserved();
return baseFunc.apply(this.$mobx.values, arguments);
});
});
var ENTRY_0 = {
configurable: true,
enumerable: false,
set: createArraySetter(0),
get: createArrayGetter(0)
};
function createArrayBufferItem(index) {
var set = createArraySetter(index);
var get = createArrayGetter(index);
Object.defineProperty(ObservableArray.prototype, "" + index, {
enumerable: false,
configurable: true,
set: set, get: get
});
}
function createArraySetter(index) {
return function (newValue) {
var adm = this.$mobx;
var values = adm.values;
assertUnwrapped(newValue, "Modifiers cannot be used on array values. For non-reactive array values use makeReactive(asFlat(array)).");
if (index < values.length) {
checkIfStateModificationsAreAllowed();
var oldValue = values[index];
if (hasInterceptors(adm)) {
var change = interceptChange(adm, {
type: "update",
object: adm.array,
index: index, newValue: newValue
});
if (!change)
return;
newValue = change.newValue;
}
newValue = adm.makeReactiveArrayItem(newValue);
var changed = (adm.mode === ValueMode.Structure) ? !deepEquals(oldValue, newValue) : oldValue !== newValue;
if (changed) {
values[index] = newValue;
adm.notifyArrayChildUpdate(index, newValue, oldValue);
}
}
else if (index === values.length) {
adm.spliceWithArray(index, 0, [newValue]);
}
else
throw new Error("[mobx.array] Index out of bounds, " + index + " is larger than " + values.length);
};
}
function createArrayGetter(index) {
return function () {
var impl = this.$mobx;
if (impl && index < impl.values.length) {
impl.atom.reportObserved();
return impl.values[index];
}
console.warn("[mobx.array] Attempt to read an array index (" + index + ") that is out of bounds (" + impl.values.length + "). Please check length first. Out of bound indices will not be tracked by MobX");
return undefined;
};
}
function reserveArrayBuffer(max) {
for (var index = OBSERVABLE_ARRAY_BUFFER_SIZE; index < max; index++)
createArrayBufferItem(index);
OBSERVABLE_ARRAY_BUFFER_SIZE = max;
}
reserveArrayBuffer(1000);
function createObservableArray(initialValues, mode, name) {
return new ObservableArray(initialValues, mode, name);
}
function fastArray(initialValues) {
deprecated("fastArray is deprecated. Please use `observable(asFlat([]))`");
return createObservableArray(initialValues, ValueMode.Flat, null);
}
exports.fastArray = fastArray;
function isObservableArray(thing) {
return thing instanceof ObservableArray;
}
exports.isObservableArray = isObservableArray;
var ObservableMapMarker = {};
var ObservableMap = (function () {
function ObservableMap(initialData, valueModeFunc) {
var _this = this;
this.$mobx = ObservableMapMarker;
this._data = {};
this._hasMap = {};
this.name = "ObservableMap@" + getNextId();
this._keys = new ObservableArray(null, ValueMode.Reference, this.name + ".keys()", true);
this.interceptors = null;
this.changeListeners = null;
this._valueMode = getValueModeFromModifierFunc(valueModeFunc);
if (this._valueMode === ValueMode.Flat)
this._valueMode = ValueMode.Reference;
allowStateChanges(true, function () {
if (isPlainObject(initialData))
_this.merge(initialData);
else if (Array.isArray(initialData))
initialData.forEach(function (_a) {
var key = _a[0], value = _a[1];
return _this.set(key, value);
});
});
}
ObservableMap.prototype._has = function (key) {
return typeof this._data[key] !== "undefined";
};
ObservableMap.prototype.has = function (key) {
if (!this.isValidKey(key))
return false;
key = "" + key;
if (this._hasMap[key])
return this._hasMap[key].get();
return this._updateHasMapEntry(key, false).get();
};
ObservableMap.prototype.set = function (key, value) {
this.assertValidKey(key);
key = "" + key;
var hasKey = this._has(key);
assertUnwrapped(value, "[mobx.map.set] Expected unwrapped value to be inserted to key '" + key + "'. If you need to use modifiers pass them as second argument to the constructor");
if (hasInterceptors(this)) {
var change = interceptChange(this, {
type: hasKey ? "update" : "add",
object: this,
newValue: value,
name: key
});
if (!change)
return;
value = change.newValue;
}
if (hasKey) {
this._updateValue(key, value);
}
else {
this._addValue(key, value);
}
};
ObservableMap.prototype.delete = function (key) {
var _this = this;
this.assertValidKey(key);
key = "" + key;
if (hasInterceptors(this)) {
var change = interceptChange(this, {
type: "delete",
object: this,
name: key
});
if (!change)
return;
}
if (this._has(key)) {
var notifySpy = isSpyEnabled();
var notify = hasListeners(this);
var change = notify || notifySpy ? {
type: "delete",
object: this,
oldValue: this._data[key].value,
name: key
} : null;
if (notifySpy)
spyReportStart(change);
transaction(function () {
_this._keys.remove(key);
_this._updateHasMapEntry(key, false);
var observable = _this._data[key];
observable.setNewValue(undefined);
_this._data[key] = undefined;
}, undefined, false);
if (notify)
notifyListeners(this, change);
if (notifySpy)
spyReportEnd();
}
};
ObservableMap.prototype._updateHasMapEntry = function (key, value) {
var entry = this._hasMap[key];
if (entry) {
entry.setNewValue(value);
}
else {
entry = this._hasMap[key] = new ObservableValue(value, ValueMode.Reference, this.name + "." + key + "?", false);
}
return entry;
};
ObservableMap.prototype._updateValue = function (name, newValue) {
var observable = this._data[name];
newValue = observable.prepareNewValue(newValue);
if (newValue !== UNCHANGED) {
var notifySpy = isSpyEnabled();
var notify = hasListeners(this);
var change = notify || notifySpy ? {
type: "update",
object: this,
oldValue: observable.value,
name: name, newValue: newValue
} : null;
if (notifySpy)
spyReportStart(change);
observable.setNewValue(newValue);
if (notify)
notifyListeners(this, change);
if (notifySpy)
spyReportEnd();
}
};
ObservableMap.prototype._addValue = function (name, newValue) {
var _this = this;
transaction(function () {
var observable = _this._data[name] = new ObservableValue(newValue, _this._valueMode, _this.name + "." + name, false);
newValue = observable.value;
_this._updateHasMapEntry(name, true);
_this._keys.push(name);
}, undefined, false);
var notifySpy = isSpyEnabled();
var notify = hasListeners(this);
var change = notify || notifySpy ? {
type: "add",
object: this,
name: name, newValue: newValue
} : null;
if (notifySpy)
spyReportStart(change);
if (notify)
notifyListeners(this, change);
if (notifySpy)
spyReportEnd();
};
ObservableMap.prototype.get = function (key) {
key = "" + key;
if (this.has(key))
return this._data[key].get();
return undefined;
};
ObservableMap.prototype.keys = function () {
return arrayAsIterator(this._keys.slice());
};
ObservableMap.prototype.values = function () {
return arrayAsIterator(this._keys.map(this.get, this));
};
ObservableMap.prototype.entries = function () {
var _this = this;
return arrayAsIterator(this._keys.map(function (key) { return [key, _this.get(key)]; }));
};
ObservableMap.prototype.forEach = function (callback, thisArg) {
var _this = this;
this.keys().forEach(function (key) { return callback.call(thisArg, _this.get(key), key); });
};
ObservableMap.prototype.merge = function (other) {
var _this = this;
transaction(function () {
if (other instanceof ObservableMap)
other.keys().forEach(function (key) { return _this.set(key, other.get(key)); });
else
Object.keys(other).forEach(function (key) { return _this.set(key, other[key]); });
}, undefined, false);
return this;
};
ObservableMap.prototype.clear = function () {
var _this = this;
transaction(function () {
untracked(function () {
_this.keys().forEach(_this.delete, _this);
});
}, undefined, false);
};
Object.defineProperty(ObservableMap.prototype, "size", {
get: function () {
return this._keys.length;
},
enumerable: true,
configurable: true
});
ObservableMap.prototype.toJS = function () {
var _this = this;
var res = {};
this.keys().forEach(function (key) { return res[key] = _this.get(key); });
return res;
};
ObservableMap.prototype.toJs = function () {
deprecated("toJs is deprecated, use toJS instead");
return this.toJS();
};
ObservableMap.prototype.toJSON = function () {
return this.toJS();
};
ObservableMap.prototype.isValidKey = function (key) {
if (key === null || key === undefined)
return false;
if (typeof key !== "string" && typeof key !== "number" && typeof key !== "boolean")
return false;
return true;
};
ObservableMap.prototype.assertValidKey = function (key) {
if (!this.isValidKey(key))
throw new Error("[mobx.map] Invalid key: '" + key + "'");
};
ObservableMap.prototype.toString = function () {
var _this = this;
return this.name + "[{ " + this.keys().map(function (key) { return (key + ": " + ("" + _this.get(key))); }).join(", ") + " }]";
};
ObservableMap.prototype.observe = function (listener, fireImmediately) {
invariant(fireImmediately !== true, "`observe` doesn't support the fire immediately property for observable maps.");
return registerListener(this, listener);
};
ObservableMap.prototype.intercept = function (handler) {
return registerInterceptor(this, handler);
};
return ObservableMap;
}());
exports.ObservableMap = ObservableMap;
declareIterator(ObservableMap.prototype, function () {
return this.entries();
});
function map(initialValues, valueModifier) {
return new ObservableMap(initialValues, valueModifier);
}
exports.map = map;
function isObservableMap(thing) {
return thing instanceof ObservableMap;
}
exports.isObservableMap = isObservableMap;
var ObservableObjectAdministration = (function () {
function ObservableObjectAdministration(target, name, mode) {
this.target = target;
this.name = name;
this.mode = mode;
this.values = {};
this.changeListeners = null;
this.interceptors = null;
}
ObservableObjectAdministration.prototype.observe = function (callback, fireImmediately) {
invariant(fireImmediately !== true, "`observe` doesn't support the fire immediately property for observable objects.");
return registerListener(this, callback);
};
ObservableObjectAdministration.prototype.intercept = function (handler) {
return registerInterceptor(this, handler);
};
return ObservableObjectAdministration;
}());
function asObservableObject(target, name, mode) {
if (mode === void 0) { mode = ValueMode.Recursive; }
if (isObservableObject(target))
return target.$mobx;
if (!isPlainObject(target))
name = target.constructor.name + "@" + getNextId();
if (!name)
name = "ObservableObject@" + getNextId();
var adm = new ObservableObjectAdministration(target, name, mode);
addHiddenFinalProp(target, "$mobx", adm);
return adm;
}
function setObservableObjectInstanceProperty(adm, propName, value) {
if (adm.values[propName])
adm.target[propName] = value;
else
defineObservableProperty(adm, propName, value, true);
}
function defineObservableProperty(adm, propName, newValue, asInstanceProperty) {
if (asInstanceProperty)
assertPropertyConfigurable(adm.target, propName);
var observable;
var name = adm.name + "." + propName;
var isComputed = true;
if (typeof newValue === "function" && newValue.length === 0 && !isAction(newValue))
observable = new ComputedValue(newValue, adm.target, false, name);
else if (newValue instanceof AsStructure && typeof newValue.value === "function" && newValue.value.length === 0)
observable = new ComputedValue(newValue.value, adm.target, true, name);
else {
isComputed = false;
if (hasInterceptors(adm)) {
var change = interceptChange(adm, {
object: adm.target,
name: propName,
type: "add",
newValue: newValue
});
if (!change)
return;
newValue = change.newValue;
}
observable = new ObservableValue(newValue, adm.mode, name, false);
newValue = observable.value;
}
adm.values[propName] = observable;
if (asInstanceProperty) {
Object.defineProperty(adm.target, propName, isComputed ? generateComputedPropConfig(propName) : generateObservablePropConfig(propName));
}
if (!isComputed)
notifyPropertyAddition(adm, adm.target, propName, newValue);
}
var observablePropertyConfigs = {};
var computedPropertyConfigs = {};
function generateObservablePropConfig(propName) {
var config = observablePropertyConfigs[propName];
if (config)
return config;
return observablePropertyConfigs[propName] = {
configurable: true,
enumerable: true,
get: function () {
return this.$mobx.values[propName].get();
},
set: function (v) {
setPropertyValue(this, propName, v);
}
};
}
function generateComputedPropConfig(propName) {
var config = computedPropertyConfigs[propName];
if (config)
return config;
return computedPropertyConfigs[propName] = {
configurable: true,
enumerable: false,
get: function () {
return this.$mobx.values[propName].get();
},
set: throwingComputedValueSetter
};
}
function setPropertyValue(instance, name, newValue) {
var adm = instance.$mobx;
var observable = adm.values[name];
if (hasInterceptors(adm)) {
var change = interceptChange(adm, {
type: "update",
object: instance,
name: name, newValue: newValue
});
if (!change)
return;
newValue = change.newValue;
}
newValue = observable.prepareNewValue(newValue);
if (newValue !== UNCHANGED) {
var notify = hasListeners(adm);
var notifySpy = isSpyEnabled();
var change = notifyListeners || hasListeners ? {
type: "update",
object: instance,
oldValue: observable.value,
name: name, newValue: newValue
} : null;
if (notifySpy)
spyReportStart(change);
observable.setNewValue(newValue);
if (notify)
notifyListeners(adm, change);
if (notifySpy)
spyReportEnd();
}
}
function notifyPropertyAddition(adm, object, name, newValue) {
var notify = hasListeners(adm);
var notifySpy = isSpyEnabled();
var change = notify || notifySpy ? {
type: "add",
object: object, name: name, newValue: newValue
} : null;
if (notifySpy)
spyReportStart(change);
if (notify)
notifyListeners(adm, change);
if (notifySpy)
spyReportEnd();
}
function isObservableObject(thing) {
if (typeof thing === "object" && thing !== null) {
runLazyInitializers(thing);
return thing.$mobx instanceof ObservableObjectAdministration;
}
return false;
}
exports.isObservableObject = isObservableObject;
var UNCHANGED = {};
var ObservableValue = (function (_super) {
__extends(ObservableValue, _super);
function ObservableValue(value, mode, name, notifySpy) {
if (name === void 0) { name = "ObservableValue@" + getNextId(); }
if (notifySpy === void 0) { notifySpy = true; }
_super.call(this, name);
this.mode = mode;
this.hasUnreportedChange = false;
this.value = undefined;
var _a = getValueModeFromValue(value, ValueMode.Recursive), childmode = _a[0], unwrappedValue = _a[1];
if (this.mode === ValueMode.Recursive)
this.mode = childmode;
this.value = makeChildObservable(unwrappedValue, this.mode, this.name);
if (notifySpy && isSpyEnabled()) {
spyReport({ type: "create", object: this, newValue: this.value });
}
}
ObservableValue.prototype.set = function (newValue) {
var oldValue = this.value;
newValue = this.prepareNewValue(newValue);
if (newValue !== UNCHANGED) {
var notifySpy = isSpyEnabled();
if (notifySpy) {
spyReportStart({
type: "update",
object: this,
newValue: newValue, oldValue: oldValue
});
}
this.setNewValue(newValue);
if (notifySpy)
spyReportEnd();
}
};
ObservableValue.prototype.prepareNewValue = function (newValue) {
assertUnwrapped(newValue, "Modifiers cannot be used on non-initial values.");
checkIfStateModificationsAreAllowed();
if (hasInterceptors(this)) {
var change = interceptChange(this, { object: this, type: "update", newValue: newValue });
if (!change)
return UNCHANGED;
newValue = change.newValue;
}
var changed = valueDidChange(this.mode === ValueMode.Structure, this.value, newValue);
if (changed)
return makeChildObservable(newValue, this.mode, this.name);
return UNCHANGED;
};
ObservableValue.prototype.setNewValue = function (newValue) {
var oldValue = this.value;
this.value = newValue;
this.reportChanged();
if (hasListeners(this))
notifyListeners(this, [newValue, oldValue]);
};
ObservableValue.prototype.get = function () {
this.reportObserved();
return this.value;
};
ObservableValue.prototype.intercept = function (handler) {
return registerInterceptor(this, handler);
};
ObservableValue.prototype.observe = function (listener, fireImmediately) {
if (fireImmediately)
listener(this.value, undefined);
return registerListener(this, listener);
};
ObservableValue.prototype.toJSON = function () {
return this.get();
};
ObservableValue.prototype.toString = function () {
return this.name + "[" + this.value + "]";
};
return ObservableValue;
}(Atom));
function getAtom(thing, property) {
if (typeof thing === "object" && thing !== null) {
if (isObservableArray(thing)) {
invariant(property === undefined, "It is not possible to get index atoms from arrays");
return thing.$mobx.atom;
}
if (isObservableMap(thing)) {
if (property === undefined)
return getAtom(thing._keys);
var observable_1 = thing._data[property] || thing._hasMap[property];
invariant(!!observable_1, "the entry '" + property + "' does not exist in the observable map '" + getDebugName(thing) + "'");
return observable_1;
}
runLazyInitializers(thing);
if (isObservableObject(thing)) {
invariant(!!property, "please specify a property");
var observable_2 = thing.$mobx.values[property];
invariant(!!observable_2, "no observable property '" + property + "' found on the observable object '" + getDebugName(thing) + "'");
return observable_2;
}
if (thing instanceof Atom || thing instanceof ComputedValue || thing instanceof Reaction) {
return thing;
}
}
else if (typeof thing === "function") {
if (thing.$mobx instanceof Reaction) {
return thing.$mobx;
}
}
invariant(false, "Cannot obtain atom from " + thing);
}
function getAdministration(thing, property) {
invariant(thing, "Expection some object");
if (property !== undefined)
return getAdministration(getAtom(thing, property));
if (thing instanceof Atom || thing instanceof ComputedValue || thing instanceof Reaction)
return thing;
if (isObservableMap(thing))
return thing;
runLazyInitializers(thing);
if (thing.$mobx)
return thing.$mobx;
invariant(false, "Cannot obtain administration from " + thing);
}
function getDebugName(thing, property) {
var named;
if (property !== undefined)
named = getAtom(thing, property);
else if (isObservableObject(thing) || isObservableMap(thing))
named = getAdministration(thing);
else
named = getAtom(thing);
return named.name;
}
function createClassPropertyDecorator(onInitialize, get, set, enumerable, allowCustomArguments) {
function classPropertyDecorator(target, key, descriptor, customArgs) {
invariant(allowCustomArguments || quacksLikeADecorator(arguments), "This function is a decorator, but it wasn't invoked like a decorator");
if (!descriptor) {
var newDescriptor = {
enumerable: enumerable,
configurable: true,
get: function () {
if (!this.__mobxInitializedProps || this.__mobxInitializedProps[key] !== true)
typescriptInitializeProperty(this, key, undefined, onInitialize, customArgs, descriptor);
return get.call(this, key);
},
set: function (v) {
if (!this.__mobxInitializedProps || this.__mobxInitializedProps[key] !== true) {
typescriptInitializeProperty(this, key, v, onInitialize, customArgs, descriptor);
}
else {
set.call(this, key, v);
}
}
};
if (arguments.length < 3) {
Object.defineProperty(target, key, newDescriptor);
}
return newDescriptor;
}
else {
if (!target.hasOwnProperty("__mobxLazyInitializers")) {
addHiddenProp(target, "__mobxLazyInitializers", (target.__mobxLazyInitializers && target.__mobxLazyInitializers.slice()) || []);
}
var value_1 = descriptor.value, initializer_1 = descriptor.initializer;
target.__mobxLazyInitializers.push(function (instance) {
onInitialize(instance, key, (initializer_1 ? initializer_1.call(instance) : value_1), customArgs, descriptor);
});
return {
enumerable: enumerable, configurable: true,
get: function () {
if (this.__mobxDidRunLazyInitializers !== true)
runLazyInitializers(this);
return get.call(this, key);
},
set: function (v) {
if (this.__mobxDidRunLazyInitializers !== true)
runLazyInitializers(this);
set.call(this, key, v);
}
};
}
}
if (allowCustomArguments) {
return function () {
if (quacksLikeADecorator(arguments))
return classPropertyDecorator.apply(null, arguments);
var outerArgs = arguments;
return function (target, key, descriptor) { return classPropertyDecorator(target, key, descriptor, outerArgs); };
};
}
return classPropertyDecorator;
}
function typescriptInitializeProperty(instance, key, v, onInitialize, customArgs, baseDescriptor) {
if (!instance.hasOwnProperty("__mobxInitializedProps"))
addHiddenProp(instance, "__mobxInitializedProps", {});
instance.__mobxInitializedProps[key] = true;
onInitialize(instance, key, v, customArgs, baseDescriptor);
}
function runLazyInitializers(instance) {
if (instance.__mobxDidRunLazyInitializers === true)
return;
if (instance.__mobxLazyInitializers) {
addHiddenProp(instance, "__mobxDidRunLazyInitializers", true);
instance.__mobxDidRunLazyInitializers && instance.__mobxLazyInitializers.forEach(function (initializer) { return initializer(instance); });
}
}
function quacksLikeADecorator(args) {
return (args.length === 2 || args.length === 3) && typeof args[1] === "string";
}
function iteratorSymbol() {
return (typeof Symbol === "function" && Symbol.iterator) || "@@iterator";
}
var IS_ITERATING_MARKER = "__$$iterating";
function arrayAsIterator(array) {
invariant(array[IS_ITERATING_MARKER] !== true, "Illegal state: cannot recycle array as iterator");
addHiddenFinalProp(array, IS_ITERATING_MARKER, true);
var idx = -1;
addHiddenFinalProp(array, "next", function next() {
idx++;
return {
done: idx >= this.length,
value: idx < this.length ? this[idx] : undefined
};
});
return array;
}
function declareIterator(prototType, iteratorFactory) {
addHiddenFinalProp(prototType, iteratorSymbol(), iteratorFactory);
}
var SimpleSet = (function () {
function SimpleSet() {
this.size = 0;
this.data = {};
}
Object.defineProperty(SimpleSet.prototype, "length", {
get: function () {
return this.size;
},
enumerable: true,
configurable: true
});
SimpleSet.prototype.asArray = function () {
var res = new Array(this.size);
var i = 0;
for (var key in this.data) {
res[i] = this.data[key];
i++;
}
return res;
};
SimpleSet.prototype.add = function (value) {
var m = value.__mapid;
if (!(m in this.data)) {
this.data[m] = value;
this.size++;
}
};
SimpleSet.prototype.remove = function (value) {
if (value.__mapid in this.data) {
delete this.data[value.__mapid];
this.size--;
}
};
return SimpleSet;
}());
exports.SimpleSet = SimpleSet;
var SimpleEventEmitter = (function () {
function SimpleEventEmitter() {
this.listeners = [];
deprecated("extras.SimpleEventEmitter is deprecated and will be removed in the next major release");
}
SimpleEventEmitter.prototype.emit = function () {
var listeners = this.listeners.slice();
for (var i = 0, l = listeners.length; i < l; i++)
listeners[i].apply(null, arguments);
};
SimpleEventEmitter.prototype.on = function (listener) {
var _this = this;
this.listeners.push(listener);
return once(function () {
var idx = _this.listeners.indexOf(listener);
if (idx !== -1)
_this.listeners.splice(idx, 1);
});
};
SimpleEventEmitter.prototype.once = function (listener) {
var subscription = this.on(function () {
subscription();
listener.apply(this, arguments);
});
return subscription;
};
return SimpleEventEmitter;
}());
exports.SimpleEventEmitter = SimpleEventEmitter;
var EMPTY_ARRAY = [];
Object.freeze(EMPTY_ARRAY);
function getNextId() {
return ++globalState.mobxGuid;
}
function invariant(check, message, thing) {
if (!check)
throw new Error("[mobx] Invariant failed: " + message + (thing ? " in '" + thing + "'" : ""));
}
var deprecatedMessages = [];
function deprecated(msg) {
if (deprecatedMessages.indexOf(msg) !== -1)
return;
deprecatedMessages.push(msg);
console.error("[mobx] Deprecated: " + msg);
}
function once(func) {
var invoked = false;
return function () {
if (invoked)
return;
invoked = true;
return func.apply(this, arguments);
};
}
var noop = function () { };
function unique(list) {
var res = [];
list.forEach(function (item) {
if (res.indexOf(item) === -1)
res.push(item);
});
return res;
}
function joinStrings(things, limit, separator) {
if (limit === void 0) { limit = 100; }
if (separator === void 0) { separator = " - "; }
if (!things)
return "";
var sliced = things.slice(0, limit);
return "" + sliced.join(separator) + (things.length > limit ? " (... and " + (things.length - limit) + "more)" : "");
}
function isPlainObject(value) {
return value !== null && typeof value === "object" && Object.getPrototypeOf(value) === Object.prototype;
}
function objectAssign() {
var res = arguments[0];
for (var i = 1, l = arguments.length; i < l; i++) {
var source = arguments[i];
for (var key in source)
if (source.hasOwnProperty(key)) {
res[key] = source[key];
}
}
return res;
}
function valueDidChange(compareStructural, oldValue, newValue) {
return compareStructural
? !deepEquals(oldValue, newValue)
: oldValue !== newValue;
}
function makeNonEnumerable(object, propNames) {
for (var i = 0; i < propNames.length; i++) {
addHiddenProp(object, propNames[i], object[propNames[i]]);
}
}
function addHiddenProp(object, propName, value) {
Object.defineProperty(object, propName, {
enumerable: false,
writable: true,
configurable: true,
value: value
});
}
function addHiddenFinalProp(object, propName, value) {
Object.defineProperty(object, propName, {
enumerable: false,
writable: false,
configurable: false,
value: value
});
}
function isPropertyConfigurable(object, prop) {
var descriptor = Object.getOwnPropertyDescriptor(object, prop);
return !descriptor || (descriptor.configurable !== false && descriptor.writable !== false);
}
function assertPropertyConfigurable(object, prop) {
invariant(isPropertyConfigurable(object, prop), "Cannot make property '" + prop + "' observable, it is not configurable and writable in the target object");
}
function getEnumerableKeys(obj) {
var res = [];
for (var key in obj)
res.push(key);
return res;
}
function deepEquals(a, b) {
if (a === null && b === null)
return true;
if (a === undefined && b === undefined)
return true;
var aIsArray = Array.isArray(a) || isObservableArray(a);
if (aIsArray !== (Array.isArray(b) || isObservableArray(b))) {
return false;
}
else if (aIsArray) {
if (a.length !== b.length)
return false;
for (var i = a.length - 1; i >= 0; i--)
if (!deepEquals(a[i], b[i]))
return false;
return true;
}
else if (typeof a === "object" && typeof b === "object") {
if (a === null || b === null)
return false;
if (getEnumerableKeys(a).length !== getEnumerableKeys(b).length)
return false;
for (var prop in a) {
if (!(prop in b))
return false;
if (!deepEquals(a[prop], b[prop]))
return false;
}
return true;
}
return a === b;
}
var _a;
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9tb2J4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG5yZWdpc3Rlckdsb2JhbHMoKTtcbmV4cG9ydHMuZXh0cmFzID0ge1xuICAgIGFsbG93U3RhdGVDaGFuZ2VzOiBhbGxvd1N0YXRlQ2hhbmdlcyxcbiAgICBnZXRBdG9tOiBnZXRBdG9tLFxuICAgIGdldERlYnVnTmFtZTogZ2V0RGVidWdOYW1lLFxuICAgIGdldERlcGVuZGVuY3lUcmVlOiBnZXREZXBlbmRlbmN5VHJlZSxcbiAgICBnZXRPYnNlcnZlclRyZWU6IGdldE9ic2VydmVyVHJlZSxcbiAgICBpc0NvbXB1dGluZ0Rlcml2YXRpb246IGlzQ29tcHV0aW5nRGVyaXZhdGlvbixcbiAgICBpc1NweUVuYWJsZWQ6IGlzU3B5RW5hYmxlZCxcbiAgICByZXNldEdsb2JhbFN0YXRlOiByZXNldEdsb2JhbFN0YXRlLFxuICAgIHNweVJlcG9ydDogc3B5UmVwb3J0LFxuICAgIHNweVJlcG9ydEVuZDogc3B5UmVwb3J0RW5kLFxuICAgIHNweVJlcG9ydFN0YXJ0OiBzcHlSZXBvcnRTdGFydCxcbiAgICB0cmFja1RyYW5zaXRpb25zOiB0cmFja1RyYW5zaXRpb25zXG59O1xuZXhwb3J0cy5fID0ge1xuICAgIGdldEFkbWluaXN0cmF0aW9uOiBnZXRBZG1pbmlzdHJhdGlvbixcbiAgICByZXNldEdsb2JhbFN0YXRlOiByZXNldEdsb2JhbFN0YXRlXG59O1xuZnVuY3Rpb24gYXV0b3J1bihhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgdmFyIG5hbWUsIHZpZXcsIHNjb3BlO1xuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBuYW1lID0gYXJnMTtcbiAgICAgICAgdmlldyA9IGFyZzI7XG4gICAgICAgIHNjb3BlID0gYXJnMztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGFyZzEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBuYW1lID0gYXJnMS5uYW1lIHx8IChcIkF1dG9ydW5AXCIgKyBnZXROZXh0SWQoKSk7XG4gICAgICAgIHZpZXcgPSBhcmcxO1xuICAgICAgICBzY29wZSA9IGFyZzI7XG4gICAgfVxuICAgIGFzc2VydFVud3JhcHBlZCh2aWV3LCBcImF1dG9ydW4gbWV0aG9kcyBjYW5ub3QgaGF2ZSBtb2RpZmllcnNcIik7XG4gICAgaW52YXJpYW50KHR5cGVvZiB2aWV3ID09PSBcImZ1bmN0aW9uXCIsIFwiYXV0b3J1biBleHBlY3RzIGEgZnVuY3Rpb25cIik7XG4gICAgaW52YXJpYW50KHZpZXcubGVuZ3RoID09PSAwLCBcImF1dG9ydW4gZXhwZWN0cyBhIGZ1bmN0aW9uIHdpdGhvdXQgYXJndW1lbnRzXCIpO1xuICAgIGlmIChzY29wZSlcbiAgICAgICAgdmlldyA9IHZpZXcuYmluZChzY29wZSk7XG4gICAgdmFyIHJlYWN0aW9uID0gbmV3IFJlYWN0aW9uKG5hbWUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy50cmFjayh2aWV3KTtcbiAgICB9KTtcbiAgICByZWFjdGlvbi5zY2hlZHVsZSgpO1xuICAgIHJldHVybiByZWFjdGlvbi5nZXREaXNwb3NlcigpO1xufVxuZXhwb3J0cy5hdXRvcnVuID0gYXV0b3J1bjtcbmZ1bmN0aW9uIHdoZW4oYXJnMSwgYXJnMiwgYXJnMywgYXJnNCkge1xuICAgIHZhciBuYW1lLCBwcmVkaWNhdGUsIGVmZmVjdCwgc2NvcGU7XG4gICAgaWYgKHR5cGVvZiBhcmcxID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG5hbWUgPSBhcmcxO1xuICAgICAgICBwcmVkaWNhdGUgPSBhcmcyO1xuICAgICAgICBlZmZlY3QgPSBhcmczO1xuICAgICAgICBzY29wZSA9IGFyZzQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBhcmcxID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgbmFtZSA9IChcIldoZW5AXCIgKyBnZXROZXh0SWQoKSk7XG4gICAgICAgIHByZWRpY2F0ZSA9IGFyZzE7XG4gICAgICAgIGVmZmVjdCA9IGFyZzI7XG4gICAgICAgIHNjb3BlID0gYXJnMztcbiAgICB9XG4gICAgdmFyIGRpc3Bvc2VJbW1lZGlhdGVseSA9IGZhbHNlO1xuICAgIHZhciBkaXNwb3NlciA9IGF1dG9ydW4obmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAocHJlZGljYXRlLmNhbGwoc2NvcGUpKSB7XG4gICAgICAgICAgICBpZiAoZGlzcG9zZXIpXG4gICAgICAgICAgICAgICAgZGlzcG9zZXIoKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBkaXNwb3NlSW1tZWRpYXRlbHkgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIHByZXZVbnRyYWNrZWQgPSB1bnRyYWNrZWRTdGFydCgpO1xuICAgICAgICAgICAgZWZmZWN0LmNhbGwoc2NvcGUpO1xuICAgICAgICAgICAgdW50cmFja2VkRW5kKHByZXZVbnRyYWNrZWQpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGRpc3Bvc2VJbW1lZGlhdGVseSlcbiAgICAgICAgZGlzcG9zZXIoKTtcbiAgICByZXR1cm4gZGlzcG9zZXI7XG59XG5leHBvcnRzLndoZW4gPSB3aGVuO1xuZnVuY3Rpb24gYXV0b3J1blVudGlsKHByZWRpY2F0ZSwgZWZmZWN0LCBzY29wZSkge1xuICAgIGRlcHJlY2F0ZWQoXCJgYXV0b3J1blVudGlsYCBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIGB3aGVuYC5cIik7XG4gICAgcmV0dXJuIHdoZW4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cbmV4cG9ydHMuYXV0b3J1blVudGlsID0gYXV0b3J1blVudGlsO1xuZnVuY3Rpb24gYXV0b3J1bkFzeW5jKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpIHtcbiAgICB2YXIgbmFtZSwgZnVuYywgZGVsYXksIHNjb3BlO1xuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBuYW1lID0gYXJnMTtcbiAgICAgICAgZnVuYyA9IGFyZzI7XG4gICAgICAgIGRlbGF5ID0gYXJnMztcbiAgICAgICAgc2NvcGUgPSBhcmc0O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG5hbWUgPSBhcmcxLm5hbWUgfHwgKFwiQXV0b3J1bkFzeW5jQFwiICsgZ2V0TmV4dElkKCkpO1xuICAgICAgICBmdW5jID0gYXJnMTtcbiAgICAgICAgZGVsYXkgPSBhcmcyO1xuICAgICAgICBzY29wZSA9IGFyZzM7XG4gICAgfVxuICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKVxuICAgICAgICBkZWxheSA9IDE7XG4gICAgaWYgKHNjb3BlKVxuICAgICAgICBmdW5jID0gZnVuYy5iaW5kKHNjb3BlKTtcbiAgICB2YXIgaXNTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICB2YXIgciA9IG5ldyBSZWFjdGlvbihuYW1lLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghaXNTY2hlZHVsZWQpIHtcbiAgICAgICAgICAgIGlzU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlzU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFyLmlzRGlzcG9zZWQpXG4gICAgICAgICAgICAgICAgICAgIHIudHJhY2soZnVuYyk7XG4gICAgICAgICAgICB9LCBkZWxheSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByLnNjaGVkdWxlKCk7XG4gICAgcmV0dXJuIHIuZ2V0RGlzcG9zZXIoKTtcbn1cbmV4cG9ydHMuYXV0b3J1bkFzeW5jID0gYXV0b3J1bkFzeW5jO1xuZnVuY3Rpb24gcmVhY3Rpb24oYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNikge1xuICAgIHZhciBuYW1lLCBleHByZXNzaW9uLCBlZmZlY3QsIGZpcmVJbW1lZGlhdGVseSwgZGVsYXksIHNjb3BlO1xuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBuYW1lID0gYXJnMTtcbiAgICAgICAgZXhwcmVzc2lvbiA9IGFyZzI7XG4gICAgICAgIGVmZmVjdCA9IGFyZzM7XG4gICAgICAgIGZpcmVJbW1lZGlhdGVseSA9IGFyZzQ7XG4gICAgICAgIGRlbGF5ID0gYXJnNTtcbiAgICAgICAgc2NvcGUgPSBhcmc2O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbmFtZSA9IGFyZzEubmFtZSB8fCBhcmcyLm5hbWUgfHwgKFwiUmVhY3Rpb25AXCIgKyBnZXROZXh0SWQoKSk7XG4gICAgICAgIGV4cHJlc3Npb24gPSBhcmcxO1xuICAgICAgICBlZmZlY3QgPSBhcmcyO1xuICAgICAgICBmaXJlSW1tZWRpYXRlbHkgPSBhcmczO1xuICAgICAgICBkZWxheSA9IGFyZzQ7XG4gICAgICAgIHNjb3BlID0gYXJnNTtcbiAgICB9XG4gICAgaWYgKGZpcmVJbW1lZGlhdGVseSA9PT0gdm9pZCAwKVxuICAgICAgICBmaXJlSW1tZWRpYXRlbHkgPSBmYWxzZTtcbiAgICBpZiAoZGVsYXkgPT09IHZvaWQgMClcbiAgICAgICAgZGVsYXkgPSAwO1xuICAgIHZhciBfYSA9IGdldFZhbHVlTW9kZUZyb21WYWx1ZShleHByZXNzaW9uLCBWYWx1ZU1vZGUuUmVmZXJlbmNlKSwgdmFsdWVNb2RlID0gX2FbMF0sIHVud3JhcHBlZEV4cHJlc3Npb24gPSBfYVsxXTtcbiAgICB2YXIgY29tcGFyZVN0cnVjdHVyYWwgPSB2YWx1ZU1vZGUgPT09IFZhbHVlTW9kZS5TdHJ1Y3R1cmU7XG4gICAgaWYgKHNjb3BlKSB7XG4gICAgICAgIHVud3JhcHBlZEV4cHJlc3Npb24gPSB1bndyYXBwZWRFeHByZXNzaW9uLmJpbmQoc2NvcGUpO1xuICAgICAgICBlZmZlY3QgPSBhY3Rpb24obmFtZSwgZWZmZWN0LmJpbmQoc2NvcGUpKTtcbiAgICB9XG4gICAgdmFyIGZpcnN0VGltZSA9IHRydWU7XG4gICAgdmFyIGlzU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgdmFyIG5leHRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICBmdW5jdGlvbiByZWFjdGlvblJ1bm5lcigpIHtcbiAgICAgICAgaWYgKHIuaXNEaXNwb3NlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgci50cmFjayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdiA9IHVud3JhcHBlZEV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB2YWx1ZURpZENoYW5nZShjb21wYXJlU3RydWN0dXJhbCwgbmV4dFZhbHVlLCB2KTtcbiAgICAgICAgICAgIG5leHRWYWx1ZSA9IHY7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZmlyc3RUaW1lICYmIGZpcmVJbW1lZGlhdGVseSlcbiAgICAgICAgICAgIGVmZmVjdChuZXh0VmFsdWUpO1xuICAgICAgICBpZiAoIWZpcnN0VGltZSAmJiBjaGFuZ2VkID09PSB0cnVlKVxuICAgICAgICAgICAgZWZmZWN0KG5leHRWYWx1ZSk7XG4gICAgICAgIGlmIChmaXJzdFRpbWUpXG4gICAgICAgICAgICBmaXJzdFRpbWUgPSBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHIgPSBuZXcgUmVhY3Rpb24obmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoZGVsYXkgPCAxKSB7XG4gICAgICAgICAgICByZWFjdGlvblJ1bm5lcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpc1NjaGVkdWxlZCkge1xuICAgICAgICAgICAgaXNTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaXNTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZWFjdGlvblJ1bm5lcigpO1xuICAgICAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgci5zY2hlZHVsZSgpO1xuICAgIHJldHVybiByLmdldERpc3Bvc2VyKCk7XG59XG5leHBvcnRzLnJlYWN0aW9uID0gcmVhY3Rpb247XG52YXIgY29tcHV0ZWREZWNvcmF0b3IgPSBjcmVhdGVDbGFzc1Byb3BlcnR5RGVjb3JhdG9yKGZ1bmN0aW9uICh0YXJnZXQsIG5hbWUsIF8sIGRlY29yYXRvckFyZ3MsIG9yaWdpbmFsRGVzY3JpcHRvcikge1xuICAgIHZhciBiYXNlVmFsdWUgPSBvcmlnaW5hbERlc2NyaXB0b3IuZ2V0O1xuICAgIGludmFyaWFudCh0eXBlb2YgYmFzZVZhbHVlID09PSBcImZ1bmN0aW9uXCIsIFwiQGNvbXB1dGVkIGNhbiBvbmx5IGJlIHVzZWQgb24gZ2V0dGVyIGZ1bmN0aW9ucywgbGlrZTogJ0Bjb21wdXRlZCBnZXQgbXlQcm9wcygpIHsgcmV0dXJuIC4uLjsgfSdcIik7XG4gICAgdmFyIGNvbXBhcmVTdHJ1Y3R1cmFsID0gZmFsc2U7XG4gICAgaWYgKGRlY29yYXRvckFyZ3MgJiYgZGVjb3JhdG9yQXJncy5sZW5ndGggPT09IDEgJiYgZGVjb3JhdG9yQXJnc1swXS5hc1N0cnVjdHVyZSA9PT0gdHJ1ZSlcbiAgICAgICAgY29tcGFyZVN0cnVjdHVyYWwgPSB0cnVlO1xuICAgIHZhciBhZG0gPSBhc09ic2VydmFibGVPYmplY3QodGFyZ2V0LCB1bmRlZmluZWQsIFZhbHVlTW9kZS5SZWN1cnNpdmUpO1xuICAgIGRlZmluZU9ic2VydmFibGVQcm9wZXJ0eShhZG0sIG5hbWUsIGNvbXBhcmVTdHJ1Y3R1cmFsID8gYXNTdHJ1Y3R1cmUoYmFzZVZhbHVlKSA6IGJhc2VWYWx1ZSwgZmFsc2UpO1xufSwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy4kbW9ieC52YWx1ZXNbbmFtZV0uZ2V0KCk7XG59LCB0aHJvd2luZ0NvbXB1dGVkVmFsdWVTZXR0ZXIsIGZhbHNlLCB0cnVlKTtcbmZ1bmN0aW9uIGNvbXB1dGVkKHRhcmdldE9yRXhwciwga2V5T3JTY29wZSwgYmFzZURlc2NyaXB0b3IsIG9wdGlvbnMpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMgJiYgdHlwZW9mIHRhcmdldE9yRXhwciA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICByZXR1cm4gY29tcHV0ZWRFeHByKHRhcmdldE9yRXhwciwga2V5T3JTY29wZSk7XG4gICAgaW52YXJpYW50KCFiYXNlRGVzY3JpcHRvciB8fCAhYmFzZURlc2NyaXB0b3Iuc2V0LCBcIkBvYnNlcnZhYmxlIHByb3BlcnRpZXMgY2Fubm90IGhhdmUgYSBzZXR0ZXI6IFwiICsga2V5T3JTY29wZSk7XG4gICAgcmV0dXJuIGNvbXB1dGVkRGVjb3JhdG9yLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5leHBvcnRzLmNvbXB1dGVkID0gY29tcHV0ZWQ7XG5mdW5jdGlvbiBjb21wdXRlZEV4cHIoZXhwciwgc2NvcGUpIHtcbiAgICB2YXIgX2EgPSBnZXRWYWx1ZU1vZGVGcm9tVmFsdWUoZXhwciwgVmFsdWVNb2RlLlJlY3Vyc2l2ZSksIG1vZGUgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICByZXR1cm4gbmV3IENvbXB1dGVkVmFsdWUodmFsdWUsIHNjb3BlLCBtb2RlID09PSBWYWx1ZU1vZGUuU3RydWN0dXJlLCB2YWx1ZS5uYW1lKTtcbn1cbmZ1bmN0aW9uIHRocm93aW5nQ29tcHV0ZWRWYWx1ZVNldHRlcigpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJbQ29tcHV0ZWRWYWx1ZV0gSXQgaXMgbm90IGFsbG93ZWQgdG8gYXNzaWduIG5ldyB2YWx1ZXMgdG8gY29tcHV0ZWQgcHJvcGVydGllcy5cIik7XG59XG5mdW5jdGlvbiBjcmVhdGVUcmFuc2Zvcm1lcih0cmFuc2Zvcm1lciwgb25DbGVhbnVwKSB7XG4gICAgaW52YXJpYW50KHR5cGVvZiB0cmFuc2Zvcm1lciA9PT0gXCJmdW5jdGlvblwiICYmIHRyYW5zZm9ybWVyLmxlbmd0aCA9PT0gMSwgXCJjcmVhdGVUcmFuc2Zvcm1lciBleHBlY3RzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIG9uZSBhcmd1bWVudFwiKTtcbiAgICB2YXIgb2JqZWN0Q2FjaGUgPSB7fTtcbiAgICB2YXIgcmVzZXRJZCA9IGdsb2JhbFN0YXRlLnJlc2V0SWQ7XG4gICAgdmFyIFRyYW5zZm9ybWVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzKFRyYW5zZm9ybWVyLCBfc3VwZXIpO1xuICAgICAgICBmdW5jdGlvbiBUcmFuc2Zvcm1lcihzb3VyY2VJZGVudGlmaWVyLCBzb3VyY2VPYmplY3QpIHtcbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRyYW5zZm9ybWVyKHNvdXJjZU9iamVjdCk7IH0sIG51bGwsIGZhbHNlLCBcIlRyYW5zZm9ybWVyLVwiICsgdHJhbnNmb3JtZXIubmFtZSArIFwiLVwiICsgc291cmNlSWRlbnRpZmllcik7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUlkZW50aWZpZXIgPSBzb3VyY2VJZGVudGlmaWVyO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VPYmplY3QgPSBzb3VyY2VPYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgVHJhbnNmb3JtZXIucHJvdG90eXBlLm9uQmVjb21lVW5vYnNlcnZlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBsYXN0VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5vbkJlY29tZVVub2JzZXJ2ZWQuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmplY3RDYWNoZVt0aGlzLnNvdXJjZUlkZW50aWZpZXJdO1xuICAgICAgICAgICAgaWYgKG9uQ2xlYW51cClcbiAgICAgICAgICAgICAgICBvbkNsZWFudXAobGFzdFZhbHVlLCB0aGlzLnNvdXJjZU9iamVjdCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBUcmFuc2Zvcm1lcjtcbiAgICB9KENvbXB1dGVkVmFsdWUpKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgICBpZiAocmVzZXRJZCAhPT0gZ2xvYmFsU3RhdGUucmVzZXRJZCkge1xuICAgICAgICAgICAgb2JqZWN0Q2FjaGUgPSB7fTtcbiAgICAgICAgICAgIHJlc2V0SWQgPSBnbG9iYWxTdGF0ZS5yZXNldElkO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpZGVudGlmaWVyID0gZ2V0TWVtb2l6YXRpb25JZChvYmplY3QpO1xuICAgICAgICB2YXIgcmVhY3RpdmVUcmFuc2Zvcm1lciA9IG9iamVjdENhY2hlW2lkZW50aWZpZXJdO1xuICAgICAgICBpZiAocmVhY3RpdmVUcmFuc2Zvcm1lcilcbiAgICAgICAgICAgIHJldHVybiByZWFjdGl2ZVRyYW5zZm9ybWVyLmdldCgpO1xuICAgICAgICByZWFjdGl2ZVRyYW5zZm9ybWVyID0gb2JqZWN0Q2FjaGVbaWRlbnRpZmllcl0gPSBuZXcgVHJhbnNmb3JtZXIoaWRlbnRpZmllciwgb2JqZWN0KTtcbiAgICAgICAgcmV0dXJuIHJlYWN0aXZlVHJhbnNmb3JtZXIuZ2V0KCk7XG4gICAgfTtcbn1cbmV4cG9ydHMuY3JlYXRlVHJhbnNmb3JtZXIgPSBjcmVhdGVUcmFuc2Zvcm1lcjtcbmZ1bmN0aW9uIGdldE1lbW9pemF0aW9uSWQob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqZWN0ICE9PSBcIm9iamVjdFwiKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieF0gdHJhbnNmb3JtIGV4cGVjdGVkIHNvbWUga2luZCBvZiBvYmplY3QsIGdvdDogXCIgKyBvYmplY3QpO1xuICAgIHZhciB0aWQgPSBvYmplY3QuJHRyYW5zZm9ybUlkO1xuICAgIGlmICh0aWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aWQgPSBnZXROZXh0SWQoKTtcbiAgICAgICAgYWRkSGlkZGVuUHJvcChvYmplY3QsIFwiJHRyYW5zZm9ybUlkXCIsIHRpZCk7XG4gICAgfVxuICAgIHJldHVybiB0aWQ7XG59XG5mdW5jdGlvbiBleHByKGV4cHIsIHNjb3BlKSB7XG4gICAgaWYgKCFpc0NvbXB1dGluZ0Rlcml2YXRpb24oKSlcbiAgICAgICAgY29uc29sZS53YXJuKFwiW21vYnguZXhwcl0gJ2V4cHInIHNob3VsZCBvbmx5IGJlIHVzZWQgaW5zaWRlIG90aGVyIHJlYWN0aXZlIGZ1bmN0aW9ucy5cIik7XG4gICAgcmV0dXJuIGNvbXB1dGVkKGV4cHIsIHNjb3BlKS5nZXQoKTtcbn1cbmV4cG9ydHMuZXhwciA9IGV4cHI7XG5mdW5jdGlvbiBleHRlbmRPYnNlcnZhYmxlKHRhcmdldCkge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgcHJvcGVydGllc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgaW52YXJpYW50KGFyZ3VtZW50cy5sZW5ndGggPj0gMiwgXCJleHRlbmRPYnNlcnZhYmxlIGV4cGVjdGVkIDIgb3IgbW9yZSBhcmd1bWVudHNcIik7XG4gICAgaW52YXJpYW50KHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIsIFwiZXh0ZW5kT2JzZXJ2YWJsZSBleHBlY3RzIGFuIG9iamVjdCBhcyBmaXJzdCBhcmd1bWVudFwiKTtcbiAgICBpbnZhcmlhbnQoISh0YXJnZXQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlTWFwKSwgXCJleHRlbmRPYnNlcnZhYmxlIHNob3VsZCBub3QgYmUgdXNlZCBvbiBtYXBzLCB1c2UgbWFwLm1lcmdlIGluc3RlYWRcIik7XG4gICAgcHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wU2V0KSB7XG4gICAgICAgIGludmFyaWFudCh0eXBlb2YgcHJvcFNldCA9PT0gXCJvYmplY3RcIiwgXCJhbGwgYXJndW1lbnRzIG9mIGV4dGVuZE9ic2VydmFibGUgc2hvdWxkIGJlIG9iamVjdHNcIik7XG4gICAgICAgIGV4dGVuZE9ic2VydmFibGVIZWxwZXIodGFyZ2V0LCBwcm9wU2V0LCBWYWx1ZU1vZGUuUmVjdXJzaXZlLCBudWxsKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZXhwb3J0cy5leHRlbmRPYnNlcnZhYmxlID0gZXh0ZW5kT2JzZXJ2YWJsZTtcbmZ1bmN0aW9uIGV4dGVuZE9ic2VydmFibGVIZWxwZXIodGFyZ2V0LCBwcm9wZXJ0aWVzLCBtb2RlLCBuYW1lKSB7XG4gICAgdmFyIGFkbSA9IGFzT2JzZXJ2YWJsZU9iamVjdCh0YXJnZXQsIG5hbWUsIG1vZGUpO1xuICAgIGZvciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKVxuICAgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0ID09PSBwcm9wZXJ0aWVzICYmICFpc1Byb3BlcnR5Q29uZmlndXJhYmxlKHRhcmdldCwga2V5KSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHNldE9ic2VydmFibGVPYmplY3RJbnN0YW5jZVByb3BlcnR5KGFkbSwga2V5LCBwcm9wZXJ0aWVzW2tleV0pO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lUcmVlKHRoaW5nLCBwcm9wZXJ0eSkge1xuICAgIHJldHVybiBub2RlVG9EZXBlbmRlbmN5VHJlZShnZXRBdG9tKHRoaW5nLCBwcm9wZXJ0eSkpO1xufVxuZnVuY3Rpb24gbm9kZVRvRGVwZW5kZW5jeVRyZWUobm9kZSkge1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6IG5vZGUubmFtZVxuICAgIH07XG4gICAgaWYgKG5vZGUub2JzZXJ2aW5nICYmIG5vZGUub2JzZXJ2aW5nLmxlbmd0aCA+IDApXG4gICAgICAgIHJlc3VsdC5kZXBlbmRlbmNpZXMgPSB1bmlxdWUobm9kZS5vYnNlcnZpbmcpLm1hcChub2RlVG9EZXBlbmRlbmN5VHJlZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldE9ic2VydmVyVHJlZSh0aGluZywgcHJvcGVydHkpIHtcbiAgICByZXR1cm4gbm9kZVRvT2JzZXJ2ZXJUcmVlKGdldEF0b20odGhpbmcsIHByb3BlcnR5KSk7XG59XG5mdW5jdGlvbiBub2RlVG9PYnNlcnZlclRyZWUobm9kZSkge1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6IG5vZGUubmFtZVxuICAgIH07XG4gICAgaWYgKG5vZGUub2JzZXJ2ZXJzICYmIG5vZGUub2JzZXJ2ZXJzLmxlbmd0aCA+IDApXG4gICAgICAgIHJlc3VsdC5vYnNlcnZlcnMgPSBub2RlLm9ic2VydmVycy5hc0FycmF5KCkubWFwKG5vZGVUb09ic2VydmVyVHJlZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGludGVyY2VwdCh0aGluZywgcHJvcE9ySGFuZGxlciwgaGFuZGxlcikge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICByZXR1cm4gaW50ZXJjZXB0UHJvcGVydHkodGhpbmcsIHByb3BPckhhbmRsZXIsIGhhbmRsZXIpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGludGVyY2VwdEludGVyY2VwdGFibGUodGhpbmcsIHByb3BPckhhbmRsZXIpO1xufVxuZXhwb3J0cy5pbnRlcmNlcHQgPSBpbnRlcmNlcHQ7XG5mdW5jdGlvbiBpbnRlcmNlcHRJbnRlcmNlcHRhYmxlKHRoaW5nLCBoYW5kbGVyKSB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QodGhpbmcpICYmICFpc09ic2VydmFibGVPYmplY3QodGhpbmcpKSB7XG4gICAgICAgIGRlcHJlY2F0ZWQoXCJQYXNzaW5nIHBsYWluIG9iamVjdHMgdG8gaW50ZXJjZXB0IC8gb2JzZXJ2ZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMy4wXCIpO1xuICAgICAgICByZXR1cm4gZ2V0QWRtaW5pc3RyYXRpb24ob2JzZXJ2YWJsZSh0aGluZykpLmludGVyY2VwdChoYW5kbGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGdldEFkbWluaXN0cmF0aW9uKHRoaW5nKS5pbnRlcmNlcHQoaGFuZGxlcik7XG59XG5mdW5jdGlvbiBpbnRlcmNlcHRQcm9wZXJ0eSh0aGluZywgcHJvcGVydHksIGhhbmRsZXIpIHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdCh0aGluZykgJiYgIWlzT2JzZXJ2YWJsZU9iamVjdCh0aGluZykpIHtcbiAgICAgICAgZGVwcmVjYXRlZChcIlBhc3NpbmcgcGxhaW4gb2JqZWN0cyB0byBpbnRlcmNlcHQgLyBvYnNlcnZlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAzLjBcIik7XG4gICAgICAgIGV4dGVuZE9ic2VydmFibGUodGhpbmcsIHtcbiAgICAgICAgICAgIHByb3BlcnR5OiB0aGluZ1twcm9wZXJ0eV1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbnRlcmNlcHRQcm9wZXJ0eSh0aGluZywgcHJvcGVydHksIGhhbmRsZXIpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0QWRtaW5pc3RyYXRpb24odGhpbmcsIHByb3BlcnR5KS5pbnRlcmNlcHQoaGFuZGxlcik7XG59XG5mdW5jdGlvbiBpc09ic2VydmFibGUodmFsdWUsIHByb3BlcnR5KSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAocHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYnNlcnZhYmxlTWFwIHx8IHZhbHVlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZUFycmF5KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW21vYnguaXNPYnNlcnZhYmxlXSBpc09ic2VydmFibGUob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFycmF5cyBhbmQgbWFwcy4gVXNlIG1hcC5oYXMgb3IgYXJyYXkubGVuZ3RoIGluc3RlYWQuXCIpO1xuICAgICAgICBlbHNlIGlmIChpc09ic2VydmFibGVPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICB2YXIgbyA9IHZhbHVlLiRtb2J4O1xuICAgICAgICAgICAgcmV0dXJuIG8udmFsdWVzICYmICEhby52YWx1ZXNbcHJvcGVydHldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICEhdmFsdWUuJG1vYnggfHwgdmFsdWUgaW5zdGFuY2VvZiBBdG9tIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVhY3Rpb24gfHwgdmFsdWUgaW5zdGFuY2VvZiBDb21wdXRlZFZhbHVlO1xufVxuZXhwb3J0cy5pc09ic2VydmFibGUgPSBpc09ic2VydmFibGU7XG52YXIgZGVjb3JhdG9ySW1wbCA9IGNyZWF0ZUNsYXNzUHJvcGVydHlEZWNvcmF0b3IoZnVuY3Rpb24gKHRhcmdldCwgbmFtZSwgYmFzZVZhbHVlKSB7XG4gICAgdmFyIHByZXZBID0gYWxsb3dTdGF0ZUNoYW5nZXNTdGFydCh0cnVlKTtcbiAgICBpZiAodHlwZW9mIGJhc2VWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBiYXNlVmFsdWUgPSBhc1JlZmVyZW5jZShiYXNlVmFsdWUpO1xuICAgIHZhciBhZG0gPSBhc09ic2VydmFibGVPYmplY3QodGFyZ2V0LCB1bmRlZmluZWQsIFZhbHVlTW9kZS5SZWN1cnNpdmUpO1xuICAgIGRlZmluZU9ic2VydmFibGVQcm9wZXJ0eShhZG0sIG5hbWUsIGJhc2VWYWx1ZSwgdHJ1ZSk7XG4gICAgYWxsb3dTdGF0ZUNoYW5nZXNFbmQocHJldkEpO1xufSwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy4kbW9ieC52YWx1ZXNbbmFtZV0uZ2V0KCk7XG59LCBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBzZXRQcm9wZXJ0eVZhbHVlKHRoaXMsIG5hbWUsIHZhbHVlKTtcbn0sIHRydWUsIGZhbHNlKTtcbmZ1bmN0aW9uIG9ic2VydmFibGVEZWNvcmF0b3IodGFyZ2V0LCBrZXksIGJhc2VEZXNjcmlwdG9yKSB7XG4gICAgaW52YXJpYW50KGFyZ3VtZW50cy5sZW5ndGggPj0gMiAmJiBhcmd1bWVudHMubGVuZ3RoIDw9IDMsIFwiSWxsZWdhbCBkZWNvcmF0b3IgY29uZmlnXCIsIGtleSk7XG4gICAgYXNzZXJ0UHJvcGVydHlDb25maWd1cmFibGUodGFyZ2V0LCBrZXkpO1xuICAgIGludmFyaWFudCghYmFzZURlc2NyaXB0b3IgfHwgIWJhc2VEZXNjcmlwdG9yLmdldCwgXCJAb2JzZXJ2YWJsZSBjYW4gbm90IGJlIHVzZWQgb24gZ2V0dGVycywgdXNlIEBjb21wdXRlZCBpbnN0ZWFkXCIpO1xuICAgIHJldHVybiBkZWNvcmF0b3JJbXBsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBvYnNlcnZhYmxlKHYsIGtleU9yU2NvcGUpIHtcbiAgICBpZiAodiA9PT0gdm9pZCAwKSB7IHYgPSB1bmRlZmluZWQ7IH1cbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1sxXSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgcmV0dXJuIG9ic2VydmFibGVEZWNvcmF0b3IuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICBpbnZhcmlhbnQoYXJndW1lbnRzLmxlbmd0aCA8IDMsIFwib2JzZXJ2YWJsZSBleHBlY3RzIHplcm8sIG9uZSBvciB0d28gYXJndW1lbnRzXCIpO1xuICAgIGlmIChpc09ic2VydmFibGUodikpXG4gICAgICAgIHJldHVybiB2O1xuICAgIHZhciBfYSA9IGdldFZhbHVlTW9kZUZyb21WYWx1ZSh2LCBWYWx1ZU1vZGUuUmVjdXJzaXZlKSwgbW9kZSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgIHZhciBzb3VyY2VUeXBlID0gbW9kZSA9PT0gVmFsdWVNb2RlLlJlZmVyZW5jZSA/IFZhbHVlVHlwZS5SZWZlcmVuY2UgOiBnZXRUeXBlT2ZWYWx1ZSh2YWx1ZSk7XG4gICAgc3dpdGNoIChzb3VyY2VUeXBlKSB7XG4gICAgICAgIGNhc2UgVmFsdWVUeXBlLkFycmF5OlxuICAgICAgICBjYXNlIFZhbHVlVHlwZS5QbGFpbk9iamVjdDpcbiAgICAgICAgICAgIHJldHVybiBtYWtlQ2hpbGRPYnNlcnZhYmxlKHZhbHVlLCBtb2RlKTtcbiAgICAgICAgY2FzZSBWYWx1ZVR5cGUuUmVmZXJlbmNlOlxuICAgICAgICBjYXNlIFZhbHVlVHlwZS5Db21wbGV4T2JqZWN0OlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlVmFsdWUodmFsdWUsIG1vZGUpO1xuICAgICAgICBjYXNlIFZhbHVlVHlwZS5Db21wbGV4RnVuY3Rpb246XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieC5vYnNlcnZhYmxlXSBUbyBiZSBhYmxlIHRvIG1ha2UgYSBmdW5jdGlvbiByZWFjdGl2ZSBpdCBzaG91bGQgbm90IGhhdmUgYXJndW1lbnRzLiBJZiB5b3UgbmVlZCBhbiBvYnNlcnZhYmxlIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uLCB1c2UgYG9ic2VydmFibGUoYXNSZWZlcmVuY2UoZikpYFwiKTtcbiAgICAgICAgY2FzZSBWYWx1ZVR5cGUuVmlld0Z1bmN0aW9uOlxuICAgICAgICAgICAgZGVwcmVjYXRlZChcIlVzZSBgY29tcHV0ZWQoZXhwcilgIGluc3RlYWQgb2YgYG9ic2VydmFibGUoZXhwcilgXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVkKHYsIGtleU9yU2NvcGUpO1xuICAgIH1cbiAgICBpbnZhcmlhbnQoZmFsc2UsIFwiSWxsZWdhbCBTdGF0ZVwiKTtcbn1cbmV4cG9ydHMub2JzZXJ2YWJsZSA9IG9ic2VydmFibGU7XG52YXIgVmFsdWVUeXBlO1xuKGZ1bmN0aW9uIChWYWx1ZVR5cGUpIHtcbiAgICBWYWx1ZVR5cGVbVmFsdWVUeXBlW1wiUmVmZXJlbmNlXCJdID0gMF0gPSBcIlJlZmVyZW5jZVwiO1xuICAgIFZhbHVlVHlwZVtWYWx1ZVR5cGVbXCJQbGFpbk9iamVjdFwiXSA9IDFdID0gXCJQbGFpbk9iamVjdFwiO1xuICAgIFZhbHVlVHlwZVtWYWx1ZVR5cGVbXCJDb21wbGV4T2JqZWN0XCJdID0gMl0gPSBcIkNvbXBsZXhPYmplY3RcIjtcbiAgICBWYWx1ZVR5cGVbVmFsdWVUeXBlW1wiQXJyYXlcIl0gPSAzXSA9IFwiQXJyYXlcIjtcbiAgICBWYWx1ZVR5cGVbVmFsdWVUeXBlW1wiVmlld0Z1bmN0aW9uXCJdID0gNF0gPSBcIlZpZXdGdW5jdGlvblwiO1xuICAgIFZhbHVlVHlwZVtWYWx1ZVR5cGVbXCJDb21wbGV4RnVuY3Rpb25cIl0gPSA1XSA9IFwiQ29tcGxleEZ1bmN0aW9uXCI7XG59KShWYWx1ZVR5cGUgfHwgKFZhbHVlVHlwZSA9IHt9KSk7XG5mdW5jdGlvbiBnZXRUeXBlT2ZWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gVmFsdWVUeXBlLlJlZmVyZW5jZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPyBWYWx1ZVR5cGUuQ29tcGxleEZ1bmN0aW9uIDogVmFsdWVUeXBlLlZpZXdGdW5jdGlvbjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBPYnNlcnZhYmxlQXJyYXkpXG4gICAgICAgIHJldHVybiBWYWx1ZVR5cGUuQXJyYXk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIilcbiAgICAgICAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpID8gVmFsdWVUeXBlLlBsYWluT2JqZWN0IDogVmFsdWVUeXBlLkNvbXBsZXhPYmplY3Q7XG4gICAgcmV0dXJuIFZhbHVlVHlwZS5SZWZlcmVuY2U7XG59XG5mdW5jdGlvbiBvYnNlcnZlKHRoaW5nLCBwcm9wT3JDYiwgY2JPckZpcmUsIGZpcmVJbW1lZGlhdGVseSkge1xuICAgIGlmICh0eXBlb2YgY2JPckZpcmUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgcmV0dXJuIG9ic2VydmVPYnNlcnZhYmxlUHJvcGVydHkodGhpbmcsIHByb3BPckNiLCBjYk9yRmlyZSwgZmlyZUltbWVkaWF0ZWx5KTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBvYnNlcnZlT2JzZXJ2YWJsZSh0aGluZywgcHJvcE9yQ2IsIGNiT3JGaXJlKTtcbn1cbmV4cG9ydHMub2JzZXJ2ZSA9IG9ic2VydmU7XG5mdW5jdGlvbiBvYnNlcnZlT2JzZXJ2YWJsZSh0aGluZywgbGlzdGVuZXIsIGZpcmVJbW1lZGlhdGVseSkge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHRoaW5nKSAmJiAhaXNPYnNlcnZhYmxlT2JqZWN0KHRoaW5nKSkge1xuICAgICAgICBkZXByZWNhdGVkKFwiUGFzc2luZyBwbGFpbiBvYmplY3RzIHRvIGludGVyY2VwdCAvIG9ic2VydmUgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIDMuMFwiKTtcbiAgICAgICAgcmV0dXJuIGdldEFkbWluaXN0cmF0aW9uKG9ic2VydmFibGUodGhpbmcpKS5vYnNlcnZlKGxpc3RlbmVyLCBmaXJlSW1tZWRpYXRlbHkpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0QWRtaW5pc3RyYXRpb24odGhpbmcpLm9ic2VydmUobGlzdGVuZXIsIGZpcmVJbW1lZGlhdGVseSk7XG59XG5mdW5jdGlvbiBvYnNlcnZlT2JzZXJ2YWJsZVByb3BlcnR5KHRoaW5nLCBwcm9wZXJ0eSwgbGlzdGVuZXIsIGZpcmVJbW1lZGlhdGVseSkge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHRoaW5nKSAmJiAhaXNPYnNlcnZhYmxlT2JqZWN0KHRoaW5nKSkge1xuICAgICAgICBkZXByZWNhdGVkKFwiUGFzc2luZyBwbGFpbiBvYmplY3RzIHRvIGludGVyY2VwdCAvIG9ic2VydmUgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIDMuMFwiKTtcbiAgICAgICAgZXh0ZW5kT2JzZXJ2YWJsZSh0aGluZywge1xuICAgICAgICAgICAgcHJvcGVydHk6IHRoaW5nW3Byb3BlcnR5XVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG9ic2VydmVPYnNlcnZhYmxlUHJvcGVydHkodGhpbmcsIHByb3BlcnR5LCBsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KTtcbiAgICB9XG4gICAgcmV0dXJuIGdldEFkbWluaXN0cmF0aW9uKHRoaW5nLCBwcm9wZXJ0eSkub2JzZXJ2ZShsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KTtcbn1cbmZ1bmN0aW9uIHRvSlMoc291cmNlLCBkZXRlY3RDeWNsZXMsIF9fYWxyZWFkeVNlZW4pIHtcbiAgICBpZiAoZGV0ZWN0Q3ljbGVzID09PSB2b2lkIDApIHsgZGV0ZWN0Q3ljbGVzID0gdHJ1ZTsgfVxuICAgIGlmIChfX2FscmVhZHlTZWVuID09PSB2b2lkIDApIHsgX19hbHJlYWR5U2VlbiA9IG51bGw7IH1cbiAgICBmdW5jdGlvbiBjYWNoZSh2YWx1ZSkge1xuICAgICAgICBpZiAoZGV0ZWN0Q3ljbGVzKVxuICAgICAgICAgICAgX19hbHJlYWR5U2Vlbi5wdXNoKFtzb3VyY2UsIHZhbHVlXSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIERhdGUgfHwgc291cmNlIGluc3RhbmNlb2YgUmVnRXhwKVxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIGlmIChkZXRlY3RDeWNsZXMgJiYgX19hbHJlYWR5U2VlbiA9PT0gbnVsbClcbiAgICAgICAgX19hbHJlYWR5U2VlbiA9IFtdO1xuICAgIGlmIChkZXRlY3RDeWNsZXMgJiYgc291cmNlICE9PSBudWxsICYmIHR5cGVvZiBzb3VyY2UgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBfX2FscmVhZHlTZWVuLmxlbmd0aDsgaSA8IGw7IGkrKylcbiAgICAgICAgICAgIGlmIChfX2FscmVhZHlTZWVuW2ldWzBdID09PSBzb3VyY2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9fYWxyZWFkeVNlZW5baV1bMV07XG4gICAgfVxuICAgIGlmICghc291cmNlKVxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkgfHwgc291cmNlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZUFycmF5KSB7XG4gICAgICAgIHZhciByZXMgPSBjYWNoZShbXSk7XG4gICAgICAgIHZhciB0b0FkZCA9IHNvdXJjZS5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0b0pTKHZhbHVlLCBkZXRlY3RDeWNsZXMsIF9fYWxyZWFkeVNlZW4pOyB9KTtcbiAgICAgICAgcmVzLmxlbmd0aCA9IHRvQWRkLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0b0FkZC5sZW5ndGg7IGkgPCBsOyBpKyspXG4gICAgICAgICAgICByZXNbaV0gPSB0b0FkZFtpXTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIE9ic2VydmFibGVNYXApIHtcbiAgICAgICAgdmFyIHJlc18xID0gY2FjaGUoe30pO1xuICAgICAgICBzb3VyY2UuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkgeyByZXR1cm4gcmVzXzFba2V5XSA9IHRvSlModmFsdWUsIGRldGVjdEN5Y2xlcywgX19hbHJlYWR5U2Vlbik7IH0pO1xuICAgICAgICByZXR1cm4gcmVzXzE7XG4gICAgfVxuICAgIGlmIChpc09ic2VydmFibGUoc291cmNlKSAmJiBzb3VyY2UuJG1vYnggaW5zdGFuY2VvZiBPYnNlcnZhYmxlVmFsdWUpXG4gICAgICAgIHJldHVybiB0b0pTKHNvdXJjZSgpLCBkZXRlY3RDeWNsZXMsIF9fYWxyZWFkeVNlZW4pO1xuICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBPYnNlcnZhYmxlVmFsdWUpXG4gICAgICAgIHJldHVybiB0b0pTKHNvdXJjZS5nZXQoKSwgZGV0ZWN0Q3ljbGVzLCBfX2FscmVhZHlTZWVuKTtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICB2YXIgcmVzID0gY2FjaGUoe30pO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKVxuICAgICAgICAgICAgcmVzW2tleV0gPSB0b0pTKHNvdXJjZVtrZXldLCBkZXRlY3RDeWNsZXMsIF9fYWxyZWFkeVNlZW4pO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlO1xufVxuZXhwb3J0cy50b0pTID0gdG9KUztcbmZ1bmN0aW9uIHRvSlNPTihzb3VyY2UsIGRldGVjdEN5Y2xlcywgX19hbHJlYWR5U2Vlbikge1xuICAgIGlmIChkZXRlY3RDeWNsZXMgPT09IHZvaWQgMCkgeyBkZXRlY3RDeWNsZXMgPSB0cnVlOyB9XG4gICAgaWYgKF9fYWxyZWFkeVNlZW4gPT09IHZvaWQgMCkgeyBfX2FscmVhZHlTZWVuID0gbnVsbDsgfVxuICAgIGRlcHJlY2F0ZWQoXCJ0b0pTT04gaXMgZGVwcmVjYXRlZC4gVXNlIHRvSlMgaW5zdGVhZFwiKTtcbiAgICByZXR1cm4gdG9KUy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0cy50b0pTT04gPSB0b0pTT047XG5mdW5jdGlvbiBsb2cobXNnKSB7XG4gICAgY29uc29sZS5sb2cobXNnKTtcbiAgICByZXR1cm4gbXNnO1xufVxuZnVuY3Rpb24gd2h5UnVuKHRoaW5nLCBwcm9wKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHRoaW5nID0gZ2xvYmFsU3RhdGUuZGVyaXZhdGlvblN0YWNrW2dsb2JhbFN0YXRlLmRlcml2YXRpb25TdGFjay5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGlmICghdGhpbmcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvZyhcIndoeVJ1bigpIGNhbiBvbmx5IGJlIHVzZWQgaWYgYSBkZXJpdmF0aW9uIGlzIGFjdGl2ZSwgb3IgYnkgcGFzc2luZyBhbiBjb21wdXRlZCB2YWx1ZSAvIHJlYWN0aW9uIGV4cGxpY2l0bHkuIElmIHlvdSBpbnZva2VkIHdoeVJ1biBmcm9tIGluc2lkZSBhIGNvbXB1dGF0aW9uOyB0aGUgY29tcHV0YXRpb24gaXMgY3VycmVudGx5IHN1c3BlbmRlZCBidXQgcmUtZXZhbHVhdGluZyBiZWNhdXNlIHNvbWVib2R5IHJlcXVlc3RlZCBpdCdzIHZhbHVlLlwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICB0aGluZyA9IGdldEF0b20odGhpbmcsIHByb3ApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaW5nID0gZ2V0QXRvbSh0aGluZyk7XG4gICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgQ29tcHV0ZWRWYWx1ZSlcbiAgICAgICAgcmV0dXJuIGxvZyh0aGluZy53aHlSdW4oKSk7XG4gICAgZWxzZSBpZiAodGhpbmcgaW5zdGFuY2VvZiBSZWFjdGlvbilcbiAgICAgICAgcmV0dXJuIGxvZyh0aGluZy53aHlSdW4oKSk7XG4gICAgZWxzZVxuICAgICAgICBpbnZhcmlhbnQoZmFsc2UsIFwid2h5UnVuIGNhbiBvbmx5IGJlIHVzZWQgb24gcmVhY3Rpb25zIGFuZCBjb21wdXRlZCB2YWx1ZXNcIik7XG59XG5leHBvcnRzLndoeVJ1biA9IHdoeVJ1bjtcbnZhciBhY3Rpb25GaWVsZERlY29yYXRvciA9IGNyZWF0ZUNsYXNzUHJvcGVydHlEZWNvcmF0b3IoZnVuY3Rpb24gKHRhcmdldCwga2V5LCB2YWx1ZSwgYXJncywgb3JpZ2luYWxEZXNjcmlwdG9yKSB7XG4gICAgdmFyIGFjdGlvbk5hbWUgPSAoYXJncyAmJiBhcmdzLmxlbmd0aCA9PT0gMSkgPyBhcmdzWzBdIDogKHZhbHVlLm5hbWUgfHwga2V5IHx8IFwiPHVubmFtZWQgYWN0aW9uPlwiKTtcbiAgICB2YXIgd3JhcHBlZEFjdGlvbiA9IGFjdGlvbihhY3Rpb25OYW1lLCB2YWx1ZSk7XG4gICAgYWRkSGlkZGVuUHJvcCh0YXJnZXQsIGtleSwgd3JhcHBlZEFjdGlvbik7XG59LCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXNba2V5XTtcbn0sIGZ1bmN0aW9uICgpIHtcbiAgICBpbnZhcmlhbnQoZmFsc2UsIFwiSXQgaXMgbm90IGFsbG93ZWQgdG8gYXNzaWduIG5ldyB2YWx1ZXMgdG8gQGFjdGlvbiBmaWVsZHNcIik7XG59LCBmYWxzZSwgdHJ1ZSk7XG5mdW5jdGlvbiBhY3Rpb24oYXJnMSwgYXJnMiwgYXJnMywgYXJnNCkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmcxID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIHJldHVybiBhY3Rpb25JbXBsZW1lbnRhdGlvbihhcmcxLm5hbWUgfHwgXCI8dW5uYW1lZCBhY3Rpb24+XCIsIGFyZzEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBhcmcyID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIHJldHVybiBhY3Rpb25JbXBsZW1lbnRhdGlvbihhcmcxLCBhcmcyKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgcmV0dXJuIG5hbWVkQWN0aW9uRGVjb3JhdG9yKGFyZzEpO1xuICAgIHJldHVybiBuYW1lZEFjdGlvbkRlY29yYXRvcihhcmcyKS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0cy5hY3Rpb24gPSBhY3Rpb247XG5mdW5jdGlvbiBuYW1lZEFjdGlvbkRlY29yYXRvcihuYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIHByb3AsIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IgJiYgdHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGFjdGlvbkltcGxlbWVudGF0aW9uKG5hbWUsIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWN0aW9uRmllbGREZWNvcmF0b3IobmFtZSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gaXNBY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSBcImZ1bmN0aW9uXCIgJiYgdGhpbmcuaXNNb2J4QWN0aW9uID09PSB0cnVlO1xufVxuZXhwb3J0cy5pc0FjdGlvbiA9IGlzQWN0aW9uO1xuZnVuY3Rpb24gcnVuSW5BY3Rpb24oYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHZhciBhY3Rpb25OYW1lID0gdHlwZW9mIGFyZzEgPT09IFwic3RyaW5nXCIgPyBhcmcxIDogYXJnMS5uYW1lIHx8IFwiPHVubmFtZWQgYWN0aW9uPlwiO1xuICAgIHZhciBmbiA9IHR5cGVvZiBhcmcxID09PSBcImZ1bmN0aW9uXCIgPyBhcmcxIDogYXJnMjtcbiAgICB2YXIgc2NvcGUgPSB0eXBlb2YgYXJnMSA9PT0gXCJmdW5jdGlvblwiID8gYXJnMiA6IGFyZzM7XG4gICAgaW52YXJpYW50KHR5cGVvZiBmbiA9PT0gXCJmdW5jdGlvblwiLCBcImBydW5JbkFjdGlvbmAgZXhwZWN0cyBhIGZ1bmN0aW9uXCIpO1xuICAgIGludmFyaWFudChmbi5sZW5ndGggPT09IDAsIFwiYHJ1bkluQWN0aW9uYCBleHBlY3RzIGEgZnVuY3Rpb24gd2l0aG91dCBhcmd1bWVudHNcIik7XG4gICAgaW52YXJpYW50KHR5cGVvZiBhY3Rpb25OYW1lID09PSBcInN0cmluZ1wiICYmIGFjdGlvbk5hbWUubGVuZ3RoID4gMCwgXCJhY3Rpb25zIHNob3VsZCBoYXZlIHZhbGlkIG5hbWVzLCBnb3Q6ICdcIiArIGFjdGlvbk5hbWUgKyBcIidcIik7XG4gICAgcmV0dXJuIGV4ZWN1dGVXcmFwcGVkKGFjdGlvbk5hbWUsIGZuLCBzY29wZSwgdW5kZWZpbmVkKTtcbn1cbmV4cG9ydHMucnVuSW5BY3Rpb24gPSBydW5JbkFjdGlvbjtcbmZ1bmN0aW9uIGFjdGlvbkltcGxlbWVudGF0aW9uKGFjdGlvbk5hbWUsIGZuKSB7XG4gICAgaW52YXJpYW50KHR5cGVvZiBmbiA9PT0gXCJmdW5jdGlvblwiLCBcImBhY3Rpb25gIGNhbiBvbmx5IGJlIGludm9rZWQgb24gZnVuY3Rpb25zXCIpO1xuICAgIGludmFyaWFudCh0eXBlb2YgYWN0aW9uTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBhY3Rpb25OYW1lLmxlbmd0aCA+IDAsIFwiYWN0aW9ucyBzaG91bGQgaGF2ZSB2YWxpZCBuYW1lcywgZ290OiAnXCIgKyBhY3Rpb25OYW1lICsgXCInXCIpO1xuICAgIHZhciByZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBleGVjdXRlV3JhcHBlZChhY3Rpb25OYW1lLCBmbiwgdGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIHJlcy5pc01vYnhBY3Rpb24gPSB0cnVlO1xuICAgIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBleGVjdXRlV3JhcHBlZChhY3Rpb25OYW1lLCBmbiwgc2NvcGUsIGFyZ3MpIHtcbiAgICB2YXIgZHMgPSBnbG9iYWxTdGF0ZS5kZXJpdmF0aW9uU3RhY2s7XG4gICAgaW52YXJpYW50KCEoZHNbZHMubGVuZ3RoIC0gMV0gaW5zdGFuY2VvZiBDb21wdXRlZFZhbHVlKSwgXCJDb21wdXRlZCB2YWx1ZXMgb3IgdHJhbnNmb3JtZXJzIHNob3VsZCBub3QgaW52b2tlIGFjdGlvbnMgb3IgdHJpZ2dlciBvdGhlciBzaWRlIGVmZmVjdHNcIik7XG4gICAgdmFyIG5vdGlmeVNweSA9IGlzU3B5RW5hYmxlZCgpO1xuICAgIHZhciBzdGFydFRpbWU7XG4gICAgaWYgKG5vdGlmeVNweSkge1xuICAgICAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB2YXIgbCA9IChhcmdzICYmIGFyZ3MubGVuZ3RoKSB8fCAwO1xuICAgICAgICB2YXIgZmxhdHRlbmRBcmdzID0gbmV3IEFycmF5KGwpO1xuICAgICAgICBpZiAobCA+IDApXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKylcbiAgICAgICAgICAgICAgICBmbGF0dGVuZEFyZ3NbaV0gPSBhcmdzW2ldO1xuICAgICAgICBzcHlSZXBvcnRTdGFydCh7XG4gICAgICAgICAgICB0eXBlOiBcImFjdGlvblwiLFxuICAgICAgICAgICAgbmFtZTogYWN0aW9uTmFtZSxcbiAgICAgICAgICAgIGZuOiBmbixcbiAgICAgICAgICAgIHRhcmdldDogc2NvcGUsXG4gICAgICAgICAgICBhcmd1bWVudHM6IGZsYXR0ZW5kQXJnc1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdmFyIHByZXZVbnRyYWNrZWQgPSB1bnRyYWNrZWRTdGFydCgpO1xuICAgIHRyYW5zYWN0aW9uU3RhcnQoYWN0aW9uTmFtZSwgc2NvcGUsIGZhbHNlKTtcbiAgICB2YXIgcHJldkFsbG93U3RhdGVDaGFuZ2VzID0gYWxsb3dTdGF0ZUNoYW5nZXNTdGFydCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkoc2NvcGUsIGFyZ3MpO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgYWxsb3dTdGF0ZUNoYW5nZXNFbmQocHJldkFsbG93U3RhdGVDaGFuZ2VzKTtcbiAgICAgICAgdHJhbnNhY3Rpb25FbmQoZmFsc2UpO1xuICAgICAgICB1bnRyYWNrZWRFbmQocHJldlVudHJhY2tlZCk7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRFbmQoeyB0aW1lOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVzZVN0cmljdChzdHJpY3QpIHtcbiAgICBpbnZhcmlhbnQoZ2xvYmFsU3RhdGUuZGVyaXZhdGlvblN0YWNrLmxlbmd0aCA9PT0gMCwgXCJJdCBpcyBub3QgYWxsb3dlZCB0byBzZXQgYHVzZVN0cmljdGAgd2hlbiBhIGRlcml2YXRpb24gaXMgcnVubmluZ1wiKTtcbiAgICBnbG9iYWxTdGF0ZS5zdHJpY3RNb2RlID0gc3RyaWN0O1xuICAgIGdsb2JhbFN0YXRlLmFsbG93U3RhdGVDaGFuZ2VzID0gIXN0cmljdDtcbn1cbmV4cG9ydHMudXNlU3RyaWN0ID0gdXNlU3RyaWN0O1xuZnVuY3Rpb24gYWxsb3dTdGF0ZUNoYW5nZXMoYWxsb3dTdGF0ZUNoYW5nZXMsIGZ1bmMpIHtcbiAgICB2YXIgcHJldiA9IGFsbG93U3RhdGVDaGFuZ2VzU3RhcnQoYWxsb3dTdGF0ZUNoYW5nZXMpO1xuICAgIHZhciByZXMgPSBmdW5jKCk7XG4gICAgYWxsb3dTdGF0ZUNoYW5nZXNFbmQocHJldik7XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGFsbG93U3RhdGVDaGFuZ2VzU3RhcnQoYWxsb3dTdGF0ZUNoYW5nZXMpIHtcbiAgICB2YXIgcHJldiA9IGdsb2JhbFN0YXRlLmFsbG93U3RhdGVDaGFuZ2VzO1xuICAgIGdsb2JhbFN0YXRlLmFsbG93U3RhdGVDaGFuZ2VzID0gYWxsb3dTdGF0ZUNoYW5nZXM7XG4gICAgcmV0dXJuIHByZXY7XG59XG5mdW5jdGlvbiBhbGxvd1N0YXRlQ2hhbmdlc0VuZChwcmV2KSB7XG4gICAgZ2xvYmFsU3RhdGUuYWxsb3dTdGF0ZUNoYW5nZXMgPSBwcmV2O1xufVxuZnVuY3Rpb24gcHJvcGFnYXRlQXRvbVJlYWR5KGF0b20pIHtcbiAgICBpbnZhcmlhbnQoYXRvbS5pc0RpcnR5LCBcImF0b20gbm90IGRpcnR5XCIpO1xuICAgIGF0b20uaXNEaXJ0eSA9IGZhbHNlO1xuICAgIHByb3BhZ2F0ZVJlYWRpbmVzcyhhdG9tLCB0cnVlKTtcbn1cbnZhciBBdG9tID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBdG9tKG5hbWUsIG9uQmVjb21lT2JzZXJ2ZWQsIG9uQmVjb21lVW5vYnNlcnZlZCkge1xuICAgICAgICBpZiAobmFtZSA9PT0gdm9pZCAwKSB7IG5hbWUgPSBcIkF0b21AXCIgKyBnZXROZXh0SWQoKTsgfVxuICAgICAgICBpZiAob25CZWNvbWVPYnNlcnZlZCA9PT0gdm9pZCAwKSB7IG9uQmVjb21lT2JzZXJ2ZWQgPSBub29wOyB9XG4gICAgICAgIGlmIChvbkJlY29tZVVub2JzZXJ2ZWQgPT09IHZvaWQgMCkgeyBvbkJlY29tZVVub2JzZXJ2ZWQgPSBub29wOyB9XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMub25CZWNvbWVPYnNlcnZlZCA9IG9uQmVjb21lT2JzZXJ2ZWQ7XG4gICAgICAgIHRoaXMub25CZWNvbWVVbm9ic2VydmVkID0gb25CZWNvbWVVbm9ic2VydmVkO1xuICAgICAgICB0aGlzLmlzRGlydHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdGFsZU9ic2VydmVycyA9IFtdO1xuICAgICAgICB0aGlzLm9ic2VydmVycyA9IG5ldyBTaW1wbGVTZXQoKTtcbiAgICAgICAgdGhpcy5kaWZmVmFsdWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RBY2Nlc3NlZEJ5ID0gMDtcbiAgICB9XG4gICAgQXRvbS5wcm90b3R5cGUucmVwb3J0T2JzZXJ2ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlcG9ydE9ic2VydmVkKHRoaXMpO1xuICAgIH07XG4gICAgQXRvbS5wcm90b3R5cGUucmVwb3J0Q2hhbmdlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMucmVwb3J0U3RhbGUoKTtcbiAgICAgICAgICAgIHRoaXMucmVwb3J0UmVhZHkoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQXRvbS5wcm90b3R5cGUucmVwb3J0U3RhbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0RpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLmlzRGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgcHJvcGFnYXRlU3RhbGVuZXNzKHRoaXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBdG9tLnByb3RvdHlwZS5yZXBvcnRSZWFkeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuaXNEaXJ0eSwgXCJhdG9tIG5vdCBkaXJ0eVwiKTtcbiAgICAgICAgaWYgKGdsb2JhbFN0YXRlLmluVHJhbnNhY3Rpb24gPiAwKVxuICAgICAgICAgICAgZ2xvYmFsU3RhdGUuY2hhbmdlZEF0b21zLnB1c2godGhpcyk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJvcGFnYXRlQXRvbVJlYWR5KHRoaXMpO1xuICAgICAgICAgICAgcnVuUmVhY3Rpb25zKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEF0b20ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH07XG4gICAgcmV0dXJuIEF0b207XG59KCkpO1xuZXhwb3J0cy5BdG9tID0gQXRvbTtcbnZhciBDb21wdXRlZFZhbHVlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb21wdXRlZFZhbHVlKGRlcml2YXRpb24sIHNjb3BlLCBjb21wYXJlU3RydWN0dXJhbCwgbmFtZSkge1xuICAgICAgICB0aGlzLmRlcml2YXRpb24gPSBkZXJpdmF0aW9uO1xuICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gICAgICAgIHRoaXMuY29tcGFyZVN0cnVjdHVyYWwgPSBjb21wYXJlU3RydWN0dXJhbDtcbiAgICAgICAgdGhpcy5pc0xhenkgPSB0cnVlO1xuICAgICAgICB0aGlzLmlzQ29tcHV0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3RhbGVPYnNlcnZlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBuZXcgU2ltcGxlU2V0KCk7XG4gICAgICAgIHRoaXMub2JzZXJ2aW5nID0gW107XG4gICAgICAgIHRoaXMuZGlmZlZhbHVlID0gMDtcbiAgICAgICAgdGhpcy5ydW5JZCA9IDA7XG4gICAgICAgIHRoaXMubGFzdEFjY2Vzc2VkQnkgPSAwO1xuICAgICAgICB0aGlzLnVuYm91bmREZXBzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLl9fbWFwaWQgPSBcIiNcIiArIGdldE5leHRJZCgpO1xuICAgICAgICB0aGlzLmRlcGVuZGVuY3lDaGFuZ2VDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jeVN0YWxlQ291bnQgPSAwO1xuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lIHx8IFwiQ29tcHV0ZWRWYWx1ZUBcIiArIGdldE5leHRJZCgpO1xuICAgIH1cbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmlzQ29tcHV0aW5nID0gdHJ1ZTtcbiAgICAgICAgdmFyIHByZXZBbGxvd1N0YXRlQ2hhbmdlcyA9IGFsbG93U3RhdGVDaGFuZ2VzU3RhcnQoZmFsc2UpO1xuICAgICAgICB2YXIgcmVzID0gdGhpcy5kZXJpdmF0aW9uLmNhbGwodGhpcy5zY29wZSk7XG4gICAgICAgIGFsbG93U3RhdGVDaGFuZ2VzRW5kKHByZXZBbGxvd1N0YXRlQ2hhbmdlcyk7XG4gICAgICAgIHRoaXMuaXNDb21wdXRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIDtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5vbkJlY29tZU9ic2VydmVkID0gZnVuY3Rpb24gKCkge1xuICAgIH07XG4gICAgQ29tcHV0ZWRWYWx1ZS5wcm90b3R5cGUub25CZWNvbWVVbm9ic2VydmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjbGVhck9ic2VydmluZyh0aGlzKTtcbiAgICAgICAgdGhpcy5pc0xhenkgPSB0cnVlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgQ29tcHV0ZWRWYWx1ZS5wcm90b3R5cGUub25EZXBlbmRlbmNpZXNSZWFkeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSB0aGlzLnRyYWNrQW5kQ29tcHV0ZSgpO1xuICAgICAgICByZXR1cm4gY2hhbmdlZDtcbiAgICB9O1xuICAgIENvbXB1dGVkVmFsdWUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW52YXJpYW50KCF0aGlzLmlzQ29tcHV0aW5nLCBcIkN5Y2xlIGRldGVjdGVkIGluIGNvbXB1dGF0aW9uIFwiICsgdGhpcy5uYW1lLCB0aGlzLmRlcml2YXRpb24pO1xuICAgICAgICByZXBvcnRPYnNlcnZlZCh0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jeVN0YWxlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wZWVrKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNMYXp5KSB7XG4gICAgICAgICAgICBpZiAoaXNDb21wdXRpbmdEZXJpdmF0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzTGF6eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMudHJhY2tBbmRDb21wdXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wZWVrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoXykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbQ29tcHV0ZWRWYWx1ZSAnXCIgKyBuYW1lICsgXCInXSBJdCBpcyBub3QgcG9zc2libGUgdG8gYXNzaWduIGEgbmV3IHZhbHVlIHRvIGEgY29tcHV0ZWQgdmFsdWUuXCIpO1xuICAgIH07XG4gICAgQ29tcHV0ZWRWYWx1ZS5wcm90b3R5cGUudHJhY2tBbmRDb21wdXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNTcHlFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHNweVJlcG9ydCh7XG4gICAgICAgICAgICAgICAgb2JqZWN0OiB0aGlzLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiY29tcHV0ZVwiLFxuICAgICAgICAgICAgICAgIGZuOiB0aGlzLmRlcml2YXRpb24sXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLnNjb3BlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLnZhbHVlID0gdHJhY2tEZXJpdmVkRnVuY3Rpb24odGhpcywgdGhpcy5wZWVrKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlRGlkQ2hhbmdlKHRoaXMuY29tcGFyZVN0cnVjdHVyYWwsIG5ld1ZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgfTtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5vYnNlcnZlID0gZnVuY3Rpb24gKGxpc3RlbmVyLCBmaXJlSW1tZWRpYXRlbHkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGZpcnN0VGltZSA9IHRydWU7XG4gICAgICAgIHZhciBwcmV2VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBhdXRvcnVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IF90aGlzLmdldCgpO1xuICAgICAgICAgICAgaWYgKCFmaXJzdFRpbWUgfHwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZXZVID0gdW50cmFja2VkU3RhcnQoKTtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcihuZXdWYWx1ZSwgcHJldlZhbHVlKTtcbiAgICAgICAgICAgICAgICB1bnRyYWNrZWRFbmQocHJldlUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7XG4gICAgICAgICAgICBwcmV2VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgpO1xuICAgIH07XG4gICAgQ29tcHV0ZWRWYWx1ZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyBcIltcIiArIHRoaXMuZGVyaXZhdGlvbi50b1N0cmluZygpICsgXCJdXCI7XG4gICAgfTtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS53aHlSdW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpc1RyYWNraW5nID0gZ2xvYmFsU3RhdGUuZGVyaXZhdGlvblN0YWNrLmxlbmd0aCA+IDA7XG4gICAgICAgIHZhciBvYnNlcnZpbmcgPSB1bmlxdWUodGhpcy5vYnNlcnZpbmcpLm1hcChmdW5jdGlvbiAoZGVwKSB7IHJldHVybiBkZXAubmFtZTsgfSk7XG4gICAgICAgIHZhciBvYnNlcnZlcnMgPSB1bmlxdWUodGhpcy5vYnNlcnZlcnMuYXNBcnJheSgpKS5tYXAoZnVuY3Rpb24gKGRlcCkgeyByZXR1cm4gZGVwLm5hbWU7IH0pO1xuICAgICAgICB2YXIgcnVuUmVhc29uID0gKHRoaXMuaXNDb21wdXRpbmdcbiAgICAgICAgICAgID8gaXNUcmFja2luZ1xuICAgICAgICAgICAgICAgID8gdGhpcy5vYnNlcnZlcnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICA/IFJ1blJlYXNvbi5JTlZBTElEQVRFRFxuICAgICAgICAgICAgICAgICAgICA6IFJ1blJlYXNvbi5SRVFVSVJFRFxuICAgICAgICAgICAgICAgIDogUnVuUmVhc29uLlBFRUtcbiAgICAgICAgICAgIDogUnVuUmVhc29uLk5PVF9SVU5OSU5HKTtcbiAgICAgICAgaWYgKHJ1blJlYXNvbiA9PT0gUnVuUmVhc29uLlJFUVVJUkVEKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWlyZWRCeSA9IGdsb2JhbFN0YXRlLmRlcml2YXRpb25TdGFja1tnbG9iYWxTdGF0ZS5kZXJpdmF0aW9uU3RhY2subGVuZ3RoIC0gMl07XG4gICAgICAgICAgICBpZiAocmVxdWlyZWRCeSlcbiAgICAgICAgICAgICAgICBvYnNlcnZlcnMucHVzaChyZXF1aXJlZEJ5Lm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKFwiXFxuV2h5UnVuPyBjb21wdXRhdGlvbiAnXCIgKyB0aGlzLm5hbWUgKyBcIic6XFxuICogUnVubmluZyBiZWNhdXNlOiBcIiArIHJ1blJlYXNvblRleHRzW3J1blJlYXNvbl0gKyBcIiBcIiArICgocnVuUmVhc29uID09PSBSdW5SZWFzb24uTk9UX1JVTk5JTkcpICYmIHRoaXMuZGVwZW5kZW5jeVN0YWxlQ291bnQgPiAwID8gXCIoYSBuZXh0IHJ1biBpcyBzY2hlZHVsZWQpXCIgOiBcIlwiKSArIFwiXFxuXCIpICtcbiAgICAgICAgICAgICh0aGlzLmlzTGF6eVxuICAgICAgICAgICAgICAgID9cbiAgICAgICAgICAgICAgICAgICAgXCIgKiBUaGlzIGNvbXB1dGF0aW9uIGlzIHN1c3BlbmRlZCAobm90IGluIHVzZSBieSBhbnkgcmVhY3Rpb24pIGFuZCB3b24ndCBydW4gYXV0b21hdGljYWxseS5cXG5cXHREaWRuJ3QgZXhwZWN0IHRoaXMgY29tcHV0YXRpb24gdG8gYmUgc3VzcGVuZGVkIGF0IHRoaXMgcG9pbnQ/XFxuXFx0ICAxLiBNYWtlIHN1cmUgdGhpcyBjb21wdXRhdGlvbiBpcyB1c2VkIGJ5IGEgcmVhY3Rpb24gKHJlYWN0aW9uLCBhdXRvcnVuLCBvYnNlcnZlcikuXFxuXFx0ICAyLiBDaGVjayB3aGV0aGVyIHlvdSBhcmUgdXNpbmcgdGhpcyBjb21wdXRhdGlvbiBzeW5jaHJvbm91c2x5IChpbiB0aGUgc2FtZSBzdGFjayBhcyB0aGV5IHJlYWN0aW9uIHRoYXQgbmVlZHMgaXQpLlxcblwiXG4gICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgICAgICBcIiAqIFRoaXMgY29tcHV0YXRpb24gd2lsbCByZS1ydW4gaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgb2JzZXJ2YWJsZXMgY2hhbmdlczpcXG4gICAgXCIgKyBqb2luU3RyaW5ncyhvYnNlcnZpbmcpICsgXCJcXG4gICAgXCIgKyAoKHRoaXMuaXNDb21wdXRpbmcgJiYgaXNUcmFja2luZykgPyBcIiAoLi4uIG9yIGFueSBvYnNlcnZhYmxlIGFjY2Vzc2VkIGR1cmluZyB0aGUgcmVtYWluZGVyIG9mIHRoZSBjdXJyZW50IHJ1bilcIiA6IFwiXCIpICsgXCJcXG5cXHRNaXNzaW5nIGl0ZW1zIGluIHRoaXMgbGlzdD9cXG5cXHQgIDEuIENoZWNrIHdoZXRoZXIgYWxsIHVzZWQgdmFsdWVzIGFyZSBwcm9wZXJseSBtYXJrZWQgYXMgb2JzZXJ2YWJsZSAodXNlIGlzT2JzZXJ2YWJsZSB0byB2ZXJpZnkpXFxuXFx0ICAyLiBNYWtlIHN1cmUgeW91IGRpZG4ndCBkZXJlZmVyZW5jZSB2YWx1ZXMgdG9vIGVhcmx5LiBNb2JYIG9ic2VydmVzIHByb3BzLCBub3QgcHJpbWl0aXZlcy4gRS5nOiB1c2UgJ3BlcnNvbi5uYW1lJyBpbnN0ZWFkIG9mICduYW1lJyBpbiB5b3VyIGNvbXB1dGF0aW9uLlxcbiAgKiBJZiB0aGUgb3V0Y29tZSBvZiB0aGlzIGNvbXB1dGF0aW9uIGNoYW5nZXMsIHRoZSBmb2xsb3dpbmcgb2JzZXJ2ZXJzIHdpbGwgYmUgcmUtcnVuOlxcbiAgICBcIiArIGpvaW5TdHJpbmdzKG9ic2VydmVycykgKyBcIlxcblwiKSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29tcHV0ZWRWYWx1ZTtcbn0oKSk7XG52YXIgUnVuUmVhc29uO1xuKGZ1bmN0aW9uIChSdW5SZWFzb24pIHtcbiAgICBSdW5SZWFzb25bUnVuUmVhc29uW1wiUEVFS1wiXSA9IDBdID0gXCJQRUVLXCI7XG4gICAgUnVuUmVhc29uW1J1blJlYXNvbltcIklOVkFMSURBVEVEXCJdID0gMV0gPSBcIklOVkFMSURBVEVEXCI7XG4gICAgUnVuUmVhc29uW1J1blJlYXNvbltcIlJFUVVJUkVEXCJdID0gMl0gPSBcIlJFUVVJUkVEXCI7XG4gICAgUnVuUmVhc29uW1J1blJlYXNvbltcIk5PVF9SVU5OSU5HXCJdID0gM10gPSBcIk5PVF9SVU5OSU5HXCI7XG59KShSdW5SZWFzb24gfHwgKFJ1blJlYXNvbiA9IHt9KSk7XG52YXIgcnVuUmVhc29uVGV4dHMgPSAoX2EgPSB7fSxcbiAgICBfYVtSdW5SZWFzb24uUEVFS10gPSBcIltwZWVrXSBUaGUgdmFsdWUgb2YgdGhpcyBjb21wdXRlZCB2YWx1ZSB3YXMgcmVxdWVzdGVkIG91dHNpZGUgYW4gcmVhY3Rpb25cIixcbiAgICBfYVtSdW5SZWFzb24uSU5WQUxJREFURURdID0gXCJbaW52YWxpZGF0ZWRdIFNvbWUgb2JzZXJ2YWJsZXMgdXNlZCBieSB0aGlzIGNvbXB1dGF0aW9uIGRpZCBjaGFuZ2VcIixcbiAgICBfYVtSdW5SZWFzb24uUkVRVUlSRURdID0gXCJbc3RhcnRlZF0gVGhpcyBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBieSBhbm90aGVyIGNvbXB1dGVkIHZhbHVlIC8gcmVhY3Rpb25cIixcbiAgICBfYVtSdW5SZWFzb24uTk9UX1JVTk5JTkddID0gXCJbaWRsZV0gVGhpcyBjb21wdXRpb24gaXMgY3VycmVudGx5IG5vdCBydW5uaW5nXCIsXG4gICAgX2Fcbik7XG5mdW5jdGlvbiBpc0NvbXB1dGluZ0Rlcml2YXRpb24oKSB7XG4gICAgcmV0dXJuIGdsb2JhbFN0YXRlLmRlcml2YXRpb25TdGFjay5sZW5ndGggPiAwXG4gICAgICAgICYmIGdsb2JhbFN0YXRlLmlzVHJhY2tpbmc7XG59XG5mdW5jdGlvbiBjaGVja0lmU3RhdGVNb2RpZmljYXRpb25zQXJlQWxsb3dlZCgpIHtcbiAgICBpZiAoIWdsb2JhbFN0YXRlLmFsbG93U3RhdGVDaGFuZ2VzKSB7XG4gICAgICAgIGludmFyaWFudChmYWxzZSwgZ2xvYmFsU3RhdGUuc3RyaWN0TW9kZVxuICAgICAgICAgICAgPyBcIkl0IGlzIG5vdCBhbGxvd2VkIHRvIGNyZWF0ZSBvciBjaGFuZ2Ugc3RhdGUgb3V0c2lkZSBhbiBgYWN0aW9uYCB3aGVuIE1vYlggaXMgaW4gc3RyaWN0IG1vZGUuIFdyYXAgdGhlIGN1cnJlbnQgbWV0aG9kIGluIGBhY3Rpb25gIGlmIHRoaXMgc3RhdGUgY2hhbmdlIGlzIGludGVuZGVkXCJcbiAgICAgICAgICAgIDogXCJJdCBpcyBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhlIHN0YXRlIHdoZW4gYSBjb21wdXRlZCB2YWx1ZSBvciB0cmFuc2Zvcm1lciBpcyBiZWluZyBldmFsdWF0ZWQuIFVzZSAnYXV0b3J1bicgdG8gY3JlYXRlIHJlYWN0aXZlIGZ1bmN0aW9ucyB3aXRoIHNpZGUtZWZmZWN0cy5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gbm90aWZ5RGVwZW5kZW5jeVN0YWxlKGRlcml2YXRpb24pIHtcbiAgICBpZiAoKytkZXJpdmF0aW9uLmRlcGVuZGVuY3lTdGFsZUNvdW50ID09PSAxKSB7XG4gICAgICAgIHByb3BhZ2F0ZVN0YWxlbmVzcyhkZXJpdmF0aW9uKTtcbiAgICB9XG59XG5mdW5jdGlvbiBub3RpZnlEZXBlbmRlbmN5UmVhZHkoZGVyaXZhdGlvbiwgZGVwZW5kZW5jeURpZENoYW5nZSkge1xuICAgIGludmFyaWFudChkZXJpdmF0aW9uLmRlcGVuZGVuY3lTdGFsZUNvdW50ID4gMCwgXCJ1bmV4cGVjdGVkIHJlYWR5IG5vdGlmaWNhdGlvblwiKTtcbiAgICBpZiAoZGVwZW5kZW5jeURpZENoYW5nZSlcbiAgICAgICAgZGVyaXZhdGlvbi5kZXBlbmRlbmN5Q2hhbmdlQ291bnQgKz0gMTtcbiAgICBpZiAoLS1kZXJpdmF0aW9uLmRlcGVuZGVuY3lTdGFsZUNvdW50ID09PSAwKSB7XG4gICAgICAgIGlmIChkZXJpdmF0aW9uLmRlcGVuZGVuY3lDaGFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGRlcml2YXRpb24uZGVwZW5kZW5jeUNoYW5nZUNvdW50ID0gMDtcbiAgICAgICAgICAgIHZhciBjaGFuZ2VkID0gZGVyaXZhdGlvbi5vbkRlcGVuZGVuY2llc1JlYWR5KCk7XG4gICAgICAgICAgICBwcm9wYWdhdGVSZWFkaW5lc3MoZGVyaXZhdGlvbiwgY2hhbmdlZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcm9wYWdhdGVSZWFkaW5lc3MoZGVyaXZhdGlvbiwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdHJhY2tEZXJpdmVkRnVuY3Rpb24oZGVyaXZhdGlvbiwgZikge1xuICAgIHZhciBwcmV2T2JzZXJ2aW5nID0gZGVyaXZhdGlvbi5vYnNlcnZpbmc7XG4gICAgZGVyaXZhdGlvbi5vYnNlcnZpbmcgPSBuZXcgQXJyYXkocHJldk9ic2VydmluZy5sZW5ndGggKyAxMDApO1xuICAgIGRlcml2YXRpb24udW5ib3VuZERlcHNDb3VudCA9IDA7XG4gICAgZGVyaXZhdGlvbi5ydW5JZCA9ICsrZ2xvYmFsU3RhdGUucnVuSWQ7XG4gICAgZ2xvYmFsU3RhdGUuZGVyaXZhdGlvblN0YWNrLnB1c2goZGVyaXZhdGlvbik7XG4gICAgdmFyIHByZXZUcmFja2luZyA9IGdsb2JhbFN0YXRlLmlzVHJhY2tpbmc7XG4gICAgZ2xvYmFsU3RhdGUuaXNUcmFja2luZyA9IHRydWU7XG4gICAgdmFyIGhhc0V4Y2VwdGlvbiA9IHRydWU7XG4gICAgdmFyIHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBmLmNhbGwoZGVyaXZhdGlvbik7XG4gICAgICAgIGhhc0V4Y2VwdGlvbiA9IGZhbHNlO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGhhc0V4Y2VwdGlvbikge1xuICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSAoXCJbbW9ieF0gQW4gdW5jYXVnaHQgZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGNhbGN1bGF0aW5nIHlvdXIgY29tcHV0ZWQgdmFsdWUsIGF1dG9ydW4gb3IgdHJhbnNmb3JtZXIuIE9yIGluc2lkZSB0aGUgcmVuZGVyKCkgbWV0aG9kIG9mIGFuIG9ic2VydmVyIGJhc2VkIFJlYWN0IGNvbXBvbmVudC4gXCIgK1xuICAgICAgICAgICAgICAgIFwiVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBuZXZlciB0aHJvdyBleGNlcHRpb25zIGFzIE1vYlggd2lsbCBub3QgYWx3YXlzIGJlIGFibGUgdG8gcmVjb3ZlciBmcm9tIHRoZW0uIFwiICtcbiAgICAgICAgICAgICAgICAoXCJQbGVhc2UgZml4IHRoZSBlcnJvciByZXBvcnRlZCBhZnRlciB0aGlzIG1lc3NhZ2Ugb3IgZW5hYmxlICdQYXVzZSBvbiAoY2F1Z2h0KSBleGNlcHRpb25zJyBpbiB5b3VyIGRlYnVnZ2VyIHRvIGZpbmQgdGhlIHJvb3QgY2F1c2UuIEluOiAnXCIgKyBkZXJpdmF0aW9uLm5hbWUgKyBcIidcIikpO1xuICAgICAgICAgICAgaWYgKGlzU3B5RW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgc3B5UmVwb3J0KHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgIGRlcml2YXRpb24udW5ib3VuZERlcHNDb3VudCA9IDA7XG4gICAgICAgICAgICBkZXJpdmF0aW9uLm9ic2VydmluZyA9IHByZXZPYnNlcnZpbmc7XG4gICAgICAgICAgICByZXNldEdsb2JhbFN0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWxTdGF0ZS5pc1RyYWNraW5nID0gcHJldlRyYWNraW5nO1xuICAgICAgICAgICAgZ2xvYmFsU3RhdGUuZGVyaXZhdGlvblN0YWNrLmxlbmd0aCAtPSAxO1xuICAgICAgICAgICAgYmluZERlcGVuZGVuY2llcyhkZXJpdmF0aW9uLCBwcmV2T2JzZXJ2aW5nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gYmluZERlcGVuZGVuY2llcyhkZXJpdmF0aW9uLCBwcmV2T2JzZXJ2aW5nKSB7XG4gICAgdmFyIHByZXZMZW5ndGggPSBwcmV2T2JzZXJ2aW5nLmxlbmd0aDtcbiAgICB2YXIgb2JzZXJ2aW5nID0gZGVyaXZhdGlvbi5vYnNlcnZpbmc7XG4gICAgdmFyIG5ld0xlbmd0aCA9IG9ic2VydmluZy5sZW5ndGggPSBkZXJpdmF0aW9uLnVuYm91bmREZXBzQ291bnQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmV2TGVuZ3RoOyBpKyspXG4gICAgICAgIHByZXZPYnNlcnZpbmdbaV0uZGlmZlZhbHVlID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdMZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZGVwID0gb2JzZXJ2aW5nW2ldO1xuICAgICAgICBpZiAoKCsrZGVwLmRpZmZWYWx1ZSkgPiAwKSB7XG4gICAgICAgICAgICBkZXAuZGlmZlZhbHVlID0gMDtcbiAgICAgICAgICAgIGFkZE9ic2VydmVyKGRlcCwgZGVyaXZhdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmV2TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGRlcCA9IHByZXZPYnNlcnZpbmdbaV07XG4gICAgICAgIGlmIChkZXAuZGlmZlZhbHVlIDwgMCkge1xuICAgICAgICAgICAgZGVwLmRpZmZWYWx1ZSA9IDA7XG4gICAgICAgICAgICByZW1vdmVPYnNlcnZlcihkZXAsIGRlcml2YXRpb24pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY2xlYXJPYnNlcnZpbmcoZGVyaXZhdGlvbikge1xuICAgIHZhciBvYnMgPSBkZXJpdmF0aW9uLm9ic2VydmluZztcbiAgICB2YXIgbCA9IG9icy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspXG4gICAgICAgIHJlbW92ZU9ic2VydmVyKG9ic1tpXSwgZGVyaXZhdGlvbik7XG4gICAgb2JzLmxlbmd0aCA9IDA7XG59XG5mdW5jdGlvbiB1bnRyYWNrZWQoYWN0aW9uKSB7XG4gICAgdmFyIHByZXYgPSB1bnRyYWNrZWRTdGFydCgpO1xuICAgIHZhciByZXMgPSBhY3Rpb24oKTtcbiAgICB1bnRyYWNrZWRFbmQocHJldik7XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudW50cmFja2VkID0gdW50cmFja2VkO1xuZnVuY3Rpb24gdW50cmFja2VkU3RhcnQoKSB7XG4gICAgdmFyIHByZXYgPSBnbG9iYWxTdGF0ZS5pc1RyYWNraW5nO1xuICAgIGdsb2JhbFN0YXRlLmlzVHJhY2tpbmcgPSBmYWxzZTtcbiAgICByZXR1cm4gcHJldjtcbn1cbmZ1bmN0aW9uIHVudHJhY2tlZEVuZChwcmV2KSB7XG4gICAgZ2xvYmFsU3RhdGUuaXNUcmFja2luZyA9IHByZXY7XG59XG52YXIgcGVyc2lzdGVudEtleXMgPSBbXCJtb2J4R3VpZFwiLCBcInJlc2V0SWRcIiwgXCJzcHlMaXN0ZW5lcnNcIiwgXCJzdHJpY3RNb2RlXCIsIFwicnVuSWRcIl07XG52YXIgTW9iWEdsb2JhbHMgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1vYlhHbG9iYWxzKCkge1xuICAgICAgICB0aGlzLnZlcnNpb24gPSAzO1xuICAgICAgICB0aGlzLmRlcml2YXRpb25TdGFjayA9IFtdO1xuICAgICAgICB0aGlzLnJ1bklkID0gMDtcbiAgICAgICAgdGhpcy5tb2J4R3VpZCA9IDA7XG4gICAgICAgIHRoaXMuaW5UcmFuc2FjdGlvbiA9IDA7XG4gICAgICAgIHRoaXMuaXNUcmFja2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzUnVubmluZ1JlYWN0aW9ucyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNoYW5nZWRBdG9tcyA9IFtdO1xuICAgICAgICB0aGlzLnBlbmRpbmdSZWFjdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5hbGxvd1N0YXRlQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RyaWN0TW9kZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0SWQgPSAwO1xuICAgICAgICB0aGlzLnNweUxpc3RlbmVycyA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gTW9iWEdsb2JhbHM7XG59KCkpO1xudmFyIGdsb2JhbFN0YXRlID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVzID0gbmV3IE1vYlhHbG9iYWxzKCk7XG4gICAgaWYgKGdsb2JhbC5fX21vYnNlcnZhYmxlVHJhY2tpbmdTdGFjayB8fCBnbG9iYWwuX19tb2JzZXJ2YWJsZVZpZXdTdGFjaylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW21vYnhdIEFuIGluY29tcGF0aWJsZSB2ZXJzaW9uIG9mIG1vYnNlcnZhYmxlIGlzIGFscmVhZHkgbG9hZGVkLlwiKTtcbiAgICBpZiAoZ2xvYmFsLl9fbW9ieEdsb2JhbCAmJiBnbG9iYWwuX19tb2J4R2xvYmFsLnZlcnNpb24gIT09IHJlcy52ZXJzaW9uKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieF0gQW4gaW5jb21wYXRpYmxlIHZlcnNpb24gb2YgbW9ieCBpcyBhbHJlYWR5IGxvYWRlZC5cIik7XG4gICAgaWYgKGdsb2JhbC5fX21vYnhHbG9iYWwpXG4gICAgICAgIHJldHVybiBnbG9iYWwuX19tb2J4R2xvYmFsO1xuICAgIHJldHVybiBnbG9iYWwuX19tb2J4R2xvYmFsID0gcmVzO1xufSkoKTtcbmZ1bmN0aW9uIHJlZ2lzdGVyR2xvYmFscygpIHtcbn1cbmZ1bmN0aW9uIHJlc2V0R2xvYmFsU3RhdGUoKSB7XG4gICAgZ2xvYmFsU3RhdGUucmVzZXRJZCsrO1xuICAgIHZhciBkZWZhdWx0R2xvYmFscyA9IG5ldyBNb2JYR2xvYmFscygpO1xuICAgIGZvciAodmFyIGtleSBpbiBkZWZhdWx0R2xvYmFscylcbiAgICAgICAgaWYgKHBlcnNpc3RlbnRLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpXG4gICAgICAgICAgICBnbG9iYWxTdGF0ZVtrZXldID0gZGVmYXVsdEdsb2JhbHNba2V5XTtcbiAgICBnbG9iYWxTdGF0ZS5hbGxvd1N0YXRlQ2hhbmdlcyA9ICFnbG9iYWxTdGF0ZS5zdHJpY3RNb2RlO1xufVxuZnVuY3Rpb24gYWRkT2JzZXJ2ZXIob2JzZXJ2YWJsZSwgbm9kZSkge1xuICAgIHZhciB3YXNFbXB0eSA9IG9ic2VydmFibGUub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMDtcbiAgICBvYnNlcnZhYmxlLm9ic2VydmVycy5hZGQobm9kZSk7XG4gICAgaWYgKHdhc0VtcHR5KVxuICAgICAgICBvYnNlcnZhYmxlLm9uQmVjb21lT2JzZXJ2ZWQoKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZU9ic2VydmVyKG9ic2VydmFibGUsIG5vZGUpIHtcbiAgICBvYnNlcnZhYmxlLm9ic2VydmVycy5yZW1vdmUobm9kZSk7XG4gICAgaWYgKG9ic2VydmFibGUub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgb2JzZXJ2YWJsZS5vbkJlY29tZVVub2JzZXJ2ZWQoKTtcbn1cbmZ1bmN0aW9uIHJlcG9ydE9ic2VydmVkKG9ic2VydmFibGUpIHtcbiAgICBpZiAoZ2xvYmFsU3RhdGUuaXNUcmFja2luZyA9PT0gZmFsc2UpXG4gICAgICAgIHJldHVybjtcbiAgICB2YXIgZGVyaXZhdGlvbiA9IGdsb2JhbFN0YXRlLmRlcml2YXRpb25TdGFja1tnbG9iYWxTdGF0ZS5kZXJpdmF0aW9uU3RhY2subGVuZ3RoIC0gMV07XG4gICAgaWYgKGRlcml2YXRpb24ucnVuSWQgIT09IG9ic2VydmFibGUubGFzdEFjY2Vzc2VkQnkpIHtcbiAgICAgICAgb2JzZXJ2YWJsZS5sYXN0QWNjZXNzZWRCeSA9IGRlcml2YXRpb24ucnVuSWQ7XG4gICAgICAgIGRlcml2YXRpb24ub2JzZXJ2aW5nW2Rlcml2YXRpb24udW5ib3VuZERlcHNDb3VudCsrXSA9IG9ic2VydmFibGU7XG4gICAgfVxufVxuZnVuY3Rpb24gcHJvcGFnYXRlU3RhbGVuZXNzKG9ic2VydmFibGUpIHtcbiAgICB2YXIgb3MgPSBvYnNlcnZhYmxlLm9ic2VydmVycy5hc0FycmF5KCk7XG4gICAgdmFyIGwgPSBvcy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspXG4gICAgICAgIG5vdGlmeURlcGVuZGVuY3lTdGFsZShvc1tpXSk7XG4gICAgb2JzZXJ2YWJsZS5zdGFsZU9ic2VydmVycyA9IG9ic2VydmFibGUuc3RhbGVPYnNlcnZlcnMuY29uY2F0KG9zKTtcbn1cbmZ1bmN0aW9uIHByb3BhZ2F0ZVJlYWRpbmVzcyhvYnNlcnZhYmxlLCB2YWx1ZURpZEFjdHVhbGx5Q2hhbmdlKSB7XG4gICAgb2JzZXJ2YWJsZS5zdGFsZU9ic2VydmVycy5zcGxpY2UoMCkuZm9yRWFjaChmdW5jdGlvbiAobykgeyByZXR1cm4gbm90aWZ5RGVwZW5kZW5jeVJlYWR5KG8sIHZhbHVlRGlkQWN0dWFsbHlDaGFuZ2UpOyB9KTtcbn1cbnZhciBFTVBUWV9ERVJJVkFUSU9OX1NFVDtcbnZhciBSZWFjdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmVhY3Rpb24obmFtZSwgb25JbnZhbGlkYXRlKSB7XG4gICAgICAgIGlmIChuYW1lID09PSB2b2lkIDApIHsgbmFtZSA9IFwiUmVhY3Rpb25AXCIgKyBnZXROZXh0SWQoKTsgfVxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLm9uSW52YWxpZGF0ZSA9IG9uSW52YWxpZGF0ZTtcbiAgICAgICAgdGhpcy5zdGFsZU9ic2VydmVycyA9IEVNUFRZX0FSUkFZO1xuICAgICAgICB0aGlzLm9ic2VydmVycyA9IEVNUFRZX0RFUklWQVRJT05fU0VUIHx8IChFTVBUWV9ERVJJVkFUSU9OX1NFVCA9IG5ldyBTaW1wbGVTZXQoKSk7XG4gICAgICAgIHRoaXMub2JzZXJ2aW5nID0gW107XG4gICAgICAgIHRoaXMuZGlmZlZhbHVlID0gMDtcbiAgICAgICAgdGhpcy5ydW5JZCA9IDA7XG4gICAgICAgIHRoaXMubGFzdEFjY2Vzc2VkQnkgPSAwO1xuICAgICAgICB0aGlzLnVuYm91bmREZXBzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLl9fbWFwaWQgPSBcIiNcIiArIGdldE5leHRJZCgpO1xuICAgICAgICB0aGlzLmRlcGVuZGVuY3lDaGFuZ2VDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jeVN0YWxlQ291bnQgPSAwO1xuICAgICAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNUcmFja1BlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5vbkJlY29tZU9ic2VydmVkID0gZnVuY3Rpb24gKCkge1xuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLm9uQmVjb21lVW5vYnNlcnZlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICB9O1xuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5vbkRlcGVuZGVuY2llc1JlYWR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc1NjaGVkdWxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICAgICAgZ2xvYmFsU3RhdGUucGVuZGluZ1JlYWN0aW9ucy5wdXNoKHRoaXMpO1xuICAgICAgICAgICAgcnVuUmVhY3Rpb25zKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5pc1NjaGVkdWxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVwZW5kZW5jeVN0YWxlQ291bnQgPiAwIHx8IHRoaXMuX2lzU2NoZWR1bGVkO1xuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLnJ1blJlYWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2lzVHJhY2tQZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMub25JbnZhbGlkYXRlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5faXNUcmFja1BlbmRpbmcgJiYgaXNTcHlFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICBzcHlSZXBvcnQoe1xuICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2NoZWR1bGVkLXJlYWN0aW9uXCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLnRyYWNrID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHZhciBub3RpZnkgPSBpc1NweUVuYWJsZWQoKTtcbiAgICAgICAgdmFyIHN0YXJ0VGltZTtcbiAgICAgICAgaWYgKG5vdGlmeSkge1xuICAgICAgICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHNweVJlcG9ydFN0YXJ0KHtcbiAgICAgICAgICAgICAgICBvYmplY3Q6IHRoaXMsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJyZWFjdGlvblwiLFxuICAgICAgICAgICAgICAgIGZuOiBmblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJhY2tEZXJpdmVkRnVuY3Rpb24odGhpcywgZm4pO1xuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNUcmFja1BlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgICAgICAgY2xlYXJPYnNlcnZpbmcodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vdGlmeSkge1xuICAgICAgICAgICAgc3B5UmVwb3J0RW5kKHtcbiAgICAgICAgICAgICAgICB0aW1lOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1J1bm5pbmcpXG4gICAgICAgICAgICAgICAgY2xlYXJPYnNlcnZpbmcodGhpcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5nZXREaXNwb3NlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLmRpc3Bvc2UuYmluZCh0aGlzKTtcbiAgICAgICAgci4kbW9ieCA9IHRoaXM7XG4gICAgICAgIHJldHVybiByO1xuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJSZWFjdGlvbltcIiArIHRoaXMubmFtZSArIFwiXVwiO1xuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLndoeVJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9ic2VydmluZyA9IHVuaXF1ZSh0aGlzLm9ic2VydmluZykubWFwKGZ1bmN0aW9uIChkZXApIHsgcmV0dXJuIGRlcC5uYW1lOyB9KTtcbiAgICAgICAgcmV0dXJuIChcIlxcbldoeVJ1bj8gcmVhY3Rpb24gJ1wiICsgdGhpcy5uYW1lICsgXCInOlxcbiAqIFN0YXR1czogW1wiICsgKHRoaXMuaXNEaXNwb3NlZCA/IFwic3RvcHBlZFwiIDogdGhpcy5faXNSdW5uaW5nID8gXCJydW5uaW5nXCIgOiB0aGlzLmlzU2NoZWR1bGVkKCkgPyBcInNjaGVkdWxlZFwiIDogXCJpZGxlXCIpICsgXCJdXFxuICogVGhpcyByZWFjdGlvbiB3aWxsIHJlLXJ1biBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBvYnNlcnZhYmxlcyBjaGFuZ2VzOlxcbiAgICBcIiArIGpvaW5TdHJpbmdzKG9ic2VydmluZykgKyBcIlxcbiAgICBcIiArICgodGhpcy5faXNSdW5uaW5nKSA/IFwiICguLi4gb3IgYW55IG9ic2VydmFibGUgYWNjZXNzZWQgZHVyaW5nIHRoZSByZW1haW5kZXIgb2YgdGhlIGN1cnJlbnQgcnVuKVwiIDogXCJcIikgKyBcIlxcblxcdE1pc3NpbmcgaXRlbXMgaW4gdGhpcyBsaXN0P1xcblxcdCAgMS4gQ2hlY2sgd2hldGhlciBhbGwgdXNlZCB2YWx1ZXMgYXJlIHByb3Blcmx5IG1hcmtlZCBhcyBvYnNlcnZhYmxlICh1c2UgaXNPYnNlcnZhYmxlIHRvIHZlcmlmeSlcXG5cXHQgIDIuIE1ha2Ugc3VyZSB5b3UgZGlkbid0IGRlcmVmZXJlbmNlIHZhbHVlcyB0b28gZWFybHkuIE1vYlggb2JzZXJ2ZXMgcHJvcHMsIG5vdCBwcmltaXRpdmVzLiBFLmc6IHVzZSAncGVyc29uLm5hbWUnIGluc3RlYWQgb2YgJ25hbWUnIGluIHlvdXIgY29tcHV0YXRpb24uXFxuXCIpO1xuICAgIH07XG4gICAgcmV0dXJuIFJlYWN0aW9uO1xufSgpKTtcbmV4cG9ydHMuUmVhY3Rpb24gPSBSZWFjdGlvbjtcbnZhciBNQVhfUkVBQ1RJT05fSVRFUkFUSU9OUyA9IDEwMDtcbmZ1bmN0aW9uIHJ1blJlYWN0aW9ucygpIHtcbiAgICBpZiAoZ2xvYmFsU3RhdGUuaXNSdW5uaW5nUmVhY3Rpb25zID09PSB0cnVlIHx8IGdsb2JhbFN0YXRlLmluVHJhbnNhY3Rpb24gPiAwKVxuICAgICAgICByZXR1cm47XG4gICAgZ2xvYmFsU3RhdGUuaXNSdW5uaW5nUmVhY3Rpb25zID0gdHJ1ZTtcbiAgICB2YXIgYWxsUmVhY3Rpb25zID0gZ2xvYmFsU3RhdGUucGVuZGluZ1JlYWN0aW9ucztcbiAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgd2hpbGUgKGFsbFJlYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICgrK2l0ZXJhdGlvbnMgPT09IE1BWF9SRUFDVElPTl9JVEVSQVRJT05TKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhY3Rpb24gZG9lc24ndCBjb252ZXJnZSB0byBhIHN0YWJsZSBzdGF0ZS4gUHJvYmFibHkgdGhlcmUgaXMgYSBjeWNsZSBpbiB0aGUgcmVhY3RpdmUgZnVuY3Rpb246IFwiICsgYWxsUmVhY3Rpb25zWzBdLnRvU3RyaW5nKCkpO1xuICAgICAgICB2YXIgcmVtYWluaW5nUmVhY3Rpb25zID0gYWxsUmVhY3Rpb25zLnNwbGljZSgwKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSByZW1haW5pbmdSZWFjdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKVxuICAgICAgICAgICAgcmVtYWluaW5nUmVhY3Rpb25zW2ldLnJ1blJlYWN0aW9uKCk7XG4gICAgfVxuICAgIGdsb2JhbFN0YXRlLmlzUnVubmluZ1JlYWN0aW9ucyA9IGZhbHNlO1xufVxudmFyIHNweUVuYWJsZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGlzU3B5RW5hYmxlZCgpIHtcbiAgICByZXR1cm4gc3B5RW5hYmxlZDtcbn1cbmZ1bmN0aW9uIHNweVJlcG9ydChldmVudCkge1xuICAgIGlmICghc3B5RW5hYmxlZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBnbG9iYWxTdGF0ZS5zcHlMaXN0ZW5lcnM7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbDsgaSsrKVxuICAgICAgICBsaXN0ZW5lcnNbaV0oZXZlbnQpO1xufVxuZnVuY3Rpb24gc3B5UmVwb3J0U3RhcnQoZXZlbnQpIHtcbiAgICB2YXIgY2hhbmdlID0gb2JqZWN0QXNzaWduKHt9LCBldmVudCwgeyBzcHlSZXBvcnRTdGFydDogdHJ1ZSB9KTtcbiAgICBzcHlSZXBvcnQoY2hhbmdlKTtcbn1cbnZhciBFTkRfRVZFTlQgPSB7IHNweVJlcG9ydEVuZDogdHJ1ZSB9O1xuZnVuY3Rpb24gc3B5UmVwb3J0RW5kKGNoYW5nZSkge1xuICAgIGlmIChjaGFuZ2UpXG4gICAgICAgIHNweVJlcG9ydChvYmplY3RBc3NpZ24oe30sIGNoYW5nZSwgRU5EX0VWRU5UKSk7XG4gICAgZWxzZVxuICAgICAgICBzcHlSZXBvcnQoRU5EX0VWRU5UKTtcbn1cbmZ1bmN0aW9uIHNweShsaXN0ZW5lcikge1xuICAgIGdsb2JhbFN0YXRlLnNweUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICBzcHlFbmFibGVkID0gZ2xvYmFsU3RhdGUuc3B5TGlzdGVuZXJzLmxlbmd0aCA+IDA7XG4gICAgcmV0dXJuIG9uY2UoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaWR4ID0gZ2xvYmFsU3RhdGUuc3B5TGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICBpZiAoaWR4ICE9PSAtMSlcbiAgICAgICAgICAgIGdsb2JhbFN0YXRlLnNweUxpc3RlbmVycy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgc3B5RW5hYmxlZCA9IGdsb2JhbFN0YXRlLnNweUxpc3RlbmVycy5sZW5ndGggPiAwO1xuICAgIH0pO1xufVxuZXhwb3J0cy5zcHkgPSBzcHk7XG5mdW5jdGlvbiB0cmFja1RyYW5zaXRpb25zKG9uUmVwb3J0KSB7XG4gICAgZGVwcmVjYXRlZChcInRyYWNrVHJhbnNpdGlvbnMgaXMgZGVwcmVjYXRlZC4gVXNlIG1vYnguc3B5IGluc3RlYWRcIik7XG4gICAgaWYgKHR5cGVvZiBvblJlcG9ydCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgZGVwcmVjYXRlZChcInRyYWNrVHJhbnNpdGlvbnMgb25seSB0YWtlcyBhIHNpbmdsZSBjYWxsYmFjayBmdW5jdGlvbi4gSWYgeW91IGFyZSB1c2luZyB0aGUgbW9ieC1yZWFjdC1kZXZ0b29scywgcGxlYXNlIHVwZGF0ZSB0aGVtIGZpcnN0XCIpO1xuICAgICAgICBvblJlcG9ydCA9IGFyZ3VtZW50c1sxXTtcbiAgICB9XG4gICAgaWYgKCFvblJlcG9ydCkge1xuICAgICAgICBkZXByZWNhdGVkKFwidHJhY2tUcmFuc2l0aW9ucyB3aXRob3V0IGNhbGxiYWNrIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIGlzIGEgbm8tb3Agbm93LiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBtb2J4LXJlYWN0LWRldnRvb2xzLCBwbGVhc2UgdXBkYXRlIHRoZW0gZmlyc3RcIik7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IH07XG4gICAgfVxuICAgIHJldHVybiBzcHkob25SZXBvcnQpO1xufVxuZnVuY3Rpb24gdHJhbnNhY3Rpb24oYWN0aW9uLCB0aGlzQXJnLCByZXBvcnQpIHtcbiAgICBpZiAodGhpc0FyZyA9PT0gdm9pZCAwKSB7IHRoaXNBcmcgPSB1bmRlZmluZWQ7IH1cbiAgICBpZiAocmVwb3J0ID09PSB2b2lkIDApIHsgcmVwb3J0ID0gdHJ1ZTsgfVxuICAgIHRyYW5zYWN0aW9uU3RhcnQoKGFjdGlvbi5uYW1lKSB8fCBcImFub255bW91cyB0cmFuc2FjdGlvblwiLCB0aGlzQXJnLCByZXBvcnQpO1xuICAgIHZhciByZXMgPSBhY3Rpb24uY2FsbCh0aGlzQXJnKTtcbiAgICB0cmFuc2FjdGlvbkVuZChyZXBvcnQpO1xuICAgIHJldHVybiByZXM7XG59XG5leHBvcnRzLnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247XG5mdW5jdGlvbiB0cmFuc2FjdGlvblN0YXJ0KG5hbWUsIHRoaXNBcmcsIHJlcG9ydCkge1xuICAgIGlmICh0aGlzQXJnID09PSB2b2lkIDApIHsgdGhpc0FyZyA9IHVuZGVmaW5lZDsgfVxuICAgIGlmIChyZXBvcnQgPT09IHZvaWQgMCkgeyByZXBvcnQgPSB0cnVlOyB9XG4gICAgZ2xvYmFsU3RhdGUuaW5UcmFuc2FjdGlvbiArPSAxO1xuICAgIGlmIChyZXBvcnQgJiYgaXNTcHlFbmFibGVkKCkpIHtcbiAgICAgICAgc3B5UmVwb3J0U3RhcnQoe1xuICAgICAgICAgICAgdHlwZTogXCJ0cmFuc2FjdGlvblwiLFxuICAgICAgICAgICAgdGFyZ2V0OiB0aGlzQXJnLFxuICAgICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiB0cmFuc2FjdGlvbkVuZChyZXBvcnQpIHtcbiAgICBpZiAocmVwb3J0ID09PSB2b2lkIDApIHsgcmVwb3J0ID0gdHJ1ZTsgfVxuICAgIGlmICgtLWdsb2JhbFN0YXRlLmluVHJhbnNhY3Rpb24gPT09IDApIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IGdsb2JhbFN0YXRlLmNoYW5nZWRBdG9tcy5zcGxpY2UoMCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWVzLmxlbmd0aDsgaSA8IGw7IGkrKylcbiAgICAgICAgICAgIHByb3BhZ2F0ZUF0b21SZWFkeSh2YWx1ZXNbaV0pO1xuICAgICAgICBydW5SZWFjdGlvbnMoKTtcbiAgICB9XG4gICAgaWYgKHJlcG9ydCAmJiBpc1NweUVuYWJsZWQoKSlcbiAgICAgICAgc3B5UmVwb3J0RW5kKCk7XG59XG5mdW5jdGlvbiBoYXNJbnRlcmNlcHRvcnMoaW50ZXJjZXB0YWJsZSkge1xuICAgIHJldHVybiAoaW50ZXJjZXB0YWJsZS5pbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0YWJsZS5pbnRlcmNlcHRvcnMubGVuZ3RoID4gMCk7XG59XG5mdW5jdGlvbiByZWdpc3RlckludGVyY2VwdG9yKGludGVyY2VwdGFibGUsIGhhbmRsZXIpIHtcbiAgICB2YXIgaW50ZXJjZXB0b3JzID0gaW50ZXJjZXB0YWJsZS5pbnRlcmNlcHRvcnMgfHwgKGludGVyY2VwdGFibGUuaW50ZXJjZXB0b3JzID0gW10pO1xuICAgIGludGVyY2VwdG9ycy5wdXNoKGhhbmRsZXIpO1xuICAgIHJldHVybiBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlkeCA9IGludGVyY2VwdG9ycy5pbmRleE9mKGhhbmRsZXIpO1xuICAgICAgICBpZiAoaWR4ICE9PSAtMSlcbiAgICAgICAgICAgIGludGVyY2VwdG9ycy5zcGxpY2UoaWR4LCAxKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGludGVyY2VwdENoYW5nZShpbnRlcmNlcHRhYmxlLCBjaGFuZ2UpIHtcbiAgICB2YXIgcHJldlUgPSB1bnRyYWNrZWRTdGFydCgpO1xuICAgIHZhciBpbnRlcmNlcHRvcnMgPSBpbnRlcmNlcHRhYmxlLmludGVyY2VwdG9ycztcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGludGVyY2VwdG9ycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY2hhbmdlID0gaW50ZXJjZXB0b3JzW2ldKGNoYW5nZSk7XG4gICAgICAgIGludmFyaWFudCghY2hhbmdlIHx8IGNoYW5nZS50eXBlLCBcIkludGVyY2VwdCBoYW5kbGVycyBzaG91bGQgcmV0dXJuIG5vdGhpbmcgb3IgYSBjaGFuZ2Ugb2JqZWN0XCIpO1xuICAgICAgICBpZiAoIWNoYW5nZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB1bnRyYWNrZWRFbmQocHJldlUpO1xuICAgIHJldHVybiBjaGFuZ2U7XG59XG5mdW5jdGlvbiBoYXNMaXN0ZW5lcnMobGlzdGVuYWJsZSkge1xuICAgIHJldHVybiBsaXN0ZW5hYmxlLmNoYW5nZUxpc3RlbmVycyAmJiBsaXN0ZW5hYmxlLmNoYW5nZUxpc3RlbmVycy5sZW5ndGggPiAwO1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5hYmxlLCBoYW5kbGVyKSB7XG4gICAgdmFyIGxpc3RlbmVycyA9IGxpc3RlbmFibGUuY2hhbmdlTGlzdGVuZXJzIHx8IChsaXN0ZW5hYmxlLmNoYW5nZUxpc3RlbmVycyA9IFtdKTtcbiAgICBsaXN0ZW5lcnMucHVzaChoYW5kbGVyKTtcbiAgICByZXR1cm4gb25jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpZHggPSBsaXN0ZW5lcnMuaW5kZXhPZihoYW5kbGVyKTtcbiAgICAgICAgaWYgKGlkeCAhPT0gLTEpXG4gICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGlkeCwgMSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBub3RpZnlMaXN0ZW5lcnMobGlzdGVuYWJsZSwgY2hhbmdlKSB7XG4gICAgdmFyIHByZXZVID0gdW50cmFja2VkU3RhcnQoKTtcbiAgICB2YXIgbGlzdGVuZXJzID0gbGlzdGVuYWJsZS5jaGFuZ2VMaXN0ZW5lcnM7XG4gICAgaWYgKCFsaXN0ZW5lcnMpXG4gICAgICAgIHJldHVybjtcbiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hhbmdlKSkge1xuICAgICAgICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KG51bGwsIGNoYW5nZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnNbaV0oY2hhbmdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1bnRyYWNrZWRFbmQocHJldlUpO1xufVxudmFyIFZhbHVlTW9kZTtcbihmdW5jdGlvbiAoVmFsdWVNb2RlKSB7XG4gICAgVmFsdWVNb2RlW1ZhbHVlTW9kZVtcIlJlY3Vyc2l2ZVwiXSA9IDBdID0gXCJSZWN1cnNpdmVcIjtcbiAgICBWYWx1ZU1vZGVbVmFsdWVNb2RlW1wiUmVmZXJlbmNlXCJdID0gMV0gPSBcIlJlZmVyZW5jZVwiO1xuICAgIFZhbHVlTW9kZVtWYWx1ZU1vZGVbXCJTdHJ1Y3R1cmVcIl0gPSAyXSA9IFwiU3RydWN0dXJlXCI7XG4gICAgVmFsdWVNb2RlW1ZhbHVlTW9kZVtcIkZsYXRcIl0gPSAzXSA9IFwiRmxhdFwiO1xufSkoVmFsdWVNb2RlIHx8IChWYWx1ZU1vZGUgPSB7fSkpO1xuZnVuY3Rpb24gYXNSZWZlcmVuY2UodmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IEFzUmVmZXJlbmNlKHZhbHVlKTtcbn1cbmV4cG9ydHMuYXNSZWZlcmVuY2UgPSBhc1JlZmVyZW5jZTtcbmZ1bmN0aW9uIGFzU3RydWN0dXJlKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBBc1N0cnVjdHVyZSh2YWx1ZSk7XG59XG5leHBvcnRzLmFzU3RydWN0dXJlID0gYXNTdHJ1Y3R1cmU7XG5mdW5jdGlvbiBhc0ZsYXQodmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IEFzRmxhdCh2YWx1ZSk7XG59XG5leHBvcnRzLmFzRmxhdCA9IGFzRmxhdDtcbnZhciBBc1JlZmVyZW5jZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXNSZWZlcmVuY2UodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBhc3NlcnRVbndyYXBwZWQodmFsdWUsIFwiTW9kaWZpZXJzIGFyZSBub3QgYWxsb3dlZCB0byBiZSBuZXN0ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiBBc1JlZmVyZW5jZTtcbn0oKSk7XG52YXIgQXNTdHJ1Y3R1cmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFzU3RydWN0dXJlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgYXNzZXJ0VW53cmFwcGVkKHZhbHVlLCBcIk1vZGlmaWVycyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgbmVzdGVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gQXNTdHJ1Y3R1cmU7XG59KCkpO1xudmFyIEFzRmxhdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXNGbGF0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgYXNzZXJ0VW53cmFwcGVkKHZhbHVlLCBcIk1vZGlmaWVycyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgbmVzdGVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gQXNGbGF0O1xufSgpKTtcbmZ1bmN0aW9uIGFzTWFwKGRhdGEsIG1vZGlmaWVyRnVuYykge1xuICAgIHJldHVybiBtYXAoZGF0YSwgbW9kaWZpZXJGdW5jKTtcbn1cbmV4cG9ydHMuYXNNYXAgPSBhc01hcDtcbmZ1bmN0aW9uIGdldFZhbHVlTW9kZUZyb21WYWx1ZSh2YWx1ZSwgZGVmYXVsdE1vZGUpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBc1JlZmVyZW5jZSlcbiAgICAgICAgcmV0dXJuIFtWYWx1ZU1vZGUuUmVmZXJlbmNlLCB2YWx1ZS52YWx1ZV07XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXNTdHJ1Y3R1cmUpXG4gICAgICAgIHJldHVybiBbVmFsdWVNb2RlLlN0cnVjdHVyZSwgdmFsdWUudmFsdWVdO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFzRmxhdClcbiAgICAgICAgcmV0dXJuIFtWYWx1ZU1vZGUuRmxhdCwgdmFsdWUudmFsdWVdO1xuICAgIHJldHVybiBbZGVmYXVsdE1vZGUsIHZhbHVlXTtcbn1cbmZ1bmN0aW9uIGdldFZhbHVlTW9kZUZyb21Nb2RpZmllckZ1bmMoZnVuYykge1xuICAgIGlmIChmdW5jID09PSBhc1JlZmVyZW5jZSlcbiAgICAgICAgcmV0dXJuIFZhbHVlTW9kZS5SZWZlcmVuY2U7XG4gICAgZWxzZSBpZiAoZnVuYyA9PT0gYXNTdHJ1Y3R1cmUpXG4gICAgICAgIHJldHVybiBWYWx1ZU1vZGUuU3RydWN0dXJlO1xuICAgIGVsc2UgaWYgKGZ1bmMgPT09IGFzRmxhdClcbiAgICAgICAgcmV0dXJuIFZhbHVlTW9kZS5GbGF0O1xuICAgIGludmFyaWFudChmdW5jID09PSB1bmRlZmluZWQsIFwiQ2Fubm90IGRldGVybWluZSB2YWx1ZSBtb2RlIGZyb20gZnVuY3Rpb24uIFBsZWFzZSBwYXNzIGluIG9uZSBvZiB0aGVzZTogbW9ieC5hc1JlZmVyZW5jZSwgbW9ieC5hc1N0cnVjdHVyZSBvciBtb2J4LmFzRmxhdCwgZ290OiBcIiArIGZ1bmMpO1xuICAgIHJldHVybiBWYWx1ZU1vZGUuUmVjdXJzaXZlO1xufVxuZnVuY3Rpb24gbWFrZUNoaWxkT2JzZXJ2YWJsZSh2YWx1ZSwgcGFyZW50TW9kZSwgbmFtZSkge1xuICAgIHZhciBjaGlsZE1vZGU7XG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICBzd2l0Y2ggKHBhcmVudE1vZGUpIHtcbiAgICAgICAgY2FzZSBWYWx1ZU1vZGUuUmVmZXJlbmNlOlxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICBjYXNlIFZhbHVlTW9kZS5GbGF0OlxuICAgICAgICAgICAgYXNzZXJ0VW53cmFwcGVkKHZhbHVlLCBcIkl0ZW1zIGluc2lkZSAnYXNGbGF0JyBjYW5ub3QgaGF2ZSBtb2RpZmllcnNcIik7XG4gICAgICAgICAgICBjaGlsZE1vZGUgPSBWYWx1ZU1vZGUuUmVmZXJlbmNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVmFsdWVNb2RlLlN0cnVjdHVyZTpcbiAgICAgICAgICAgIGFzc2VydFVud3JhcHBlZCh2YWx1ZSwgXCJJdGVtcyBpbnNpZGUgJ2FzU3RydWN0dXJlJyBjYW5ub3QgaGF2ZSBtb2RpZmllcnNcIik7XG4gICAgICAgICAgICBjaGlsZE1vZGUgPSBWYWx1ZU1vZGUuU3RydWN0dXJlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVmFsdWVNb2RlLlJlY3Vyc2l2ZTpcbiAgICAgICAgICAgIF9hID0gZ2V0VmFsdWVNb2RlRnJvbVZhbHVlKHZhbHVlLCBWYWx1ZU1vZGUuUmVjdXJzaXZlKSwgY2hpbGRNb2RlID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGludmFyaWFudChmYWxzZSwgXCJJbGxlZ2FsIFN0YXRlXCIpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiBjcmVhdGVPYnNlcnZhYmxlQXJyYXkodmFsdWUsIGNoaWxkTW9kZSwgbmFtZSk7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpICYmIE9iamVjdC5pc0V4dGVuc2libGUodmFsdWUpKVxuICAgICAgICByZXR1cm4gZXh0ZW5kT2JzZXJ2YWJsZUhlbHBlcih2YWx1ZSwgdmFsdWUsIGNoaWxkTW9kZSwgbmFtZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICAgIHZhciBfYTtcbn1cbmZ1bmN0aW9uIGFzc2VydFVud3JhcHBlZCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFzUmVmZXJlbmNlIHx8IHZhbHVlIGluc3RhbmNlb2YgQXNTdHJ1Y3R1cmUgfHwgdmFsdWUgaW5zdGFuY2VvZiBBc0ZsYXQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlttb2J4XSBhc1N0cnVjdHVyZSAvIGFzUmVmZXJlbmNlIC8gYXNGbGF0IGNhbm5vdCBiZSB1c2VkIGhlcmUuIFwiICsgbWVzc2FnZSk7XG59XG52YXIgc2FmYXJpUHJvdG90eXBlU2V0dGVySW5oZXJpdGFuY2VCdWcgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciB2ID0gZmFsc2U7XG4gICAgdmFyIHAgPSB7fTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocCwgXCIwXCIsIHsgc2V0OiBmdW5jdGlvbiAoKSB7IHYgPSB0cnVlOyB9IH0pO1xuICAgIE9iamVjdC5jcmVhdGUocClbXCIwXCJdID0gMTtcbiAgICByZXR1cm4gdiA9PT0gZmFsc2U7XG59KSgpO1xudmFyIE9CU0VSVkFCTEVfQVJSQVlfQlVGRkVSX1NJWkUgPSAwO1xudmFyIFN0dWJBcnJheSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3R1YkFycmF5KCkge1xuICAgIH1cbiAgICByZXR1cm4gU3R1YkFycmF5O1xufSgpKTtcblN0dWJBcnJheS5wcm90b3R5cGUgPSBbXTtcbnZhciBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb24obmFtZSwgbW9kZSwgYXJyYXksIG93bmVkKSB7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbiAgICAgICAgdGhpcy5vd25lZCA9IG93bmVkO1xuICAgICAgICB0aGlzLmxhc3RLbm93bkxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzID0gbnVsbDtcbiAgICAgICAgdGhpcy5jaGFuZ2VMaXN0ZW5lcnMgPSBudWxsO1xuICAgICAgICB0aGlzLmF0b20gPSBuZXcgQXRvbShuYW1lIHx8IChcIk9ic2VydmFibGVBcnJheUBcIiArIGdldE5leHRJZCgpKSk7XG4gICAgfVxuICAgIE9ic2VydmFibGVBcnJheUFkbWluaXN0cmF0aW9uLnByb3RvdHlwZS5tYWtlUmVhY3RpdmVBcnJheUl0ZW0gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgYXNzZXJ0VW53cmFwcGVkKHZhbHVlLCBcIkFycmF5IHZhbHVlcyBjYW5ub3QgaGF2ZSBtb2RpZmllcnNcIik7XG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09IFZhbHVlTW9kZS5GbGF0IHx8IHRoaXMubW9kZSA9PT0gVmFsdWVNb2RlLlJlZmVyZW5jZSlcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIG1ha2VDaGlsZE9ic2VydmFibGUodmFsdWUsIHRoaXMubW9kZSwgdGhpcy5hdG9tLm5hbWUgKyBcIlsuLl1cIik7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbi5wcm90b3R5cGUuaW50ZXJjZXB0ID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVySW50ZXJjZXB0b3IodGhpcywgaGFuZGxlcik7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbi5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uIChsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgIGlmIChmaXJlSW1tZWRpYXRlbHkgPT09IHZvaWQgMCkgeyBmaXJlSW1tZWRpYXRlbHkgPSBmYWxzZTsgfVxuICAgICAgICBpZiAoZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgICAgICBsaXN0ZW5lcih7XG4gICAgICAgICAgICAgICAgb2JqZWN0OiB0aGlzLmFycmF5LFxuICAgICAgICAgICAgICAgIHR5cGU6IFwic3BsaWNlXCIsXG4gICAgICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgYWRkZWQ6IHRoaXMudmFsdWVzLnNsaWNlKCksXG4gICAgICAgICAgICAgICAgYWRkZWRDb3VudDogdGhpcy52YWx1ZXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHJlbW92ZWQ6IFtdLFxuICAgICAgICAgICAgICAgIHJlbW92ZWRDb3VudDogMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVyTGlzdGVuZXIodGhpcywgbGlzdGVuZXIpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb24ucHJvdG90eXBlLmdldEFycmF5TGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmF0b20ucmVwb3J0T2JzZXJ2ZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aDtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheUFkbWluaXN0cmF0aW9uLnByb3RvdHlwZS5zZXRBcnJheUxlbmd0aCA9IGZ1bmN0aW9uIChuZXdMZW5ndGgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuZXdMZW5ndGggIT09IFwibnVtYmVyXCIgfHwgbmV3TGVuZ3RoIDwgMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlttb2J4LmFycmF5XSBPdXQgb2YgcmFuZ2U6IFwiICsgbmV3TGVuZ3RoKTtcbiAgICAgICAgdmFyIGN1cnJlbnRMZW5ndGggPSB0aGlzLnZhbHVlcy5sZW5ndGg7XG4gICAgICAgIGlmIChuZXdMZW5ndGggPT09IGN1cnJlbnRMZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGVsc2UgaWYgKG5ld0xlbmd0aCA+IGN1cnJlbnRMZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnNwbGljZVdpdGhBcnJheShjdXJyZW50TGVuZ3RoLCAwLCBuZXcgQXJyYXkobmV3TGVuZ3RoIC0gY3VycmVudExlbmd0aCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnNwbGljZVdpdGhBcnJheShuZXdMZW5ndGgsIGN1cnJlbnRMZW5ndGggLSBuZXdMZW5ndGgpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb24ucHJvdG90eXBlLnVwZGF0ZUFycmF5TGVuZ3RoID0gZnVuY3Rpb24gKG9sZExlbmd0aCwgZGVsdGEpIHtcbiAgICAgICAgaWYgKG9sZExlbmd0aCAhPT0gdGhpcy5sYXN0S25vd25MZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieF0gTW9kaWZpY2F0aW9uIGV4Y2VwdGlvbjogdGhlIGludGVybmFsIHN0cnVjdHVyZSBvZiBhbiBvYnNlcnZhYmxlIGFycmF5IHdhcyBjaGFuZ2VkLiBEaWQgeW91IHVzZSBwZWVrKCkgdG8gY2hhbmdlIGl0P1wiKTtcbiAgICAgICAgdGhpcy5sYXN0S25vd25MZW5ndGggKz0gZGVsdGE7XG4gICAgICAgIGlmIChkZWx0YSA+IDAgJiYgb2xkTGVuZ3RoICsgZGVsdGEgKyAxID4gT0JTRVJWQUJMRV9BUlJBWV9CVUZGRVJfU0laRSlcbiAgICAgICAgICAgIHJlc2VydmVBcnJheUJ1ZmZlcihvbGRMZW5ndGggKyBkZWx0YSArIDEpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb24ucHJvdG90eXBlLnNwbGljZVdpdGhBcnJheSA9IGZ1bmN0aW9uIChpbmRleCwgZGVsZXRlQ291bnQsIG5ld0l0ZW1zKSB7XG4gICAgICAgIGNoZWNrSWZTdGF0ZU1vZGlmaWNhdGlvbnNBcmVBbGxvd2VkKCk7XG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLnZhbHVlcy5sZW5ndGg7XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICBlbHNlIGlmIChpbmRleCA+IGxlbmd0aClcbiAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuICAgICAgICBlbHNlIGlmIChpbmRleCA8IDApXG4gICAgICAgICAgICBpbmRleCA9IE1hdGgubWF4KDAsIGxlbmd0aCArIGluZGV4KTtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICBkZWxldGVDb3VudCA9IGxlbmd0aCAtIGluZGV4O1xuICAgICAgICBlbHNlIGlmIChkZWxldGVDb3VudCA9PT0gdW5kZWZpbmVkIHx8IGRlbGV0ZUNvdW50ID09PSBudWxsKVxuICAgICAgICAgICAgZGVsZXRlQ291bnQgPSAwO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGVDb3VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGRlbGV0ZUNvdW50LCBsZW5ndGggLSBpbmRleCkpO1xuICAgICAgICBpZiAobmV3SXRlbXMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIG5ld0l0ZW1zID0gW107XG4gICAgICAgIGlmIChoYXNJbnRlcmNlcHRvcnModGhpcykpIHtcbiAgICAgICAgICAgIHZhciBjaGFuZ2UgPSBpbnRlcmNlcHRDaGFuZ2UodGhpcywge1xuICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcy5hcnJheSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcInNwbGljZVwiLFxuICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICByZW1vdmVkQ291bnQ6IGRlbGV0ZUNvdW50LFxuICAgICAgICAgICAgICAgIGFkZGVkOiBuZXdJdGVtc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWNoYW5nZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFlfQVJSQVk7XG4gICAgICAgICAgICBkZWxldGVDb3VudCA9IGNoYW5nZS5yZW1vdmVkQ291bnQ7XG4gICAgICAgICAgICBuZXdJdGVtcyA9IGNoYW5nZS5hZGRlZDtcbiAgICAgICAgfVxuICAgICAgICBuZXdJdGVtcyA9IG5ld0l0ZW1zLm1hcCh0aGlzLm1ha2VSZWFjdGl2ZUFycmF5SXRlbSwgdGhpcyk7XG4gICAgICAgIHZhciBsZW5ndGhEZWx0YSA9IG5ld0l0ZW1zLmxlbmd0aCAtIGRlbGV0ZUNvdW50O1xuICAgICAgICB0aGlzLnVwZGF0ZUFycmF5TGVuZ3RoKGxlbmd0aCwgbGVuZ3RoRGVsdGEpO1xuICAgICAgICB2YXIgcmVzID0gKF9hID0gdGhpcy52YWx1ZXMpLnNwbGljZS5hcHBseShfYSwgW2luZGV4LCBkZWxldGVDb3VudF0uY29uY2F0KG5ld0l0ZW1zKSk7XG4gICAgICAgIGlmIChkZWxldGVDb3VudCAhPT0gMCB8fCBuZXdJdGVtcy5sZW5ndGggIT09IDApXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUFycmF5U3BsaWNlKGluZGV4LCBuZXdJdGVtcywgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgdmFyIF9hO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb24ucHJvdG90eXBlLm5vdGlmeUFycmF5Q2hpbGRVcGRhdGUgPSBmdW5jdGlvbiAoaW5kZXgsIG5ld1ZhbHVlLCBvbGRWYWx1ZSkge1xuICAgICAgICB2YXIgbm90aWZ5U3B5ID0gIXRoaXMub3duZWQgJiYgaXNTcHlFbmFibGVkKCk7XG4gICAgICAgIHZhciBub3RpZnkgPSBoYXNMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgIHZhciBjaGFuZ2UgPSBub3RpZnkgfHwgbm90aWZ5U3B5ID8ge1xuICAgICAgICAgICAgb2JqZWN0OiB0aGlzLmFycmF5LFxuICAgICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIixcbiAgICAgICAgICAgIGluZGV4OiBpbmRleCwgbmV3VmFsdWU6IG5ld1ZhbHVlLCBvbGRWYWx1ZTogb2xkVmFsdWVcbiAgICAgICAgfSA6IG51bGw7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRTdGFydChjaGFuZ2UpO1xuICAgICAgICB0aGlzLmF0b20ucmVwb3J0Q2hhbmdlZCgpO1xuICAgICAgICBpZiAobm90aWZ5KVxuICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIGNoYW5nZSk7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRFbmQoKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheUFkbWluaXN0cmF0aW9uLnByb3RvdHlwZS5ub3RpZnlBcnJheVNwbGljZSA9IGZ1bmN0aW9uIChpbmRleCwgYWRkZWQsIHJlbW92ZWQpIHtcbiAgICAgICAgdmFyIG5vdGlmeVNweSA9ICF0aGlzLm93bmVkICYmIGlzU3B5RW5hYmxlZCgpO1xuICAgICAgICB2YXIgbm90aWZ5ID0gaGFzTGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICB2YXIgY2hhbmdlID0gbm90aWZ5IHx8IG5vdGlmeVNweSA/IHtcbiAgICAgICAgICAgIG9iamVjdDogdGhpcy5hcnJheSxcbiAgICAgICAgICAgIHR5cGU6IFwic3BsaWNlXCIsXG4gICAgICAgICAgICBpbmRleDogaW5kZXgsIHJlbW92ZWQ6IHJlbW92ZWQsIGFkZGVkOiBhZGRlZCxcbiAgICAgICAgICAgIHJlbW92ZWRDb3VudDogcmVtb3ZlZC5sZW5ndGgsXG4gICAgICAgICAgICBhZGRlZENvdW50OiBhZGRlZC5sZW5ndGhcbiAgICAgICAgfSA6IG51bGw7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRTdGFydChjaGFuZ2UpO1xuICAgICAgICB0aGlzLmF0b20ucmVwb3J0Q2hhbmdlZCgpO1xuICAgICAgICBpZiAobm90aWZ5KVxuICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIGNoYW5nZSk7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRFbmQoKTtcbiAgICB9O1xuICAgIHJldHVybiBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbjtcbn0oKSk7XG52YXIgT2JzZXJ2YWJsZUFycmF5ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoT2JzZXJ2YWJsZUFycmF5LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE9ic2VydmFibGVBcnJheShpbml0aWFsVmFsdWVzLCBtb2RlLCBuYW1lLCBvd25lZCkge1xuICAgICAgICBpZiAob3duZWQgPT09IHZvaWQgMCkgeyBvd25lZCA9IGZhbHNlOyB9XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICB2YXIgYWRtID0gbmV3IE9ic2VydmFibGVBcnJheUFkbWluaXN0cmF0aW9uKG5hbWUsIG1vZGUsIHRoaXMsIG93bmVkKTtcbiAgICAgICAgYWRkSGlkZGVuRmluYWxQcm9wKHRoaXMsIFwiJG1vYnhcIiwgYWRtKTtcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZXMgJiYgaW5pdGlhbFZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFkbS51cGRhdGVBcnJheUxlbmd0aCgwLCBpbml0aWFsVmFsdWVzLmxlbmd0aCk7XG4gICAgICAgICAgICBhZG0udmFsdWVzID0gaW5pdGlhbFZhbHVlcy5tYXAoYWRtLm1ha2VSZWFjdGl2ZUFycmF5SXRlbSwgYWRtKTtcbiAgICAgICAgICAgIGFkbS5ub3RpZnlBcnJheVNwbGljZSgwLCBhZG0udmFsdWVzLnNsaWNlKCksIEVNUFRZX0FSUkFZKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFkbS52YWx1ZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2FmYXJpUHJvdG90eXBlU2V0dGVySW5oZXJpdGFuY2VCdWcpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhZG0uYXJyYXksIFwiMFwiLCBFTlRSWV8wKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLmludGVyY2VwdCA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRtb2J4LmludGVyY2VwdChoYW5kbGVyKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uIChsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgIGlmIChmaXJlSW1tZWRpYXRlbHkgPT09IHZvaWQgMCkgeyBmaXJlSW1tZWRpYXRlbHkgPSBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gdGhpcy4kbW9ieC5vYnNlcnZlKGxpc3RlbmVyLCBmaXJlSW1tZWRpYXRlbHkpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BsaWNlKDApO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gKG5ld0l0ZW1zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRtb2J4LnNwbGljZVdpdGhBcnJheSgwLCB0aGlzLiRtb2J4LnZhbHVlcy5sZW5ndGgsIG5ld0l0ZW1zKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUudG9KUyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xpY2UoKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b0pTKCk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLnBlZWsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRtb2J4LnZhbHVlcztcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uIChwcmVkaWNhdGUsIHRoaXNBcmcsIGZyb21JbmRleCkge1xuICAgICAgICBpZiAoZnJvbUluZGV4ID09PSB2b2lkIDApIHsgZnJvbUluZGV4ID0gMDsgfVxuICAgICAgICB0aGlzLiRtb2J4LmF0b20ucmVwb3J0T2JzZXJ2ZWQoKTtcbiAgICAgICAgdmFyIGl0ZW1zID0gdGhpcy4kbW9ieC52YWx1ZXMsIGwgPSBpdGVtcy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSBmcm9tSW5kZXg7IGkgPCBsOyBpKyspXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlLmNhbGwodGhpc0FyZywgaXRlbXNbaV0sIGksIHRoaXMpKVxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtc1tpXTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUuc3BsaWNlID0gZnVuY3Rpb24gKGluZGV4LCBkZWxldGVDb3VudCkge1xuICAgICAgICB2YXIgbmV3SXRlbXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIG5ld0l0ZW1zW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kbW9ieC5zcGxpY2VXaXRoQXJyYXkoaW5kZXgpO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRtb2J4LnNwbGljZVdpdGhBcnJheShpbmRleCwgZGVsZXRlQ291bnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiRtb2J4LnNwbGljZVdpdGhBcnJheShpbmRleCwgZGVsZXRlQ291bnQsIG5ld0l0ZW1zKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGl0ZW1zID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBpdGVtc1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYWRtID0gdGhpcy4kbW9ieDtcbiAgICAgICAgYWRtLnNwbGljZVdpdGhBcnJheShhZG0udmFsdWVzLmxlbmd0aCwgMCwgaXRlbXMpO1xuICAgICAgICByZXR1cm4gYWRtLnZhbHVlcy5sZW5ndGg7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BsaWNlKE1hdGgubWF4KHRoaXMuJG1vYngudmFsdWVzLmxlbmd0aCAtIDEsIDApLCAxKVswXTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNwbGljZSgwLCAxKVswXTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGl0ZW1zID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBpdGVtc1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYWRtID0gdGhpcy4kbW9ieDtcbiAgICAgICAgYWRtLnNwbGljZVdpdGhBcnJheSgwLCAwLCBpdGVtcyk7XG4gICAgICAgIHJldHVybiBhZG0udmFsdWVzLmxlbmd0aDtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUucmV2ZXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy4kbW9ieC5hdG9tLnJlcG9ydE9ic2VydmVkKCk7XG4gICAgICAgIHZhciBjbG9uZSA9IHRoaXMuc2xpY2UoKTtcbiAgICAgICAgcmV0dXJuIGNsb25lLnJldmVyc2UuYXBwbHkoY2xvbmUsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLnNvcnQgPSBmdW5jdGlvbiAoY29tcGFyZUZuKSB7XG4gICAgICAgIHRoaXMuJG1vYnguYXRvbS5yZXBvcnRPYnNlcnZlZCgpO1xuICAgICAgICB2YXIgY2xvbmUgPSB0aGlzLnNsaWNlKCk7XG4gICAgICAgIHJldHVybiBjbG9uZS5zb3J0LmFwcGx5KGNsb25lLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGlkeCA9IHRoaXMuJG1vYngudmFsdWVzLmluZGV4T2YodmFsdWUpO1xuICAgICAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJbbW9ieC5hcnJheV0gXCIgKyBBcnJheS5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkodGhpcy4kbW9ieC52YWx1ZXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJbbW9ieC5hcnJheV0gXCIgKyBBcnJheS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcuYXBwbHkodGhpcy4kbW9ieC52YWx1ZXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICByZXR1cm4gT2JzZXJ2YWJsZUFycmF5O1xufShTdHViQXJyYXkpKTtcbmRlY2xhcmVJdGVyYXRvcihPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGFycmF5QXNJdGVyYXRvcih0aGlzLnNsaWNlKCkpO1xufSk7XG5tYWtlTm9uRW51bWVyYWJsZShPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLCBbXG4gICAgXCJjb25zdHJ1Y3RvclwiLFxuICAgIFwib2JzZXJ2ZVwiLFxuICAgIFwiY2xlYXJcIixcbiAgICBcInJlcGxhY2VcIixcbiAgICBcInRvSlNPTlwiLFxuICAgIFwicGVla1wiLFxuICAgIFwiZmluZFwiLFxuICAgIFwic3BsaWNlXCIsXG4gICAgXCJwdXNoXCIsXG4gICAgXCJwb3BcIixcbiAgICBcInNoaWZ0XCIsXG4gICAgXCJ1bnNoaWZ0XCIsXG4gICAgXCJyZXZlcnNlXCIsXG4gICAgXCJzb3J0XCIsXG4gICAgXCJyZW1vdmVcIixcbiAgICBcInRvU3RyaW5nXCIsXG4gICAgXCJ0b0xvY2FsZVN0cmluZ1wiXG5dKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLCBcImxlbmd0aFwiLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kbW9ieC5nZXRBcnJheUxlbmd0aCgpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAobmV3TGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuJG1vYnguc2V0QXJyYXlMZW5ndGgobmV3TGVuZ3RoKTtcbiAgICB9XG59KTtcbltcbiAgICBcImNvbmNhdFwiLFxuICAgIFwiZXZlcnlcIixcbiAgICBcImZpbHRlclwiLFxuICAgIFwiZm9yRWFjaFwiLFxuICAgIFwiaW5kZXhPZlwiLFxuICAgIFwiam9pblwiLFxuICAgIFwibGFzdEluZGV4T2ZcIixcbiAgICBcIm1hcFwiLFxuICAgIFwicmVkdWNlXCIsXG4gICAgXCJyZWR1Y2VSaWdodFwiLFxuICAgIFwic2xpY2VcIixcbiAgICBcInNvbWVcIlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChmdW5jTmFtZSkge1xuICAgIHZhciBiYXNlRnVuYyA9IEFycmF5LnByb3RvdHlwZVtmdW5jTmFtZV07XG4gICAgYWRkSGlkZGVuUHJvcChPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLCBmdW5jTmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLiRtb2J4LmF0b20ucmVwb3J0T2JzZXJ2ZWQoKTtcbiAgICAgICAgcmV0dXJuIGJhc2VGdW5jLmFwcGx5KHRoaXMuJG1vYngudmFsdWVzLCBhcmd1bWVudHMpO1xuICAgIH0pO1xufSk7XG52YXIgRU5UUllfMCA9IHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgc2V0OiBjcmVhdGVBcnJheVNldHRlcigwKSxcbiAgICBnZXQ6IGNyZWF0ZUFycmF5R2V0dGVyKDApXG59O1xuZnVuY3Rpb24gY3JlYXRlQXJyYXlCdWZmZXJJdGVtKGluZGV4KSB7XG4gICAgdmFyIHNldCA9IGNyZWF0ZUFycmF5U2V0dGVyKGluZGV4KTtcbiAgICB2YXIgZ2V0ID0gY3JlYXRlQXJyYXlHZXR0ZXIoaW5kZXgpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLCBcIlwiICsgaW5kZXgsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgc2V0OiBzZXQsIGdldDogZ2V0XG4gICAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVBcnJheVNldHRlcihpbmRleCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgICAgdmFyIGFkbSA9IHRoaXMuJG1vYng7XG4gICAgICAgIHZhciB2YWx1ZXMgPSBhZG0udmFsdWVzO1xuICAgICAgICBhc3NlcnRVbndyYXBwZWQobmV3VmFsdWUsIFwiTW9kaWZpZXJzIGNhbm5vdCBiZSB1c2VkIG9uIGFycmF5IHZhbHVlcy4gRm9yIG5vbi1yZWFjdGl2ZSBhcnJheSB2YWx1ZXMgdXNlIG1ha2VSZWFjdGl2ZShhc0ZsYXQoYXJyYXkpKS5cIik7XG4gICAgICAgIGlmIChpbmRleCA8IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNoZWNrSWZTdGF0ZU1vZGlmaWNhdGlvbnNBcmVBbGxvd2VkKCk7XG4gICAgICAgICAgICB2YXIgb2xkVmFsdWUgPSB2YWx1ZXNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGhhc0ludGVyY2VwdG9ycyhhZG0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoYW5nZSA9IGludGVyY2VwdENoYW5nZShhZG0sIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBhZG0uYXJyYXksXG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCwgbmV3VmFsdWU6IG5ld1ZhbHVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGFuZ2UpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IGNoYW5nZS5uZXdWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld1ZhbHVlID0gYWRtLm1ha2VSZWFjdGl2ZUFycmF5SXRlbShuZXdWYWx1ZSk7XG4gICAgICAgICAgICB2YXIgY2hhbmdlZCA9IChhZG0ubW9kZSA9PT0gVmFsdWVNb2RlLlN0cnVjdHVyZSkgPyAhZGVlcEVxdWFscyhvbGRWYWx1ZSwgbmV3VmFsdWUpIDogb2xkVmFsdWUgIT09IG5ld1ZhbHVlO1xuICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgYWRtLm5vdGlmeUFycmF5Q2hpbGRVcGRhdGUoaW5kZXgsIG5ld1ZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPT09IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFkbS5zcGxpY2VXaXRoQXJyYXkoaW5kZXgsIDAsIFtuZXdWYWx1ZV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlttb2J4LmFycmF5XSBJbmRleCBvdXQgb2YgYm91bmRzLCBcIiArIGluZGV4ICsgXCIgaXMgbGFyZ2VyIHRoYW4gXCIgKyB2YWx1ZXMubGVuZ3RoKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlQXJyYXlHZXR0ZXIoaW5kZXgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW1wbCA9IHRoaXMuJG1vYng7XG4gICAgICAgIGlmIChpbXBsICYmIGluZGV4IDwgaW1wbC52YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpbXBsLmF0b20ucmVwb3J0T2JzZXJ2ZWQoKTtcbiAgICAgICAgICAgIHJldHVybiBpbXBsLnZhbHVlc1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKFwiW21vYnguYXJyYXldIEF0dGVtcHQgdG8gcmVhZCBhbiBhcnJheSBpbmRleCAoXCIgKyBpbmRleCArIFwiKSB0aGF0IGlzIG91dCBvZiBib3VuZHMgKFwiICsgaW1wbC52YWx1ZXMubGVuZ3RoICsgXCIpLiBQbGVhc2UgY2hlY2sgbGVuZ3RoIGZpcnN0LiBPdXQgb2YgYm91bmQgaW5kaWNlcyB3aWxsIG5vdCBiZSB0cmFja2VkIGJ5IE1vYlhcIik7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHJlc2VydmVBcnJheUJ1ZmZlcihtYXgpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IE9CU0VSVkFCTEVfQVJSQVlfQlVGRkVSX1NJWkU7IGluZGV4IDwgbWF4OyBpbmRleCsrKVxuICAgICAgICBjcmVhdGVBcnJheUJ1ZmZlckl0ZW0oaW5kZXgpO1xuICAgIE9CU0VSVkFCTEVfQVJSQVlfQlVGRkVSX1NJWkUgPSBtYXg7XG59XG5yZXNlcnZlQXJyYXlCdWZmZXIoMTAwMCk7XG5mdW5jdGlvbiBjcmVhdGVPYnNlcnZhYmxlQXJyYXkoaW5pdGlhbFZhbHVlcywgbW9kZSwgbmFtZSkge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZUFycmF5KGluaXRpYWxWYWx1ZXMsIG1vZGUsIG5hbWUpO1xufVxuZnVuY3Rpb24gZmFzdEFycmF5KGluaXRpYWxWYWx1ZXMpIHtcbiAgICBkZXByZWNhdGVkKFwiZmFzdEFycmF5IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYG9ic2VydmFibGUoYXNGbGF0KFtdKSlgXCIpO1xuICAgIHJldHVybiBjcmVhdGVPYnNlcnZhYmxlQXJyYXkoaW5pdGlhbFZhbHVlcywgVmFsdWVNb2RlLkZsYXQsIG51bGwpO1xufVxuZXhwb3J0cy5mYXN0QXJyYXkgPSBmYXN0QXJyYXk7XG5mdW5jdGlvbiBpc09ic2VydmFibGVBcnJheSh0aGluZykge1xuICAgIHJldHVybiB0aGluZyBpbnN0YW5jZW9mIE9ic2VydmFibGVBcnJheTtcbn1cbmV4cG9ydHMuaXNPYnNlcnZhYmxlQXJyYXkgPSBpc09ic2VydmFibGVBcnJheTtcbnZhciBPYnNlcnZhYmxlTWFwTWFya2VyID0ge307XG52YXIgT2JzZXJ2YWJsZU1hcCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT2JzZXJ2YWJsZU1hcChpbml0aWFsRGF0YSwgdmFsdWVNb2RlRnVuYykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLiRtb2J4ID0gT2JzZXJ2YWJsZU1hcE1hcmtlcjtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuICAgICAgICB0aGlzLl9oYXNNYXAgPSB7fTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJPYnNlcnZhYmxlTWFwQFwiICsgZ2V0TmV4dElkKCk7XG4gICAgICAgIHRoaXMuX2tleXMgPSBuZXcgT2JzZXJ2YWJsZUFycmF5KG51bGwsIFZhbHVlTW9kZS5SZWZlcmVuY2UsIHRoaXMubmFtZSArIFwiLmtleXMoKVwiLCB0cnVlKTtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRvcnMgPSBudWxsO1xuICAgICAgICB0aGlzLmNoYW5nZUxpc3RlbmVycyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3ZhbHVlTW9kZSA9IGdldFZhbHVlTW9kZUZyb21Nb2RpZmllckZ1bmModmFsdWVNb2RlRnVuYyk7XG4gICAgICAgIGlmICh0aGlzLl92YWx1ZU1vZGUgPT09IFZhbHVlTW9kZS5GbGF0KVxuICAgICAgICAgICAgdGhpcy5fdmFsdWVNb2RlID0gVmFsdWVNb2RlLlJlZmVyZW5jZTtcbiAgICAgICAgYWxsb3dTdGF0ZUNoYW5nZXModHJ1ZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QoaW5pdGlhbERhdGEpKVxuICAgICAgICAgICAgICAgIF90aGlzLm1lcmdlKGluaXRpYWxEYXRhKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5pdGlhbERhdGEpKVxuICAgICAgICAgICAgICAgIGluaXRpYWxEYXRhLmZvckVhY2goZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLl9oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5fZGF0YVtrZXldICE9PSBcInVuZGVmaW5lZFwiO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZEtleShrZXkpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBrZXkgPSBcIlwiICsga2V5O1xuICAgICAgICBpZiAodGhpcy5faGFzTWFwW2tleV0pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faGFzTWFwW2tleV0uZ2V0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVIYXNNYXBFbnRyeShrZXksIGZhbHNlKS5nZXQoKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0VmFsaWRLZXkoa2V5KTtcbiAgICAgICAga2V5ID0gXCJcIiArIGtleTtcbiAgICAgICAgdmFyIGhhc0tleSA9IHRoaXMuX2hhcyhrZXkpO1xuICAgICAgICBhc3NlcnRVbndyYXBwZWQodmFsdWUsIFwiW21vYngubWFwLnNldF0gRXhwZWN0ZWQgdW53cmFwcGVkIHZhbHVlIHRvIGJlIGluc2VydGVkIHRvIGtleSAnXCIgKyBrZXkgKyBcIicuIElmIHlvdSBuZWVkIHRvIHVzZSBtb2RpZmllcnMgcGFzcyB0aGVtIGFzIHNlY29uZCBhcmd1bWVudCB0byB0aGUgY29uc3RydWN0b3JcIik7XG4gICAgICAgIGlmIChoYXNJbnRlcmNlcHRvcnModGhpcykpIHtcbiAgICAgICAgICAgIHZhciBjaGFuZ2UgPSBpbnRlcmNlcHRDaGFuZ2UodGhpcywge1xuICAgICAgICAgICAgICAgIHR5cGU6IGhhc0tleSA/IFwidXBkYXRlXCIgOiBcImFkZFwiLFxuICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcyxcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgbmFtZToga2V5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghY2hhbmdlKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHZhbHVlID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNLZXkpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVZhbHVlKGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYWRkVmFsdWUoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5hc3NlcnRWYWxpZEtleShrZXkpO1xuICAgICAgICBrZXkgPSBcIlwiICsga2V5O1xuICAgICAgICBpZiAoaGFzSW50ZXJjZXB0b3JzKHRoaXMpKSB7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gaW50ZXJjZXB0Q2hhbmdlKHRoaXMsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImRlbGV0ZVwiLFxuICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcyxcbiAgICAgICAgICAgICAgICBuYW1lOiBrZXlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFjaGFuZ2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9oYXMoa2V5KSkge1xuICAgICAgICAgICAgdmFyIG5vdGlmeVNweSA9IGlzU3B5RW5hYmxlZCgpO1xuICAgICAgICAgICAgdmFyIG5vdGlmeSA9IGhhc0xpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgICAgIHZhciBjaGFuZ2UgPSBub3RpZnkgfHwgbm90aWZ5U3B5ID8ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiZGVsZXRlXCIsXG4gICAgICAgICAgICAgICAgb2JqZWN0OiB0aGlzLFxuICAgICAgICAgICAgICAgIG9sZFZhbHVlOiB0aGlzLl9kYXRhW2tleV0udmFsdWUsXG4gICAgICAgICAgICAgICAgbmFtZToga2V5XG4gICAgICAgICAgICB9IDogbnVsbDtcbiAgICAgICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICAgICAgc3B5UmVwb3J0U3RhcnQoY2hhbmdlKTtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5fa2V5cy5yZW1vdmUoa2V5KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5fdXBkYXRlSGFzTWFwRW50cnkoa2V5LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGUgPSBfdGhpcy5fZGF0YVtrZXldO1xuICAgICAgICAgICAgICAgIG9ic2VydmFibGUuc2V0TmV3VmFsdWUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5fZGF0YVtrZXldID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAobm90aWZ5KVxuICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyh0aGlzLCBjaGFuZ2UpO1xuICAgICAgICAgICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgICAgICAgICBzcHlSZXBvcnRFbmQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuX3VwZGF0ZUhhc01hcEVudHJ5ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5faGFzTWFwW2tleV07XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgZW50cnkuc2V0TmV3VmFsdWUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLl9oYXNNYXBba2V5XSA9IG5ldyBPYnNlcnZhYmxlVmFsdWUodmFsdWUsIFZhbHVlTW9kZS5SZWZlcmVuY2UsIHRoaXMubmFtZSArIFwiLlwiICsga2V5ICsgXCI/XCIsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5fdXBkYXRlVmFsdWUgPSBmdW5jdGlvbiAobmFtZSwgbmV3VmFsdWUpIHtcbiAgICAgICAgdmFyIG9ic2VydmFibGUgPSB0aGlzLl9kYXRhW25hbWVdO1xuICAgICAgICBuZXdWYWx1ZSA9IG9ic2VydmFibGUucHJlcGFyZU5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSBVTkNIQU5HRUQpIHtcbiAgICAgICAgICAgIHZhciBub3RpZnlTcHkgPSBpc1NweUVuYWJsZWQoKTtcbiAgICAgICAgICAgIHZhciBub3RpZnkgPSBoYXNMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gbm90aWZ5IHx8IG5vdGlmeVNweSA/IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInVwZGF0ZVwiLFxuICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcyxcbiAgICAgICAgICAgICAgICBvbGRWYWx1ZTogb2JzZXJ2YWJsZS52YWx1ZSxcbiAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLCBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICAgICAgICAgIH0gOiBudWxsO1xuICAgICAgICAgICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgICAgICAgICBzcHlSZXBvcnRTdGFydChjaGFuZ2UpO1xuICAgICAgICAgICAgb2JzZXJ2YWJsZS5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICAgICAgICBpZiAobm90aWZ5KVxuICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyh0aGlzLCBjaGFuZ2UpO1xuICAgICAgICAgICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgICAgICAgICBzcHlSZXBvcnRFbmQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuX2FkZFZhbHVlID0gZnVuY3Rpb24gKG5hbWUsIG5ld1ZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRyYW5zYWN0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gX3RoaXMuX2RhdGFbbmFtZV0gPSBuZXcgT2JzZXJ2YWJsZVZhbHVlKG5ld1ZhbHVlLCBfdGhpcy5fdmFsdWVNb2RlLCBfdGhpcy5uYW1lICsgXCIuXCIgKyBuYW1lLCBmYWxzZSk7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IG9ic2VydmFibGUudmFsdWU7XG4gICAgICAgICAgICBfdGhpcy5fdXBkYXRlSGFzTWFwRW50cnkobmFtZSwgdHJ1ZSk7XG4gICAgICAgICAgICBfdGhpcy5fa2V5cy5wdXNoKG5hbWUpO1xuICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICAgICAgdmFyIG5vdGlmeVNweSA9IGlzU3B5RW5hYmxlZCgpO1xuICAgICAgICB2YXIgbm90aWZ5ID0gaGFzTGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICB2YXIgY2hhbmdlID0gbm90aWZ5IHx8IG5vdGlmeVNweSA/IHtcbiAgICAgICAgICAgIHR5cGU6IFwiYWRkXCIsXG4gICAgICAgICAgICBvYmplY3Q6IHRoaXMsXG4gICAgICAgICAgICBuYW1lOiBuYW1lLCBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICAgICAgfSA6IG51bGw7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRTdGFydChjaGFuZ2UpO1xuICAgICAgICBpZiAobm90aWZ5KVxuICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIGNoYW5nZSk7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRFbmQoKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAga2V5ID0gXCJcIiArIGtleTtcbiAgICAgICAgaWYgKHRoaXMuaGFzKGtleSkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVtrZXldLmdldCgpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5QXNJdGVyYXRvcih0aGlzLl9rZXlzLnNsaWNlKCkpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJyYXlBc0l0ZXJhdG9yKHRoaXMuX2tleXMubWFwKHRoaXMuZ2V0LCB0aGlzKSk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gYXJyYXlBc0l0ZXJhdG9yKHRoaXMuX2tleXMubWFwKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIFtrZXksIF90aGlzLmdldChrZXkpXTsgfSkpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmtleXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgX3RoaXMuZ2V0KGtleSksIGtleSk7IH0pO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUubWVyZ2UgPSBmdW5jdGlvbiAob3RoZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdHJhbnNhY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgT2JzZXJ2YWJsZU1hcClcbiAgICAgICAgICAgICAgICBvdGhlci5rZXlzKCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBfdGhpcy5zZXQoa2V5LCBvdGhlci5nZXQoa2V5KSk7IH0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG90aGVyKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIF90aGlzLnNldChrZXksIG90aGVyW2tleV0pOyB9KTtcbiAgICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRyYW5zYWN0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHVudHJhY2tlZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMua2V5cygpLmZvckVhY2goX3RoaXMuZGVsZXRlLCBfdGhpcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS50b0pTID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmVzID0ge307XG4gICAgICAgIHRoaXMua2V5cygpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gcmVzW2tleV0gPSBfdGhpcy5nZXQoa2V5KTsgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS50b0pzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBkZXByZWNhdGVkKFwidG9KcyBpcyBkZXByZWNhdGVkLCB1c2UgdG9KUyBpbnN0ZWFkXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy50b0pTKCk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvSlMoKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLmlzVmFsaWRLZXkgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT09IG51bGwgfHwga2V5ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSBcInN0cmluZ1wiICYmIHR5cGVvZiBrZXkgIT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGtleSAhPT0gXCJib29sZWFuXCIpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuYXNzZXJ0VmFsaWRLZXkgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkS2V5KGtleSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieC5tYXBdIEludmFsaWQga2V5OiAnXCIgKyBrZXkgKyBcIidcIik7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArIFwiW3sgXCIgKyB0aGlzLmtleXMoKS5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gKGtleSArIFwiOiBcIiArIChcIlwiICsgX3RoaXMuZ2V0KGtleSkpKTsgfSkuam9pbihcIiwgXCIpICsgXCIgfV1cIjtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbiAobGlzdGVuZXIsIGZpcmVJbW1lZGlhdGVseSkge1xuICAgICAgICBpbnZhcmlhbnQoZmlyZUltbWVkaWF0ZWx5ICE9PSB0cnVlLCBcImBvYnNlcnZlYCBkb2Vzbid0IHN1cHBvcnQgdGhlIGZpcmUgaW1tZWRpYXRlbHkgcHJvcGVydHkgZm9yIG9ic2VydmFibGUgbWFwcy5cIik7XG4gICAgICAgIHJldHVybiByZWdpc3Rlckxpc3RlbmVyKHRoaXMsIGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLmludGVyY2VwdCA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiByZWdpc3RlckludGVyY2VwdG9yKHRoaXMsIGhhbmRsZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIE9ic2VydmFibGVNYXA7XG59KCkpO1xuZXhwb3J0cy5PYnNlcnZhYmxlTWFwID0gT2JzZXJ2YWJsZU1hcDtcbmRlY2xhcmVJdGVyYXRvcihPYnNlcnZhYmxlTWFwLnByb3RvdHlwZSwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbn0pO1xuZnVuY3Rpb24gbWFwKGluaXRpYWxWYWx1ZXMsIHZhbHVlTW9kaWZpZXIpIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGVNYXAoaW5pdGlhbFZhbHVlcywgdmFsdWVNb2RpZmllcik7XG59XG5leHBvcnRzLm1hcCA9IG1hcDtcbmZ1bmN0aW9uIGlzT2JzZXJ2YWJsZU1hcCh0aGluZykge1xuICAgIHJldHVybiB0aGluZyBpbnN0YW5jZW9mIE9ic2VydmFibGVNYXA7XG59XG5leHBvcnRzLmlzT2JzZXJ2YWJsZU1hcCA9IGlzT2JzZXJ2YWJsZU1hcDtcbnZhciBPYnNlcnZhYmxlT2JqZWN0QWRtaW5pc3RyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE9ic2VydmFibGVPYmplY3RBZG1pbmlzdHJhdGlvbih0YXJnZXQsIG5hbWUsIG1vZGUpIHtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgICAgIHRoaXMuY2hhbmdlTGlzdGVuZXJzID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRvcnMgPSBudWxsO1xuICAgIH1cbiAgICBPYnNlcnZhYmxlT2JqZWN0QWRtaW5pc3RyYXRpb24ucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGZpcmVJbW1lZGlhdGVseSkge1xuICAgICAgICBpbnZhcmlhbnQoZmlyZUltbWVkaWF0ZWx5ICE9PSB0cnVlLCBcImBvYnNlcnZlYCBkb2Vzbid0IHN1cHBvcnQgdGhlIGZpcmUgaW1tZWRpYXRlbHkgcHJvcGVydHkgZm9yIG9ic2VydmFibGUgb2JqZWN0cy5cIik7XG4gICAgICAgIHJldHVybiByZWdpc3Rlckxpc3RlbmVyKHRoaXMsIGNhbGxiYWNrKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVPYmplY3RBZG1pbmlzdHJhdGlvbi5wcm90b3R5cGUuaW50ZXJjZXB0ID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVySW50ZXJjZXB0b3IodGhpcywgaGFuZGxlcik7XG4gICAgfTtcbiAgICByZXR1cm4gT2JzZXJ2YWJsZU9iamVjdEFkbWluaXN0cmF0aW9uO1xufSgpKTtcbmZ1bmN0aW9uIGFzT2JzZXJ2YWJsZU9iamVjdCh0YXJnZXQsIG5hbWUsIG1vZGUpIHtcbiAgICBpZiAobW9kZSA9PT0gdm9pZCAwKSB7IG1vZGUgPSBWYWx1ZU1vZGUuUmVjdXJzaXZlOyB9XG4gICAgaWYgKGlzT2JzZXJ2YWJsZU9iamVjdCh0YXJnZXQpKVxuICAgICAgICByZXR1cm4gdGFyZ2V0LiRtb2J4O1xuICAgIGlmICghaXNQbGFpbk9iamVjdCh0YXJnZXQpKVxuICAgICAgICBuYW1lID0gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUgKyBcIkBcIiArIGdldE5leHRJZCgpO1xuICAgIGlmICghbmFtZSlcbiAgICAgICAgbmFtZSA9IFwiT2JzZXJ2YWJsZU9iamVjdEBcIiArIGdldE5leHRJZCgpO1xuICAgIHZhciBhZG0gPSBuZXcgT2JzZXJ2YWJsZU9iamVjdEFkbWluaXN0cmF0aW9uKHRhcmdldCwgbmFtZSwgbW9kZSk7XG4gICAgYWRkSGlkZGVuRmluYWxQcm9wKHRhcmdldCwgXCIkbW9ieFwiLCBhZG0pO1xuICAgIHJldHVybiBhZG07XG59XG5mdW5jdGlvbiBzZXRPYnNlcnZhYmxlT2JqZWN0SW5zdGFuY2VQcm9wZXJ0eShhZG0sIHByb3BOYW1lLCB2YWx1ZSkge1xuICAgIGlmIChhZG0udmFsdWVzW3Byb3BOYW1lXSlcbiAgICAgICAgYWRtLnRhcmdldFtwcm9wTmFtZV0gPSB2YWx1ZTtcbiAgICBlbHNlXG4gICAgICAgIGRlZmluZU9ic2VydmFibGVQcm9wZXJ0eShhZG0sIHByb3BOYW1lLCB2YWx1ZSwgdHJ1ZSk7XG59XG5mdW5jdGlvbiBkZWZpbmVPYnNlcnZhYmxlUHJvcGVydHkoYWRtLCBwcm9wTmFtZSwgbmV3VmFsdWUsIGFzSW5zdGFuY2VQcm9wZXJ0eSkge1xuICAgIGlmIChhc0luc3RhbmNlUHJvcGVydHkpXG4gICAgICAgIGFzc2VydFByb3BlcnR5Q29uZmlndXJhYmxlKGFkbS50YXJnZXQsIHByb3BOYW1lKTtcbiAgICB2YXIgb2JzZXJ2YWJsZTtcbiAgICB2YXIgbmFtZSA9IGFkbS5uYW1lICsgXCIuXCIgKyBwcm9wTmFtZTtcbiAgICB2YXIgaXNDb21wdXRlZCA9IHRydWU7XG4gICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmIG5ld1ZhbHVlLmxlbmd0aCA9PT0gMCAmJiAhaXNBY3Rpb24obmV3VmFsdWUpKVxuICAgICAgICBvYnNlcnZhYmxlID0gbmV3IENvbXB1dGVkVmFsdWUobmV3VmFsdWUsIGFkbS50YXJnZXQsIGZhbHNlLCBuYW1lKTtcbiAgICBlbHNlIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIEFzU3RydWN0dXJlICYmIHR5cGVvZiBuZXdWYWx1ZS52YWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmIG5ld1ZhbHVlLnZhbHVlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgb2JzZXJ2YWJsZSA9IG5ldyBDb21wdXRlZFZhbHVlKG5ld1ZhbHVlLnZhbHVlLCBhZG0udGFyZ2V0LCB0cnVlLCBuYW1lKTtcbiAgICBlbHNlIHtcbiAgICAgICAgaXNDb21wdXRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoaGFzSW50ZXJjZXB0b3JzKGFkbSkpIHtcbiAgICAgICAgICAgIHZhciBjaGFuZ2UgPSBpbnRlcmNlcHRDaGFuZ2UoYWRtLCB7XG4gICAgICAgICAgICAgICAgb2JqZWN0OiBhZG0udGFyZ2V0LFxuICAgICAgICAgICAgICAgIG5hbWU6IHByb3BOYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYWRkXCIsXG4gICAgICAgICAgICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghY2hhbmdlKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIG9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZVZhbHVlKG5ld1ZhbHVlLCBhZG0ubW9kZSwgbmFtZSwgZmFsc2UpO1xuICAgICAgICBuZXdWYWx1ZSA9IG9ic2VydmFibGUudmFsdWU7XG4gICAgfVxuICAgIGFkbS52YWx1ZXNbcHJvcE5hbWVdID0gb2JzZXJ2YWJsZTtcbiAgICBpZiAoYXNJbnN0YW5jZVByb3BlcnR5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhZG0udGFyZ2V0LCBwcm9wTmFtZSwgaXNDb21wdXRlZCA/IGdlbmVyYXRlQ29tcHV0ZWRQcm9wQ29uZmlnKHByb3BOYW1lKSA6IGdlbmVyYXRlT2JzZXJ2YWJsZVByb3BDb25maWcocHJvcE5hbWUpKTtcbiAgICB9XG4gICAgaWYgKCFpc0NvbXB1dGVkKVxuICAgICAgICBub3RpZnlQcm9wZXJ0eUFkZGl0aW9uKGFkbSwgYWRtLnRhcmdldCwgcHJvcE5hbWUsIG5ld1ZhbHVlKTtcbn1cbnZhciBvYnNlcnZhYmxlUHJvcGVydHlDb25maWdzID0ge307XG52YXIgY29tcHV0ZWRQcm9wZXJ0eUNvbmZpZ3MgPSB7fTtcbmZ1bmN0aW9uIGdlbmVyYXRlT2JzZXJ2YWJsZVByb3BDb25maWcocHJvcE5hbWUpIHtcbiAgICB2YXIgY29uZmlnID0gb2JzZXJ2YWJsZVByb3BlcnR5Q29uZmlnc1twcm9wTmFtZV07XG4gICAgaWYgKGNvbmZpZylcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICByZXR1cm4gb2JzZXJ2YWJsZVByb3BlcnR5Q29uZmlnc1twcm9wTmFtZV0gPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4kbW9ieC52YWx1ZXNbcHJvcE5hbWVdLmdldCgpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICBzZXRQcm9wZXJ0eVZhbHVlKHRoaXMsIHByb3BOYW1lLCB2KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBnZW5lcmF0ZUNvbXB1dGVkUHJvcENvbmZpZyhwcm9wTmFtZSkge1xuICAgIHZhciBjb25maWcgPSBjb21wdXRlZFByb3BlcnR5Q29uZmlnc1twcm9wTmFtZV07XG4gICAgaWYgKGNvbmZpZylcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICByZXR1cm4gY29tcHV0ZWRQcm9wZXJ0eUNvbmZpZ3NbcHJvcE5hbWVdID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiRtb2J4LnZhbHVlc1twcm9wTmFtZV0uZ2V0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogdGhyb3dpbmdDb21wdXRlZFZhbHVlU2V0dGVyXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHNldFByb3BlcnR5VmFsdWUoaW5zdGFuY2UsIG5hbWUsIG5ld1ZhbHVlKSB7XG4gICAgdmFyIGFkbSA9IGluc3RhbmNlLiRtb2J4O1xuICAgIHZhciBvYnNlcnZhYmxlID0gYWRtLnZhbHVlc1tuYW1lXTtcbiAgICBpZiAoaGFzSW50ZXJjZXB0b3JzKGFkbSkpIHtcbiAgICAgICAgdmFyIGNoYW5nZSA9IGludGVyY2VwdENoYW5nZShhZG0sIHtcbiAgICAgICAgICAgIHR5cGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgICBvYmplY3Q6IGluc3RhbmNlLFxuICAgICAgICAgICAgbmFtZTogbmFtZSwgbmV3VmFsdWU6IG5ld1ZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWNoYW5nZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbmV3VmFsdWUgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgfVxuICAgIG5ld1ZhbHVlID0gb2JzZXJ2YWJsZS5wcmVwYXJlTmV3VmFsdWUobmV3VmFsdWUpO1xuICAgIGlmIChuZXdWYWx1ZSAhPT0gVU5DSEFOR0VEKSB7XG4gICAgICAgIHZhciBub3RpZnkgPSBoYXNMaXN0ZW5lcnMoYWRtKTtcbiAgICAgICAgdmFyIG5vdGlmeVNweSA9IGlzU3B5RW5hYmxlZCgpO1xuICAgICAgICB2YXIgY2hhbmdlID0gbm90aWZ5TGlzdGVuZXJzIHx8IGhhc0xpc3RlbmVycyA/IHtcbiAgICAgICAgICAgIHR5cGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgICBvYmplY3Q6IGluc3RhbmNlLFxuICAgICAgICAgICAgb2xkVmFsdWU6IG9ic2VydmFibGUudmFsdWUsXG4gICAgICAgICAgICBuYW1lOiBuYW1lLCBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICAgICAgfSA6IG51bGw7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRTdGFydChjaGFuZ2UpO1xuICAgICAgICBvYnNlcnZhYmxlLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgaWYgKG5vdGlmeSlcbiAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyhhZG0sIGNoYW5nZSk7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRFbmQoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBub3RpZnlQcm9wZXJ0eUFkZGl0aW9uKGFkbSwgb2JqZWN0LCBuYW1lLCBuZXdWYWx1ZSkge1xuICAgIHZhciBub3RpZnkgPSBoYXNMaXN0ZW5lcnMoYWRtKTtcbiAgICB2YXIgbm90aWZ5U3B5ID0gaXNTcHlFbmFibGVkKCk7XG4gICAgdmFyIGNoYW5nZSA9IG5vdGlmeSB8fCBub3RpZnlTcHkgPyB7XG4gICAgICAgIHR5cGU6IFwiYWRkXCIsXG4gICAgICAgIG9iamVjdDogb2JqZWN0LCBuYW1lOiBuYW1lLCBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICB9IDogbnVsbDtcbiAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICBzcHlSZXBvcnRTdGFydChjaGFuZ2UpO1xuICAgIGlmIChub3RpZnkpXG4gICAgICAgIG5vdGlmeUxpc3RlbmVycyhhZG0sIGNoYW5nZSk7XG4gICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgc3B5UmVwb3J0RW5kKCk7XG59XG5mdW5jdGlvbiBpc09ic2VydmFibGVPYmplY3QodGhpbmcpIHtcbiAgICBpZiAodHlwZW9mIHRoaW5nID09PSBcIm9iamVjdFwiICYmIHRoaW5nICE9PSBudWxsKSB7XG4gICAgICAgIHJ1bkxhenlJbml0aWFsaXplcnModGhpbmcpO1xuICAgICAgICByZXR1cm4gdGhpbmcuJG1vYnggaW5zdGFuY2VvZiBPYnNlcnZhYmxlT2JqZWN0QWRtaW5pc3RyYXRpb247XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydHMuaXNPYnNlcnZhYmxlT2JqZWN0ID0gaXNPYnNlcnZhYmxlT2JqZWN0O1xudmFyIFVOQ0hBTkdFRCA9IHt9O1xudmFyIE9ic2VydmFibGVWYWx1ZSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE9ic2VydmFibGVWYWx1ZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBPYnNlcnZhYmxlVmFsdWUodmFsdWUsIG1vZGUsIG5hbWUsIG5vdGlmeVNweSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gdm9pZCAwKSB7IG5hbWUgPSBcIk9ic2VydmFibGVWYWx1ZUBcIiArIGdldE5leHRJZCgpOyB9XG4gICAgICAgIGlmIChub3RpZnlTcHkgPT09IHZvaWQgMCkgeyBub3RpZnlTcHkgPSB0cnVlOyB9XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIG5hbWUpO1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICB0aGlzLmhhc1VucmVwb3J0ZWRDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIF9hID0gZ2V0VmFsdWVNb2RlRnJvbVZhbHVlKHZhbHVlLCBWYWx1ZU1vZGUuUmVjdXJzaXZlKSwgY2hpbGRtb2RlID0gX2FbMF0sIHVud3JhcHBlZFZhbHVlID0gX2FbMV07XG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09IFZhbHVlTW9kZS5SZWN1cnNpdmUpXG4gICAgICAgICAgICB0aGlzLm1vZGUgPSBjaGlsZG1vZGU7XG4gICAgICAgIHRoaXMudmFsdWUgPSBtYWtlQ2hpbGRPYnNlcnZhYmxlKHVud3JhcHBlZFZhbHVlLCB0aGlzLm1vZGUsIHRoaXMubmFtZSk7XG4gICAgICAgIGlmIChub3RpZnlTcHkgJiYgaXNTcHlFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHNweVJlcG9ydCh7IHR5cGU6IFwiY3JlYXRlXCIsIG9iamVjdDogdGhpcywgbmV3VmFsdWU6IHRoaXMudmFsdWUgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgT2JzZXJ2YWJsZVZhbHVlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgbmV3VmFsdWUgPSB0aGlzLnByZXBhcmVOZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gVU5DSEFOR0VEKSB7XG4gICAgICAgICAgICB2YXIgbm90aWZ5U3B5ID0gaXNTcHlFbmFibGVkKCk7XG4gICAgICAgICAgICBpZiAobm90aWZ5U3B5KSB7XG4gICAgICAgICAgICAgICAgc3B5UmVwb3J0U3RhcnQoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInVwZGF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZSwgb2xkVmFsdWU6IG9sZFZhbHVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICAgICAgc3B5UmVwb3J0RW5kKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE9ic2VydmFibGVWYWx1ZS5wcm90b3R5cGUucHJlcGFyZU5ld1ZhbHVlID0gZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICAgIGFzc2VydFVud3JhcHBlZChuZXdWYWx1ZSwgXCJNb2RpZmllcnMgY2Fubm90IGJlIHVzZWQgb24gbm9uLWluaXRpYWwgdmFsdWVzLlwiKTtcbiAgICAgICAgY2hlY2tJZlN0YXRlTW9kaWZpY2F0aW9uc0FyZUFsbG93ZWQoKTtcbiAgICAgICAgaWYgKGhhc0ludGVyY2VwdG9ycyh0aGlzKSkge1xuICAgICAgICAgICAgdmFyIGNoYW5nZSA9IGludGVyY2VwdENoYW5nZSh0aGlzLCB7IG9iamVjdDogdGhpcywgdHlwZTogXCJ1cGRhdGVcIiwgbmV3VmFsdWU6IG5ld1ZhbHVlIH0pO1xuICAgICAgICAgICAgaWYgKCFjaGFuZ2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFVOQ0hBTkdFRDtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGFuZ2VkID0gdmFsdWVEaWRDaGFuZ2UodGhpcy5tb2RlID09PSBWYWx1ZU1vZGUuU3RydWN0dXJlLCB0aGlzLnZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgIGlmIChjaGFuZ2VkKVxuICAgICAgICAgICAgcmV0dXJuIG1ha2VDaGlsZE9ic2VydmFibGUobmV3VmFsdWUsIHRoaXMubW9kZSwgdGhpcy5uYW1lKTtcbiAgICAgICAgcmV0dXJuIFVOQ0hBTkdFRDtcbiAgICB9O1xuICAgIE9ic2VydmFibGVWYWx1ZS5wcm90b3R5cGUuc2V0TmV3VmFsdWUgPSBmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLnJlcG9ydENoYW5nZWQoKTtcbiAgICAgICAgaWYgKGhhc0xpc3RlbmVycyh0aGlzKSlcbiAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyh0aGlzLCBbbmV3VmFsdWUsIG9sZFZhbHVlXSk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlVmFsdWUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5yZXBvcnRPYnNlcnZlZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVWYWx1ZS5wcm90b3R5cGUuaW50ZXJjZXB0ID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVySW50ZXJjZXB0b3IodGhpcywgaGFuZGxlcik7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlVmFsdWUucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbiAobGlzdGVuZXIsIGZpcmVJbW1lZGlhdGVseSkge1xuICAgICAgICBpZiAoZmlyZUltbWVkaWF0ZWx5KVxuICAgICAgICAgICAgbGlzdGVuZXIodGhpcy52YWx1ZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVyTGlzdGVuZXIodGhpcywgbGlzdGVuZXIpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZVZhbHVlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZVZhbHVlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArIFwiW1wiICsgdGhpcy52YWx1ZSArIFwiXVwiO1xuICAgIH07XG4gICAgcmV0dXJuIE9ic2VydmFibGVWYWx1ZTtcbn0oQXRvbSkpO1xuZnVuY3Rpb24gZ2V0QXRvbSh0aGluZywgcHJvcGVydHkpIHtcbiAgICBpZiAodHlwZW9mIHRoaW5nID09PSBcIm9iamVjdFwiICYmIHRoaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChpc09ic2VydmFibGVBcnJheSh0aGluZykpIHtcbiAgICAgICAgICAgIGludmFyaWFudChwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkLCBcIkl0IGlzIG5vdCBwb3NzaWJsZSB0byBnZXQgaW5kZXggYXRvbXMgZnJvbSBhcnJheXNcIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpbmcuJG1vYnguYXRvbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNPYnNlcnZhYmxlTWFwKHRoaW5nKSkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEF0b20odGhpbmcuX2tleXMpO1xuICAgICAgICAgICAgdmFyIG9ic2VydmFibGVfMSA9IHRoaW5nLl9kYXRhW3Byb3BlcnR5XSB8fCB0aGluZy5faGFzTWFwW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGludmFyaWFudCghIW9ic2VydmFibGVfMSwgXCJ0aGUgZW50cnkgJ1wiICsgcHJvcGVydHkgKyBcIicgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG9ic2VydmFibGUgbWFwICdcIiArIGdldERlYnVnTmFtZSh0aGluZykgKyBcIidcIik7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZV8xO1xuICAgICAgICB9XG4gICAgICAgIHJ1bkxhenlJbml0aWFsaXplcnModGhpbmcpO1xuICAgICAgICBpZiAoaXNPYnNlcnZhYmxlT2JqZWN0KHRoaW5nKSkge1xuICAgICAgICAgICAgaW52YXJpYW50KCEhcHJvcGVydHksIFwicGxlYXNlIHNwZWNpZnkgYSBwcm9wZXJ0eVwiKTtcbiAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlXzIgPSB0aGluZy4kbW9ieC52YWx1ZXNbcHJvcGVydHldO1xuICAgICAgICAgICAgaW52YXJpYW50KCEhb2JzZXJ2YWJsZV8yLCBcIm5vIG9ic2VydmFibGUgcHJvcGVydHkgJ1wiICsgcHJvcGVydHkgKyBcIicgZm91bmQgb24gdGhlIG9ic2VydmFibGUgb2JqZWN0ICdcIiArIGdldERlYnVnTmFtZSh0aGluZykgKyBcIidcIik7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZV8yO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIEF0b20gfHwgdGhpbmcgaW5zdGFuY2VvZiBDb21wdXRlZFZhbHVlIHx8IHRoaW5nIGluc3RhbmNlb2YgUmVhY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGluZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgdGhpbmcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBpZiAodGhpbmcuJG1vYnggaW5zdGFuY2VvZiBSZWFjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaW5nLiRtb2J4O1xuICAgICAgICB9XG4gICAgfVxuICAgIGludmFyaWFudChmYWxzZSwgXCJDYW5ub3Qgb2J0YWluIGF0b20gZnJvbSBcIiArIHRoaW5nKTtcbn1cbmZ1bmN0aW9uIGdldEFkbWluaXN0cmF0aW9uKHRoaW5nLCBwcm9wZXJ0eSkge1xuICAgIGludmFyaWFudCh0aGluZywgXCJFeHBlY3Rpb24gc29tZSBvYmplY3RcIik7XG4gICAgaWYgKHByb3BlcnR5ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiBnZXRBZG1pbmlzdHJhdGlvbihnZXRBdG9tKHRoaW5nLCBwcm9wZXJ0eSkpO1xuICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIEF0b20gfHwgdGhpbmcgaW5zdGFuY2VvZiBDb21wdXRlZFZhbHVlIHx8IHRoaW5nIGluc3RhbmNlb2YgUmVhY3Rpb24pXG4gICAgICAgIHJldHVybiB0aGluZztcbiAgICBpZiAoaXNPYnNlcnZhYmxlTWFwKHRoaW5nKSlcbiAgICAgICAgcmV0dXJuIHRoaW5nO1xuICAgIHJ1bkxhenlJbml0aWFsaXplcnModGhpbmcpO1xuICAgIGlmICh0aGluZy4kbW9ieClcbiAgICAgICAgcmV0dXJuIHRoaW5nLiRtb2J4O1xuICAgIGludmFyaWFudChmYWxzZSwgXCJDYW5ub3Qgb2J0YWluIGFkbWluaXN0cmF0aW9uIGZyb20gXCIgKyB0aGluZyk7XG59XG5mdW5jdGlvbiBnZXREZWJ1Z05hbWUodGhpbmcsIHByb3BlcnR5KSB7XG4gICAgdmFyIG5hbWVkO1xuICAgIGlmIChwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICBuYW1lZCA9IGdldEF0b20odGhpbmcsIHByb3BlcnR5KTtcbiAgICBlbHNlIGlmIChpc09ic2VydmFibGVPYmplY3QodGhpbmcpIHx8IGlzT2JzZXJ2YWJsZU1hcCh0aGluZykpXG4gICAgICAgIG5hbWVkID0gZ2V0QWRtaW5pc3RyYXRpb24odGhpbmcpO1xuICAgIGVsc2VcbiAgICAgICAgbmFtZWQgPSBnZXRBdG9tKHRoaW5nKTtcbiAgICByZXR1cm4gbmFtZWQubmFtZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNsYXNzUHJvcGVydHlEZWNvcmF0b3Iob25Jbml0aWFsaXplLCBnZXQsIHNldCwgZW51bWVyYWJsZSwgYWxsb3dDdXN0b21Bcmd1bWVudHMpIHtcbiAgICBmdW5jdGlvbiBjbGFzc1Byb3BlcnR5RGVjb3JhdG9yKHRhcmdldCwga2V5LCBkZXNjcmlwdG9yLCBjdXN0b21BcmdzKSB7XG4gICAgICAgIGludmFyaWFudChhbGxvd0N1c3RvbUFyZ3VtZW50cyB8fCBxdWFja3NMaWtlQURlY29yYXRvcihhcmd1bWVudHMpLCBcIlRoaXMgZnVuY3Rpb24gaXMgYSBkZWNvcmF0b3IsIGJ1dCBpdCB3YXNuJ3QgaW52b2tlZCBsaWtlIGEgZGVjb3JhdG9yXCIpO1xuICAgICAgICBpZiAoIWRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIHZhciBuZXdEZXNjcmlwdG9yID0ge1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGVudW1lcmFibGUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX19tb2J4SW5pdGlhbGl6ZWRQcm9wcyB8fCB0aGlzLl9fbW9ieEluaXRpYWxpemVkUHJvcHNba2V5XSAhPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzY3JpcHRJbml0aWFsaXplUHJvcGVydHkodGhpcywga2V5LCB1bmRlZmluZWQsIG9uSW5pdGlhbGl6ZSwgY3VzdG9tQXJncywgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQuY2FsbCh0aGlzLCBrZXkpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX19tb2J4SW5pdGlhbGl6ZWRQcm9wcyB8fCB0aGlzLl9fbW9ieEluaXRpYWxpemVkUHJvcHNba2V5XSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXNjcmlwdEluaXRpYWxpemVQcm9wZXJ0eSh0aGlzLCBrZXksIHYsIG9uSW5pdGlhbGl6ZSwgY3VzdG9tQXJncywgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQuY2FsbCh0aGlzLCBrZXksIHYpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgbmV3RGVzY3JpcHRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3RGVzY3JpcHRvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0Lmhhc093blByb3BlcnR5KFwiX19tb2J4TGF6eUluaXRpYWxpemVyc1wiKSkge1xuICAgICAgICAgICAgICAgIGFkZEhpZGRlblByb3AodGFyZ2V0LCBcIl9fbW9ieExhenlJbml0aWFsaXplcnNcIiwgKHRhcmdldC5fX21vYnhMYXp5SW5pdGlhbGl6ZXJzICYmIHRhcmdldC5fX21vYnhMYXp5SW5pdGlhbGl6ZXJzLnNsaWNlKCkpIHx8IFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2YWx1ZV8xID0gZGVzY3JpcHRvci52YWx1ZSwgaW5pdGlhbGl6ZXJfMSA9IGRlc2NyaXB0b3IuaW5pdGlhbGl6ZXI7XG4gICAgICAgICAgICB0YXJnZXQuX19tb2J4TGF6eUluaXRpYWxpemVycy5wdXNoKGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIG9uSW5pdGlhbGl6ZShpbnN0YW5jZSwga2V5LCAoaW5pdGlhbGl6ZXJfMSA/IGluaXRpYWxpemVyXzEuY2FsbChpbnN0YW5jZSkgOiB2YWx1ZV8xKSwgY3VzdG9tQXJncywgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZW51bWVyYWJsZSwgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fX21vYnhEaWRSdW5MYXp5SW5pdGlhbGl6ZXJzICE9PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuTGF6eUluaXRpYWxpemVycyh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldC5jYWxsKHRoaXMsIGtleSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fbW9ieERpZFJ1bkxhenlJbml0aWFsaXplcnMgIT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5MYXp5SW5pdGlhbGl6ZXJzKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBzZXQuY2FsbCh0aGlzLCBrZXksIHYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbG93Q3VzdG9tQXJndW1lbnRzKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAocXVhY2tzTGlrZUFEZWNvcmF0b3IoYXJndW1lbnRzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NQcm9wZXJ0eURlY29yYXRvci5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgdmFyIG91dGVyQXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpIHsgcmV0dXJuIGNsYXNzUHJvcGVydHlEZWNvcmF0b3IodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IsIG91dGVyQXJncyk7IH07XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBjbGFzc1Byb3BlcnR5RGVjb3JhdG9yO1xufVxuZnVuY3Rpb24gdHlwZXNjcmlwdEluaXRpYWxpemVQcm9wZXJ0eShpbnN0YW5jZSwga2V5LCB2LCBvbkluaXRpYWxpemUsIGN1c3RvbUFyZ3MsIGJhc2VEZXNjcmlwdG9yKSB7XG4gICAgaWYgKCFpbnN0YW5jZS5oYXNPd25Qcm9wZXJ0eShcIl9fbW9ieEluaXRpYWxpemVkUHJvcHNcIikpXG4gICAgICAgIGFkZEhpZGRlblByb3AoaW5zdGFuY2UsIFwiX19tb2J4SW5pdGlhbGl6ZWRQcm9wc1wiLCB7fSk7XG4gICAgaW5zdGFuY2UuX19tb2J4SW5pdGlhbGl6ZWRQcm9wc1trZXldID0gdHJ1ZTtcbiAgICBvbkluaXRpYWxpemUoaW5zdGFuY2UsIGtleSwgdiwgY3VzdG9tQXJncywgYmFzZURlc2NyaXB0b3IpO1xufVxuZnVuY3Rpb24gcnVuTGF6eUluaXRpYWxpemVycyhpbnN0YW5jZSkge1xuICAgIGlmIChpbnN0YW5jZS5fX21vYnhEaWRSdW5MYXp5SW5pdGlhbGl6ZXJzID09PSB0cnVlKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKGluc3RhbmNlLl9fbW9ieExhenlJbml0aWFsaXplcnMpIHtcbiAgICAgICAgYWRkSGlkZGVuUHJvcChpbnN0YW5jZSwgXCJfX21vYnhEaWRSdW5MYXp5SW5pdGlhbGl6ZXJzXCIsIHRydWUpO1xuICAgICAgICBpbnN0YW5jZS5fX21vYnhEaWRSdW5MYXp5SW5pdGlhbGl6ZXJzICYmIGluc3RhbmNlLl9fbW9ieExhenlJbml0aWFsaXplcnMuZm9yRWFjaChmdW5jdGlvbiAoaW5pdGlhbGl6ZXIpIHsgcmV0dXJuIGluaXRpYWxpemVyKGluc3RhbmNlKTsgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gcXVhY2tzTGlrZUFEZWNvcmF0b3IoYXJncykge1xuICAgIHJldHVybiAoYXJncy5sZW5ndGggPT09IDIgfHwgYXJncy5sZW5ndGggPT09IDMpICYmIHR5cGVvZiBhcmdzWzFdID09PSBcInN0cmluZ1wiO1xufVxuZnVuY3Rpb24gaXRlcmF0b3JTeW1ib2woKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yKSB8fCBcIkBAaXRlcmF0b3JcIjtcbn1cbnZhciBJU19JVEVSQVRJTkdfTUFSS0VSID0gXCJfXyQkaXRlcmF0aW5nXCI7XG5mdW5jdGlvbiBhcnJheUFzSXRlcmF0b3IoYXJyYXkpIHtcbiAgICBpbnZhcmlhbnQoYXJyYXlbSVNfSVRFUkFUSU5HX01BUktFUl0gIT09IHRydWUsIFwiSWxsZWdhbCBzdGF0ZTogY2Fubm90IHJlY3ljbGUgYXJyYXkgYXMgaXRlcmF0b3JcIik7XG4gICAgYWRkSGlkZGVuRmluYWxQcm9wKGFycmF5LCBJU19JVEVSQVRJTkdfTUFSS0VSLCB0cnVlKTtcbiAgICB2YXIgaWR4ID0gLTE7XG4gICAgYWRkSGlkZGVuRmluYWxQcm9wKGFycmF5LCBcIm5leHRcIiwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgaWR4Kys7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiBpZHggPj0gdGhpcy5sZW5ndGgsXG4gICAgICAgICAgICB2YWx1ZTogaWR4IDwgdGhpcy5sZW5ndGggPyB0aGlzW2lkeF0gOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gYXJyYXk7XG59XG5mdW5jdGlvbiBkZWNsYXJlSXRlcmF0b3IocHJvdG90VHlwZSwgaXRlcmF0b3JGYWN0b3J5KSB7XG4gICAgYWRkSGlkZGVuRmluYWxQcm9wKHByb3RvdFR5cGUsIGl0ZXJhdG9yU3ltYm9sKCksIGl0ZXJhdG9yRmFjdG9yeSk7XG59XG52YXIgU2ltcGxlU2V0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTaW1wbGVTZXQoKSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuZGF0YSA9IHt9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2ltcGxlU2V0LnByb3RvdHlwZSwgXCJsZW5ndGhcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNpemU7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIFNpbXBsZVNldC5wcm90b3R5cGUuYXNBcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJlcyA9IG5ldyBBcnJheSh0aGlzLnNpemUpO1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgIHJlc1tpXSA9IHRoaXMuZGF0YVtrZXldO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICBTaW1wbGVTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgbSA9IHZhbHVlLl9fbWFwaWQ7XG4gICAgICAgIGlmICghKG0gaW4gdGhpcy5kYXRhKSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhW21dID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLnNpemUrKztcbiAgICAgICAgfVxuICAgIH07XG4gICAgU2ltcGxlU2V0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlLl9fbWFwaWQgaW4gdGhpcy5kYXRhKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5kYXRhW3ZhbHVlLl9fbWFwaWRdO1xuICAgICAgICAgICAgdGhpcy5zaXplLS07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBTaW1wbGVTZXQ7XG59KCkpO1xuZXhwb3J0cy5TaW1wbGVTZXQgPSBTaW1wbGVTZXQ7XG52YXIgU2ltcGxlRXZlbnRFbWl0dGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTaW1wbGVFdmVudEVtaXR0ZXIoKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0gW107XG4gICAgICAgIGRlcHJlY2F0ZWQoXCJleHRyYXMuU2ltcGxlRXZlbnRFbWl0dGVyIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlXCIpO1xuICAgIH1cbiAgICBTaW1wbGVFdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycy5zbGljZSgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsOyBpKyspXG4gICAgICAgICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIFNpbXBsZUV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpZHggPSBfdGhpcy5saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgICAgICBpZiAoaWR4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICBfdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU2ltcGxlRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGlzLm9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbigpO1xuICAgICAgICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gICAgfTtcbiAgICByZXR1cm4gU2ltcGxlRXZlbnRFbWl0dGVyO1xufSgpKTtcbmV4cG9ydHMuU2ltcGxlRXZlbnRFbWl0dGVyID0gU2ltcGxlRXZlbnRFbWl0dGVyO1xudmFyIEVNUFRZX0FSUkFZID0gW107XG5PYmplY3QuZnJlZXplKEVNUFRZX0FSUkFZKTtcbmZ1bmN0aW9uIGdldE5leHRJZCgpIHtcbiAgICByZXR1cm4gKytnbG9iYWxTdGF0ZS5tb2J4R3VpZDtcbn1cbmZ1bmN0aW9uIGludmFyaWFudChjaGVjaywgbWVzc2FnZSwgdGhpbmcpIHtcbiAgICBpZiAoIWNoZWNrKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieF0gSW52YXJpYW50IGZhaWxlZDogXCIgKyBtZXNzYWdlICsgKHRoaW5nID8gXCIgaW4gJ1wiICsgdGhpbmcgKyBcIidcIiA6IFwiXCIpKTtcbn1cbnZhciBkZXByZWNhdGVkTWVzc2FnZXMgPSBbXTtcbmZ1bmN0aW9uIGRlcHJlY2F0ZWQobXNnKSB7XG4gICAgaWYgKGRlcHJlY2F0ZWRNZXNzYWdlcy5pbmRleE9mKG1zZykgIT09IC0xKVxuICAgICAgICByZXR1cm47XG4gICAgZGVwcmVjYXRlZE1lc3NhZ2VzLnB1c2gobXNnKTtcbiAgICBjb25zb2xlLmVycm9yKFwiW21vYnhdIERlcHJlY2F0ZWQ6IFwiICsgbXNnKTtcbn1cbmZ1bmN0aW9uIG9uY2UoZnVuYykge1xuICAgIHZhciBpbnZva2VkID0gZmFsc2U7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGludm9rZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGludm9rZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59XG52YXIgbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbmZ1bmN0aW9uIHVuaXF1ZShsaXN0KSB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBpZiAocmVzLmluZGV4T2YoaXRlbSkgPT09IC0xKVxuICAgICAgICAgICAgcmVzLnB1c2goaXRlbSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGpvaW5TdHJpbmdzKHRoaW5ncywgbGltaXQsIHNlcGFyYXRvcikge1xuICAgIGlmIChsaW1pdCA9PT0gdm9pZCAwKSB7IGxpbWl0ID0gMTAwOyB9XG4gICAgaWYgKHNlcGFyYXRvciA9PT0gdm9pZCAwKSB7IHNlcGFyYXRvciA9IFwiIC0gXCI7IH1cbiAgICBpZiAoIXRoaW5ncylcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgdmFyIHNsaWNlZCA9IHRoaW5ncy5zbGljZSgwLCBsaW1pdCk7XG4gICAgcmV0dXJuIFwiXCIgKyBzbGljZWQuam9pbihzZXBhcmF0b3IpICsgKHRoaW5ncy5sZW5ndGggPiBsaW1pdCA/IFwiICguLi4gYW5kIFwiICsgKHRoaW5ncy5sZW5ndGggLSBsaW1pdCkgKyBcIm1vcmUpXCIgOiBcIlwiKTtcbn1cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IE9iamVjdC5wcm90b3R5cGU7XG59XG5mdW5jdGlvbiBvYmplY3RBc3NpZ24oKSB7XG4gICAgdmFyIHJlcyA9IGFyZ3VtZW50c1swXTtcbiAgICBmb3IgKHZhciBpID0gMSwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSlcbiAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJlc1trZXldID0gc291cmNlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiB2YWx1ZURpZENoYW5nZShjb21wYXJlU3RydWN0dXJhbCwgb2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgcmV0dXJuIGNvbXBhcmVTdHJ1Y3R1cmFsXG4gICAgICAgID8gIWRlZXBFcXVhbHMob2xkVmFsdWUsIG5ld1ZhbHVlKVxuICAgICAgICA6IG9sZFZhbHVlICE9PSBuZXdWYWx1ZTtcbn1cbmZ1bmN0aW9uIG1ha2VOb25FbnVtZXJhYmxlKG9iamVjdCwgcHJvcE5hbWVzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWRkSGlkZGVuUHJvcChvYmplY3QsIHByb3BOYW1lc1tpXSwgb2JqZWN0W3Byb3BOYW1lc1tpXV0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZEhpZGRlblByb3Aob2JqZWN0LCBwcm9wTmFtZSwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wTmFtZSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSk7XG59XG5mdW5jdGlvbiBhZGRIaWRkZW5GaW5hbFByb3Aob2JqZWN0LCBwcm9wTmFtZSwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wTmFtZSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGlzUHJvcGVydHlDb25maWd1cmFibGUob2JqZWN0LCBwcm9wKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcCk7XG4gICAgcmV0dXJuICFkZXNjcmlwdG9yIHx8IChkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSAhPT0gZmFsc2UgJiYgZGVzY3JpcHRvci53cml0YWJsZSAhPT0gZmFsc2UpO1xufVxuZnVuY3Rpb24gYXNzZXJ0UHJvcGVydHlDb25maWd1cmFibGUob2JqZWN0LCBwcm9wKSB7XG4gICAgaW52YXJpYW50KGlzUHJvcGVydHlDb25maWd1cmFibGUob2JqZWN0LCBwcm9wKSwgXCJDYW5ub3QgbWFrZSBwcm9wZXJ0eSAnXCIgKyBwcm9wICsgXCInIG9ic2VydmFibGUsIGl0IGlzIG5vdCBjb25maWd1cmFibGUgYW5kIHdyaXRhYmxlIGluIHRoZSB0YXJnZXQgb2JqZWN0XCIpO1xufVxuZnVuY3Rpb24gZ2V0RW51bWVyYWJsZUtleXMob2JqKSB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopXG4gICAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGRlZXBFcXVhbHMoYSwgYikge1xuICAgIGlmIChhID09PSBudWxsICYmIGIgPT09IG51bGwpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgYUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGEpIHx8IGlzT2JzZXJ2YWJsZUFycmF5KGEpO1xuICAgIGlmIChhSXNBcnJheSAhPT0gKEFycmF5LmlzQXJyYXkoYikgfHwgaXNPYnNlcnZhYmxlQXJyYXkoYikpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYUlzQXJyYXkpIHtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICBpZiAoIWRlZXBFcXVhbHMoYVtpXSwgYltpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGEgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGIgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGdldEVudW1lcmFibGVLZXlzKGEpLmxlbmd0aCAhPT0gZ2V0RW51bWVyYWJsZUtleXMoYikubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBwcm9wIGluIGEpIHtcbiAgICAgICAgICAgIGlmICghKHByb3AgaW4gYikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFkZWVwRXF1YWxzKGFbcHJvcF0sIGJbcHJvcF0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGEgPT09IGI7XG59XG52YXIgX2E7XG4iXX0=
},{}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsImxpYi9tb2J4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcblwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG5yZWdpc3Rlckdsb2JhbHMoKTtcbmV4cG9ydHMuZXh0cmFzID0ge1xuICAgIGFsbG93U3RhdGVDaGFuZ2VzOiBhbGxvd1N0YXRlQ2hhbmdlcyxcbiAgICBnZXRBdG9tOiBnZXRBdG9tLFxuICAgIGdldERlYnVnTmFtZTogZ2V0RGVidWdOYW1lLFxuICAgIGdldERlcGVuZGVuY3lUcmVlOiBnZXREZXBlbmRlbmN5VHJlZSxcbiAgICBnZXRPYnNlcnZlclRyZWU6IGdldE9ic2VydmVyVHJlZSxcbiAgICBpc0NvbXB1dGluZ0Rlcml2YXRpb246IGlzQ29tcHV0aW5nRGVyaXZhdGlvbixcbiAgICBpc1NweUVuYWJsZWQ6IGlzU3B5RW5hYmxlZCxcbiAgICByZXNldEdsb2JhbFN0YXRlOiByZXNldEdsb2JhbFN0YXRlLFxuICAgIHNweVJlcG9ydDogc3B5UmVwb3J0LFxuICAgIHNweVJlcG9ydEVuZDogc3B5UmVwb3J0RW5kLFxuICAgIHNweVJlcG9ydFN0YXJ0OiBzcHlSZXBvcnRTdGFydCxcbiAgICB0cmFja1RyYW5zaXRpb25zOiB0cmFja1RyYW5zaXRpb25zXG59O1xuZXhwb3J0cy5fID0ge1xuICAgIGdldEFkbWluaXN0cmF0aW9uOiBnZXRBZG1pbmlzdHJhdGlvbixcbiAgICByZXNldEdsb2JhbFN0YXRlOiByZXNldEdsb2JhbFN0YXRlXG59O1xuZnVuY3Rpb24gYXV0b3J1bihhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgdmFyIG5hbWUsIHZpZXcsIHNjb3BlO1xuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBuYW1lID0gYXJnMTtcbiAgICAgICAgdmlldyA9IGFyZzI7XG4gICAgICAgIHNjb3BlID0gYXJnMztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGFyZzEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBuYW1lID0gYXJnMS5uYW1lIHx8IChcIkF1dG9ydW5AXCIgKyBnZXROZXh0SWQoKSk7XG4gICAgICAgIHZpZXcgPSBhcmcxO1xuICAgICAgICBzY29wZSA9IGFyZzI7XG4gICAgfVxuICAgIGFzc2VydFVud3JhcHBlZCh2aWV3LCBcImF1dG9ydW4gbWV0aG9kcyBjYW5ub3QgaGF2ZSBtb2RpZmllcnNcIik7XG4gICAgaW52YXJpYW50KHR5cGVvZiB2aWV3ID09PSBcImZ1bmN0aW9uXCIsIFwiYXV0b3J1biBleHBlY3RzIGEgZnVuY3Rpb25cIik7XG4gICAgaW52YXJpYW50KHZpZXcubGVuZ3RoID09PSAwLCBcImF1dG9ydW4gZXhwZWN0cyBhIGZ1bmN0aW9uIHdpdGhvdXQgYXJndW1lbnRzXCIpO1xuICAgIGlmIChzY29wZSlcbiAgICAgICAgdmlldyA9IHZpZXcuYmluZChzY29wZSk7XG4gICAgdmFyIHJlYWN0aW9uID0gbmV3IFJlYWN0aW9uKG5hbWUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy50cmFjayh2aWV3KTtcbiAgICB9KTtcbiAgICByZWFjdGlvbi5zY2hlZHVsZSgpO1xuICAgIHJldHVybiByZWFjdGlvbi5nZXREaXNwb3NlcigpO1xufVxuZXhwb3J0cy5hdXRvcnVuID0gYXV0b3J1bjtcbmZ1bmN0aW9uIHdoZW4oYXJnMSwgYXJnMiwgYXJnMywgYXJnNCkge1xuICAgIHZhciBuYW1lLCBwcmVkaWNhdGUsIGVmZmVjdCwgc2NvcGU7XG4gICAgaWYgKHR5cGVvZiBhcmcxID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG5hbWUgPSBhcmcxO1xuICAgICAgICBwcmVkaWNhdGUgPSBhcmcyO1xuICAgICAgICBlZmZlY3QgPSBhcmczO1xuICAgICAgICBzY29wZSA9IGFyZzQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBhcmcxID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgbmFtZSA9IChcIldoZW5AXCIgKyBnZXROZXh0SWQoKSk7XG4gICAgICAgIHByZWRpY2F0ZSA9IGFyZzE7XG4gICAgICAgIGVmZmVjdCA9IGFyZzI7XG4gICAgICAgIHNjb3BlID0gYXJnMztcbiAgICB9XG4gICAgdmFyIGRpc3Bvc2VJbW1lZGlhdGVseSA9IGZhbHNlO1xuICAgIHZhciBkaXNwb3NlciA9IGF1dG9ydW4obmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAocHJlZGljYXRlLmNhbGwoc2NvcGUpKSB7XG4gICAgICAgICAgICBpZiAoZGlzcG9zZXIpXG4gICAgICAgICAgICAgICAgZGlzcG9zZXIoKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBkaXNwb3NlSW1tZWRpYXRlbHkgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIHByZXZVbnRyYWNrZWQgPSB1bnRyYWNrZWRTdGFydCgpO1xuICAgICAgICAgICAgZWZmZWN0LmNhbGwoc2NvcGUpO1xuICAgICAgICAgICAgdW50cmFja2VkRW5kKHByZXZVbnRyYWNrZWQpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGRpc3Bvc2VJbW1lZGlhdGVseSlcbiAgICAgICAgZGlzcG9zZXIoKTtcbiAgICByZXR1cm4gZGlzcG9zZXI7XG59XG5leHBvcnRzLndoZW4gPSB3aGVuO1xuZnVuY3Rpb24gYXV0b3J1blVudGlsKHByZWRpY2F0ZSwgZWZmZWN0LCBzY29wZSkge1xuICAgIGRlcHJlY2F0ZWQoXCJgYXV0b3J1blVudGlsYCBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIGB3aGVuYC5cIik7XG4gICAgcmV0dXJuIHdoZW4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cbmV4cG9ydHMuYXV0b3J1blVudGlsID0gYXV0b3J1blVudGlsO1xuZnVuY3Rpb24gYXV0b3J1bkFzeW5jKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpIHtcbiAgICB2YXIgbmFtZSwgZnVuYywgZGVsYXksIHNjb3BlO1xuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBuYW1lID0gYXJnMTtcbiAgICAgICAgZnVuYyA9IGFyZzI7XG4gICAgICAgIGRlbGF5ID0gYXJnMztcbiAgICAgICAgc2NvcGUgPSBhcmc0O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG5hbWUgPSBhcmcxLm5hbWUgfHwgKFwiQXV0b3J1bkFzeW5jQFwiICsgZ2V0TmV4dElkKCkpO1xuICAgICAgICBmdW5jID0gYXJnMTtcbiAgICAgICAgZGVsYXkgPSBhcmcyO1xuICAgICAgICBzY29wZSA9IGFyZzM7XG4gICAgfVxuICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKVxuICAgICAgICBkZWxheSA9IDE7XG4gICAgaWYgKHNjb3BlKVxuICAgICAgICBmdW5jID0gZnVuYy5iaW5kKHNjb3BlKTtcbiAgICB2YXIgaXNTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICB2YXIgciA9IG5ldyBSZWFjdGlvbihuYW1lLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghaXNTY2hlZHVsZWQpIHtcbiAgICAgICAgICAgIGlzU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlzU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFyLmlzRGlzcG9zZWQpXG4gICAgICAgICAgICAgICAgICAgIHIudHJhY2soZnVuYyk7XG4gICAgICAgICAgICB9LCBkZWxheSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByLnNjaGVkdWxlKCk7XG4gICAgcmV0dXJuIHIuZ2V0RGlzcG9zZXIoKTtcbn1cbmV4cG9ydHMuYXV0b3J1bkFzeW5jID0gYXV0b3J1bkFzeW5jO1xuZnVuY3Rpb24gcmVhY3Rpb24oYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNikge1xuICAgIHZhciBuYW1lLCBleHByZXNzaW9uLCBlZmZlY3QsIGZpcmVJbW1lZGlhdGVseSwgZGVsYXksIHNjb3BlO1xuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBuYW1lID0gYXJnMTtcbiAgICAgICAgZXhwcmVzc2lvbiA9IGFyZzI7XG4gICAgICAgIGVmZmVjdCA9IGFyZzM7XG4gICAgICAgIGZpcmVJbW1lZGlhdGVseSA9IGFyZzQ7XG4gICAgICAgIGRlbGF5ID0gYXJnNTtcbiAgICAgICAgc2NvcGUgPSBhcmc2O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbmFtZSA9IGFyZzEubmFtZSB8fCBhcmcyLm5hbWUgfHwgKFwiUmVhY3Rpb25AXCIgKyBnZXROZXh0SWQoKSk7XG4gICAgICAgIGV4cHJlc3Npb24gPSBhcmcxO1xuICAgICAgICBlZmZlY3QgPSBhcmcyO1xuICAgICAgICBmaXJlSW1tZWRpYXRlbHkgPSBhcmczO1xuICAgICAgICBkZWxheSA9IGFyZzQ7XG4gICAgICAgIHNjb3BlID0gYXJnNTtcbiAgICB9XG4gICAgaWYgKGZpcmVJbW1lZGlhdGVseSA9PT0gdm9pZCAwKVxuICAgICAgICBmaXJlSW1tZWRpYXRlbHkgPSBmYWxzZTtcbiAgICBpZiAoZGVsYXkgPT09IHZvaWQgMClcbiAgICAgICAgZGVsYXkgPSAwO1xuICAgIHZhciBfYSA9IGdldFZhbHVlTW9kZUZyb21WYWx1ZShleHByZXNzaW9uLCBWYWx1ZU1vZGUuUmVmZXJlbmNlKSwgdmFsdWVNb2RlID0gX2FbMF0sIHVud3JhcHBlZEV4cHJlc3Npb24gPSBfYVsxXTtcbiAgICB2YXIgY29tcGFyZVN0cnVjdHVyYWwgPSB2YWx1ZU1vZGUgPT09IFZhbHVlTW9kZS5TdHJ1Y3R1cmU7XG4gICAgaWYgKHNjb3BlKSB7XG4gICAgICAgIHVud3JhcHBlZEV4cHJlc3Npb24gPSB1bndyYXBwZWRFeHByZXNzaW9uLmJpbmQoc2NvcGUpO1xuICAgICAgICBlZmZlY3QgPSBhY3Rpb24obmFtZSwgZWZmZWN0LmJpbmQoc2NvcGUpKTtcbiAgICB9XG4gICAgdmFyIGZpcnN0VGltZSA9IHRydWU7XG4gICAgdmFyIGlzU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgdmFyIG5leHRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICBmdW5jdGlvbiByZWFjdGlvblJ1bm5lcigpIHtcbiAgICAgICAgaWYgKHIuaXNEaXNwb3NlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgci50cmFjayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdiA9IHVud3JhcHBlZEV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB2YWx1ZURpZENoYW5nZShjb21wYXJlU3RydWN0dXJhbCwgbmV4dFZhbHVlLCB2KTtcbiAgICAgICAgICAgIG5leHRWYWx1ZSA9IHY7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZmlyc3RUaW1lICYmIGZpcmVJbW1lZGlhdGVseSlcbiAgICAgICAgICAgIGVmZmVjdChuZXh0VmFsdWUpO1xuICAgICAgICBpZiAoIWZpcnN0VGltZSAmJiBjaGFuZ2VkID09PSB0cnVlKVxuICAgICAgICAgICAgZWZmZWN0KG5leHRWYWx1ZSk7XG4gICAgICAgIGlmIChmaXJzdFRpbWUpXG4gICAgICAgICAgICBmaXJzdFRpbWUgPSBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHIgPSBuZXcgUmVhY3Rpb24obmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoZGVsYXkgPCAxKSB7XG4gICAgICAgICAgICByZWFjdGlvblJ1bm5lcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpc1NjaGVkdWxlZCkge1xuICAgICAgICAgICAgaXNTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaXNTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZWFjdGlvblJ1bm5lcigpO1xuICAgICAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgci5zY2hlZHVsZSgpO1xuICAgIHJldHVybiByLmdldERpc3Bvc2VyKCk7XG59XG5leHBvcnRzLnJlYWN0aW9uID0gcmVhY3Rpb247XG52YXIgY29tcHV0ZWREZWNvcmF0b3IgPSBjcmVhdGVDbGFzc1Byb3BlcnR5RGVjb3JhdG9yKGZ1bmN0aW9uICh0YXJnZXQsIG5hbWUsIF8sIGRlY29yYXRvckFyZ3MsIG9yaWdpbmFsRGVzY3JpcHRvcikge1xuICAgIHZhciBiYXNlVmFsdWUgPSBvcmlnaW5hbERlc2NyaXB0b3IuZ2V0O1xuICAgIGludmFyaWFudCh0eXBlb2YgYmFzZVZhbHVlID09PSBcImZ1bmN0aW9uXCIsIFwiQGNvbXB1dGVkIGNhbiBvbmx5IGJlIHVzZWQgb24gZ2V0dGVyIGZ1bmN0aW9ucywgbGlrZTogJ0Bjb21wdXRlZCBnZXQgbXlQcm9wcygpIHsgcmV0dXJuIC4uLjsgfSdcIik7XG4gICAgdmFyIGNvbXBhcmVTdHJ1Y3R1cmFsID0gZmFsc2U7XG4gICAgaWYgKGRlY29yYXRvckFyZ3MgJiYgZGVjb3JhdG9yQXJncy5sZW5ndGggPT09IDEgJiYgZGVjb3JhdG9yQXJnc1swXS5hc1N0cnVjdHVyZSA9PT0gdHJ1ZSlcbiAgICAgICAgY29tcGFyZVN0cnVjdHVyYWwgPSB0cnVlO1xuICAgIHZhciBhZG0gPSBhc09ic2VydmFibGVPYmplY3QodGFyZ2V0LCB1bmRlZmluZWQsIFZhbHVlTW9kZS5SZWN1cnNpdmUpO1xuICAgIGRlZmluZU9ic2VydmFibGVQcm9wZXJ0eShhZG0sIG5hbWUsIGNvbXBhcmVTdHJ1Y3R1cmFsID8gYXNTdHJ1Y3R1cmUoYmFzZVZhbHVlKSA6IGJhc2VWYWx1ZSwgZmFsc2UpO1xufSwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy4kbW9ieC52YWx1ZXNbbmFtZV0uZ2V0KCk7XG59LCB0aHJvd2luZ0NvbXB1dGVkVmFsdWVTZXR0ZXIsIGZhbHNlLCB0cnVlKTtcbmZ1bmN0aW9uIGNvbXB1dGVkKHRhcmdldE9yRXhwciwga2V5T3JTY29wZSwgYmFzZURlc2NyaXB0b3IsIG9wdGlvbnMpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMgJiYgdHlwZW9mIHRhcmdldE9yRXhwciA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICByZXR1cm4gY29tcHV0ZWRFeHByKHRhcmdldE9yRXhwciwga2V5T3JTY29wZSk7XG4gICAgaW52YXJpYW50KCFiYXNlRGVzY3JpcHRvciB8fCAhYmFzZURlc2NyaXB0b3Iuc2V0LCBcIkBvYnNlcnZhYmxlIHByb3BlcnRpZXMgY2Fubm90IGhhdmUgYSBzZXR0ZXI6IFwiICsga2V5T3JTY29wZSk7XG4gICAgcmV0dXJuIGNvbXB1dGVkRGVjb3JhdG9yLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5leHBvcnRzLmNvbXB1dGVkID0gY29tcHV0ZWQ7XG5mdW5jdGlvbiBjb21wdXRlZEV4cHIoZXhwciwgc2NvcGUpIHtcbiAgICB2YXIgX2EgPSBnZXRWYWx1ZU1vZGVGcm9tVmFsdWUoZXhwciwgVmFsdWVNb2RlLlJlY3Vyc2l2ZSksIG1vZGUgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICByZXR1cm4gbmV3IENvbXB1dGVkVmFsdWUodmFsdWUsIHNjb3BlLCBtb2RlID09PSBWYWx1ZU1vZGUuU3RydWN0dXJlLCB2YWx1ZS5uYW1lKTtcbn1cbmZ1bmN0aW9uIHRocm93aW5nQ29tcHV0ZWRWYWx1ZVNldHRlcigpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJbQ29tcHV0ZWRWYWx1ZV0gSXQgaXMgbm90IGFsbG93ZWQgdG8gYXNzaWduIG5ldyB2YWx1ZXMgdG8gY29tcHV0ZWQgcHJvcGVydGllcy5cIik7XG59XG5mdW5jdGlvbiBjcmVhdGVUcmFuc2Zvcm1lcih0cmFuc2Zvcm1lciwgb25DbGVhbnVwKSB7XG4gICAgaW52YXJpYW50KHR5cGVvZiB0cmFuc2Zvcm1lciA9PT0gXCJmdW5jdGlvblwiICYmIHRyYW5zZm9ybWVyLmxlbmd0aCA9PT0gMSwgXCJjcmVhdGVUcmFuc2Zvcm1lciBleHBlY3RzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIG9uZSBhcmd1bWVudFwiKTtcbiAgICB2YXIgb2JqZWN0Q2FjaGUgPSB7fTtcbiAgICB2YXIgcmVzZXRJZCA9IGdsb2JhbFN0YXRlLnJlc2V0SWQ7XG4gICAgdmFyIFRyYW5zZm9ybWVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzKFRyYW5zZm9ybWVyLCBfc3VwZXIpO1xuICAgICAgICBmdW5jdGlvbiBUcmFuc2Zvcm1lcihzb3VyY2VJZGVudGlmaWVyLCBzb3VyY2VPYmplY3QpIHtcbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRyYW5zZm9ybWVyKHNvdXJjZU9iamVjdCk7IH0sIG51bGwsIGZhbHNlLCBcIlRyYW5zZm9ybWVyLVwiICsgdHJhbnNmb3JtZXIubmFtZSArIFwiLVwiICsgc291cmNlSWRlbnRpZmllcik7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUlkZW50aWZpZXIgPSBzb3VyY2VJZGVudGlmaWVyO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VPYmplY3QgPSBzb3VyY2VPYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgVHJhbnNmb3JtZXIucHJvdG90eXBlLm9uQmVjb21lVW5vYnNlcnZlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBsYXN0VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5vbkJlY29tZVVub2JzZXJ2ZWQuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmplY3RDYWNoZVt0aGlzLnNvdXJjZUlkZW50aWZpZXJdO1xuICAgICAgICAgICAgaWYgKG9uQ2xlYW51cClcbiAgICAgICAgICAgICAgICBvbkNsZWFudXAobGFzdFZhbHVlLCB0aGlzLnNvdXJjZU9iamVjdCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBUcmFuc2Zvcm1lcjtcbiAgICB9KENvbXB1dGVkVmFsdWUpKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgICBpZiAocmVzZXRJZCAhPT0gZ2xvYmFsU3RhdGUucmVzZXRJZCkge1xuICAgICAgICAgICAgb2JqZWN0Q2FjaGUgPSB7fTtcbiAgICAgICAgICAgIHJlc2V0SWQgPSBnbG9iYWxTdGF0ZS5yZXNldElkO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpZGVudGlmaWVyID0gZ2V0TWVtb2l6YXRpb25JZChvYmplY3QpO1xuICAgICAgICB2YXIgcmVhY3RpdmVUcmFuc2Zvcm1lciA9IG9iamVjdENhY2hlW2lkZW50aWZpZXJdO1xuICAgICAgICBpZiAocmVhY3RpdmVUcmFuc2Zvcm1lcilcbiAgICAgICAgICAgIHJldHVybiByZWFjdGl2ZVRyYW5zZm9ybWVyLmdldCgpO1xuICAgICAgICByZWFjdGl2ZVRyYW5zZm9ybWVyID0gb2JqZWN0Q2FjaGVbaWRlbnRpZmllcl0gPSBuZXcgVHJhbnNmb3JtZXIoaWRlbnRpZmllciwgb2JqZWN0KTtcbiAgICAgICAgcmV0dXJuIHJlYWN0aXZlVHJhbnNmb3JtZXIuZ2V0KCk7XG4gICAgfTtcbn1cbmV4cG9ydHMuY3JlYXRlVHJhbnNmb3JtZXIgPSBjcmVhdGVUcmFuc2Zvcm1lcjtcbmZ1bmN0aW9uIGdldE1lbW9pemF0aW9uSWQob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqZWN0ICE9PSBcIm9iamVjdFwiKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieF0gdHJhbnNmb3JtIGV4cGVjdGVkIHNvbWUga2luZCBvZiBvYmplY3QsIGdvdDogXCIgKyBvYmplY3QpO1xuICAgIHZhciB0aWQgPSBvYmplY3QuJHRyYW5zZm9ybUlkO1xuICAgIGlmICh0aWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aWQgPSBnZXROZXh0SWQoKTtcbiAgICAgICAgYWRkSGlkZGVuUHJvcChvYmplY3QsIFwiJHRyYW5zZm9ybUlkXCIsIHRpZCk7XG4gICAgfVxuICAgIHJldHVybiB0aWQ7XG59XG5mdW5jdGlvbiBleHByKGV4cHIsIHNjb3BlKSB7XG4gICAgaWYgKCFpc0NvbXB1dGluZ0Rlcml2YXRpb24oKSlcbiAgICAgICAgY29uc29sZS53YXJuKFwiW21vYnguZXhwcl0gJ2V4cHInIHNob3VsZCBvbmx5IGJlIHVzZWQgaW5zaWRlIG90aGVyIHJlYWN0aXZlIGZ1bmN0aW9ucy5cIik7XG4gICAgcmV0dXJuIGNvbXB1dGVkKGV4cHIsIHNjb3BlKS5nZXQoKTtcbn1cbmV4cG9ydHMuZXhwciA9IGV4cHI7XG5mdW5jdGlvbiBleHRlbmRPYnNlcnZhYmxlKHRhcmdldCkge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgcHJvcGVydGllc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgaW52YXJpYW50KGFyZ3VtZW50cy5sZW5ndGggPj0gMiwgXCJleHRlbmRPYnNlcnZhYmxlIGV4cGVjdGVkIDIgb3IgbW9yZSBhcmd1bWVudHNcIik7XG4gICAgaW52YXJpYW50KHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIsIFwiZXh0ZW5kT2JzZXJ2YWJsZSBleHBlY3RzIGFuIG9iamVjdCBhcyBmaXJzdCBhcmd1bWVudFwiKTtcbiAgICBpbnZhcmlhbnQoISh0YXJnZXQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlTWFwKSwgXCJleHRlbmRPYnNlcnZhYmxlIHNob3VsZCBub3QgYmUgdXNlZCBvbiBtYXBzLCB1c2UgbWFwLm1lcmdlIGluc3RlYWRcIik7XG4gICAgcHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wU2V0KSB7XG4gICAgICAgIGludmFyaWFudCh0eXBlb2YgcHJvcFNldCA9PT0gXCJvYmplY3RcIiwgXCJhbGwgYXJndW1lbnRzIG9mIGV4dGVuZE9ic2VydmFibGUgc2hvdWxkIGJlIG9iamVjdHNcIik7XG4gICAgICAgIGV4dGVuZE9ic2VydmFibGVIZWxwZXIodGFyZ2V0LCBwcm9wU2V0LCBWYWx1ZU1vZGUuUmVjdXJzaXZlLCBudWxsKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZXhwb3J0cy5leHRlbmRPYnNlcnZhYmxlID0gZXh0ZW5kT2JzZXJ2YWJsZTtcbmZ1bmN0aW9uIGV4dGVuZE9ic2VydmFibGVIZWxwZXIodGFyZ2V0LCBwcm9wZXJ0aWVzLCBtb2RlLCBuYW1lKSB7XG4gICAgdmFyIGFkbSA9IGFzT2JzZXJ2YWJsZU9iamVjdCh0YXJnZXQsIG5hbWUsIG1vZGUpO1xuICAgIGZvciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKVxuICAgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0ID09PSBwcm9wZXJ0aWVzICYmICFpc1Byb3BlcnR5Q29uZmlndXJhYmxlKHRhcmdldCwga2V5KSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHNldE9ic2VydmFibGVPYmplY3RJbnN0YW5jZVByb3BlcnR5KGFkbSwga2V5LCBwcm9wZXJ0aWVzW2tleV0pO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lUcmVlKHRoaW5nLCBwcm9wZXJ0eSkge1xuICAgIHJldHVybiBub2RlVG9EZXBlbmRlbmN5VHJlZShnZXRBdG9tKHRoaW5nLCBwcm9wZXJ0eSkpO1xufVxuZnVuY3Rpb24gbm9kZVRvRGVwZW5kZW5jeVRyZWUobm9kZSkge1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6IG5vZGUubmFtZVxuICAgIH07XG4gICAgaWYgKG5vZGUub2JzZXJ2aW5nICYmIG5vZGUub2JzZXJ2aW5nLmxlbmd0aCA+IDApXG4gICAgICAgIHJlc3VsdC5kZXBlbmRlbmNpZXMgPSB1bmlxdWUobm9kZS5vYnNlcnZpbmcpLm1hcChub2RlVG9EZXBlbmRlbmN5VHJlZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldE9ic2VydmVyVHJlZSh0aGluZywgcHJvcGVydHkpIHtcbiAgICByZXR1cm4gbm9kZVRvT2JzZXJ2ZXJUcmVlKGdldEF0b20odGhpbmcsIHByb3BlcnR5KSk7XG59XG5mdW5jdGlvbiBub2RlVG9PYnNlcnZlclRyZWUobm9kZSkge1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6IG5vZGUubmFtZVxuICAgIH07XG4gICAgaWYgKG5vZGUub2JzZXJ2ZXJzICYmIG5vZGUub2JzZXJ2ZXJzLmxlbmd0aCA+IDApXG4gICAgICAgIHJlc3VsdC5vYnNlcnZlcnMgPSBub2RlLm9ic2VydmVycy5hc0FycmF5KCkubWFwKG5vZGVUb09ic2VydmVyVHJlZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGludGVyY2VwdCh0aGluZywgcHJvcE9ySGFuZGxlciwgaGFuZGxlcikge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICByZXR1cm4gaW50ZXJjZXB0UHJvcGVydHkodGhpbmcsIHByb3BPckhhbmRsZXIsIGhhbmRsZXIpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGludGVyY2VwdEludGVyY2VwdGFibGUodGhpbmcsIHByb3BPckhhbmRsZXIpO1xufVxuZXhwb3J0cy5pbnRlcmNlcHQgPSBpbnRlcmNlcHQ7XG5mdW5jdGlvbiBpbnRlcmNlcHRJbnRlcmNlcHRhYmxlKHRoaW5nLCBoYW5kbGVyKSB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QodGhpbmcpICYmICFpc09ic2VydmFibGVPYmplY3QodGhpbmcpKSB7XG4gICAgICAgIGRlcHJlY2F0ZWQoXCJQYXNzaW5nIHBsYWluIG9iamVjdHMgdG8gaW50ZXJjZXB0IC8gb2JzZXJ2ZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMy4wXCIpO1xuICAgICAgICByZXR1cm4gZ2V0QWRtaW5pc3RyYXRpb24ob2JzZXJ2YWJsZSh0aGluZykpLmludGVyY2VwdChoYW5kbGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGdldEFkbWluaXN0cmF0aW9uKHRoaW5nKS5pbnRlcmNlcHQoaGFuZGxlcik7XG59XG5mdW5jdGlvbiBpbnRlcmNlcHRQcm9wZXJ0eSh0aGluZywgcHJvcGVydHksIGhhbmRsZXIpIHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdCh0aGluZykgJiYgIWlzT2JzZXJ2YWJsZU9iamVjdCh0aGluZykpIHtcbiAgICAgICAgZGVwcmVjYXRlZChcIlBhc3NpbmcgcGxhaW4gb2JqZWN0cyB0byBpbnRlcmNlcHQgLyBvYnNlcnZlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAzLjBcIik7XG4gICAgICAgIGV4dGVuZE9ic2VydmFibGUodGhpbmcsIHtcbiAgICAgICAgICAgIHByb3BlcnR5OiB0aGluZ1twcm9wZXJ0eV1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbnRlcmNlcHRQcm9wZXJ0eSh0aGluZywgcHJvcGVydHksIGhhbmRsZXIpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0QWRtaW5pc3RyYXRpb24odGhpbmcsIHByb3BlcnR5KS5pbnRlcmNlcHQoaGFuZGxlcik7XG59XG5mdW5jdGlvbiBpc09ic2VydmFibGUodmFsdWUsIHByb3BlcnR5KSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAocHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYnNlcnZhYmxlTWFwIHx8IHZhbHVlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZUFycmF5KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW21vYnguaXNPYnNlcnZhYmxlXSBpc09ic2VydmFibGUob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFycmF5cyBhbmQgbWFwcy4gVXNlIG1hcC5oYXMgb3IgYXJyYXkubGVuZ3RoIGluc3RlYWQuXCIpO1xuICAgICAgICBlbHNlIGlmIChpc09ic2VydmFibGVPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICB2YXIgbyA9IHZhbHVlLiRtb2J4O1xuICAgICAgICAgICAgcmV0dXJuIG8udmFsdWVzICYmICEhby52YWx1ZXNbcHJvcGVydHldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICEhdmFsdWUuJG1vYnggfHwgdmFsdWUgaW5zdGFuY2VvZiBBdG9tIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVhY3Rpb24gfHwgdmFsdWUgaW5zdGFuY2VvZiBDb21wdXRlZFZhbHVlO1xufVxuZXhwb3J0cy5pc09ic2VydmFibGUgPSBpc09ic2VydmFibGU7XG52YXIgZGVjb3JhdG9ySW1wbCA9IGNyZWF0ZUNsYXNzUHJvcGVydHlEZWNvcmF0b3IoZnVuY3Rpb24gKHRhcmdldCwgbmFtZSwgYmFzZVZhbHVlKSB7XG4gICAgdmFyIHByZXZBID0gYWxsb3dTdGF0ZUNoYW5nZXNTdGFydCh0cnVlKTtcbiAgICBpZiAodHlwZW9mIGJhc2VWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBiYXNlVmFsdWUgPSBhc1JlZmVyZW5jZShiYXNlVmFsdWUpO1xuICAgIHZhciBhZG0gPSBhc09ic2VydmFibGVPYmplY3QodGFyZ2V0LCB1bmRlZmluZWQsIFZhbHVlTW9kZS5SZWN1cnNpdmUpO1xuICAgIGRlZmluZU9ic2VydmFibGVQcm9wZXJ0eShhZG0sIG5hbWUsIGJhc2VWYWx1ZSwgdHJ1ZSk7XG4gICAgYWxsb3dTdGF0ZUNoYW5nZXNFbmQocHJldkEpO1xufSwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy4kbW9ieC52YWx1ZXNbbmFtZV0uZ2V0KCk7XG59LCBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBzZXRQcm9wZXJ0eVZhbHVlKHRoaXMsIG5hbWUsIHZhbHVlKTtcbn0sIHRydWUsIGZhbHNlKTtcbmZ1bmN0aW9uIG9ic2VydmFibGVEZWNvcmF0b3IodGFyZ2V0LCBrZXksIGJhc2VEZXNjcmlwdG9yKSB7XG4gICAgaW52YXJpYW50KGFyZ3VtZW50cy5sZW5ndGggPj0gMiAmJiBhcmd1bWVudHMubGVuZ3RoIDw9IDMsIFwiSWxsZWdhbCBkZWNvcmF0b3IgY29uZmlnXCIsIGtleSk7XG4gICAgYXNzZXJ0UHJvcGVydHlDb25maWd1cmFibGUodGFyZ2V0LCBrZXkpO1xuICAgIGludmFyaWFudCghYmFzZURlc2NyaXB0b3IgfHwgIWJhc2VEZXNjcmlwdG9yLmdldCwgXCJAb2JzZXJ2YWJsZSBjYW4gbm90IGJlIHVzZWQgb24gZ2V0dGVycywgdXNlIEBjb21wdXRlZCBpbnN0ZWFkXCIpO1xuICAgIHJldHVybiBkZWNvcmF0b3JJbXBsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBvYnNlcnZhYmxlKHYsIGtleU9yU2NvcGUpIHtcbiAgICBpZiAodiA9PT0gdm9pZCAwKSB7IHYgPSB1bmRlZmluZWQ7IH1cbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1sxXSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgcmV0dXJuIG9ic2VydmFibGVEZWNvcmF0b3IuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICBpbnZhcmlhbnQoYXJndW1lbnRzLmxlbmd0aCA8IDMsIFwib2JzZXJ2YWJsZSBleHBlY3RzIHplcm8sIG9uZSBvciB0d28gYXJndW1lbnRzXCIpO1xuICAgIGlmIChpc09ic2VydmFibGUodikpXG4gICAgICAgIHJldHVybiB2O1xuICAgIHZhciBfYSA9IGdldFZhbHVlTW9kZUZyb21WYWx1ZSh2LCBWYWx1ZU1vZGUuUmVjdXJzaXZlKSwgbW9kZSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgIHZhciBzb3VyY2VUeXBlID0gbW9kZSA9PT0gVmFsdWVNb2RlLlJlZmVyZW5jZSA/IFZhbHVlVHlwZS5SZWZlcmVuY2UgOiBnZXRUeXBlT2ZWYWx1ZSh2YWx1ZSk7XG4gICAgc3dpdGNoIChzb3VyY2VUeXBlKSB7XG4gICAgICAgIGNhc2UgVmFsdWVUeXBlLkFycmF5OlxuICAgICAgICBjYXNlIFZhbHVlVHlwZS5QbGFpbk9iamVjdDpcbiAgICAgICAgICAgIHJldHVybiBtYWtlQ2hpbGRPYnNlcnZhYmxlKHZhbHVlLCBtb2RlKTtcbiAgICAgICAgY2FzZSBWYWx1ZVR5cGUuUmVmZXJlbmNlOlxuICAgICAgICBjYXNlIFZhbHVlVHlwZS5Db21wbGV4T2JqZWN0OlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlVmFsdWUodmFsdWUsIG1vZGUpO1xuICAgICAgICBjYXNlIFZhbHVlVHlwZS5Db21wbGV4RnVuY3Rpb246XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieC5vYnNlcnZhYmxlXSBUbyBiZSBhYmxlIHRvIG1ha2UgYSBmdW5jdGlvbiByZWFjdGl2ZSBpdCBzaG91bGQgbm90IGhhdmUgYXJndW1lbnRzLiBJZiB5b3UgbmVlZCBhbiBvYnNlcnZhYmxlIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uLCB1c2UgYG9ic2VydmFibGUoYXNSZWZlcmVuY2UoZikpYFwiKTtcbiAgICAgICAgY2FzZSBWYWx1ZVR5cGUuVmlld0Z1bmN0aW9uOlxuICAgICAgICAgICAgZGVwcmVjYXRlZChcIlVzZSBgY29tcHV0ZWQoZXhwcilgIGluc3RlYWQgb2YgYG9ic2VydmFibGUoZXhwcilgXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVkKHYsIGtleU9yU2NvcGUpO1xuICAgIH1cbiAgICBpbnZhcmlhbnQoZmFsc2UsIFwiSWxsZWdhbCBTdGF0ZVwiKTtcbn1cbmV4cG9ydHMub2JzZXJ2YWJsZSA9IG9ic2VydmFibGU7XG52YXIgVmFsdWVUeXBlO1xuKGZ1bmN0aW9uIChWYWx1ZVR5cGUpIHtcbiAgICBWYWx1ZVR5cGVbVmFsdWVUeXBlW1wiUmVmZXJlbmNlXCJdID0gMF0gPSBcIlJlZmVyZW5jZVwiO1xuICAgIFZhbHVlVHlwZVtWYWx1ZVR5cGVbXCJQbGFpbk9iamVjdFwiXSA9IDFdID0gXCJQbGFpbk9iamVjdFwiO1xuICAgIFZhbHVlVHlwZVtWYWx1ZVR5cGVbXCJDb21wbGV4T2JqZWN0XCJdID0gMl0gPSBcIkNvbXBsZXhPYmplY3RcIjtcbiAgICBWYWx1ZVR5cGVbVmFsdWVUeXBlW1wiQXJyYXlcIl0gPSAzXSA9IFwiQXJyYXlcIjtcbiAgICBWYWx1ZVR5cGVbVmFsdWVUeXBlW1wiVmlld0Z1bmN0aW9uXCJdID0gNF0gPSBcIlZpZXdGdW5jdGlvblwiO1xuICAgIFZhbHVlVHlwZVtWYWx1ZVR5cGVbXCJDb21wbGV4RnVuY3Rpb25cIl0gPSA1XSA9IFwiQ29tcGxleEZ1bmN0aW9uXCI7XG59KShWYWx1ZVR5cGUgfHwgKFZhbHVlVHlwZSA9IHt9KSk7XG5mdW5jdGlvbiBnZXRUeXBlT2ZWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gVmFsdWVUeXBlLlJlZmVyZW5jZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPyBWYWx1ZVR5cGUuQ29tcGxleEZ1bmN0aW9uIDogVmFsdWVUeXBlLlZpZXdGdW5jdGlvbjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBPYnNlcnZhYmxlQXJyYXkpXG4gICAgICAgIHJldHVybiBWYWx1ZVR5cGUuQXJyYXk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIilcbiAgICAgICAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpID8gVmFsdWVUeXBlLlBsYWluT2JqZWN0IDogVmFsdWVUeXBlLkNvbXBsZXhPYmplY3Q7XG4gICAgcmV0dXJuIFZhbHVlVHlwZS5SZWZlcmVuY2U7XG59XG5mdW5jdGlvbiBvYnNlcnZlKHRoaW5nLCBwcm9wT3JDYiwgY2JPckZpcmUsIGZpcmVJbW1lZGlhdGVseSkge1xuICAgIGlmICh0eXBlb2YgY2JPckZpcmUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgcmV0dXJuIG9ic2VydmVPYnNlcnZhYmxlUHJvcGVydHkodGhpbmcsIHByb3BPckNiLCBjYk9yRmlyZSwgZmlyZUltbWVkaWF0ZWx5KTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBvYnNlcnZlT2JzZXJ2YWJsZSh0aGluZywgcHJvcE9yQ2IsIGNiT3JGaXJlKTtcbn1cbmV4cG9ydHMub2JzZXJ2ZSA9IG9ic2VydmU7XG5mdW5jdGlvbiBvYnNlcnZlT2JzZXJ2YWJsZSh0aGluZywgbGlzdGVuZXIsIGZpcmVJbW1lZGlhdGVseSkge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHRoaW5nKSAmJiAhaXNPYnNlcnZhYmxlT2JqZWN0KHRoaW5nKSkge1xuICAgICAgICBkZXByZWNhdGVkKFwiUGFzc2luZyBwbGFpbiBvYmplY3RzIHRvIGludGVyY2VwdCAvIG9ic2VydmUgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIDMuMFwiKTtcbiAgICAgICAgcmV0dXJuIGdldEFkbWluaXN0cmF0aW9uKG9ic2VydmFibGUodGhpbmcpKS5vYnNlcnZlKGxpc3RlbmVyLCBmaXJlSW1tZWRpYXRlbHkpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0QWRtaW5pc3RyYXRpb24odGhpbmcpLm9ic2VydmUobGlzdGVuZXIsIGZpcmVJbW1lZGlhdGVseSk7XG59XG5mdW5jdGlvbiBvYnNlcnZlT2JzZXJ2YWJsZVByb3BlcnR5KHRoaW5nLCBwcm9wZXJ0eSwgbGlzdGVuZXIsIGZpcmVJbW1lZGlhdGVseSkge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHRoaW5nKSAmJiAhaXNPYnNlcnZhYmxlT2JqZWN0KHRoaW5nKSkge1xuICAgICAgICBkZXByZWNhdGVkKFwiUGFzc2luZyBwbGFpbiBvYmplY3RzIHRvIGludGVyY2VwdCAvIG9ic2VydmUgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIDMuMFwiKTtcbiAgICAgICAgZXh0ZW5kT2JzZXJ2YWJsZSh0aGluZywge1xuICAgICAgICAgICAgcHJvcGVydHk6IHRoaW5nW3Byb3BlcnR5XVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG9ic2VydmVPYnNlcnZhYmxlUHJvcGVydHkodGhpbmcsIHByb3BlcnR5LCBsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KTtcbiAgICB9XG4gICAgcmV0dXJuIGdldEFkbWluaXN0cmF0aW9uKHRoaW5nLCBwcm9wZXJ0eSkub2JzZXJ2ZShsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KTtcbn1cbmZ1bmN0aW9uIHRvSlMoc291cmNlLCBkZXRlY3RDeWNsZXMsIF9fYWxyZWFkeVNlZW4pIHtcbiAgICBpZiAoZGV0ZWN0Q3ljbGVzID09PSB2b2lkIDApIHsgZGV0ZWN0Q3ljbGVzID0gdHJ1ZTsgfVxuICAgIGlmIChfX2FscmVhZHlTZWVuID09PSB2b2lkIDApIHsgX19hbHJlYWR5U2VlbiA9IG51bGw7IH1cbiAgICBmdW5jdGlvbiBjYWNoZSh2YWx1ZSkge1xuICAgICAgICBpZiAoZGV0ZWN0Q3ljbGVzKVxuICAgICAgICAgICAgX19hbHJlYWR5U2Vlbi5wdXNoKFtzb3VyY2UsIHZhbHVlXSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIERhdGUgfHwgc291cmNlIGluc3RhbmNlb2YgUmVnRXhwKVxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIGlmIChkZXRlY3RDeWNsZXMgJiYgX19hbHJlYWR5U2VlbiA9PT0gbnVsbClcbiAgICAgICAgX19hbHJlYWR5U2VlbiA9IFtdO1xuICAgIGlmIChkZXRlY3RDeWNsZXMgJiYgc291cmNlICE9PSBudWxsICYmIHR5cGVvZiBzb3VyY2UgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBfX2FscmVhZHlTZWVuLmxlbmd0aDsgaSA8IGw7IGkrKylcbiAgICAgICAgICAgIGlmIChfX2FscmVhZHlTZWVuW2ldWzBdID09PSBzb3VyY2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9fYWxyZWFkeVNlZW5baV1bMV07XG4gICAgfVxuICAgIGlmICghc291cmNlKVxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkgfHwgc291cmNlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZUFycmF5KSB7XG4gICAgICAgIHZhciByZXMgPSBjYWNoZShbXSk7XG4gICAgICAgIHZhciB0b0FkZCA9IHNvdXJjZS5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0b0pTKHZhbHVlLCBkZXRlY3RDeWNsZXMsIF9fYWxyZWFkeVNlZW4pOyB9KTtcbiAgICAgICAgcmVzLmxlbmd0aCA9IHRvQWRkLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0b0FkZC5sZW5ndGg7IGkgPCBsOyBpKyspXG4gICAgICAgICAgICByZXNbaV0gPSB0b0FkZFtpXTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIE9ic2VydmFibGVNYXApIHtcbiAgICAgICAgdmFyIHJlc18xID0gY2FjaGUoe30pO1xuICAgICAgICBzb3VyY2UuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkgeyByZXR1cm4gcmVzXzFba2V5XSA9IHRvSlModmFsdWUsIGRldGVjdEN5Y2xlcywgX19hbHJlYWR5U2Vlbik7IH0pO1xuICAgICAgICByZXR1cm4gcmVzXzE7XG4gICAgfVxuICAgIGlmIChpc09ic2VydmFibGUoc291cmNlKSAmJiBzb3VyY2UuJG1vYnggaW5zdGFuY2VvZiBPYnNlcnZhYmxlVmFsdWUpXG4gICAgICAgIHJldHVybiB0b0pTKHNvdXJjZSgpLCBkZXRlY3RDeWNsZXMsIF9fYWxyZWFkeVNlZW4pO1xuICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBPYnNlcnZhYmxlVmFsdWUpXG4gICAgICAgIHJldHVybiB0b0pTKHNvdXJjZS5nZXQoKSwgZGV0ZWN0Q3ljbGVzLCBfX2FscmVhZHlTZWVuKTtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICB2YXIgcmVzID0gY2FjaGUoe30pO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKVxuICAgICAgICAgICAgcmVzW2tleV0gPSB0b0pTKHNvdXJjZVtrZXldLCBkZXRlY3RDeWNsZXMsIF9fYWxyZWFkeVNlZW4pO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlO1xufVxuZXhwb3J0cy50b0pTID0gdG9KUztcbmZ1bmN0aW9uIHRvSlNPTihzb3VyY2UsIGRldGVjdEN5Y2xlcywgX19hbHJlYWR5U2Vlbikge1xuICAgIGlmIChkZXRlY3RDeWNsZXMgPT09IHZvaWQgMCkgeyBkZXRlY3RDeWNsZXMgPSB0cnVlOyB9XG4gICAgaWYgKF9fYWxyZWFkeVNlZW4gPT09IHZvaWQgMCkgeyBfX2FscmVhZHlTZWVuID0gbnVsbDsgfVxuICAgIGRlcHJlY2F0ZWQoXCJ0b0pTT04gaXMgZGVwcmVjYXRlZC4gVXNlIHRvSlMgaW5zdGVhZFwiKTtcbiAgICByZXR1cm4gdG9KUy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0cy50b0pTT04gPSB0b0pTT047XG5mdW5jdGlvbiBsb2cobXNnKSB7XG4gICAgY29uc29sZS5sb2cobXNnKTtcbiAgICByZXR1cm4gbXNnO1xufVxuZnVuY3Rpb24gd2h5UnVuKHRoaW5nLCBwcm9wKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHRoaW5nID0gZ2xvYmFsU3RhdGUuZGVyaXZhdGlvblN0YWNrW2dsb2JhbFN0YXRlLmRlcml2YXRpb25TdGFjay5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGlmICghdGhpbmcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvZyhcIndoeVJ1bigpIGNhbiBvbmx5IGJlIHVzZWQgaWYgYSBkZXJpdmF0aW9uIGlzIGFjdGl2ZSwgb3IgYnkgcGFzc2luZyBhbiBjb21wdXRlZCB2YWx1ZSAvIHJlYWN0aW9uIGV4cGxpY2l0bHkuIElmIHlvdSBpbnZva2VkIHdoeVJ1biBmcm9tIGluc2lkZSBhIGNvbXB1dGF0aW9uOyB0aGUgY29tcHV0YXRpb24gaXMgY3VycmVudGx5IHN1c3BlbmRlZCBidXQgcmUtZXZhbHVhdGluZyBiZWNhdXNlIHNvbWVib2R5IHJlcXVlc3RlZCBpdCdzIHZhbHVlLlwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICB0aGluZyA9IGdldEF0b20odGhpbmcsIHByb3ApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaW5nID0gZ2V0QXRvbSh0aGluZyk7XG4gICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgQ29tcHV0ZWRWYWx1ZSlcbiAgICAgICAgcmV0dXJuIGxvZyh0aGluZy53aHlSdW4oKSk7XG4gICAgZWxzZSBpZiAodGhpbmcgaW5zdGFuY2VvZiBSZWFjdGlvbilcbiAgICAgICAgcmV0dXJuIGxvZyh0aGluZy53aHlSdW4oKSk7XG4gICAgZWxzZVxuICAgICAgICBpbnZhcmlhbnQoZmFsc2UsIFwid2h5UnVuIGNhbiBvbmx5IGJlIHVzZWQgb24gcmVhY3Rpb25zIGFuZCBjb21wdXRlZCB2YWx1ZXNcIik7XG59XG5leHBvcnRzLndoeVJ1biA9IHdoeVJ1bjtcbnZhciBhY3Rpb25GaWVsZERlY29yYXRvciA9IGNyZWF0ZUNsYXNzUHJvcGVydHlEZWNvcmF0b3IoZnVuY3Rpb24gKHRhcmdldCwga2V5LCB2YWx1ZSwgYXJncywgb3JpZ2luYWxEZXNjcmlwdG9yKSB7XG4gICAgdmFyIGFjdGlvbk5hbWUgPSAoYXJncyAmJiBhcmdzLmxlbmd0aCA9PT0gMSkgPyBhcmdzWzBdIDogKHZhbHVlLm5hbWUgfHwga2V5IHx8IFwiPHVubmFtZWQgYWN0aW9uPlwiKTtcbiAgICB2YXIgd3JhcHBlZEFjdGlvbiA9IGFjdGlvbihhY3Rpb25OYW1lLCB2YWx1ZSk7XG4gICAgYWRkSGlkZGVuUHJvcCh0YXJnZXQsIGtleSwgd3JhcHBlZEFjdGlvbik7XG59LCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXNba2V5XTtcbn0sIGZ1bmN0aW9uICgpIHtcbiAgICBpbnZhcmlhbnQoZmFsc2UsIFwiSXQgaXMgbm90IGFsbG93ZWQgdG8gYXNzaWduIG5ldyB2YWx1ZXMgdG8gQGFjdGlvbiBmaWVsZHNcIik7XG59LCBmYWxzZSwgdHJ1ZSk7XG5mdW5jdGlvbiBhY3Rpb24oYXJnMSwgYXJnMiwgYXJnMywgYXJnNCkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmcxID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIHJldHVybiBhY3Rpb25JbXBsZW1lbnRhdGlvbihhcmcxLm5hbWUgfHwgXCI8dW5uYW1lZCBhY3Rpb24+XCIsIGFyZzEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBhcmcyID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIHJldHVybiBhY3Rpb25JbXBsZW1lbnRhdGlvbihhcmcxLCBhcmcyKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgcmV0dXJuIG5hbWVkQWN0aW9uRGVjb3JhdG9yKGFyZzEpO1xuICAgIHJldHVybiBuYW1lZEFjdGlvbkRlY29yYXRvcihhcmcyKS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0cy5hY3Rpb24gPSBhY3Rpb247XG5mdW5jdGlvbiBuYW1lZEFjdGlvbkRlY29yYXRvcihuYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIHByb3AsIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IgJiYgdHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGFjdGlvbkltcGxlbWVudGF0aW9uKG5hbWUsIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWN0aW9uRmllbGREZWNvcmF0b3IobmFtZSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gaXNBY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSBcImZ1bmN0aW9uXCIgJiYgdGhpbmcuaXNNb2J4QWN0aW9uID09PSB0cnVlO1xufVxuZXhwb3J0cy5pc0FjdGlvbiA9IGlzQWN0aW9uO1xuZnVuY3Rpb24gcnVuSW5BY3Rpb24oYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHZhciBhY3Rpb25OYW1lID0gdHlwZW9mIGFyZzEgPT09IFwic3RyaW5nXCIgPyBhcmcxIDogYXJnMS5uYW1lIHx8IFwiPHVubmFtZWQgYWN0aW9uPlwiO1xuICAgIHZhciBmbiA9IHR5cGVvZiBhcmcxID09PSBcImZ1bmN0aW9uXCIgPyBhcmcxIDogYXJnMjtcbiAgICB2YXIgc2NvcGUgPSB0eXBlb2YgYXJnMSA9PT0gXCJmdW5jdGlvblwiID8gYXJnMiA6IGFyZzM7XG4gICAgaW52YXJpYW50KHR5cGVvZiBmbiA9PT0gXCJmdW5jdGlvblwiLCBcImBydW5JbkFjdGlvbmAgZXhwZWN0cyBhIGZ1bmN0aW9uXCIpO1xuICAgIGludmFyaWFudChmbi5sZW5ndGggPT09IDAsIFwiYHJ1bkluQWN0aW9uYCBleHBlY3RzIGEgZnVuY3Rpb24gd2l0aG91dCBhcmd1bWVudHNcIik7XG4gICAgaW52YXJpYW50KHR5cGVvZiBhY3Rpb25OYW1lID09PSBcInN0cmluZ1wiICYmIGFjdGlvbk5hbWUubGVuZ3RoID4gMCwgXCJhY3Rpb25zIHNob3VsZCBoYXZlIHZhbGlkIG5hbWVzLCBnb3Q6ICdcIiArIGFjdGlvbk5hbWUgKyBcIidcIik7XG4gICAgcmV0dXJuIGV4ZWN1dGVXcmFwcGVkKGFjdGlvbk5hbWUsIGZuLCBzY29wZSwgdW5kZWZpbmVkKTtcbn1cbmV4cG9ydHMucnVuSW5BY3Rpb24gPSBydW5JbkFjdGlvbjtcbmZ1bmN0aW9uIGFjdGlvbkltcGxlbWVudGF0aW9uKGFjdGlvbk5hbWUsIGZuKSB7XG4gICAgaW52YXJpYW50KHR5cGVvZiBmbiA9PT0gXCJmdW5jdGlvblwiLCBcImBhY3Rpb25gIGNhbiBvbmx5IGJlIGludm9rZWQgb24gZnVuY3Rpb25zXCIpO1xuICAgIGludmFyaWFudCh0eXBlb2YgYWN0aW9uTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBhY3Rpb25OYW1lLmxlbmd0aCA+IDAsIFwiYWN0aW9ucyBzaG91bGQgaGF2ZSB2YWxpZCBuYW1lcywgZ290OiAnXCIgKyBhY3Rpb25OYW1lICsgXCInXCIpO1xuICAgIHZhciByZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBleGVjdXRlV3JhcHBlZChhY3Rpb25OYW1lLCBmbiwgdGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIHJlcy5pc01vYnhBY3Rpb24gPSB0cnVlO1xuICAgIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBleGVjdXRlV3JhcHBlZChhY3Rpb25OYW1lLCBmbiwgc2NvcGUsIGFyZ3MpIHtcbiAgICB2YXIgZHMgPSBnbG9iYWxTdGF0ZS5kZXJpdmF0aW9uU3RhY2s7XG4gICAgaW52YXJpYW50KCEoZHNbZHMubGVuZ3RoIC0gMV0gaW5zdGFuY2VvZiBDb21wdXRlZFZhbHVlKSwgXCJDb21wdXRlZCB2YWx1ZXMgb3IgdHJhbnNmb3JtZXJzIHNob3VsZCBub3QgaW52b2tlIGFjdGlvbnMgb3IgdHJpZ2dlciBvdGhlciBzaWRlIGVmZmVjdHNcIik7XG4gICAgdmFyIG5vdGlmeVNweSA9IGlzU3B5RW5hYmxlZCgpO1xuICAgIHZhciBzdGFydFRpbWU7XG4gICAgaWYgKG5vdGlmeVNweSkge1xuICAgICAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB2YXIgbCA9IChhcmdzICYmIGFyZ3MubGVuZ3RoKSB8fCAwO1xuICAgICAgICB2YXIgZmxhdHRlbmRBcmdzID0gbmV3IEFycmF5KGwpO1xuICAgICAgICBpZiAobCA+IDApXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKylcbiAgICAgICAgICAgICAgICBmbGF0dGVuZEFyZ3NbaV0gPSBhcmdzW2ldO1xuICAgICAgICBzcHlSZXBvcnRTdGFydCh7XG4gICAgICAgICAgICB0eXBlOiBcImFjdGlvblwiLFxuICAgICAgICAgICAgbmFtZTogYWN0aW9uTmFtZSxcbiAgICAgICAgICAgIGZuOiBmbixcbiAgICAgICAgICAgIHRhcmdldDogc2NvcGUsXG4gICAgICAgICAgICBhcmd1bWVudHM6IGZsYXR0ZW5kQXJnc1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdmFyIHByZXZVbnRyYWNrZWQgPSB1bnRyYWNrZWRTdGFydCgpO1xuICAgIHRyYW5zYWN0aW9uU3RhcnQoYWN0aW9uTmFtZSwgc2NvcGUsIGZhbHNlKTtcbiAgICB2YXIgcHJldkFsbG93U3RhdGVDaGFuZ2VzID0gYWxsb3dTdGF0ZUNoYW5nZXNTdGFydCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkoc2NvcGUsIGFyZ3MpO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgYWxsb3dTdGF0ZUNoYW5nZXNFbmQocHJldkFsbG93U3RhdGVDaGFuZ2VzKTtcbiAgICAgICAgdHJhbnNhY3Rpb25FbmQoZmFsc2UpO1xuICAgICAgICB1bnRyYWNrZWRFbmQocHJldlVudHJhY2tlZCk7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRFbmQoeyB0aW1lOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVzZVN0cmljdChzdHJpY3QpIHtcbiAgICBpbnZhcmlhbnQoZ2xvYmFsU3RhdGUuZGVyaXZhdGlvblN0YWNrLmxlbmd0aCA9PT0gMCwgXCJJdCBpcyBub3QgYWxsb3dlZCB0byBzZXQgYHVzZVN0cmljdGAgd2hlbiBhIGRlcml2YXRpb24gaXMgcnVubmluZ1wiKTtcbiAgICBnbG9iYWxTdGF0ZS5zdHJpY3RNb2RlID0gc3RyaWN0O1xuICAgIGdsb2JhbFN0YXRlLmFsbG93U3RhdGVDaGFuZ2VzID0gIXN0cmljdDtcbn1cbmV4cG9ydHMudXNlU3RyaWN0ID0gdXNlU3RyaWN0O1xuZnVuY3Rpb24gYWxsb3dTdGF0ZUNoYW5nZXMoYWxsb3dTdGF0ZUNoYW5nZXMsIGZ1bmMpIHtcbiAgICB2YXIgcHJldiA9IGFsbG93U3RhdGVDaGFuZ2VzU3RhcnQoYWxsb3dTdGF0ZUNoYW5nZXMpO1xuICAgIHZhciByZXMgPSBmdW5jKCk7XG4gICAgYWxsb3dTdGF0ZUNoYW5nZXNFbmQocHJldik7XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGFsbG93U3RhdGVDaGFuZ2VzU3RhcnQoYWxsb3dTdGF0ZUNoYW5nZXMpIHtcbiAgICB2YXIgcHJldiA9IGdsb2JhbFN0YXRlLmFsbG93U3RhdGVDaGFuZ2VzO1xuICAgIGdsb2JhbFN0YXRlLmFsbG93U3RhdGVDaGFuZ2VzID0gYWxsb3dTdGF0ZUNoYW5nZXM7XG4gICAgcmV0dXJuIHByZXY7XG59XG5mdW5jdGlvbiBhbGxvd1N0YXRlQ2hhbmdlc0VuZChwcmV2KSB7XG4gICAgZ2xvYmFsU3RhdGUuYWxsb3dTdGF0ZUNoYW5nZXMgPSBwcmV2O1xufVxuZnVuY3Rpb24gcHJvcGFnYXRlQXRvbVJlYWR5KGF0b20pIHtcbiAgICBpbnZhcmlhbnQoYXRvbS5pc0RpcnR5LCBcImF0b20gbm90IGRpcnR5XCIpO1xuICAgIGF0b20uaXNEaXJ0eSA9IGZhbHNlO1xuICAgIHByb3BhZ2F0ZVJlYWRpbmVzcyhhdG9tLCB0cnVlKTtcbn1cbnZhciBBdG9tID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBdG9tKG5hbWUsIG9uQmVjb21lT2JzZXJ2ZWQsIG9uQmVjb21lVW5vYnNlcnZlZCkge1xuICAgICAgICBpZiAobmFtZSA9PT0gdm9pZCAwKSB7IG5hbWUgPSBcIkF0b21AXCIgKyBnZXROZXh0SWQoKTsgfVxuICAgICAgICBpZiAob25CZWNvbWVPYnNlcnZlZCA9PT0gdm9pZCAwKSB7IG9uQmVjb21lT2JzZXJ2ZWQgPSBub29wOyB9XG4gICAgICAgIGlmIChvbkJlY29tZVVub2JzZXJ2ZWQgPT09IHZvaWQgMCkgeyBvbkJlY29tZVVub2JzZXJ2ZWQgPSBub29wOyB9XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMub25CZWNvbWVPYnNlcnZlZCA9IG9uQmVjb21lT2JzZXJ2ZWQ7XG4gICAgICAgIHRoaXMub25CZWNvbWVVbm9ic2VydmVkID0gb25CZWNvbWVVbm9ic2VydmVkO1xuICAgICAgICB0aGlzLmlzRGlydHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdGFsZU9ic2VydmVycyA9IFtdO1xuICAgICAgICB0aGlzLm9ic2VydmVycyA9IG5ldyBTaW1wbGVTZXQoKTtcbiAgICAgICAgdGhpcy5kaWZmVmFsdWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RBY2Nlc3NlZEJ5ID0gMDtcbiAgICB9XG4gICAgQXRvbS5wcm90b3R5cGUucmVwb3J0T2JzZXJ2ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlcG9ydE9ic2VydmVkKHRoaXMpO1xuICAgIH07XG4gICAgQXRvbS5wcm90b3R5cGUucmVwb3J0Q2hhbmdlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMucmVwb3J0U3RhbGUoKTtcbiAgICAgICAgICAgIHRoaXMucmVwb3J0UmVhZHkoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQXRvbS5wcm90b3R5cGUucmVwb3J0U3RhbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0RpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLmlzRGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgcHJvcGFnYXRlU3RhbGVuZXNzKHRoaXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBdG9tLnByb3RvdHlwZS5yZXBvcnRSZWFkeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuaXNEaXJ0eSwgXCJhdG9tIG5vdCBkaXJ0eVwiKTtcbiAgICAgICAgaWYgKGdsb2JhbFN0YXRlLmluVHJhbnNhY3Rpb24gPiAwKVxuICAgICAgICAgICAgZ2xvYmFsU3RhdGUuY2hhbmdlZEF0b21zLnB1c2godGhpcyk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJvcGFnYXRlQXRvbVJlYWR5KHRoaXMpO1xuICAgICAgICAgICAgcnVuUmVhY3Rpb25zKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEF0b20ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH07XG4gICAgcmV0dXJuIEF0b207XG59KCkpO1xuZXhwb3J0cy5BdG9tID0gQXRvbTtcbnZhciBDb21wdXRlZFZhbHVlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb21wdXRlZFZhbHVlKGRlcml2YXRpb24sIHNjb3BlLCBjb21wYXJlU3RydWN0dXJhbCwgbmFtZSkge1xuICAgICAgICB0aGlzLmRlcml2YXRpb24gPSBkZXJpdmF0aW9uO1xuICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gICAgICAgIHRoaXMuY29tcGFyZVN0cnVjdHVyYWwgPSBjb21wYXJlU3RydWN0dXJhbDtcbiAgICAgICAgdGhpcy5pc0xhenkgPSB0cnVlO1xuICAgICAgICB0aGlzLmlzQ29tcHV0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3RhbGVPYnNlcnZlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBuZXcgU2ltcGxlU2V0KCk7XG4gICAgICAgIHRoaXMub2JzZXJ2aW5nID0gW107XG4gICAgICAgIHRoaXMuZGlmZlZhbHVlID0gMDtcbiAgICAgICAgdGhpcy5ydW5JZCA9IDA7XG4gICAgICAgIHRoaXMubGFzdEFjY2Vzc2VkQnkgPSAwO1xuICAgICAgICB0aGlzLnVuYm91bmREZXBzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLl9fbWFwaWQgPSBcIiNcIiArIGdldE5leHRJZCgpO1xuICAgICAgICB0aGlzLmRlcGVuZGVuY3lDaGFuZ2VDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jeVN0YWxlQ291bnQgPSAwO1xuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lIHx8IFwiQ29tcHV0ZWRWYWx1ZUBcIiArIGdldE5leHRJZCgpO1xuICAgIH1cbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmlzQ29tcHV0aW5nID0gdHJ1ZTtcbiAgICAgICAgdmFyIHByZXZBbGxvd1N0YXRlQ2hhbmdlcyA9IGFsbG93U3RhdGVDaGFuZ2VzU3RhcnQoZmFsc2UpO1xuICAgICAgICB2YXIgcmVzID0gdGhpcy5kZXJpdmF0aW9uLmNhbGwodGhpcy5zY29wZSk7XG4gICAgICAgIGFsbG93U3RhdGVDaGFuZ2VzRW5kKHByZXZBbGxvd1N0YXRlQ2hhbmdlcyk7XG4gICAgICAgIHRoaXMuaXNDb21wdXRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIDtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5vbkJlY29tZU9ic2VydmVkID0gZnVuY3Rpb24gKCkge1xuICAgIH07XG4gICAgQ29tcHV0ZWRWYWx1ZS5wcm90b3R5cGUub25CZWNvbWVVbm9ic2VydmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjbGVhck9ic2VydmluZyh0aGlzKTtcbiAgICAgICAgdGhpcy5pc0xhenkgPSB0cnVlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgQ29tcHV0ZWRWYWx1ZS5wcm90b3R5cGUub25EZXBlbmRlbmNpZXNSZWFkeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSB0aGlzLnRyYWNrQW5kQ29tcHV0ZSgpO1xuICAgICAgICByZXR1cm4gY2hhbmdlZDtcbiAgICB9O1xuICAgIENvbXB1dGVkVmFsdWUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW52YXJpYW50KCF0aGlzLmlzQ29tcHV0aW5nLCBcIkN5Y2xlIGRldGVjdGVkIGluIGNvbXB1dGF0aW9uIFwiICsgdGhpcy5uYW1lLCB0aGlzLmRlcml2YXRpb24pO1xuICAgICAgICByZXBvcnRPYnNlcnZlZCh0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jeVN0YWxlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wZWVrKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNMYXp5KSB7XG4gICAgICAgICAgICBpZiAoaXNDb21wdXRpbmdEZXJpdmF0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzTGF6eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMudHJhY2tBbmRDb21wdXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wZWVrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoXykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbQ29tcHV0ZWRWYWx1ZSAnXCIgKyBuYW1lICsgXCInXSBJdCBpcyBub3QgcG9zc2libGUgdG8gYXNzaWduIGEgbmV3IHZhbHVlIHRvIGEgY29tcHV0ZWQgdmFsdWUuXCIpO1xuICAgIH07XG4gICAgQ29tcHV0ZWRWYWx1ZS5wcm90b3R5cGUudHJhY2tBbmRDb21wdXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNTcHlFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHNweVJlcG9ydCh7XG4gICAgICAgICAgICAgICAgb2JqZWN0OiB0aGlzLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiY29tcHV0ZVwiLFxuICAgICAgICAgICAgICAgIGZuOiB0aGlzLmRlcml2YXRpb24sXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLnNjb3BlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLnZhbHVlID0gdHJhY2tEZXJpdmVkRnVuY3Rpb24odGhpcywgdGhpcy5wZWVrKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlRGlkQ2hhbmdlKHRoaXMuY29tcGFyZVN0cnVjdHVyYWwsIG5ld1ZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgfTtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5vYnNlcnZlID0gZnVuY3Rpb24gKGxpc3RlbmVyLCBmaXJlSW1tZWRpYXRlbHkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGZpcnN0VGltZSA9IHRydWU7XG4gICAgICAgIHZhciBwcmV2VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBhdXRvcnVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IF90aGlzLmdldCgpO1xuICAgICAgICAgICAgaWYgKCFmaXJzdFRpbWUgfHwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZXZVID0gdW50cmFja2VkU3RhcnQoKTtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcihuZXdWYWx1ZSwgcHJldlZhbHVlKTtcbiAgICAgICAgICAgICAgICB1bnRyYWNrZWRFbmQocHJldlUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7XG4gICAgICAgICAgICBwcmV2VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgpO1xuICAgIH07XG4gICAgQ29tcHV0ZWRWYWx1ZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyBcIltcIiArIHRoaXMuZGVyaXZhdGlvbi50b1N0cmluZygpICsgXCJdXCI7XG4gICAgfTtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS53aHlSdW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpc1RyYWNraW5nID0gZ2xvYmFsU3RhdGUuZGVyaXZhdGlvblN0YWNrLmxlbmd0aCA+IDA7XG4gICAgICAgIHZhciBvYnNlcnZpbmcgPSB1bmlxdWUodGhpcy5vYnNlcnZpbmcpLm1hcChmdW5jdGlvbiAoZGVwKSB7IHJldHVybiBkZXAubmFtZTsgfSk7XG4gICAgICAgIHZhciBvYnNlcnZlcnMgPSB1bmlxdWUodGhpcy5vYnNlcnZlcnMuYXNBcnJheSgpKS5tYXAoZnVuY3Rpb24gKGRlcCkgeyByZXR1cm4gZGVwLm5hbWU7IH0pO1xuICAgICAgICB2YXIgcnVuUmVhc29uID0gKHRoaXMuaXNDb21wdXRpbmdcbiAgICAgICAgICAgID8gaXNUcmFja2luZ1xuICAgICAgICAgICAgICAgID8gdGhpcy5vYnNlcnZlcnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICA/IFJ1blJlYXNvbi5JTlZBTElEQVRFRFxuICAgICAgICAgICAgICAgICAgICA6IFJ1blJlYXNvbi5SRVFVSVJFRFxuICAgICAgICAgICAgICAgIDogUnVuUmVhc29uLlBFRUtcbiAgICAgICAgICAgIDogUnVuUmVhc29uLk5PVF9SVU5OSU5HKTtcbiAgICAgICAgaWYgKHJ1blJlYXNvbiA9PT0gUnVuUmVhc29uLlJFUVVJUkVEKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWlyZWRCeSA9IGdsb2JhbFN0YXRlLmRlcml2YXRpb25TdGFja1tnbG9iYWxTdGF0ZS5kZXJpdmF0aW9uU3RhY2subGVuZ3RoIC0gMl07XG4gICAgICAgICAgICBpZiAocmVxdWlyZWRCeSlcbiAgICAgICAgICAgICAgICBvYnNlcnZlcnMucHVzaChyZXF1aXJlZEJ5Lm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKFwiXFxuV2h5UnVuPyBjb21wdXRhdGlvbiAnXCIgKyB0aGlzLm5hbWUgKyBcIic6XFxuICogUnVubmluZyBiZWNhdXNlOiBcIiArIHJ1blJlYXNvblRleHRzW3J1blJlYXNvbl0gKyBcIiBcIiArICgocnVuUmVhc29uID09PSBSdW5SZWFzb24uTk9UX1JVTk5JTkcpICYmIHRoaXMuZGVwZW5kZW5jeVN0YWxlQ291bnQgPiAwID8gXCIoYSBuZXh0IHJ1biBpcyBzY2hlZHVsZWQpXCIgOiBcIlwiKSArIFwiXFxuXCIpICtcbiAgICAgICAgICAgICh0aGlzLmlzTGF6eVxuICAgICAgICAgICAgICAgID9cbiAgICAgICAgICAgICAgICAgICAgXCIgKiBUaGlzIGNvbXB1dGF0aW9uIGlzIHN1c3BlbmRlZCAobm90IGluIHVzZSBieSBhbnkgcmVhY3Rpb24pIGFuZCB3b24ndCBydW4gYXV0b21hdGljYWxseS5cXG5cXHREaWRuJ3QgZXhwZWN0IHRoaXMgY29tcHV0YXRpb24gdG8gYmUgc3VzcGVuZGVkIGF0IHRoaXMgcG9pbnQ/XFxuXFx0ICAxLiBNYWtlIHN1cmUgdGhpcyBjb21wdXRhdGlvbiBpcyB1c2VkIGJ5IGEgcmVhY3Rpb24gKHJlYWN0aW9uLCBhdXRvcnVuLCBvYnNlcnZlcikuXFxuXFx0ICAyLiBDaGVjayB3aGV0aGVyIHlvdSBhcmUgdXNpbmcgdGhpcyBjb21wdXRhdGlvbiBzeW5jaHJvbm91c2x5IChpbiB0aGUgc2FtZSBzdGFjayBhcyB0aGV5IHJlYWN0aW9uIHRoYXQgbmVlZHMgaXQpLlxcblwiXG4gICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgICAgICBcIiAqIFRoaXMgY29tcHV0YXRpb24gd2lsbCByZS1ydW4gaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgb2JzZXJ2YWJsZXMgY2hhbmdlczpcXG4gICAgXCIgKyBqb2luU3RyaW5ncyhvYnNlcnZpbmcpICsgXCJcXG4gICAgXCIgKyAoKHRoaXMuaXNDb21wdXRpbmcgJiYgaXNUcmFja2luZykgPyBcIiAoLi4uIG9yIGFueSBvYnNlcnZhYmxlIGFjY2Vzc2VkIGR1cmluZyB0aGUgcmVtYWluZGVyIG9mIHRoZSBjdXJyZW50IHJ1bilcIiA6IFwiXCIpICsgXCJcXG5cXHRNaXNzaW5nIGl0ZW1zIGluIHRoaXMgbGlzdD9cXG5cXHQgIDEuIENoZWNrIHdoZXRoZXIgYWxsIHVzZWQgdmFsdWVzIGFyZSBwcm9wZXJseSBtYXJrZWQgYXMgb2JzZXJ2YWJsZSAodXNlIGlzT2JzZXJ2YWJsZSB0byB2ZXJpZnkpXFxuXFx0ICAyLiBNYWtlIHN1cmUgeW91IGRpZG4ndCBkZXJlZmVyZW5jZSB2YWx1ZXMgdG9vIGVhcmx5LiBNb2JYIG9ic2VydmVzIHByb3BzLCBub3QgcHJpbWl0aXZlcy4gRS5nOiB1c2UgJ3BlcnNvbi5uYW1lJyBpbnN0ZWFkIG9mICduYW1lJyBpbiB5b3VyIGNvbXB1dGF0aW9uLlxcbiAgKiBJZiB0aGUgb3V0Y29tZSBvZiB0aGlzIGNvbXB1dGF0aW9uIGNoYW5nZXMsIHRoZSBmb2xsb3dpbmcgb2JzZXJ2ZXJzIHdpbGwgYmUgcmUtcnVuOlxcbiAgICBcIiArIGpvaW5TdHJpbmdzKG9ic2VydmVycykgKyBcIlxcblwiKSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29tcHV0ZWRWYWx1ZTtcbn0oKSk7XG52YXIgUnVuUmVhc29uO1xuKGZ1bmN0aW9uIChSdW5SZWFzb24pIHtcbiAgICBSdW5SZWFzb25bUnVuUmVhc29uW1wiUEVFS1wiXSA9IDBdID0gXCJQRUVLXCI7XG4gICAgUnVuUmVhc29uW1J1blJlYXNvbltcIklOVkFMSURBVEVEXCJdID0gMV0gPSBcIklOVkFMSURBVEVEXCI7XG4gICAgUnVuUmVhc29uW1J1blJlYXNvbltcIlJFUVVJUkVEXCJdID0gMl0gPSBcIlJFUVVJUkVEXCI7XG4gICAgUnVuUmVhc29uW1J1blJlYXNvbltcIk5PVF9SVU5OSU5HXCJdID0gM10gPSBcIk5PVF9SVU5OSU5HXCI7XG59KShSdW5SZWFzb24gfHwgKFJ1blJlYXNvbiA9IHt9KSk7XG52YXIgcnVuUmVhc29uVGV4dHMgPSAoX2EgPSB7fSxcbiAgICBfYVtSdW5SZWFzb24uUEVFS10gPSBcIltwZWVrXSBUaGUgdmFsdWUgb2YgdGhpcyBjb21wdXRlZCB2YWx1ZSB3YXMgcmVxdWVzdGVkIG91dHNpZGUgYW4gcmVhY3Rpb25cIixcbiAgICBfYVtSdW5SZWFzb24uSU5WQUxJREFURURdID0gXCJbaW52YWxpZGF0ZWRdIFNvbWUgb2JzZXJ2YWJsZXMgdXNlZCBieSB0aGlzIGNvbXB1dGF0aW9uIGRpZCBjaGFuZ2VcIixcbiAgICBfYVtSdW5SZWFzb24uUkVRVUlSRURdID0gXCJbc3RhcnRlZF0gVGhpcyBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBieSBhbm90aGVyIGNvbXB1dGVkIHZhbHVlIC8gcmVhY3Rpb25cIixcbiAgICBfYVtSdW5SZWFzb24uTk9UX1JVTk5JTkddID0gXCJbaWRsZV0gVGhpcyBjb21wdXRpb24gaXMgY3VycmVudGx5IG5vdCBydW5uaW5nXCIsXG4gICAgX2Fcbik7XG5mdW5jdGlvbiBpc0NvbXB1dGluZ0Rlcml2YXRpb24oKSB7XG4gICAgcmV0dXJuIGdsb2JhbFN0YXRlLmRlcml2YXRpb25TdGFjay5sZW5ndGggPiAwXG4gICAgICAgICYmIGdsb2JhbFN0YXRlLmlzVHJhY2tpbmc7XG59XG5mdW5jdGlvbiBjaGVja0lmU3RhdGVNb2RpZmljYXRpb25zQXJlQWxsb3dlZCgpIHtcbiAgICBpZiAoIWdsb2JhbFN0YXRlLmFsbG93U3RhdGVDaGFuZ2VzKSB7XG4gICAgICAgIGludmFyaWFudChmYWxzZSwgZ2xvYmFsU3RhdGUuc3RyaWN0TW9kZVxuICAgICAgICAgICAgPyBcIkl0IGlzIG5vdCBhbGxvd2VkIHRvIGNyZWF0ZSBvciBjaGFuZ2Ugc3RhdGUgb3V0c2lkZSBhbiBgYWN0aW9uYCB3aGVuIE1vYlggaXMgaW4gc3RyaWN0IG1vZGUuIFdyYXAgdGhlIGN1cnJlbnQgbWV0aG9kIGluIGBhY3Rpb25gIGlmIHRoaXMgc3RhdGUgY2hhbmdlIGlzIGludGVuZGVkXCJcbiAgICAgICAgICAgIDogXCJJdCBpcyBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhlIHN0YXRlIHdoZW4gYSBjb21wdXRlZCB2YWx1ZSBvciB0cmFuc2Zvcm1lciBpcyBiZWluZyBldmFsdWF0ZWQuIFVzZSAnYXV0b3J1bicgdG8gY3JlYXRlIHJlYWN0aXZlIGZ1bmN0aW9ucyB3aXRoIHNpZGUtZWZmZWN0cy5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gbm90aWZ5RGVwZW5kZW5jeVN0YWxlKGRlcml2YXRpb24pIHtcbiAgICBpZiAoKytkZXJpdmF0aW9uLmRlcGVuZGVuY3lTdGFsZUNvdW50ID09PSAxKSB7XG4gICAgICAgIHByb3BhZ2F0ZVN0YWxlbmVzcyhkZXJpdmF0aW9uKTtcbiAgICB9XG59XG5mdW5jdGlvbiBub3RpZnlEZXBlbmRlbmN5UmVhZHkoZGVyaXZhdGlvbiwgZGVwZW5kZW5jeURpZENoYW5nZSkge1xuICAgIGludmFyaWFudChkZXJpdmF0aW9uLmRlcGVuZGVuY3lTdGFsZUNvdW50ID4gMCwgXCJ1bmV4cGVjdGVkIHJlYWR5IG5vdGlmaWNhdGlvblwiKTtcbiAgICBpZiAoZGVwZW5kZW5jeURpZENoYW5nZSlcbiAgICAgICAgZGVyaXZhdGlvbi5kZXBlbmRlbmN5Q2hhbmdlQ291bnQgKz0gMTtcbiAgICBpZiAoLS1kZXJpdmF0aW9uLmRlcGVuZGVuY3lTdGFsZUNvdW50ID09PSAwKSB7XG4gICAgICAgIGlmIChkZXJpdmF0aW9uLmRlcGVuZGVuY3lDaGFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGRlcml2YXRpb24uZGVwZW5kZW5jeUNoYW5nZUNvdW50ID0gMDtcbiAgICAgICAgICAgIHZhciBjaGFuZ2VkID0gZGVyaXZhdGlvbi5vbkRlcGVuZGVuY2llc1JlYWR5KCk7XG4gICAgICAgICAgICBwcm9wYWdhdGVSZWFkaW5lc3MoZGVyaXZhdGlvbiwgY2hhbmdlZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcm9wYWdhdGVSZWFkaW5lc3MoZGVyaXZhdGlvbiwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdHJhY2tEZXJpdmVkRnVuY3Rpb24oZGVyaXZhdGlvbiwgZikge1xuICAgIHZhciBwcmV2T2JzZXJ2aW5nID0gZGVyaXZhdGlvbi5vYnNlcnZpbmc7XG4gICAgZGVyaXZhdGlvbi5vYnNlcnZpbmcgPSBuZXcgQXJyYXkocHJldk9ic2VydmluZy5sZW5ndGggKyAxMDApO1xuICAgIGRlcml2YXRpb24udW5ib3VuZERlcHNDb3VudCA9IDA7XG4gICAgZGVyaXZhdGlvbi5ydW5JZCA9ICsrZ2xvYmFsU3RhdGUucnVuSWQ7XG4gICAgZ2xvYmFsU3RhdGUuZGVyaXZhdGlvblN0YWNrLnB1c2goZGVyaXZhdGlvbik7XG4gICAgdmFyIHByZXZUcmFja2luZyA9IGdsb2JhbFN0YXRlLmlzVHJhY2tpbmc7XG4gICAgZ2xvYmFsU3RhdGUuaXNUcmFja2luZyA9IHRydWU7XG4gICAgdmFyIGhhc0V4Y2VwdGlvbiA9IHRydWU7XG4gICAgdmFyIHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBmLmNhbGwoZGVyaXZhdGlvbik7XG4gICAgICAgIGhhc0V4Y2VwdGlvbiA9IGZhbHNlO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGhhc0V4Y2VwdGlvbikge1xuICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSAoXCJbbW9ieF0gQW4gdW5jYXVnaHQgZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGNhbGN1bGF0aW5nIHlvdXIgY29tcHV0ZWQgdmFsdWUsIGF1dG9ydW4gb3IgdHJhbnNmb3JtZXIuIE9yIGluc2lkZSB0aGUgcmVuZGVyKCkgbWV0aG9kIG9mIGFuIG9ic2VydmVyIGJhc2VkIFJlYWN0IGNvbXBvbmVudC4gXCIgK1xuICAgICAgICAgICAgICAgIFwiVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBuZXZlciB0aHJvdyBleGNlcHRpb25zIGFzIE1vYlggd2lsbCBub3QgYWx3YXlzIGJlIGFibGUgdG8gcmVjb3ZlciBmcm9tIHRoZW0uIFwiICtcbiAgICAgICAgICAgICAgICAoXCJQbGVhc2UgZml4IHRoZSBlcnJvciByZXBvcnRlZCBhZnRlciB0aGlzIG1lc3NhZ2Ugb3IgZW5hYmxlICdQYXVzZSBvbiAoY2F1Z2h0KSBleGNlcHRpb25zJyBpbiB5b3VyIGRlYnVnZ2VyIHRvIGZpbmQgdGhlIHJvb3QgY2F1c2UuIEluOiAnXCIgKyBkZXJpdmF0aW9uLm5hbWUgKyBcIidcIikpO1xuICAgICAgICAgICAgaWYgKGlzU3B5RW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgc3B5UmVwb3J0KHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgIGRlcml2YXRpb24udW5ib3VuZERlcHNDb3VudCA9IDA7XG4gICAgICAgICAgICBkZXJpdmF0aW9uLm9ic2VydmluZyA9IHByZXZPYnNlcnZpbmc7XG4gICAgICAgICAgICByZXNldEdsb2JhbFN0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWxTdGF0ZS5pc1RyYWNraW5nID0gcHJldlRyYWNraW5nO1xuICAgICAgICAgICAgZ2xvYmFsU3RhdGUuZGVyaXZhdGlvblN0YWNrLmxlbmd0aCAtPSAxO1xuICAgICAgICAgICAgYmluZERlcGVuZGVuY2llcyhkZXJpdmF0aW9uLCBwcmV2T2JzZXJ2aW5nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gYmluZERlcGVuZGVuY2llcyhkZXJpdmF0aW9uLCBwcmV2T2JzZXJ2aW5nKSB7XG4gICAgdmFyIHByZXZMZW5ndGggPSBwcmV2T2JzZXJ2aW5nLmxlbmd0aDtcbiAgICB2YXIgb2JzZXJ2aW5nID0gZGVyaXZhdGlvbi5vYnNlcnZpbmc7XG4gICAgdmFyIG5ld0xlbmd0aCA9IG9ic2VydmluZy5sZW5ndGggPSBkZXJpdmF0aW9uLnVuYm91bmREZXBzQ291bnQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmV2TGVuZ3RoOyBpKyspXG4gICAgICAgIHByZXZPYnNlcnZpbmdbaV0uZGlmZlZhbHVlID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdMZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZGVwID0gb2JzZXJ2aW5nW2ldO1xuICAgICAgICBpZiAoKCsrZGVwLmRpZmZWYWx1ZSkgPiAwKSB7XG4gICAgICAgICAgICBkZXAuZGlmZlZhbHVlID0gMDtcbiAgICAgICAgICAgIGFkZE9ic2VydmVyKGRlcCwgZGVyaXZhdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmV2TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGRlcCA9IHByZXZPYnNlcnZpbmdbaV07XG4gICAgICAgIGlmIChkZXAuZGlmZlZhbHVlIDwgMCkge1xuICAgICAgICAgICAgZGVwLmRpZmZWYWx1ZSA9IDA7XG4gICAgICAgICAgICByZW1vdmVPYnNlcnZlcihkZXAsIGRlcml2YXRpb24pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY2xlYXJPYnNlcnZpbmcoZGVyaXZhdGlvbikge1xuICAgIHZhciBvYnMgPSBkZXJpdmF0aW9uLm9ic2VydmluZztcbiAgICB2YXIgbCA9IG9icy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspXG4gICAgICAgIHJlbW92ZU9ic2VydmVyKG9ic1tpXSwgZGVyaXZhdGlvbik7XG4gICAgb2JzLmxlbmd0aCA9IDA7XG59XG5mdW5jdGlvbiB1bnRyYWNrZWQoYWN0aW9uKSB7XG4gICAgdmFyIHByZXYgPSB1bnRyYWNrZWRTdGFydCgpO1xuICAgIHZhciByZXMgPSBhY3Rpb24oKTtcbiAgICB1bnRyYWNrZWRFbmQocHJldik7XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudW50cmFja2VkID0gdW50cmFja2VkO1xuZnVuY3Rpb24gdW50cmFja2VkU3RhcnQoKSB7XG4gICAgdmFyIHByZXYgPSBnbG9iYWxTdGF0ZS5pc1RyYWNraW5nO1xuICAgIGdsb2JhbFN0YXRlLmlzVHJhY2tpbmcgPSBmYWxzZTtcbiAgICByZXR1cm4gcHJldjtcbn1cbmZ1bmN0aW9uIHVudHJhY2tlZEVuZChwcmV2KSB7XG4gICAgZ2xvYmFsU3RhdGUuaXNUcmFja2luZyA9IHByZXY7XG59XG52YXIgcGVyc2lzdGVudEtleXMgPSBbXCJtb2J4R3VpZFwiLCBcInJlc2V0SWRcIiwgXCJzcHlMaXN0ZW5lcnNcIiwgXCJzdHJpY3RNb2RlXCIsIFwicnVuSWRcIl07XG52YXIgTW9iWEdsb2JhbHMgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1vYlhHbG9iYWxzKCkge1xuICAgICAgICB0aGlzLnZlcnNpb24gPSAzO1xuICAgICAgICB0aGlzLmRlcml2YXRpb25TdGFjayA9IFtdO1xuICAgICAgICB0aGlzLnJ1bklkID0gMDtcbiAgICAgICAgdGhpcy5tb2J4R3VpZCA9IDA7XG4gICAgICAgIHRoaXMuaW5UcmFuc2FjdGlvbiA9IDA7XG4gICAgICAgIHRoaXMuaXNUcmFja2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzUnVubmluZ1JlYWN0aW9ucyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNoYW5nZWRBdG9tcyA9IFtdO1xuICAgICAgICB0aGlzLnBlbmRpbmdSZWFjdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5hbGxvd1N0YXRlQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RyaWN0TW9kZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0SWQgPSAwO1xuICAgICAgICB0aGlzLnNweUxpc3RlbmVycyA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gTW9iWEdsb2JhbHM7XG59KCkpO1xudmFyIGdsb2JhbFN0YXRlID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVzID0gbmV3IE1vYlhHbG9iYWxzKCk7XG4gICAgaWYgKGdsb2JhbC5fX21vYnNlcnZhYmxlVHJhY2tpbmdTdGFjayB8fCBnbG9iYWwuX19tb2JzZXJ2YWJsZVZpZXdTdGFjaylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW21vYnhdIEFuIGluY29tcGF0aWJsZSB2ZXJzaW9uIG9mIG1vYnNlcnZhYmxlIGlzIGFscmVhZHkgbG9hZGVkLlwiKTtcbiAgICBpZiAoZ2xvYmFsLl9fbW9ieEdsb2JhbCAmJiBnbG9iYWwuX19tb2J4R2xvYmFsLnZlcnNpb24gIT09IHJlcy52ZXJzaW9uKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieF0gQW4gaW5jb21wYXRpYmxlIHZlcnNpb24gb2YgbW9ieCBpcyBhbHJlYWR5IGxvYWRlZC5cIik7XG4gICAgaWYgKGdsb2JhbC5fX21vYnhHbG9iYWwpXG4gICAgICAgIHJldHVybiBnbG9iYWwuX19tb2J4R2xvYmFsO1xuICAgIHJldHVybiBnbG9iYWwuX19tb2J4R2xvYmFsID0gcmVzO1xufSkoKTtcbmZ1bmN0aW9uIHJlZ2lzdGVyR2xvYmFscygpIHtcbn1cbmZ1bmN0aW9uIHJlc2V0R2xvYmFsU3RhdGUoKSB7XG4gICAgZ2xvYmFsU3RhdGUucmVzZXRJZCsrO1xuICAgIHZhciBkZWZhdWx0R2xvYmFscyA9IG5ldyBNb2JYR2xvYmFscygpO1xuICAgIGZvciAodmFyIGtleSBpbiBkZWZhdWx0R2xvYmFscylcbiAgICAgICAgaWYgKHBlcnNpc3RlbnRLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpXG4gICAgICAgICAgICBnbG9iYWxTdGF0ZVtrZXldID0gZGVmYXVsdEdsb2JhbHNba2V5XTtcbiAgICBnbG9iYWxTdGF0ZS5hbGxvd1N0YXRlQ2hhbmdlcyA9ICFnbG9iYWxTdGF0ZS5zdHJpY3RNb2RlO1xufVxuZnVuY3Rpb24gYWRkT2JzZXJ2ZXIob2JzZXJ2YWJsZSwgbm9kZSkge1xuICAgIHZhciB3YXNFbXB0eSA9IG9ic2VydmFibGUub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMDtcbiAgICBvYnNlcnZhYmxlLm9ic2VydmVycy5hZGQobm9kZSk7XG4gICAgaWYgKHdhc0VtcHR5KVxuICAgICAgICBvYnNlcnZhYmxlLm9uQmVjb21lT2JzZXJ2ZWQoKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZU9ic2VydmVyKG9ic2VydmFibGUsIG5vZGUpIHtcbiAgICBvYnNlcnZhYmxlLm9ic2VydmVycy5yZW1vdmUobm9kZSk7XG4gICAgaWYgKG9ic2VydmFibGUub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgb2JzZXJ2YWJsZS5vbkJlY29tZVVub2JzZXJ2ZWQoKTtcbn1cbmZ1bmN0aW9uIHJlcG9ydE9ic2VydmVkKG9ic2VydmFibGUpIHtcbiAgICBpZiAoZ2xvYmFsU3RhdGUuaXNUcmFja2luZyA9PT0gZmFsc2UpXG4gICAgICAgIHJldHVybjtcbiAgICB2YXIgZGVyaXZhdGlvbiA9IGdsb2JhbFN0YXRlLmRlcml2YXRpb25TdGFja1tnbG9iYWxTdGF0ZS5kZXJpdmF0aW9uU3RhY2subGVuZ3RoIC0gMV07XG4gICAgaWYgKGRlcml2YXRpb24ucnVuSWQgIT09IG9ic2VydmFibGUubGFzdEFjY2Vzc2VkQnkpIHtcbiAgICAgICAgb2JzZXJ2YWJsZS5sYXN0QWNjZXNzZWRCeSA9IGRlcml2YXRpb24ucnVuSWQ7XG4gICAgICAgIGRlcml2YXRpb24ub2JzZXJ2aW5nW2Rlcml2YXRpb24udW5ib3VuZERlcHNDb3VudCsrXSA9IG9ic2VydmFibGU7XG4gICAgfVxufVxuZnVuY3Rpb24gcHJvcGFnYXRlU3RhbGVuZXNzKG9ic2VydmFibGUpIHtcbiAgICB2YXIgb3MgPSBvYnNlcnZhYmxlLm9ic2VydmVycy5hc0FycmF5KCk7XG4gICAgdmFyIGwgPSBvcy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspXG4gICAgICAgIG5vdGlmeURlcGVuZGVuY3lTdGFsZShvc1tpXSk7XG4gICAgb2JzZXJ2YWJsZS5zdGFsZU9ic2VydmVycyA9IG9ic2VydmFibGUuc3RhbGVPYnNlcnZlcnMuY29uY2F0KG9zKTtcbn1cbmZ1bmN0aW9uIHByb3BhZ2F0ZVJlYWRpbmVzcyhvYnNlcnZhYmxlLCB2YWx1ZURpZEFjdHVhbGx5Q2hhbmdlKSB7XG4gICAgb2JzZXJ2YWJsZS5zdGFsZU9ic2VydmVycy5zcGxpY2UoMCkuZm9yRWFjaChmdW5jdGlvbiAobykgeyByZXR1cm4gbm90aWZ5RGVwZW5kZW5jeVJlYWR5KG8sIHZhbHVlRGlkQWN0dWFsbHlDaGFuZ2UpOyB9KTtcbn1cbnZhciBFTVBUWV9ERVJJVkFUSU9OX1NFVDtcbnZhciBSZWFjdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmVhY3Rpb24obmFtZSwgb25JbnZhbGlkYXRlKSB7XG4gICAgICAgIGlmIChuYW1lID09PSB2b2lkIDApIHsgbmFtZSA9IFwiUmVhY3Rpb25AXCIgKyBnZXROZXh0SWQoKTsgfVxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLm9uSW52YWxpZGF0ZSA9IG9uSW52YWxpZGF0ZTtcbiAgICAgICAgdGhpcy5zdGFsZU9ic2VydmVycyA9IEVNUFRZX0FSUkFZO1xuICAgICAgICB0aGlzLm9ic2VydmVycyA9IEVNUFRZX0RFUklWQVRJT05fU0VUIHx8IChFTVBUWV9ERVJJVkFUSU9OX1NFVCA9IG5ldyBTaW1wbGVTZXQoKSk7XG4gICAgICAgIHRoaXMub2JzZXJ2aW5nID0gW107XG4gICAgICAgIHRoaXMuZGlmZlZhbHVlID0gMDtcbiAgICAgICAgdGhpcy5ydW5JZCA9IDA7XG4gICAgICAgIHRoaXMubGFzdEFjY2Vzc2VkQnkgPSAwO1xuICAgICAgICB0aGlzLnVuYm91bmREZXBzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLl9fbWFwaWQgPSBcIiNcIiArIGdldE5leHRJZCgpO1xuICAgICAgICB0aGlzLmRlcGVuZGVuY3lDaGFuZ2VDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jeVN0YWxlQ291bnQgPSAwO1xuICAgICAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNUcmFja1BlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5vbkJlY29tZU9ic2VydmVkID0gZnVuY3Rpb24gKCkge1xuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLm9uQmVjb21lVW5vYnNlcnZlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICB9O1xuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5vbkRlcGVuZGVuY2llc1JlYWR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc1NjaGVkdWxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICAgICAgZ2xvYmFsU3RhdGUucGVuZGluZ1JlYWN0aW9ucy5wdXNoKHRoaXMpO1xuICAgICAgICAgICAgcnVuUmVhY3Rpb25zKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5pc1NjaGVkdWxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVwZW5kZW5jeVN0YWxlQ291bnQgPiAwIHx8IHRoaXMuX2lzU2NoZWR1bGVkO1xuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLnJ1blJlYWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2lzVHJhY2tQZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMub25JbnZhbGlkYXRlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5faXNUcmFja1BlbmRpbmcgJiYgaXNTcHlFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICBzcHlSZXBvcnQoe1xuICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2NoZWR1bGVkLXJlYWN0aW9uXCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLnRyYWNrID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHZhciBub3RpZnkgPSBpc1NweUVuYWJsZWQoKTtcbiAgICAgICAgdmFyIHN0YXJ0VGltZTtcbiAgICAgICAgaWYgKG5vdGlmeSkge1xuICAgICAgICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHNweVJlcG9ydFN0YXJ0KHtcbiAgICAgICAgICAgICAgICBvYmplY3Q6IHRoaXMsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJyZWFjdGlvblwiLFxuICAgICAgICAgICAgICAgIGZuOiBmblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJhY2tEZXJpdmVkRnVuY3Rpb24odGhpcywgZm4pO1xuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNUcmFja1BlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgICAgICAgY2xlYXJPYnNlcnZpbmcodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vdGlmeSkge1xuICAgICAgICAgICAgc3B5UmVwb3J0RW5kKHtcbiAgICAgICAgICAgICAgICB0aW1lOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1J1bm5pbmcpXG4gICAgICAgICAgICAgICAgY2xlYXJPYnNlcnZpbmcodGhpcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5nZXREaXNwb3NlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLmRpc3Bvc2UuYmluZCh0aGlzKTtcbiAgICAgICAgci4kbW9ieCA9IHRoaXM7XG4gICAgICAgIHJldHVybiByO1xuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJSZWFjdGlvbltcIiArIHRoaXMubmFtZSArIFwiXVwiO1xuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLndoeVJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9ic2VydmluZyA9IHVuaXF1ZSh0aGlzLm9ic2VydmluZykubWFwKGZ1bmN0aW9uIChkZXApIHsgcmV0dXJuIGRlcC5uYW1lOyB9KTtcbiAgICAgICAgcmV0dXJuIChcIlxcbldoeVJ1bj8gcmVhY3Rpb24gJ1wiICsgdGhpcy5uYW1lICsgXCInOlxcbiAqIFN0YXR1czogW1wiICsgKHRoaXMuaXNEaXNwb3NlZCA/IFwic3RvcHBlZFwiIDogdGhpcy5faXNSdW5uaW5nID8gXCJydW5uaW5nXCIgOiB0aGlzLmlzU2NoZWR1bGVkKCkgPyBcInNjaGVkdWxlZFwiIDogXCJpZGxlXCIpICsgXCJdXFxuICogVGhpcyByZWFjdGlvbiB3aWxsIHJlLXJ1biBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBvYnNlcnZhYmxlcyBjaGFuZ2VzOlxcbiAgICBcIiArIGpvaW5TdHJpbmdzKG9ic2VydmluZykgKyBcIlxcbiAgICBcIiArICgodGhpcy5faXNSdW5uaW5nKSA/IFwiICguLi4gb3IgYW55IG9ic2VydmFibGUgYWNjZXNzZWQgZHVyaW5nIHRoZSByZW1haW5kZXIgb2YgdGhlIGN1cnJlbnQgcnVuKVwiIDogXCJcIikgKyBcIlxcblxcdE1pc3NpbmcgaXRlbXMgaW4gdGhpcyBsaXN0P1xcblxcdCAgMS4gQ2hlY2sgd2hldGhlciBhbGwgdXNlZCB2YWx1ZXMgYXJlIHByb3Blcmx5IG1hcmtlZCBhcyBvYnNlcnZhYmxlICh1c2UgaXNPYnNlcnZhYmxlIHRvIHZlcmlmeSlcXG5cXHQgIDIuIE1ha2Ugc3VyZSB5b3UgZGlkbid0IGRlcmVmZXJlbmNlIHZhbHVlcyB0b28gZWFybHkuIE1vYlggb2JzZXJ2ZXMgcHJvcHMsIG5vdCBwcmltaXRpdmVzLiBFLmc6IHVzZSAncGVyc29uLm5hbWUnIGluc3RlYWQgb2YgJ25hbWUnIGluIHlvdXIgY29tcHV0YXRpb24uXFxuXCIpO1xuICAgIH07XG4gICAgcmV0dXJuIFJlYWN0aW9uO1xufSgpKTtcbmV4cG9ydHMuUmVhY3Rpb24gPSBSZWFjdGlvbjtcbnZhciBNQVhfUkVBQ1RJT05fSVRFUkFUSU9OUyA9IDEwMDtcbmZ1bmN0aW9uIHJ1blJlYWN0aW9ucygpIHtcbiAgICBpZiAoZ2xvYmFsU3RhdGUuaXNSdW5uaW5nUmVhY3Rpb25zID09PSB0cnVlIHx8IGdsb2JhbFN0YXRlLmluVHJhbnNhY3Rpb24gPiAwKVxuICAgICAgICByZXR1cm47XG4gICAgZ2xvYmFsU3RhdGUuaXNSdW5uaW5nUmVhY3Rpb25zID0gdHJ1ZTtcbiAgICB2YXIgYWxsUmVhY3Rpb25zID0gZ2xvYmFsU3RhdGUucGVuZGluZ1JlYWN0aW9ucztcbiAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgd2hpbGUgKGFsbFJlYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICgrK2l0ZXJhdGlvbnMgPT09IE1BWF9SRUFDVElPTl9JVEVSQVRJT05TKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhY3Rpb24gZG9lc24ndCBjb252ZXJnZSB0byBhIHN0YWJsZSBzdGF0ZS4gUHJvYmFibHkgdGhlcmUgaXMgYSBjeWNsZSBpbiB0aGUgcmVhY3RpdmUgZnVuY3Rpb246IFwiICsgYWxsUmVhY3Rpb25zWzBdLnRvU3RyaW5nKCkpO1xuICAgICAgICB2YXIgcmVtYWluaW5nUmVhY3Rpb25zID0gYWxsUmVhY3Rpb25zLnNwbGljZSgwKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSByZW1haW5pbmdSZWFjdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKVxuICAgICAgICAgICAgcmVtYWluaW5nUmVhY3Rpb25zW2ldLnJ1blJlYWN0aW9uKCk7XG4gICAgfVxuICAgIGdsb2JhbFN0YXRlLmlzUnVubmluZ1JlYWN0aW9ucyA9IGZhbHNlO1xufVxudmFyIHNweUVuYWJsZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGlzU3B5RW5hYmxlZCgpIHtcbiAgICByZXR1cm4gc3B5RW5hYmxlZDtcbn1cbmZ1bmN0aW9uIHNweVJlcG9ydChldmVudCkge1xuICAgIGlmICghc3B5RW5hYmxlZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBnbG9iYWxTdGF0ZS5zcHlMaXN0ZW5lcnM7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbDsgaSsrKVxuICAgICAgICBsaXN0ZW5lcnNbaV0oZXZlbnQpO1xufVxuZnVuY3Rpb24gc3B5UmVwb3J0U3RhcnQoZXZlbnQpIHtcbiAgICB2YXIgY2hhbmdlID0gb2JqZWN0QXNzaWduKHt9LCBldmVudCwgeyBzcHlSZXBvcnRTdGFydDogdHJ1ZSB9KTtcbiAgICBzcHlSZXBvcnQoY2hhbmdlKTtcbn1cbnZhciBFTkRfRVZFTlQgPSB7IHNweVJlcG9ydEVuZDogdHJ1ZSB9O1xuZnVuY3Rpb24gc3B5UmVwb3J0RW5kKGNoYW5nZSkge1xuICAgIGlmIChjaGFuZ2UpXG4gICAgICAgIHNweVJlcG9ydChvYmplY3RBc3NpZ24oe30sIGNoYW5nZSwgRU5EX0VWRU5UKSk7XG4gICAgZWxzZVxuICAgICAgICBzcHlSZXBvcnQoRU5EX0VWRU5UKTtcbn1cbmZ1bmN0aW9uIHNweShsaXN0ZW5lcikge1xuICAgIGdsb2JhbFN0YXRlLnNweUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICBzcHlFbmFibGVkID0gZ2xvYmFsU3RhdGUuc3B5TGlzdGVuZXJzLmxlbmd0aCA+IDA7XG4gICAgcmV0dXJuIG9uY2UoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaWR4ID0gZ2xvYmFsU3RhdGUuc3B5TGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICBpZiAoaWR4ICE9PSAtMSlcbiAgICAgICAgICAgIGdsb2JhbFN0YXRlLnNweUxpc3RlbmVycy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgc3B5RW5hYmxlZCA9IGdsb2JhbFN0YXRlLnNweUxpc3RlbmVycy5sZW5ndGggPiAwO1xuICAgIH0pO1xufVxuZXhwb3J0cy5zcHkgPSBzcHk7XG5mdW5jdGlvbiB0cmFja1RyYW5zaXRpb25zKG9uUmVwb3J0KSB7XG4gICAgZGVwcmVjYXRlZChcInRyYWNrVHJhbnNpdGlvbnMgaXMgZGVwcmVjYXRlZC4gVXNlIG1vYnguc3B5IGluc3RlYWRcIik7XG4gICAgaWYgKHR5cGVvZiBvblJlcG9ydCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgZGVwcmVjYXRlZChcInRyYWNrVHJhbnNpdGlvbnMgb25seSB0YWtlcyBhIHNpbmdsZSBjYWxsYmFjayBmdW5jdGlvbi4gSWYgeW91IGFyZSB1c2luZyB0aGUgbW9ieC1yZWFjdC1kZXZ0b29scywgcGxlYXNlIHVwZGF0ZSB0aGVtIGZpcnN0XCIpO1xuICAgICAgICBvblJlcG9ydCA9IGFyZ3VtZW50c1sxXTtcbiAgICB9XG4gICAgaWYgKCFvblJlcG9ydCkge1xuICAgICAgICBkZXByZWNhdGVkKFwidHJhY2tUcmFuc2l0aW9ucyB3aXRob3V0IGNhbGxiYWNrIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIGlzIGEgbm8tb3Agbm93LiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBtb2J4LXJlYWN0LWRldnRvb2xzLCBwbGVhc2UgdXBkYXRlIHRoZW0gZmlyc3RcIik7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IH07XG4gICAgfVxuICAgIHJldHVybiBzcHkob25SZXBvcnQpO1xufVxuZnVuY3Rpb24gdHJhbnNhY3Rpb24oYWN0aW9uLCB0aGlzQXJnLCByZXBvcnQpIHtcbiAgICBpZiAodGhpc0FyZyA9PT0gdm9pZCAwKSB7IHRoaXNBcmcgPSB1bmRlZmluZWQ7IH1cbiAgICBpZiAocmVwb3J0ID09PSB2b2lkIDApIHsgcmVwb3J0ID0gdHJ1ZTsgfVxuICAgIHRyYW5zYWN0aW9uU3RhcnQoKGFjdGlvbi5uYW1lKSB8fCBcImFub255bW91cyB0cmFuc2FjdGlvblwiLCB0aGlzQXJnLCByZXBvcnQpO1xuICAgIHZhciByZXMgPSBhY3Rpb24uY2FsbCh0aGlzQXJnKTtcbiAgICB0cmFuc2FjdGlvbkVuZChyZXBvcnQpO1xuICAgIHJldHVybiByZXM7XG59XG5leHBvcnRzLnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247XG5mdW5jdGlvbiB0cmFuc2FjdGlvblN0YXJ0KG5hbWUsIHRoaXNBcmcsIHJlcG9ydCkge1xuICAgIGlmICh0aGlzQXJnID09PSB2b2lkIDApIHsgdGhpc0FyZyA9IHVuZGVmaW5lZDsgfVxuICAgIGlmIChyZXBvcnQgPT09IHZvaWQgMCkgeyByZXBvcnQgPSB0cnVlOyB9XG4gICAgZ2xvYmFsU3RhdGUuaW5UcmFuc2FjdGlvbiArPSAxO1xuICAgIGlmIChyZXBvcnQgJiYgaXNTcHlFbmFibGVkKCkpIHtcbiAgICAgICAgc3B5UmVwb3J0U3RhcnQoe1xuICAgICAgICAgICAgdHlwZTogXCJ0cmFuc2FjdGlvblwiLFxuICAgICAgICAgICAgdGFyZ2V0OiB0aGlzQXJnLFxuICAgICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiB0cmFuc2FjdGlvbkVuZChyZXBvcnQpIHtcbiAgICBpZiAocmVwb3J0ID09PSB2b2lkIDApIHsgcmVwb3J0ID0gdHJ1ZTsgfVxuICAgIGlmICgtLWdsb2JhbFN0YXRlLmluVHJhbnNhY3Rpb24gPT09IDApIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IGdsb2JhbFN0YXRlLmNoYW5nZWRBdG9tcy5zcGxpY2UoMCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWVzLmxlbmd0aDsgaSA8IGw7IGkrKylcbiAgICAgICAgICAgIHByb3BhZ2F0ZUF0b21SZWFkeSh2YWx1ZXNbaV0pO1xuICAgICAgICBydW5SZWFjdGlvbnMoKTtcbiAgICB9XG4gICAgaWYgKHJlcG9ydCAmJiBpc1NweUVuYWJsZWQoKSlcbiAgICAgICAgc3B5UmVwb3J0RW5kKCk7XG59XG5mdW5jdGlvbiBoYXNJbnRlcmNlcHRvcnMoaW50ZXJjZXB0YWJsZSkge1xuICAgIHJldHVybiAoaW50ZXJjZXB0YWJsZS5pbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0YWJsZS5pbnRlcmNlcHRvcnMubGVuZ3RoID4gMCk7XG59XG5mdW5jdGlvbiByZWdpc3RlckludGVyY2VwdG9yKGludGVyY2VwdGFibGUsIGhhbmRsZXIpIHtcbiAgICB2YXIgaW50ZXJjZXB0b3JzID0gaW50ZXJjZXB0YWJsZS5pbnRlcmNlcHRvcnMgfHwgKGludGVyY2VwdGFibGUuaW50ZXJjZXB0b3JzID0gW10pO1xuICAgIGludGVyY2VwdG9ycy5wdXNoKGhhbmRsZXIpO1xuICAgIHJldHVybiBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlkeCA9IGludGVyY2VwdG9ycy5pbmRleE9mKGhhbmRsZXIpO1xuICAgICAgICBpZiAoaWR4ICE9PSAtMSlcbiAgICAgICAgICAgIGludGVyY2VwdG9ycy5zcGxpY2UoaWR4LCAxKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGludGVyY2VwdENoYW5nZShpbnRlcmNlcHRhYmxlLCBjaGFuZ2UpIHtcbiAgICB2YXIgcHJldlUgPSB1bnRyYWNrZWRTdGFydCgpO1xuICAgIHZhciBpbnRlcmNlcHRvcnMgPSBpbnRlcmNlcHRhYmxlLmludGVyY2VwdG9ycztcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGludGVyY2VwdG9ycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY2hhbmdlID0gaW50ZXJjZXB0b3JzW2ldKGNoYW5nZSk7XG4gICAgICAgIGludmFyaWFudCghY2hhbmdlIHx8IGNoYW5nZS50eXBlLCBcIkludGVyY2VwdCBoYW5kbGVycyBzaG91bGQgcmV0dXJuIG5vdGhpbmcgb3IgYSBjaGFuZ2Ugb2JqZWN0XCIpO1xuICAgICAgICBpZiAoIWNoYW5nZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB1bnRyYWNrZWRFbmQocHJldlUpO1xuICAgIHJldHVybiBjaGFuZ2U7XG59XG5mdW5jdGlvbiBoYXNMaXN0ZW5lcnMobGlzdGVuYWJsZSkge1xuICAgIHJldHVybiBsaXN0ZW5hYmxlLmNoYW5nZUxpc3RlbmVycyAmJiBsaXN0ZW5hYmxlLmNoYW5nZUxpc3RlbmVycy5sZW5ndGggPiAwO1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5hYmxlLCBoYW5kbGVyKSB7XG4gICAgdmFyIGxpc3RlbmVycyA9IGxpc3RlbmFibGUuY2hhbmdlTGlzdGVuZXJzIHx8IChsaXN0ZW5hYmxlLmNoYW5nZUxpc3RlbmVycyA9IFtdKTtcbiAgICBsaXN0ZW5lcnMucHVzaChoYW5kbGVyKTtcbiAgICByZXR1cm4gb25jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpZHggPSBsaXN0ZW5lcnMuaW5kZXhPZihoYW5kbGVyKTtcbiAgICAgICAgaWYgKGlkeCAhPT0gLTEpXG4gICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGlkeCwgMSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBub3RpZnlMaXN0ZW5lcnMobGlzdGVuYWJsZSwgY2hhbmdlKSB7XG4gICAgdmFyIHByZXZVID0gdW50cmFja2VkU3RhcnQoKTtcbiAgICB2YXIgbGlzdGVuZXJzID0gbGlzdGVuYWJsZS5jaGFuZ2VMaXN0ZW5lcnM7XG4gICAgaWYgKCFsaXN0ZW5lcnMpXG4gICAgICAgIHJldHVybjtcbiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hhbmdlKSkge1xuICAgICAgICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KG51bGwsIGNoYW5nZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnNbaV0oY2hhbmdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1bnRyYWNrZWRFbmQocHJldlUpO1xufVxudmFyIFZhbHVlTW9kZTtcbihmdW5jdGlvbiAoVmFsdWVNb2RlKSB7XG4gICAgVmFsdWVNb2RlW1ZhbHVlTW9kZVtcIlJlY3Vyc2l2ZVwiXSA9IDBdID0gXCJSZWN1cnNpdmVcIjtcbiAgICBWYWx1ZU1vZGVbVmFsdWVNb2RlW1wiUmVmZXJlbmNlXCJdID0gMV0gPSBcIlJlZmVyZW5jZVwiO1xuICAgIFZhbHVlTW9kZVtWYWx1ZU1vZGVbXCJTdHJ1Y3R1cmVcIl0gPSAyXSA9IFwiU3RydWN0dXJlXCI7XG4gICAgVmFsdWVNb2RlW1ZhbHVlTW9kZVtcIkZsYXRcIl0gPSAzXSA9IFwiRmxhdFwiO1xufSkoVmFsdWVNb2RlIHx8IChWYWx1ZU1vZGUgPSB7fSkpO1xuZnVuY3Rpb24gYXNSZWZlcmVuY2UodmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IEFzUmVmZXJlbmNlKHZhbHVlKTtcbn1cbmV4cG9ydHMuYXNSZWZlcmVuY2UgPSBhc1JlZmVyZW5jZTtcbmZ1bmN0aW9uIGFzU3RydWN0dXJlKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBBc1N0cnVjdHVyZSh2YWx1ZSk7XG59XG5leHBvcnRzLmFzU3RydWN0dXJlID0gYXNTdHJ1Y3R1cmU7XG5mdW5jdGlvbiBhc0ZsYXQodmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IEFzRmxhdCh2YWx1ZSk7XG59XG5leHBvcnRzLmFzRmxhdCA9IGFzRmxhdDtcbnZhciBBc1JlZmVyZW5jZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXNSZWZlcmVuY2UodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBhc3NlcnRVbndyYXBwZWQodmFsdWUsIFwiTW9kaWZpZXJzIGFyZSBub3QgYWxsb3dlZCB0byBiZSBuZXN0ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiBBc1JlZmVyZW5jZTtcbn0oKSk7XG52YXIgQXNTdHJ1Y3R1cmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFzU3RydWN0dXJlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgYXNzZXJ0VW53cmFwcGVkKHZhbHVlLCBcIk1vZGlmaWVycyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgbmVzdGVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gQXNTdHJ1Y3R1cmU7XG59KCkpO1xudmFyIEFzRmxhdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXNGbGF0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgYXNzZXJ0VW53cmFwcGVkKHZhbHVlLCBcIk1vZGlmaWVycyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgbmVzdGVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gQXNGbGF0O1xufSgpKTtcbmZ1bmN0aW9uIGFzTWFwKGRhdGEsIG1vZGlmaWVyRnVuYykge1xuICAgIHJldHVybiBtYXAoZGF0YSwgbW9kaWZpZXJGdW5jKTtcbn1cbmV4cG9ydHMuYXNNYXAgPSBhc01hcDtcbmZ1bmN0aW9uIGdldFZhbHVlTW9kZUZyb21WYWx1ZSh2YWx1ZSwgZGVmYXVsdE1vZGUpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBc1JlZmVyZW5jZSlcbiAgICAgICAgcmV0dXJuIFtWYWx1ZU1vZGUuUmVmZXJlbmNlLCB2YWx1ZS52YWx1ZV07XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXNTdHJ1Y3R1cmUpXG4gICAgICAgIHJldHVybiBbVmFsdWVNb2RlLlN0cnVjdHVyZSwgdmFsdWUudmFsdWVdO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFzRmxhdClcbiAgICAgICAgcmV0dXJuIFtWYWx1ZU1vZGUuRmxhdCwgdmFsdWUudmFsdWVdO1xuICAgIHJldHVybiBbZGVmYXVsdE1vZGUsIHZhbHVlXTtcbn1cbmZ1bmN0aW9uIGdldFZhbHVlTW9kZUZyb21Nb2RpZmllckZ1bmMoZnVuYykge1xuICAgIGlmIChmdW5jID09PSBhc1JlZmVyZW5jZSlcbiAgICAgICAgcmV0dXJuIFZhbHVlTW9kZS5SZWZlcmVuY2U7XG4gICAgZWxzZSBpZiAoZnVuYyA9PT0gYXNTdHJ1Y3R1cmUpXG4gICAgICAgIHJldHVybiBWYWx1ZU1vZGUuU3RydWN0dXJlO1xuICAgIGVsc2UgaWYgKGZ1bmMgPT09IGFzRmxhdClcbiAgICAgICAgcmV0dXJuIFZhbHVlTW9kZS5GbGF0O1xuICAgIGludmFyaWFudChmdW5jID09PSB1bmRlZmluZWQsIFwiQ2Fubm90IGRldGVybWluZSB2YWx1ZSBtb2RlIGZyb20gZnVuY3Rpb24uIFBsZWFzZSBwYXNzIGluIG9uZSBvZiB0aGVzZTogbW9ieC5hc1JlZmVyZW5jZSwgbW9ieC5hc1N0cnVjdHVyZSBvciBtb2J4LmFzRmxhdCwgZ290OiBcIiArIGZ1bmMpO1xuICAgIHJldHVybiBWYWx1ZU1vZGUuUmVjdXJzaXZlO1xufVxuZnVuY3Rpb24gbWFrZUNoaWxkT2JzZXJ2YWJsZSh2YWx1ZSwgcGFyZW50TW9kZSwgbmFtZSkge1xuICAgIHZhciBjaGlsZE1vZGU7XG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICBzd2l0Y2ggKHBhcmVudE1vZGUpIHtcbiAgICAgICAgY2FzZSBWYWx1ZU1vZGUuUmVmZXJlbmNlOlxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICBjYXNlIFZhbHVlTW9kZS5GbGF0OlxuICAgICAgICAgICAgYXNzZXJ0VW53cmFwcGVkKHZhbHVlLCBcIkl0ZW1zIGluc2lkZSAnYXNGbGF0JyBjYW5ub3QgaGF2ZSBtb2RpZmllcnNcIik7XG4gICAgICAgICAgICBjaGlsZE1vZGUgPSBWYWx1ZU1vZGUuUmVmZXJlbmNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVmFsdWVNb2RlLlN0cnVjdHVyZTpcbiAgICAgICAgICAgIGFzc2VydFVud3JhcHBlZCh2YWx1ZSwgXCJJdGVtcyBpbnNpZGUgJ2FzU3RydWN0dXJlJyBjYW5ub3QgaGF2ZSBtb2RpZmllcnNcIik7XG4gICAgICAgICAgICBjaGlsZE1vZGUgPSBWYWx1ZU1vZGUuU3RydWN0dXJlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVmFsdWVNb2RlLlJlY3Vyc2l2ZTpcbiAgICAgICAgICAgIF9hID0gZ2V0VmFsdWVNb2RlRnJvbVZhbHVlKHZhbHVlLCBWYWx1ZU1vZGUuUmVjdXJzaXZlKSwgY2hpbGRNb2RlID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGludmFyaWFudChmYWxzZSwgXCJJbGxlZ2FsIFN0YXRlXCIpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiBjcmVhdGVPYnNlcnZhYmxlQXJyYXkodmFsdWUsIGNoaWxkTW9kZSwgbmFtZSk7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpICYmIE9iamVjdC5pc0V4dGVuc2libGUodmFsdWUpKVxuICAgICAgICByZXR1cm4gZXh0ZW5kT2JzZXJ2YWJsZUhlbHBlcih2YWx1ZSwgdmFsdWUsIGNoaWxkTW9kZSwgbmFtZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICAgIHZhciBfYTtcbn1cbmZ1bmN0aW9uIGFzc2VydFVud3JhcHBlZCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFzUmVmZXJlbmNlIHx8IHZhbHVlIGluc3RhbmNlb2YgQXNTdHJ1Y3R1cmUgfHwgdmFsdWUgaW5zdGFuY2VvZiBBc0ZsYXQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlttb2J4XSBhc1N0cnVjdHVyZSAvIGFzUmVmZXJlbmNlIC8gYXNGbGF0IGNhbm5vdCBiZSB1c2VkIGhlcmUuIFwiICsgbWVzc2FnZSk7XG59XG52YXIgc2FmYXJpUHJvdG90eXBlU2V0dGVySW5oZXJpdGFuY2VCdWcgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciB2ID0gZmFsc2U7XG4gICAgdmFyIHAgPSB7fTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocCwgXCIwXCIsIHsgc2V0OiBmdW5jdGlvbiAoKSB7IHYgPSB0cnVlOyB9IH0pO1xuICAgIE9iamVjdC5jcmVhdGUocClbXCIwXCJdID0gMTtcbiAgICByZXR1cm4gdiA9PT0gZmFsc2U7XG59KSgpO1xudmFyIE9CU0VSVkFCTEVfQVJSQVlfQlVGRkVSX1NJWkUgPSAwO1xudmFyIFN0dWJBcnJheSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3R1YkFycmF5KCkge1xuICAgIH1cbiAgICByZXR1cm4gU3R1YkFycmF5O1xufSgpKTtcblN0dWJBcnJheS5wcm90b3R5cGUgPSBbXTtcbnZhciBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb24obmFtZSwgbW9kZSwgYXJyYXksIG93bmVkKSB7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbiAgICAgICAgdGhpcy5vd25lZCA9IG93bmVkO1xuICAgICAgICB0aGlzLmxhc3RLbm93bkxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzID0gbnVsbDtcbiAgICAgICAgdGhpcy5jaGFuZ2VMaXN0ZW5lcnMgPSBudWxsO1xuICAgICAgICB0aGlzLmF0b20gPSBuZXcgQXRvbShuYW1lIHx8IChcIk9ic2VydmFibGVBcnJheUBcIiArIGdldE5leHRJZCgpKSk7XG4gICAgfVxuICAgIE9ic2VydmFibGVBcnJheUFkbWluaXN0cmF0aW9uLnByb3RvdHlwZS5tYWtlUmVhY3RpdmVBcnJheUl0ZW0gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgYXNzZXJ0VW53cmFwcGVkKHZhbHVlLCBcIkFycmF5IHZhbHVlcyBjYW5ub3QgaGF2ZSBtb2RpZmllcnNcIik7XG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09IFZhbHVlTW9kZS5GbGF0IHx8IHRoaXMubW9kZSA9PT0gVmFsdWVNb2RlLlJlZmVyZW5jZSlcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIG1ha2VDaGlsZE9ic2VydmFibGUodmFsdWUsIHRoaXMubW9kZSwgdGhpcy5hdG9tLm5hbWUgKyBcIlsuLl1cIik7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbi5wcm90b3R5cGUuaW50ZXJjZXB0ID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVySW50ZXJjZXB0b3IodGhpcywgaGFuZGxlcik7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbi5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uIChsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgIGlmIChmaXJlSW1tZWRpYXRlbHkgPT09IHZvaWQgMCkgeyBmaXJlSW1tZWRpYXRlbHkgPSBmYWxzZTsgfVxuICAgICAgICBpZiAoZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgICAgICBsaXN0ZW5lcih7XG4gICAgICAgICAgICAgICAgb2JqZWN0OiB0aGlzLmFycmF5LFxuICAgICAgICAgICAgICAgIHR5cGU6IFwic3BsaWNlXCIsXG4gICAgICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgYWRkZWQ6IHRoaXMudmFsdWVzLnNsaWNlKCksXG4gICAgICAgICAgICAgICAgYWRkZWRDb3VudDogdGhpcy52YWx1ZXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHJlbW92ZWQ6IFtdLFxuICAgICAgICAgICAgICAgIHJlbW92ZWRDb3VudDogMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVyTGlzdGVuZXIodGhpcywgbGlzdGVuZXIpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb24ucHJvdG90eXBlLmdldEFycmF5TGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmF0b20ucmVwb3J0T2JzZXJ2ZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aDtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheUFkbWluaXN0cmF0aW9uLnByb3RvdHlwZS5zZXRBcnJheUxlbmd0aCA9IGZ1bmN0aW9uIChuZXdMZW5ndGgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuZXdMZW5ndGggIT09IFwibnVtYmVyXCIgfHwgbmV3TGVuZ3RoIDwgMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlttb2J4LmFycmF5XSBPdXQgb2YgcmFuZ2U6IFwiICsgbmV3TGVuZ3RoKTtcbiAgICAgICAgdmFyIGN1cnJlbnRMZW5ndGggPSB0aGlzLnZhbHVlcy5sZW5ndGg7XG4gICAgICAgIGlmIChuZXdMZW5ndGggPT09IGN1cnJlbnRMZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGVsc2UgaWYgKG5ld0xlbmd0aCA+IGN1cnJlbnRMZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnNwbGljZVdpdGhBcnJheShjdXJyZW50TGVuZ3RoLCAwLCBuZXcgQXJyYXkobmV3TGVuZ3RoIC0gY3VycmVudExlbmd0aCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnNwbGljZVdpdGhBcnJheShuZXdMZW5ndGgsIGN1cnJlbnRMZW5ndGggLSBuZXdMZW5ndGgpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb24ucHJvdG90eXBlLnVwZGF0ZUFycmF5TGVuZ3RoID0gZnVuY3Rpb24gKG9sZExlbmd0aCwgZGVsdGEpIHtcbiAgICAgICAgaWYgKG9sZExlbmd0aCAhPT0gdGhpcy5sYXN0S25vd25MZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieF0gTW9kaWZpY2F0aW9uIGV4Y2VwdGlvbjogdGhlIGludGVybmFsIHN0cnVjdHVyZSBvZiBhbiBvYnNlcnZhYmxlIGFycmF5IHdhcyBjaGFuZ2VkLiBEaWQgeW91IHVzZSBwZWVrKCkgdG8gY2hhbmdlIGl0P1wiKTtcbiAgICAgICAgdGhpcy5sYXN0S25vd25MZW5ndGggKz0gZGVsdGE7XG4gICAgICAgIGlmIChkZWx0YSA+IDAgJiYgb2xkTGVuZ3RoICsgZGVsdGEgKyAxID4gT0JTRVJWQUJMRV9BUlJBWV9CVUZGRVJfU0laRSlcbiAgICAgICAgICAgIHJlc2VydmVBcnJheUJ1ZmZlcihvbGRMZW5ndGggKyBkZWx0YSArIDEpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb24ucHJvdG90eXBlLnNwbGljZVdpdGhBcnJheSA9IGZ1bmN0aW9uIChpbmRleCwgZGVsZXRlQ291bnQsIG5ld0l0ZW1zKSB7XG4gICAgICAgIGNoZWNrSWZTdGF0ZU1vZGlmaWNhdGlvbnNBcmVBbGxvd2VkKCk7XG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLnZhbHVlcy5sZW5ndGg7XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICBlbHNlIGlmIChpbmRleCA+IGxlbmd0aClcbiAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuICAgICAgICBlbHNlIGlmIChpbmRleCA8IDApXG4gICAgICAgICAgICBpbmRleCA9IE1hdGgubWF4KDAsIGxlbmd0aCArIGluZGV4KTtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICBkZWxldGVDb3VudCA9IGxlbmd0aCAtIGluZGV4O1xuICAgICAgICBlbHNlIGlmIChkZWxldGVDb3VudCA9PT0gdW5kZWZpbmVkIHx8IGRlbGV0ZUNvdW50ID09PSBudWxsKVxuICAgICAgICAgICAgZGVsZXRlQ291bnQgPSAwO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGVDb3VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGRlbGV0ZUNvdW50LCBsZW5ndGggLSBpbmRleCkpO1xuICAgICAgICBpZiAobmV3SXRlbXMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIG5ld0l0ZW1zID0gW107XG4gICAgICAgIGlmIChoYXNJbnRlcmNlcHRvcnModGhpcykpIHtcbiAgICAgICAgICAgIHZhciBjaGFuZ2UgPSBpbnRlcmNlcHRDaGFuZ2UodGhpcywge1xuICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcy5hcnJheSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcInNwbGljZVwiLFxuICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICByZW1vdmVkQ291bnQ6IGRlbGV0ZUNvdW50LFxuICAgICAgICAgICAgICAgIGFkZGVkOiBuZXdJdGVtc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWNoYW5nZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFlfQVJSQVk7XG4gICAgICAgICAgICBkZWxldGVDb3VudCA9IGNoYW5nZS5yZW1vdmVkQ291bnQ7XG4gICAgICAgICAgICBuZXdJdGVtcyA9IGNoYW5nZS5hZGRlZDtcbiAgICAgICAgfVxuICAgICAgICBuZXdJdGVtcyA9IG5ld0l0ZW1zLm1hcCh0aGlzLm1ha2VSZWFjdGl2ZUFycmF5SXRlbSwgdGhpcyk7XG4gICAgICAgIHZhciBsZW5ndGhEZWx0YSA9IG5ld0l0ZW1zLmxlbmd0aCAtIGRlbGV0ZUNvdW50O1xuICAgICAgICB0aGlzLnVwZGF0ZUFycmF5TGVuZ3RoKGxlbmd0aCwgbGVuZ3RoRGVsdGEpO1xuICAgICAgICB2YXIgcmVzID0gKF9hID0gdGhpcy52YWx1ZXMpLnNwbGljZS5hcHBseShfYSwgW2luZGV4LCBkZWxldGVDb3VudF0uY29uY2F0KG5ld0l0ZW1zKSk7XG4gICAgICAgIGlmIChkZWxldGVDb3VudCAhPT0gMCB8fCBuZXdJdGVtcy5sZW5ndGggIT09IDApXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUFycmF5U3BsaWNlKGluZGV4LCBuZXdJdGVtcywgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgdmFyIF9hO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb24ucHJvdG90eXBlLm5vdGlmeUFycmF5Q2hpbGRVcGRhdGUgPSBmdW5jdGlvbiAoaW5kZXgsIG5ld1ZhbHVlLCBvbGRWYWx1ZSkge1xuICAgICAgICB2YXIgbm90aWZ5U3B5ID0gIXRoaXMub3duZWQgJiYgaXNTcHlFbmFibGVkKCk7XG4gICAgICAgIHZhciBub3RpZnkgPSBoYXNMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgIHZhciBjaGFuZ2UgPSBub3RpZnkgfHwgbm90aWZ5U3B5ID8ge1xuICAgICAgICAgICAgb2JqZWN0OiB0aGlzLmFycmF5LFxuICAgICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIixcbiAgICAgICAgICAgIGluZGV4OiBpbmRleCwgbmV3VmFsdWU6IG5ld1ZhbHVlLCBvbGRWYWx1ZTogb2xkVmFsdWVcbiAgICAgICAgfSA6IG51bGw7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRTdGFydChjaGFuZ2UpO1xuICAgICAgICB0aGlzLmF0b20ucmVwb3J0Q2hhbmdlZCgpO1xuICAgICAgICBpZiAobm90aWZ5KVxuICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIGNoYW5nZSk7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRFbmQoKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheUFkbWluaXN0cmF0aW9uLnByb3RvdHlwZS5ub3RpZnlBcnJheVNwbGljZSA9IGZ1bmN0aW9uIChpbmRleCwgYWRkZWQsIHJlbW92ZWQpIHtcbiAgICAgICAgdmFyIG5vdGlmeVNweSA9ICF0aGlzLm93bmVkICYmIGlzU3B5RW5hYmxlZCgpO1xuICAgICAgICB2YXIgbm90aWZ5ID0gaGFzTGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICB2YXIgY2hhbmdlID0gbm90aWZ5IHx8IG5vdGlmeVNweSA/IHtcbiAgICAgICAgICAgIG9iamVjdDogdGhpcy5hcnJheSxcbiAgICAgICAgICAgIHR5cGU6IFwic3BsaWNlXCIsXG4gICAgICAgICAgICBpbmRleDogaW5kZXgsIHJlbW92ZWQ6IHJlbW92ZWQsIGFkZGVkOiBhZGRlZCxcbiAgICAgICAgICAgIHJlbW92ZWRDb3VudDogcmVtb3ZlZC5sZW5ndGgsXG4gICAgICAgICAgICBhZGRlZENvdW50OiBhZGRlZC5sZW5ndGhcbiAgICAgICAgfSA6IG51bGw7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRTdGFydChjaGFuZ2UpO1xuICAgICAgICB0aGlzLmF0b20ucmVwb3J0Q2hhbmdlZCgpO1xuICAgICAgICBpZiAobm90aWZ5KVxuICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIGNoYW5nZSk7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRFbmQoKTtcbiAgICB9O1xuICAgIHJldHVybiBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbjtcbn0oKSk7XG52YXIgT2JzZXJ2YWJsZUFycmF5ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoT2JzZXJ2YWJsZUFycmF5LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE9ic2VydmFibGVBcnJheShpbml0aWFsVmFsdWVzLCBtb2RlLCBuYW1lLCBvd25lZCkge1xuICAgICAgICBpZiAob3duZWQgPT09IHZvaWQgMCkgeyBvd25lZCA9IGZhbHNlOyB9XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICB2YXIgYWRtID0gbmV3IE9ic2VydmFibGVBcnJheUFkbWluaXN0cmF0aW9uKG5hbWUsIG1vZGUsIHRoaXMsIG93bmVkKTtcbiAgICAgICAgYWRkSGlkZGVuRmluYWxQcm9wKHRoaXMsIFwiJG1vYnhcIiwgYWRtKTtcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZXMgJiYgaW5pdGlhbFZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFkbS51cGRhdGVBcnJheUxlbmd0aCgwLCBpbml0aWFsVmFsdWVzLmxlbmd0aCk7XG4gICAgICAgICAgICBhZG0udmFsdWVzID0gaW5pdGlhbFZhbHVlcy5tYXAoYWRtLm1ha2VSZWFjdGl2ZUFycmF5SXRlbSwgYWRtKTtcbiAgICAgICAgICAgIGFkbS5ub3RpZnlBcnJheVNwbGljZSgwLCBhZG0udmFsdWVzLnNsaWNlKCksIEVNUFRZX0FSUkFZKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFkbS52YWx1ZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2FmYXJpUHJvdG90eXBlU2V0dGVySW5oZXJpdGFuY2VCdWcpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhZG0uYXJyYXksIFwiMFwiLCBFTlRSWV8wKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLmludGVyY2VwdCA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRtb2J4LmludGVyY2VwdChoYW5kbGVyKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uIChsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgIGlmIChmaXJlSW1tZWRpYXRlbHkgPT09IHZvaWQgMCkgeyBmaXJlSW1tZWRpYXRlbHkgPSBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gdGhpcy4kbW9ieC5vYnNlcnZlKGxpc3RlbmVyLCBmaXJlSW1tZWRpYXRlbHkpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BsaWNlKDApO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gKG5ld0l0ZW1zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRtb2J4LnNwbGljZVdpdGhBcnJheSgwLCB0aGlzLiRtb2J4LnZhbHVlcy5sZW5ndGgsIG5ld0l0ZW1zKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUudG9KUyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xpY2UoKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b0pTKCk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLnBlZWsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRtb2J4LnZhbHVlcztcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uIChwcmVkaWNhdGUsIHRoaXNBcmcsIGZyb21JbmRleCkge1xuICAgICAgICBpZiAoZnJvbUluZGV4ID09PSB2b2lkIDApIHsgZnJvbUluZGV4ID0gMDsgfVxuICAgICAgICB0aGlzLiRtb2J4LmF0b20ucmVwb3J0T2JzZXJ2ZWQoKTtcbiAgICAgICAgdmFyIGl0ZW1zID0gdGhpcy4kbW9ieC52YWx1ZXMsIGwgPSBpdGVtcy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSBmcm9tSW5kZXg7IGkgPCBsOyBpKyspXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlLmNhbGwodGhpc0FyZywgaXRlbXNbaV0sIGksIHRoaXMpKVxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtc1tpXTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUuc3BsaWNlID0gZnVuY3Rpb24gKGluZGV4LCBkZWxldGVDb3VudCkge1xuICAgICAgICB2YXIgbmV3SXRlbXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIG5ld0l0ZW1zW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kbW9ieC5zcGxpY2VXaXRoQXJyYXkoaW5kZXgpO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRtb2J4LnNwbGljZVdpdGhBcnJheShpbmRleCwgZGVsZXRlQ291bnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiRtb2J4LnNwbGljZVdpdGhBcnJheShpbmRleCwgZGVsZXRlQ291bnQsIG5ld0l0ZW1zKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGl0ZW1zID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBpdGVtc1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYWRtID0gdGhpcy4kbW9ieDtcbiAgICAgICAgYWRtLnNwbGljZVdpdGhBcnJheShhZG0udmFsdWVzLmxlbmd0aCwgMCwgaXRlbXMpO1xuICAgICAgICByZXR1cm4gYWRtLnZhbHVlcy5sZW5ndGg7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BsaWNlKE1hdGgubWF4KHRoaXMuJG1vYngudmFsdWVzLmxlbmd0aCAtIDEsIDApLCAxKVswXTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNwbGljZSgwLCAxKVswXTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGl0ZW1zID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBpdGVtc1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYWRtID0gdGhpcy4kbW9ieDtcbiAgICAgICAgYWRtLnNwbGljZVdpdGhBcnJheSgwLCAwLCBpdGVtcyk7XG4gICAgICAgIHJldHVybiBhZG0udmFsdWVzLmxlbmd0aDtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUucmV2ZXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy4kbW9ieC5hdG9tLnJlcG9ydE9ic2VydmVkKCk7XG4gICAgICAgIHZhciBjbG9uZSA9IHRoaXMuc2xpY2UoKTtcbiAgICAgICAgcmV0dXJuIGNsb25lLnJldmVyc2UuYXBwbHkoY2xvbmUsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLnNvcnQgPSBmdW5jdGlvbiAoY29tcGFyZUZuKSB7XG4gICAgICAgIHRoaXMuJG1vYnguYXRvbS5yZXBvcnRPYnNlcnZlZCgpO1xuICAgICAgICB2YXIgY2xvbmUgPSB0aGlzLnNsaWNlKCk7XG4gICAgICAgIHJldHVybiBjbG9uZS5zb3J0LmFwcGx5KGNsb25lLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGlkeCA9IHRoaXMuJG1vYngudmFsdWVzLmluZGV4T2YodmFsdWUpO1xuICAgICAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJbbW9ieC5hcnJheV0gXCIgKyBBcnJheS5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkodGhpcy4kbW9ieC52YWx1ZXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJbbW9ieC5hcnJheV0gXCIgKyBBcnJheS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcuYXBwbHkodGhpcy4kbW9ieC52YWx1ZXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICByZXR1cm4gT2JzZXJ2YWJsZUFycmF5O1xufShTdHViQXJyYXkpKTtcbmRlY2xhcmVJdGVyYXRvcihPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGFycmF5QXNJdGVyYXRvcih0aGlzLnNsaWNlKCkpO1xufSk7XG5tYWtlTm9uRW51bWVyYWJsZShPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLCBbXG4gICAgXCJjb25zdHJ1Y3RvclwiLFxuICAgIFwib2JzZXJ2ZVwiLFxuICAgIFwiY2xlYXJcIixcbiAgICBcInJlcGxhY2VcIixcbiAgICBcInRvSlNPTlwiLFxuICAgIFwicGVla1wiLFxuICAgIFwiZmluZFwiLFxuICAgIFwic3BsaWNlXCIsXG4gICAgXCJwdXNoXCIsXG4gICAgXCJwb3BcIixcbiAgICBcInNoaWZ0XCIsXG4gICAgXCJ1bnNoaWZ0XCIsXG4gICAgXCJyZXZlcnNlXCIsXG4gICAgXCJzb3J0XCIsXG4gICAgXCJyZW1vdmVcIixcbiAgICBcInRvU3RyaW5nXCIsXG4gICAgXCJ0b0xvY2FsZVN0cmluZ1wiXG5dKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLCBcImxlbmd0aFwiLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kbW9ieC5nZXRBcnJheUxlbmd0aCgpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAobmV3TGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuJG1vYnguc2V0QXJyYXlMZW5ndGgobmV3TGVuZ3RoKTtcbiAgICB9XG59KTtcbltcbiAgICBcImNvbmNhdFwiLFxuICAgIFwiZXZlcnlcIixcbiAgICBcImZpbHRlclwiLFxuICAgIFwiZm9yRWFjaFwiLFxuICAgIFwiaW5kZXhPZlwiLFxuICAgIFwiam9pblwiLFxuICAgIFwibGFzdEluZGV4T2ZcIixcbiAgICBcIm1hcFwiLFxuICAgIFwicmVkdWNlXCIsXG4gICAgXCJyZWR1Y2VSaWdodFwiLFxuICAgIFwic2xpY2VcIixcbiAgICBcInNvbWVcIlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChmdW5jTmFtZSkge1xuICAgIHZhciBiYXNlRnVuYyA9IEFycmF5LnByb3RvdHlwZVtmdW5jTmFtZV07XG4gICAgYWRkSGlkZGVuUHJvcChPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLCBmdW5jTmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLiRtb2J4LmF0b20ucmVwb3J0T2JzZXJ2ZWQoKTtcbiAgICAgICAgcmV0dXJuIGJhc2VGdW5jLmFwcGx5KHRoaXMuJG1vYngudmFsdWVzLCBhcmd1bWVudHMpO1xuICAgIH0pO1xufSk7XG52YXIgRU5UUllfMCA9IHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgc2V0OiBjcmVhdGVBcnJheVNldHRlcigwKSxcbiAgICBnZXQ6IGNyZWF0ZUFycmF5R2V0dGVyKDApXG59O1xuZnVuY3Rpb24gY3JlYXRlQXJyYXlCdWZmZXJJdGVtKGluZGV4KSB7XG4gICAgdmFyIHNldCA9IGNyZWF0ZUFycmF5U2V0dGVyKGluZGV4KTtcbiAgICB2YXIgZ2V0ID0gY3JlYXRlQXJyYXlHZXR0ZXIoaW5kZXgpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLCBcIlwiICsgaW5kZXgsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgc2V0OiBzZXQsIGdldDogZ2V0XG4gICAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVBcnJheVNldHRlcihpbmRleCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgICAgdmFyIGFkbSA9IHRoaXMuJG1vYng7XG4gICAgICAgIHZhciB2YWx1ZXMgPSBhZG0udmFsdWVzO1xuICAgICAgICBhc3NlcnRVbndyYXBwZWQobmV3VmFsdWUsIFwiTW9kaWZpZXJzIGNhbm5vdCBiZSB1c2VkIG9uIGFycmF5IHZhbHVlcy4gRm9yIG5vbi1yZWFjdGl2ZSBhcnJheSB2YWx1ZXMgdXNlIG1ha2VSZWFjdGl2ZShhc0ZsYXQoYXJyYXkpKS5cIik7XG4gICAgICAgIGlmIChpbmRleCA8IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNoZWNrSWZTdGF0ZU1vZGlmaWNhdGlvbnNBcmVBbGxvd2VkKCk7XG4gICAgICAgICAgICB2YXIgb2xkVmFsdWUgPSB2YWx1ZXNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGhhc0ludGVyY2VwdG9ycyhhZG0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoYW5nZSA9IGludGVyY2VwdENoYW5nZShhZG0sIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBhZG0uYXJyYXksXG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCwgbmV3VmFsdWU6IG5ld1ZhbHVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGFuZ2UpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IGNoYW5nZS5uZXdWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld1ZhbHVlID0gYWRtLm1ha2VSZWFjdGl2ZUFycmF5SXRlbShuZXdWYWx1ZSk7XG4gICAgICAgICAgICB2YXIgY2hhbmdlZCA9IChhZG0ubW9kZSA9PT0gVmFsdWVNb2RlLlN0cnVjdHVyZSkgPyAhZGVlcEVxdWFscyhvbGRWYWx1ZSwgbmV3VmFsdWUpIDogb2xkVmFsdWUgIT09IG5ld1ZhbHVlO1xuICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgYWRtLm5vdGlmeUFycmF5Q2hpbGRVcGRhdGUoaW5kZXgsIG5ld1ZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPT09IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFkbS5zcGxpY2VXaXRoQXJyYXkoaW5kZXgsIDAsIFtuZXdWYWx1ZV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlttb2J4LmFycmF5XSBJbmRleCBvdXQgb2YgYm91bmRzLCBcIiArIGluZGV4ICsgXCIgaXMgbGFyZ2VyIHRoYW4gXCIgKyB2YWx1ZXMubGVuZ3RoKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlQXJyYXlHZXR0ZXIoaW5kZXgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW1wbCA9IHRoaXMuJG1vYng7XG4gICAgICAgIGlmIChpbXBsICYmIGluZGV4IDwgaW1wbC52YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpbXBsLmF0b20ucmVwb3J0T2JzZXJ2ZWQoKTtcbiAgICAgICAgICAgIHJldHVybiBpbXBsLnZhbHVlc1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKFwiW21vYnguYXJyYXldIEF0dGVtcHQgdG8gcmVhZCBhbiBhcnJheSBpbmRleCAoXCIgKyBpbmRleCArIFwiKSB0aGF0IGlzIG91dCBvZiBib3VuZHMgKFwiICsgaW1wbC52YWx1ZXMubGVuZ3RoICsgXCIpLiBQbGVhc2UgY2hlY2sgbGVuZ3RoIGZpcnN0LiBPdXQgb2YgYm91bmQgaW5kaWNlcyB3aWxsIG5vdCBiZSB0cmFja2VkIGJ5IE1vYlhcIik7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHJlc2VydmVBcnJheUJ1ZmZlcihtYXgpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IE9CU0VSVkFCTEVfQVJSQVlfQlVGRkVSX1NJWkU7IGluZGV4IDwgbWF4OyBpbmRleCsrKVxuICAgICAgICBjcmVhdGVBcnJheUJ1ZmZlckl0ZW0oaW5kZXgpO1xuICAgIE9CU0VSVkFCTEVfQVJSQVlfQlVGRkVSX1NJWkUgPSBtYXg7XG59XG5yZXNlcnZlQXJyYXlCdWZmZXIoMTAwMCk7XG5mdW5jdGlvbiBjcmVhdGVPYnNlcnZhYmxlQXJyYXkoaW5pdGlhbFZhbHVlcywgbW9kZSwgbmFtZSkge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZUFycmF5KGluaXRpYWxWYWx1ZXMsIG1vZGUsIG5hbWUpO1xufVxuZnVuY3Rpb24gZmFzdEFycmF5KGluaXRpYWxWYWx1ZXMpIHtcbiAgICBkZXByZWNhdGVkKFwiZmFzdEFycmF5IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYG9ic2VydmFibGUoYXNGbGF0KFtdKSlgXCIpO1xuICAgIHJldHVybiBjcmVhdGVPYnNlcnZhYmxlQXJyYXkoaW5pdGlhbFZhbHVlcywgVmFsdWVNb2RlLkZsYXQsIG51bGwpO1xufVxuZXhwb3J0cy5mYXN0QXJyYXkgPSBmYXN0QXJyYXk7XG5mdW5jdGlvbiBpc09ic2VydmFibGVBcnJheSh0aGluZykge1xuICAgIHJldHVybiB0aGluZyBpbnN0YW5jZW9mIE9ic2VydmFibGVBcnJheTtcbn1cbmV4cG9ydHMuaXNPYnNlcnZhYmxlQXJyYXkgPSBpc09ic2VydmFibGVBcnJheTtcbnZhciBPYnNlcnZhYmxlTWFwTWFya2VyID0ge307XG52YXIgT2JzZXJ2YWJsZU1hcCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT2JzZXJ2YWJsZU1hcChpbml0aWFsRGF0YSwgdmFsdWVNb2RlRnVuYykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLiRtb2J4ID0gT2JzZXJ2YWJsZU1hcE1hcmtlcjtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuICAgICAgICB0aGlzLl9oYXNNYXAgPSB7fTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJPYnNlcnZhYmxlTWFwQFwiICsgZ2V0TmV4dElkKCk7XG4gICAgICAgIHRoaXMuX2tleXMgPSBuZXcgT2JzZXJ2YWJsZUFycmF5KG51bGwsIFZhbHVlTW9kZS5SZWZlcmVuY2UsIHRoaXMubmFtZSArIFwiLmtleXMoKVwiLCB0cnVlKTtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRvcnMgPSBudWxsO1xuICAgICAgICB0aGlzLmNoYW5nZUxpc3RlbmVycyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3ZhbHVlTW9kZSA9IGdldFZhbHVlTW9kZUZyb21Nb2RpZmllckZ1bmModmFsdWVNb2RlRnVuYyk7XG4gICAgICAgIGlmICh0aGlzLl92YWx1ZU1vZGUgPT09IFZhbHVlTW9kZS5GbGF0KVxuICAgICAgICAgICAgdGhpcy5fdmFsdWVNb2RlID0gVmFsdWVNb2RlLlJlZmVyZW5jZTtcbiAgICAgICAgYWxsb3dTdGF0ZUNoYW5nZXModHJ1ZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QoaW5pdGlhbERhdGEpKVxuICAgICAgICAgICAgICAgIF90aGlzLm1lcmdlKGluaXRpYWxEYXRhKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5pdGlhbERhdGEpKVxuICAgICAgICAgICAgICAgIGluaXRpYWxEYXRhLmZvckVhY2goZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLl9oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5fZGF0YVtrZXldICE9PSBcInVuZGVmaW5lZFwiO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZEtleShrZXkpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBrZXkgPSBcIlwiICsga2V5O1xuICAgICAgICBpZiAodGhpcy5faGFzTWFwW2tleV0pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faGFzTWFwW2tleV0uZ2V0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVIYXNNYXBFbnRyeShrZXksIGZhbHNlKS5nZXQoKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0VmFsaWRLZXkoa2V5KTtcbiAgICAgICAga2V5ID0gXCJcIiArIGtleTtcbiAgICAgICAgdmFyIGhhc0tleSA9IHRoaXMuX2hhcyhrZXkpO1xuICAgICAgICBhc3NlcnRVbndyYXBwZWQodmFsdWUsIFwiW21vYngubWFwLnNldF0gRXhwZWN0ZWQgdW53cmFwcGVkIHZhbHVlIHRvIGJlIGluc2VydGVkIHRvIGtleSAnXCIgKyBrZXkgKyBcIicuIElmIHlvdSBuZWVkIHRvIHVzZSBtb2RpZmllcnMgcGFzcyB0aGVtIGFzIHNlY29uZCBhcmd1bWVudCB0byB0aGUgY29uc3RydWN0b3JcIik7XG4gICAgICAgIGlmIChoYXNJbnRlcmNlcHRvcnModGhpcykpIHtcbiAgICAgICAgICAgIHZhciBjaGFuZ2UgPSBpbnRlcmNlcHRDaGFuZ2UodGhpcywge1xuICAgICAgICAgICAgICAgIHR5cGU6IGhhc0tleSA/IFwidXBkYXRlXCIgOiBcImFkZFwiLFxuICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcyxcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgbmFtZToga2V5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghY2hhbmdlKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHZhbHVlID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNLZXkpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVZhbHVlKGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYWRkVmFsdWUoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5hc3NlcnRWYWxpZEtleShrZXkpO1xuICAgICAgICBrZXkgPSBcIlwiICsga2V5O1xuICAgICAgICBpZiAoaGFzSW50ZXJjZXB0b3JzKHRoaXMpKSB7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gaW50ZXJjZXB0Q2hhbmdlKHRoaXMsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImRlbGV0ZVwiLFxuICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcyxcbiAgICAgICAgICAgICAgICBuYW1lOiBrZXlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFjaGFuZ2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9oYXMoa2V5KSkge1xuICAgICAgICAgICAgdmFyIG5vdGlmeVNweSA9IGlzU3B5RW5hYmxlZCgpO1xuICAgICAgICAgICAgdmFyIG5vdGlmeSA9IGhhc0xpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgICAgIHZhciBjaGFuZ2UgPSBub3RpZnkgfHwgbm90aWZ5U3B5ID8ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiZGVsZXRlXCIsXG4gICAgICAgICAgICAgICAgb2JqZWN0OiB0aGlzLFxuICAgICAgICAgICAgICAgIG9sZFZhbHVlOiB0aGlzLl9kYXRhW2tleV0udmFsdWUsXG4gICAgICAgICAgICAgICAgbmFtZToga2V5XG4gICAgICAgICAgICB9IDogbnVsbDtcbiAgICAgICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICAgICAgc3B5UmVwb3J0U3RhcnQoY2hhbmdlKTtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5fa2V5cy5yZW1vdmUoa2V5KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5fdXBkYXRlSGFzTWFwRW50cnkoa2V5LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGUgPSBfdGhpcy5fZGF0YVtrZXldO1xuICAgICAgICAgICAgICAgIG9ic2VydmFibGUuc2V0TmV3VmFsdWUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5fZGF0YVtrZXldID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAobm90aWZ5KVxuICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyh0aGlzLCBjaGFuZ2UpO1xuICAgICAgICAgICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgICAgICAgICBzcHlSZXBvcnRFbmQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuX3VwZGF0ZUhhc01hcEVudHJ5ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5faGFzTWFwW2tleV07XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgZW50cnkuc2V0TmV3VmFsdWUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLl9oYXNNYXBba2V5XSA9IG5ldyBPYnNlcnZhYmxlVmFsdWUodmFsdWUsIFZhbHVlTW9kZS5SZWZlcmVuY2UsIHRoaXMubmFtZSArIFwiLlwiICsga2V5ICsgXCI/XCIsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5fdXBkYXRlVmFsdWUgPSBmdW5jdGlvbiAobmFtZSwgbmV3VmFsdWUpIHtcbiAgICAgICAgdmFyIG9ic2VydmFibGUgPSB0aGlzLl9kYXRhW25hbWVdO1xuICAgICAgICBuZXdWYWx1ZSA9IG9ic2VydmFibGUucHJlcGFyZU5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSBVTkNIQU5HRUQpIHtcbiAgICAgICAgICAgIHZhciBub3RpZnlTcHkgPSBpc1NweUVuYWJsZWQoKTtcbiAgICAgICAgICAgIHZhciBub3RpZnkgPSBoYXNMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gbm90aWZ5IHx8IG5vdGlmeVNweSA/IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInVwZGF0ZVwiLFxuICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcyxcbiAgICAgICAgICAgICAgICBvbGRWYWx1ZTogb2JzZXJ2YWJsZS52YWx1ZSxcbiAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLCBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICAgICAgICAgIH0gOiBudWxsO1xuICAgICAgICAgICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgICAgICAgICBzcHlSZXBvcnRTdGFydChjaGFuZ2UpO1xuICAgICAgICAgICAgb2JzZXJ2YWJsZS5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICAgICAgICBpZiAobm90aWZ5KVxuICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyh0aGlzLCBjaGFuZ2UpO1xuICAgICAgICAgICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgICAgICAgICBzcHlSZXBvcnRFbmQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuX2FkZFZhbHVlID0gZnVuY3Rpb24gKG5hbWUsIG5ld1ZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRyYW5zYWN0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gX3RoaXMuX2RhdGFbbmFtZV0gPSBuZXcgT2JzZXJ2YWJsZVZhbHVlKG5ld1ZhbHVlLCBfdGhpcy5fdmFsdWVNb2RlLCBfdGhpcy5uYW1lICsgXCIuXCIgKyBuYW1lLCBmYWxzZSk7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IG9ic2VydmFibGUudmFsdWU7XG4gICAgICAgICAgICBfdGhpcy5fdXBkYXRlSGFzTWFwRW50cnkobmFtZSwgdHJ1ZSk7XG4gICAgICAgICAgICBfdGhpcy5fa2V5cy5wdXNoKG5hbWUpO1xuICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICAgICAgdmFyIG5vdGlmeVNweSA9IGlzU3B5RW5hYmxlZCgpO1xuICAgICAgICB2YXIgbm90aWZ5ID0gaGFzTGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICB2YXIgY2hhbmdlID0gbm90aWZ5IHx8IG5vdGlmeVNweSA/IHtcbiAgICAgICAgICAgIHR5cGU6IFwiYWRkXCIsXG4gICAgICAgICAgICBvYmplY3Q6IHRoaXMsXG4gICAgICAgICAgICBuYW1lOiBuYW1lLCBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICAgICAgfSA6IG51bGw7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRTdGFydChjaGFuZ2UpO1xuICAgICAgICBpZiAobm90aWZ5KVxuICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIGNoYW5nZSk7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRFbmQoKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAga2V5ID0gXCJcIiArIGtleTtcbiAgICAgICAgaWYgKHRoaXMuaGFzKGtleSkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVtrZXldLmdldCgpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5QXNJdGVyYXRvcih0aGlzLl9rZXlzLnNsaWNlKCkpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJyYXlBc0l0ZXJhdG9yKHRoaXMuX2tleXMubWFwKHRoaXMuZ2V0LCB0aGlzKSk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gYXJyYXlBc0l0ZXJhdG9yKHRoaXMuX2tleXMubWFwKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIFtrZXksIF90aGlzLmdldChrZXkpXTsgfSkpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmtleXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgX3RoaXMuZ2V0KGtleSksIGtleSk7IH0pO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUubWVyZ2UgPSBmdW5jdGlvbiAob3RoZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdHJhbnNhY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgT2JzZXJ2YWJsZU1hcClcbiAgICAgICAgICAgICAgICBvdGhlci5rZXlzKCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBfdGhpcy5zZXQoa2V5LCBvdGhlci5nZXQoa2V5KSk7IH0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG90aGVyKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIF90aGlzLnNldChrZXksIG90aGVyW2tleV0pOyB9KTtcbiAgICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRyYW5zYWN0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHVudHJhY2tlZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMua2V5cygpLmZvckVhY2goX3RoaXMuZGVsZXRlLCBfdGhpcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS50b0pTID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmVzID0ge307XG4gICAgICAgIHRoaXMua2V5cygpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gcmVzW2tleV0gPSBfdGhpcy5nZXQoa2V5KTsgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS50b0pzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBkZXByZWNhdGVkKFwidG9KcyBpcyBkZXByZWNhdGVkLCB1c2UgdG9KUyBpbnN0ZWFkXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy50b0pTKCk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvSlMoKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLmlzVmFsaWRLZXkgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT09IG51bGwgfHwga2V5ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSBcInN0cmluZ1wiICYmIHR5cGVvZiBrZXkgIT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGtleSAhPT0gXCJib29sZWFuXCIpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuYXNzZXJ0VmFsaWRLZXkgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkS2V5KGtleSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieC5tYXBdIEludmFsaWQga2V5OiAnXCIgKyBrZXkgKyBcIidcIik7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArIFwiW3sgXCIgKyB0aGlzLmtleXMoKS5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gKGtleSArIFwiOiBcIiArIChcIlwiICsgX3RoaXMuZ2V0KGtleSkpKTsgfSkuam9pbihcIiwgXCIpICsgXCIgfV1cIjtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbiAobGlzdGVuZXIsIGZpcmVJbW1lZGlhdGVseSkge1xuICAgICAgICBpbnZhcmlhbnQoZmlyZUltbWVkaWF0ZWx5ICE9PSB0cnVlLCBcImBvYnNlcnZlYCBkb2Vzbid0IHN1cHBvcnQgdGhlIGZpcmUgaW1tZWRpYXRlbHkgcHJvcGVydHkgZm9yIG9ic2VydmFibGUgbWFwcy5cIik7XG4gICAgICAgIHJldHVybiByZWdpc3Rlckxpc3RlbmVyKHRoaXMsIGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLmludGVyY2VwdCA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiByZWdpc3RlckludGVyY2VwdG9yKHRoaXMsIGhhbmRsZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIE9ic2VydmFibGVNYXA7XG59KCkpO1xuZXhwb3J0cy5PYnNlcnZhYmxlTWFwID0gT2JzZXJ2YWJsZU1hcDtcbmRlY2xhcmVJdGVyYXRvcihPYnNlcnZhYmxlTWFwLnByb3RvdHlwZSwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbn0pO1xuZnVuY3Rpb24gbWFwKGluaXRpYWxWYWx1ZXMsIHZhbHVlTW9kaWZpZXIpIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGVNYXAoaW5pdGlhbFZhbHVlcywgdmFsdWVNb2RpZmllcik7XG59XG5leHBvcnRzLm1hcCA9IG1hcDtcbmZ1bmN0aW9uIGlzT2JzZXJ2YWJsZU1hcCh0aGluZykge1xuICAgIHJldHVybiB0aGluZyBpbnN0YW5jZW9mIE9ic2VydmFibGVNYXA7XG59XG5leHBvcnRzLmlzT2JzZXJ2YWJsZU1hcCA9IGlzT2JzZXJ2YWJsZU1hcDtcbnZhciBPYnNlcnZhYmxlT2JqZWN0QWRtaW5pc3RyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE9ic2VydmFibGVPYmplY3RBZG1pbmlzdHJhdGlvbih0YXJnZXQsIG5hbWUsIG1vZGUpIHtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgICAgIHRoaXMuY2hhbmdlTGlzdGVuZXJzID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRvcnMgPSBudWxsO1xuICAgIH1cbiAgICBPYnNlcnZhYmxlT2JqZWN0QWRtaW5pc3RyYXRpb24ucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGZpcmVJbW1lZGlhdGVseSkge1xuICAgICAgICBpbnZhcmlhbnQoZmlyZUltbWVkaWF0ZWx5ICE9PSB0cnVlLCBcImBvYnNlcnZlYCBkb2Vzbid0IHN1cHBvcnQgdGhlIGZpcmUgaW1tZWRpYXRlbHkgcHJvcGVydHkgZm9yIG9ic2VydmFibGUgb2JqZWN0cy5cIik7XG4gICAgICAgIHJldHVybiByZWdpc3Rlckxpc3RlbmVyKHRoaXMsIGNhbGxiYWNrKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVPYmplY3RBZG1pbmlzdHJhdGlvbi5wcm90b3R5cGUuaW50ZXJjZXB0ID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVySW50ZXJjZXB0b3IodGhpcywgaGFuZGxlcik7XG4gICAgfTtcbiAgICByZXR1cm4gT2JzZXJ2YWJsZU9iamVjdEFkbWluaXN0cmF0aW9uO1xufSgpKTtcbmZ1bmN0aW9uIGFzT2JzZXJ2YWJsZU9iamVjdCh0YXJnZXQsIG5hbWUsIG1vZGUpIHtcbiAgICBpZiAobW9kZSA9PT0gdm9pZCAwKSB7IG1vZGUgPSBWYWx1ZU1vZGUuUmVjdXJzaXZlOyB9XG4gICAgaWYgKGlzT2JzZXJ2YWJsZU9iamVjdCh0YXJnZXQpKVxuICAgICAgICByZXR1cm4gdGFyZ2V0LiRtb2J4O1xuICAgIGlmICghaXNQbGFpbk9iamVjdCh0YXJnZXQpKVxuICAgICAgICBuYW1lID0gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUgKyBcIkBcIiArIGdldE5leHRJZCgpO1xuICAgIGlmICghbmFtZSlcbiAgICAgICAgbmFtZSA9IFwiT2JzZXJ2YWJsZU9iamVjdEBcIiArIGdldE5leHRJZCgpO1xuICAgIHZhciBhZG0gPSBuZXcgT2JzZXJ2YWJsZU9iamVjdEFkbWluaXN0cmF0aW9uKHRhcmdldCwgbmFtZSwgbW9kZSk7XG4gICAgYWRkSGlkZGVuRmluYWxQcm9wKHRhcmdldCwgXCIkbW9ieFwiLCBhZG0pO1xuICAgIHJldHVybiBhZG07XG59XG5mdW5jdGlvbiBzZXRPYnNlcnZhYmxlT2JqZWN0SW5zdGFuY2VQcm9wZXJ0eShhZG0sIHByb3BOYW1lLCB2YWx1ZSkge1xuICAgIGlmIChhZG0udmFsdWVzW3Byb3BOYW1lXSlcbiAgICAgICAgYWRtLnRhcmdldFtwcm9wTmFtZV0gPSB2YWx1ZTtcbiAgICBlbHNlXG4gICAgICAgIGRlZmluZU9ic2VydmFibGVQcm9wZXJ0eShhZG0sIHByb3BOYW1lLCB2YWx1ZSwgdHJ1ZSk7XG59XG5mdW5jdGlvbiBkZWZpbmVPYnNlcnZhYmxlUHJvcGVydHkoYWRtLCBwcm9wTmFtZSwgbmV3VmFsdWUsIGFzSW5zdGFuY2VQcm9wZXJ0eSkge1xuICAgIGlmIChhc0luc3RhbmNlUHJvcGVydHkpXG4gICAgICAgIGFzc2VydFByb3BlcnR5Q29uZmlndXJhYmxlKGFkbS50YXJnZXQsIHByb3BOYW1lKTtcbiAgICB2YXIgb2JzZXJ2YWJsZTtcbiAgICB2YXIgbmFtZSA9IGFkbS5uYW1lICsgXCIuXCIgKyBwcm9wTmFtZTtcbiAgICB2YXIgaXNDb21wdXRlZCA9IHRydWU7XG4gICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmIG5ld1ZhbHVlLmxlbmd0aCA9PT0gMCAmJiAhaXNBY3Rpb24obmV3VmFsdWUpKVxuICAgICAgICBvYnNlcnZhYmxlID0gbmV3IENvbXB1dGVkVmFsdWUobmV3VmFsdWUsIGFkbS50YXJnZXQsIGZhbHNlLCBuYW1lKTtcbiAgICBlbHNlIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIEFzU3RydWN0dXJlICYmIHR5cGVvZiBuZXdWYWx1ZS52YWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmIG5ld1ZhbHVlLnZhbHVlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgb2JzZXJ2YWJsZSA9IG5ldyBDb21wdXRlZFZhbHVlKG5ld1ZhbHVlLnZhbHVlLCBhZG0udGFyZ2V0LCB0cnVlLCBuYW1lKTtcbiAgICBlbHNlIHtcbiAgICAgICAgaXNDb21wdXRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoaGFzSW50ZXJjZXB0b3JzKGFkbSkpIHtcbiAgICAgICAgICAgIHZhciBjaGFuZ2UgPSBpbnRlcmNlcHRDaGFuZ2UoYWRtLCB7XG4gICAgICAgICAgICAgICAgb2JqZWN0OiBhZG0udGFyZ2V0LFxuICAgICAgICAgICAgICAgIG5hbWU6IHByb3BOYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYWRkXCIsXG4gICAgICAgICAgICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghY2hhbmdlKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIG9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZVZhbHVlKG5ld1ZhbHVlLCBhZG0ubW9kZSwgbmFtZSwgZmFsc2UpO1xuICAgICAgICBuZXdWYWx1ZSA9IG9ic2VydmFibGUudmFsdWU7XG4gICAgfVxuICAgIGFkbS52YWx1ZXNbcHJvcE5hbWVdID0gb2JzZXJ2YWJsZTtcbiAgICBpZiAoYXNJbnN0YW5jZVByb3BlcnR5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhZG0udGFyZ2V0LCBwcm9wTmFtZSwgaXNDb21wdXRlZCA/IGdlbmVyYXRlQ29tcHV0ZWRQcm9wQ29uZmlnKHByb3BOYW1lKSA6IGdlbmVyYXRlT2JzZXJ2YWJsZVByb3BDb25maWcocHJvcE5hbWUpKTtcbiAgICB9XG4gICAgaWYgKCFpc0NvbXB1dGVkKVxuICAgICAgICBub3RpZnlQcm9wZXJ0eUFkZGl0aW9uKGFkbSwgYWRtLnRhcmdldCwgcHJvcE5hbWUsIG5ld1ZhbHVlKTtcbn1cbnZhciBvYnNlcnZhYmxlUHJvcGVydHlDb25maWdzID0ge307XG52YXIgY29tcHV0ZWRQcm9wZXJ0eUNvbmZpZ3MgPSB7fTtcbmZ1bmN0aW9uIGdlbmVyYXRlT2JzZXJ2YWJsZVByb3BDb25maWcocHJvcE5hbWUpIHtcbiAgICB2YXIgY29uZmlnID0gb2JzZXJ2YWJsZVByb3BlcnR5Q29uZmlnc1twcm9wTmFtZV07XG4gICAgaWYgKGNvbmZpZylcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICByZXR1cm4gb2JzZXJ2YWJsZVByb3BlcnR5Q29uZmlnc1twcm9wTmFtZV0gPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4kbW9ieC52YWx1ZXNbcHJvcE5hbWVdLmdldCgpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICBzZXRQcm9wZXJ0eVZhbHVlKHRoaXMsIHByb3BOYW1lLCB2KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBnZW5lcmF0ZUNvbXB1dGVkUHJvcENvbmZpZyhwcm9wTmFtZSkge1xuICAgIHZhciBjb25maWcgPSBjb21wdXRlZFByb3BlcnR5Q29uZmlnc1twcm9wTmFtZV07XG4gICAgaWYgKGNvbmZpZylcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICByZXR1cm4gY29tcHV0ZWRQcm9wZXJ0eUNvbmZpZ3NbcHJvcE5hbWVdID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiRtb2J4LnZhbHVlc1twcm9wTmFtZV0uZ2V0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogdGhyb3dpbmdDb21wdXRlZFZhbHVlU2V0dGVyXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHNldFByb3BlcnR5VmFsdWUoaW5zdGFuY2UsIG5hbWUsIG5ld1ZhbHVlKSB7XG4gICAgdmFyIGFkbSA9IGluc3RhbmNlLiRtb2J4O1xuICAgIHZhciBvYnNlcnZhYmxlID0gYWRtLnZhbHVlc1tuYW1lXTtcbiAgICBpZiAoaGFzSW50ZXJjZXB0b3JzKGFkbSkpIHtcbiAgICAgICAgdmFyIGNoYW5nZSA9IGludGVyY2VwdENoYW5nZShhZG0sIHtcbiAgICAgICAgICAgIHR5cGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgICBvYmplY3Q6IGluc3RhbmNlLFxuICAgICAgICAgICAgbmFtZTogbmFtZSwgbmV3VmFsdWU6IG5ld1ZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWNoYW5nZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbmV3VmFsdWUgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgfVxuICAgIG5ld1ZhbHVlID0gb2JzZXJ2YWJsZS5wcmVwYXJlTmV3VmFsdWUobmV3VmFsdWUpO1xuICAgIGlmIChuZXdWYWx1ZSAhPT0gVU5DSEFOR0VEKSB7XG4gICAgICAgIHZhciBub3RpZnkgPSBoYXNMaXN0ZW5lcnMoYWRtKTtcbiAgICAgICAgdmFyIG5vdGlmeVNweSA9IGlzU3B5RW5hYmxlZCgpO1xuICAgICAgICB2YXIgY2hhbmdlID0gbm90aWZ5TGlzdGVuZXJzIHx8IGhhc0xpc3RlbmVycyA/IHtcbiAgICAgICAgICAgIHR5cGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgICBvYmplY3Q6IGluc3RhbmNlLFxuICAgICAgICAgICAgb2xkVmFsdWU6IG9ic2VydmFibGUudmFsdWUsXG4gICAgICAgICAgICBuYW1lOiBuYW1lLCBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICAgICAgfSA6IG51bGw7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRTdGFydChjaGFuZ2UpO1xuICAgICAgICBvYnNlcnZhYmxlLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgaWYgKG5vdGlmeSlcbiAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyhhZG0sIGNoYW5nZSk7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRFbmQoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBub3RpZnlQcm9wZXJ0eUFkZGl0aW9uKGFkbSwgb2JqZWN0LCBuYW1lLCBuZXdWYWx1ZSkge1xuICAgIHZhciBub3RpZnkgPSBoYXNMaXN0ZW5lcnMoYWRtKTtcbiAgICB2YXIgbm90aWZ5U3B5ID0gaXNTcHlFbmFibGVkKCk7XG4gICAgdmFyIGNoYW5nZSA9IG5vdGlmeSB8fCBub3RpZnlTcHkgPyB7XG4gICAgICAgIHR5cGU6IFwiYWRkXCIsXG4gICAgICAgIG9iamVjdDogb2JqZWN0LCBuYW1lOiBuYW1lLCBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICB9IDogbnVsbDtcbiAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICBzcHlSZXBvcnRTdGFydChjaGFuZ2UpO1xuICAgIGlmIChub3RpZnkpXG4gICAgICAgIG5vdGlmeUxpc3RlbmVycyhhZG0sIGNoYW5nZSk7XG4gICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgc3B5UmVwb3J0RW5kKCk7XG59XG5mdW5jdGlvbiBpc09ic2VydmFibGVPYmplY3QodGhpbmcpIHtcbiAgICBpZiAodHlwZW9mIHRoaW5nID09PSBcIm9iamVjdFwiICYmIHRoaW5nICE9PSBudWxsKSB7XG4gICAgICAgIHJ1bkxhenlJbml0aWFsaXplcnModGhpbmcpO1xuICAgICAgICByZXR1cm4gdGhpbmcuJG1vYnggaW5zdGFuY2VvZiBPYnNlcnZhYmxlT2JqZWN0QWRtaW5pc3RyYXRpb247XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydHMuaXNPYnNlcnZhYmxlT2JqZWN0ID0gaXNPYnNlcnZhYmxlT2JqZWN0O1xudmFyIFVOQ0hBTkdFRCA9IHt9O1xudmFyIE9ic2VydmFibGVWYWx1ZSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE9ic2VydmFibGVWYWx1ZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBPYnNlcnZhYmxlVmFsdWUodmFsdWUsIG1vZGUsIG5hbWUsIG5vdGlmeVNweSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gdm9pZCAwKSB7IG5hbWUgPSBcIk9ic2VydmFibGVWYWx1ZUBcIiArIGdldE5leHRJZCgpOyB9XG4gICAgICAgIGlmIChub3RpZnlTcHkgPT09IHZvaWQgMCkgeyBub3RpZnlTcHkgPSB0cnVlOyB9XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIG5hbWUpO1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICB0aGlzLmhhc1VucmVwb3J0ZWRDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIF9hID0gZ2V0VmFsdWVNb2RlRnJvbVZhbHVlKHZhbHVlLCBWYWx1ZU1vZGUuUmVjdXJzaXZlKSwgY2hpbGRtb2RlID0gX2FbMF0sIHVud3JhcHBlZFZhbHVlID0gX2FbMV07XG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09IFZhbHVlTW9kZS5SZWN1cnNpdmUpXG4gICAgICAgICAgICB0aGlzLm1vZGUgPSBjaGlsZG1vZGU7XG4gICAgICAgIHRoaXMudmFsdWUgPSBtYWtlQ2hpbGRPYnNlcnZhYmxlKHVud3JhcHBlZFZhbHVlLCB0aGlzLm1vZGUsIHRoaXMubmFtZSk7XG4gICAgICAgIGlmIChub3RpZnlTcHkgJiYgaXNTcHlFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHNweVJlcG9ydCh7IHR5cGU6IFwiY3JlYXRlXCIsIG9iamVjdDogdGhpcywgbmV3VmFsdWU6IHRoaXMudmFsdWUgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgT2JzZXJ2YWJsZVZhbHVlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgbmV3VmFsdWUgPSB0aGlzLnByZXBhcmVOZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gVU5DSEFOR0VEKSB7XG4gICAgICAgICAgICB2YXIgbm90aWZ5U3B5ID0gaXNTcHlFbmFibGVkKCk7XG4gICAgICAgICAgICBpZiAobm90aWZ5U3B5KSB7XG4gICAgICAgICAgICAgICAgc3B5UmVwb3J0U3RhcnQoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInVwZGF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZSwgb2xkVmFsdWU6IG9sZFZhbHVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICAgICAgc3B5UmVwb3J0RW5kKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE9ic2VydmFibGVWYWx1ZS5wcm90b3R5cGUucHJlcGFyZU5ld1ZhbHVlID0gZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICAgIGFzc2VydFVud3JhcHBlZChuZXdWYWx1ZSwgXCJNb2RpZmllcnMgY2Fubm90IGJlIHVzZWQgb24gbm9uLWluaXRpYWwgdmFsdWVzLlwiKTtcbiAgICAgICAgY2hlY2tJZlN0YXRlTW9kaWZpY2F0aW9uc0FyZUFsbG93ZWQoKTtcbiAgICAgICAgaWYgKGhhc0ludGVyY2VwdG9ycyh0aGlzKSkge1xuICAgICAgICAgICAgdmFyIGNoYW5nZSA9IGludGVyY2VwdENoYW5nZSh0aGlzLCB7IG9iamVjdDogdGhpcywgdHlwZTogXCJ1cGRhdGVcIiwgbmV3VmFsdWU6IG5ld1ZhbHVlIH0pO1xuICAgICAgICAgICAgaWYgKCFjaGFuZ2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFVOQ0hBTkdFRDtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGFuZ2VkID0gdmFsdWVEaWRDaGFuZ2UodGhpcy5tb2RlID09PSBWYWx1ZU1vZGUuU3RydWN0dXJlLCB0aGlzLnZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgIGlmIChjaGFuZ2VkKVxuICAgICAgICAgICAgcmV0dXJuIG1ha2VDaGlsZE9ic2VydmFibGUobmV3VmFsdWUsIHRoaXMubW9kZSwgdGhpcy5uYW1lKTtcbiAgICAgICAgcmV0dXJuIFVOQ0hBTkdFRDtcbiAgICB9O1xuICAgIE9ic2VydmFibGVWYWx1ZS5wcm90b3R5cGUuc2V0TmV3VmFsdWUgPSBmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLnJlcG9ydENoYW5nZWQoKTtcbiAgICAgICAgaWYgKGhhc0xpc3RlbmVycyh0aGlzKSlcbiAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyh0aGlzLCBbbmV3VmFsdWUsIG9sZFZhbHVlXSk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlVmFsdWUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5yZXBvcnRPYnNlcnZlZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVWYWx1ZS5wcm90b3R5cGUuaW50ZXJjZXB0ID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVySW50ZXJjZXB0b3IodGhpcywgaGFuZGxlcik7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlVmFsdWUucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbiAobGlzdGVuZXIsIGZpcmVJbW1lZGlhdGVseSkge1xuICAgICAgICBpZiAoZmlyZUltbWVkaWF0ZWx5KVxuICAgICAgICAgICAgbGlzdGVuZXIodGhpcy52YWx1ZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVyTGlzdGVuZXIodGhpcywgbGlzdGVuZXIpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZVZhbHVlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZVZhbHVlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArIFwiW1wiICsgdGhpcy52YWx1ZSArIFwiXVwiO1xuICAgIH07XG4gICAgcmV0dXJuIE9ic2VydmFibGVWYWx1ZTtcbn0oQXRvbSkpO1xuZnVuY3Rpb24gZ2V0QXRvbSh0aGluZywgcHJvcGVydHkpIHtcbiAgICBpZiAodHlwZW9mIHRoaW5nID09PSBcIm9iamVjdFwiICYmIHRoaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChpc09ic2VydmFibGVBcnJheSh0aGluZykpIHtcbiAgICAgICAgICAgIGludmFyaWFudChwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkLCBcIkl0IGlzIG5vdCBwb3NzaWJsZSB0byBnZXQgaW5kZXggYXRvbXMgZnJvbSBhcnJheXNcIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpbmcuJG1vYnguYXRvbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNPYnNlcnZhYmxlTWFwKHRoaW5nKSkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEF0b20odGhpbmcuX2tleXMpO1xuICAgICAgICAgICAgdmFyIG9ic2VydmFibGVfMSA9IHRoaW5nLl9kYXRhW3Byb3BlcnR5XSB8fCB0aGluZy5faGFzTWFwW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGludmFyaWFudCghIW9ic2VydmFibGVfMSwgXCJ0aGUgZW50cnkgJ1wiICsgcHJvcGVydHkgKyBcIicgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG9ic2VydmFibGUgbWFwICdcIiArIGdldERlYnVnTmFtZSh0aGluZykgKyBcIidcIik7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZV8xO1xuICAgICAgICB9XG4gICAgICAgIHJ1bkxhenlJbml0aWFsaXplcnModGhpbmcpO1xuICAgICAgICBpZiAoaXNPYnNlcnZhYmxlT2JqZWN0KHRoaW5nKSkge1xuICAgICAgICAgICAgaW52YXJpYW50KCEhcHJvcGVydHksIFwicGxlYXNlIHNwZWNpZnkgYSBwcm9wZXJ0eVwiKTtcbiAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlXzIgPSB0aGluZy4kbW9ieC52YWx1ZXNbcHJvcGVydHldO1xuICAgICAgICAgICAgaW52YXJpYW50KCEhb2JzZXJ2YWJsZV8yLCBcIm5vIG9ic2VydmFibGUgcHJvcGVydHkgJ1wiICsgcHJvcGVydHkgKyBcIicgZm91bmQgb24gdGhlIG9ic2VydmFibGUgb2JqZWN0ICdcIiArIGdldERlYnVnTmFtZSh0aGluZykgKyBcIidcIik7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZV8yO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIEF0b20gfHwgdGhpbmcgaW5zdGFuY2VvZiBDb21wdXRlZFZhbHVlIHx8IHRoaW5nIGluc3RhbmNlb2YgUmVhY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGluZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgdGhpbmcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBpZiAodGhpbmcuJG1vYnggaW5zdGFuY2VvZiBSZWFjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaW5nLiRtb2J4O1xuICAgICAgICB9XG4gICAgfVxuICAgIGludmFyaWFudChmYWxzZSwgXCJDYW5ub3Qgb2J0YWluIGF0b20gZnJvbSBcIiArIHRoaW5nKTtcbn1cbmZ1bmN0aW9uIGdldEFkbWluaXN0cmF0aW9uKHRoaW5nLCBwcm9wZXJ0eSkge1xuICAgIGludmFyaWFudCh0aGluZywgXCJFeHBlY3Rpb24gc29tZSBvYmplY3RcIik7XG4gICAgaWYgKHByb3BlcnR5ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiBnZXRBZG1pbmlzdHJhdGlvbihnZXRBdG9tKHRoaW5nLCBwcm9wZXJ0eSkpO1xuICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIEF0b20gfHwgdGhpbmcgaW5zdGFuY2VvZiBDb21wdXRlZFZhbHVlIHx8IHRoaW5nIGluc3RhbmNlb2YgUmVhY3Rpb24pXG4gICAgICAgIHJldHVybiB0aGluZztcbiAgICBpZiAoaXNPYnNlcnZhYmxlTWFwKHRoaW5nKSlcbiAgICAgICAgcmV0dXJuIHRoaW5nO1xuICAgIHJ1bkxhenlJbml0aWFsaXplcnModGhpbmcpO1xuICAgIGlmICh0aGluZy4kbW9ieClcbiAgICAgICAgcmV0dXJuIHRoaW5nLiRtb2J4O1xuICAgIGludmFyaWFudChmYWxzZSwgXCJDYW5ub3Qgb2J0YWluIGFkbWluaXN0cmF0aW9uIGZyb20gXCIgKyB0aGluZyk7XG59XG5mdW5jdGlvbiBnZXREZWJ1Z05hbWUodGhpbmcsIHByb3BlcnR5KSB7XG4gICAgdmFyIG5hbWVkO1xuICAgIGlmIChwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICBuYW1lZCA9IGdldEF0b20odGhpbmcsIHByb3BlcnR5KTtcbiAgICBlbHNlIGlmIChpc09ic2VydmFibGVPYmplY3QodGhpbmcpIHx8IGlzT2JzZXJ2YWJsZU1hcCh0aGluZykpXG4gICAgICAgIG5hbWVkID0gZ2V0QWRtaW5pc3RyYXRpb24odGhpbmcpO1xuICAgIGVsc2VcbiAgICAgICAgbmFtZWQgPSBnZXRBdG9tKHRoaW5nKTtcbiAgICByZXR1cm4gbmFtZWQubmFtZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNsYXNzUHJvcGVydHlEZWNvcmF0b3Iob25Jbml0aWFsaXplLCBnZXQsIHNldCwgZW51bWVyYWJsZSwgYWxsb3dDdXN0b21Bcmd1bWVudHMpIHtcbiAgICBmdW5jdGlvbiBjbGFzc1Byb3BlcnR5RGVjb3JhdG9yKHRhcmdldCwga2V5LCBkZXNjcmlwdG9yLCBjdXN0b21BcmdzKSB7XG4gICAgICAgIGludmFyaWFudChhbGxvd0N1c3RvbUFyZ3VtZW50cyB8fCBxdWFja3NMaWtlQURlY29yYXRvcihhcmd1bWVudHMpLCBcIlRoaXMgZnVuY3Rpb24gaXMgYSBkZWNvcmF0b3IsIGJ1dCBpdCB3YXNuJ3QgaW52b2tlZCBsaWtlIGEgZGVjb3JhdG9yXCIpO1xuICAgICAgICBpZiAoIWRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIHZhciBuZXdEZXNjcmlwdG9yID0ge1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGVudW1lcmFibGUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX19tb2J4SW5pdGlhbGl6ZWRQcm9wcyB8fCB0aGlzLl9fbW9ieEluaXRpYWxpemVkUHJvcHNba2V5XSAhPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzY3JpcHRJbml0aWFsaXplUHJvcGVydHkodGhpcywga2V5LCB1bmRlZmluZWQsIG9uSW5pdGlhbGl6ZSwgY3VzdG9tQXJncywgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQuY2FsbCh0aGlzLCBrZXkpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX19tb2J4SW5pdGlhbGl6ZWRQcm9wcyB8fCB0aGlzLl9fbW9ieEluaXRpYWxpemVkUHJvcHNba2V5XSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXNjcmlwdEluaXRpYWxpemVQcm9wZXJ0eSh0aGlzLCBrZXksIHYsIG9uSW5pdGlhbGl6ZSwgY3VzdG9tQXJncywgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQuY2FsbCh0aGlzLCBrZXksIHYpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgbmV3RGVzY3JpcHRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3RGVzY3JpcHRvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0Lmhhc093blByb3BlcnR5KFwiX19tb2J4TGF6eUluaXRpYWxpemVyc1wiKSkge1xuICAgICAgICAgICAgICAgIGFkZEhpZGRlblByb3AodGFyZ2V0LCBcIl9fbW9ieExhenlJbml0aWFsaXplcnNcIiwgKHRhcmdldC5fX21vYnhMYXp5SW5pdGlhbGl6ZXJzICYmIHRhcmdldC5fX21vYnhMYXp5SW5pdGlhbGl6ZXJzLnNsaWNlKCkpIHx8IFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2YWx1ZV8xID0gZGVzY3JpcHRvci52YWx1ZSwgaW5pdGlhbGl6ZXJfMSA9IGRlc2NyaXB0b3IuaW5pdGlhbGl6ZXI7XG4gICAgICAgICAgICB0YXJnZXQuX19tb2J4TGF6eUluaXRpYWxpemVycy5wdXNoKGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIG9uSW5pdGlhbGl6ZShpbnN0YW5jZSwga2V5LCAoaW5pdGlhbGl6ZXJfMSA/IGluaXRpYWxpemVyXzEuY2FsbChpbnN0YW5jZSkgOiB2YWx1ZV8xKSwgY3VzdG9tQXJncywgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZW51bWVyYWJsZSwgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fX21vYnhEaWRSdW5MYXp5SW5pdGlhbGl6ZXJzICE9PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuTGF6eUluaXRpYWxpemVycyh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldC5jYWxsKHRoaXMsIGtleSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fbW9ieERpZFJ1bkxhenlJbml0aWFsaXplcnMgIT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5MYXp5SW5pdGlhbGl6ZXJzKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBzZXQuY2FsbCh0aGlzLCBrZXksIHYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbG93Q3VzdG9tQXJndW1lbnRzKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAocXVhY2tzTGlrZUFEZWNvcmF0b3IoYXJndW1lbnRzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NQcm9wZXJ0eURlY29yYXRvci5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgdmFyIG91dGVyQXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpIHsgcmV0dXJuIGNsYXNzUHJvcGVydHlEZWNvcmF0b3IodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IsIG91dGVyQXJncyk7IH07XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBjbGFzc1Byb3BlcnR5RGVjb3JhdG9yO1xufVxuZnVuY3Rpb24gdHlwZXNjcmlwdEluaXRpYWxpemVQcm9wZXJ0eShpbnN0YW5jZSwga2V5LCB2LCBvbkluaXRpYWxpemUsIGN1c3RvbUFyZ3MsIGJhc2VEZXNjcmlwdG9yKSB7XG4gICAgaWYgKCFpbnN0YW5jZS5oYXNPd25Qcm9wZXJ0eShcIl9fbW9ieEluaXRpYWxpemVkUHJvcHNcIikpXG4gICAgICAgIGFkZEhpZGRlblByb3AoaW5zdGFuY2UsIFwiX19tb2J4SW5pdGlhbGl6ZWRQcm9wc1wiLCB7fSk7XG4gICAgaW5zdGFuY2UuX19tb2J4SW5pdGlhbGl6ZWRQcm9wc1trZXldID0gdHJ1ZTtcbiAgICBvbkluaXRpYWxpemUoaW5zdGFuY2UsIGtleSwgdiwgY3VzdG9tQXJncywgYmFzZURlc2NyaXB0b3IpO1xufVxuZnVuY3Rpb24gcnVuTGF6eUluaXRpYWxpemVycyhpbnN0YW5jZSkge1xuICAgIGlmIChpbnN0YW5jZS5fX21vYnhEaWRSdW5MYXp5SW5pdGlhbGl6ZXJzID09PSB0cnVlKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKGluc3RhbmNlLl9fbW9ieExhenlJbml0aWFsaXplcnMpIHtcbiAgICAgICAgYWRkSGlkZGVuUHJvcChpbnN0YW5jZSwgXCJfX21vYnhEaWRSdW5MYXp5SW5pdGlhbGl6ZXJzXCIsIHRydWUpO1xuICAgICAgICBpbnN0YW5jZS5fX21vYnhEaWRSdW5MYXp5SW5pdGlhbGl6ZXJzICYmIGluc3RhbmNlLl9fbW9ieExhenlJbml0aWFsaXplcnMuZm9yRWFjaChmdW5jdGlvbiAoaW5pdGlhbGl6ZXIpIHsgcmV0dXJuIGluaXRpYWxpemVyKGluc3RhbmNlKTsgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gcXVhY2tzTGlrZUFEZWNvcmF0b3IoYXJncykge1xuICAgIHJldHVybiAoYXJncy5sZW5ndGggPT09IDIgfHwgYXJncy5sZW5ndGggPT09IDMpICYmIHR5cGVvZiBhcmdzWzFdID09PSBcInN0cmluZ1wiO1xufVxuZnVuY3Rpb24gaXRlcmF0b3JTeW1ib2woKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yKSB8fCBcIkBAaXRlcmF0b3JcIjtcbn1cbnZhciBJU19JVEVSQVRJTkdfTUFSS0VSID0gXCJfXyQkaXRlcmF0aW5nXCI7XG5mdW5jdGlvbiBhcnJheUFzSXRlcmF0b3IoYXJyYXkpIHtcbiAgICBpbnZhcmlhbnQoYXJyYXlbSVNfSVRFUkFUSU5HX01BUktFUl0gIT09IHRydWUsIFwiSWxsZWdhbCBzdGF0ZTogY2Fubm90IHJlY3ljbGUgYXJyYXkgYXMgaXRlcmF0b3JcIik7XG4gICAgYWRkSGlkZGVuRmluYWxQcm9wKGFycmF5LCBJU19JVEVSQVRJTkdfTUFSS0VSLCB0cnVlKTtcbiAgICB2YXIgaWR4ID0gLTE7XG4gICAgYWRkSGlkZGVuRmluYWxQcm9wKGFycmF5LCBcIm5leHRcIiwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgaWR4Kys7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiBpZHggPj0gdGhpcy5sZW5ndGgsXG4gICAgICAgICAgICB2YWx1ZTogaWR4IDwgdGhpcy5sZW5ndGggPyB0aGlzW2lkeF0gOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gYXJyYXk7XG59XG5mdW5jdGlvbiBkZWNsYXJlSXRlcmF0b3IocHJvdG90VHlwZSwgaXRlcmF0b3JGYWN0b3J5KSB7XG4gICAgYWRkSGlkZGVuRmluYWxQcm9wKHByb3RvdFR5cGUsIGl0ZXJhdG9yU3ltYm9sKCksIGl0ZXJhdG9yRmFjdG9yeSk7XG59XG52YXIgU2ltcGxlU2V0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTaW1wbGVTZXQoKSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuZGF0YSA9IHt9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2ltcGxlU2V0LnByb3RvdHlwZSwgXCJsZW5ndGhcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNpemU7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIFNpbXBsZVNldC5wcm90b3R5cGUuYXNBcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJlcyA9IG5ldyBBcnJheSh0aGlzLnNpemUpO1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgIHJlc1tpXSA9IHRoaXMuZGF0YVtrZXldO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICBTaW1wbGVTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgbSA9IHZhbHVlLl9fbWFwaWQ7XG4gICAgICAgIGlmICghKG0gaW4gdGhpcy5kYXRhKSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhW21dID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLnNpemUrKztcbiAgICAgICAgfVxuICAgIH07XG4gICAgU2ltcGxlU2V0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlLl9fbWFwaWQgaW4gdGhpcy5kYXRhKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5kYXRhW3ZhbHVlLl9fbWFwaWRdO1xuICAgICAgICAgICAgdGhpcy5zaXplLS07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBTaW1wbGVTZXQ7XG59KCkpO1xuZXhwb3J0cy5TaW1wbGVTZXQgPSBTaW1wbGVTZXQ7XG52YXIgU2ltcGxlRXZlbnRFbWl0dGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTaW1wbGVFdmVudEVtaXR0ZXIoKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0gW107XG4gICAgICAgIGRlcHJlY2F0ZWQoXCJleHRyYXMuU2ltcGxlRXZlbnRFbWl0dGVyIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlXCIpO1xuICAgIH1cbiAgICBTaW1wbGVFdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycy5zbGljZSgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsOyBpKyspXG4gICAgICAgICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIFNpbXBsZUV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpZHggPSBfdGhpcy5saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgICAgICBpZiAoaWR4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICBfdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU2ltcGxlRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGlzLm9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbigpO1xuICAgICAgICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gICAgfTtcbiAgICByZXR1cm4gU2ltcGxlRXZlbnRFbWl0dGVyO1xufSgpKTtcbmV4cG9ydHMuU2ltcGxlRXZlbnRFbWl0dGVyID0gU2ltcGxlRXZlbnRFbWl0dGVyO1xudmFyIEVNUFRZX0FSUkFZID0gW107XG5PYmplY3QuZnJlZXplKEVNUFRZX0FSUkFZKTtcbmZ1bmN0aW9uIGdldE5leHRJZCgpIHtcbiAgICByZXR1cm4gKytnbG9iYWxTdGF0ZS5tb2J4R3VpZDtcbn1cbmZ1bmN0aW9uIGludmFyaWFudChjaGVjaywgbWVzc2FnZSwgdGhpbmcpIHtcbiAgICBpZiAoIWNoZWNrKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieF0gSW52YXJpYW50IGZhaWxlZDogXCIgKyBtZXNzYWdlICsgKHRoaW5nID8gXCIgaW4gJ1wiICsgdGhpbmcgKyBcIidcIiA6IFwiXCIpKTtcbn1cbnZhciBkZXByZWNhdGVkTWVzc2FnZXMgPSBbXTtcbmZ1bmN0aW9uIGRlcHJlY2F0ZWQobXNnKSB7XG4gICAgaWYgKGRlcHJlY2F0ZWRNZXNzYWdlcy5pbmRleE9mKG1zZykgIT09IC0xKVxuICAgICAgICByZXR1cm47XG4gICAgZGVwcmVjYXRlZE1lc3NhZ2VzLnB1c2gobXNnKTtcbiAgICBjb25zb2xlLmVycm9yKFwiW21vYnhdIERlcHJlY2F0ZWQ6IFwiICsgbXNnKTtcbn1cbmZ1bmN0aW9uIG9uY2UoZnVuYykge1xuICAgIHZhciBpbnZva2VkID0gZmFsc2U7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGludm9rZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGludm9rZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59XG52YXIgbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbmZ1bmN0aW9uIHVuaXF1ZShsaXN0KSB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBpZiAocmVzLmluZGV4T2YoaXRlbSkgPT09IC0xKVxuICAgICAgICAgICAgcmVzLnB1c2goaXRlbSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGpvaW5TdHJpbmdzKHRoaW5ncywgbGltaXQsIHNlcGFyYXRvcikge1xuICAgIGlmIChsaW1pdCA9PT0gdm9pZCAwKSB7IGxpbWl0ID0gMTAwOyB9XG4gICAgaWYgKHNlcGFyYXRvciA9PT0gdm9pZCAwKSB7IHNlcGFyYXRvciA9IFwiIC0gXCI7IH1cbiAgICBpZiAoIXRoaW5ncylcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgdmFyIHNsaWNlZCA9IHRoaW5ncy5zbGljZSgwLCBsaW1pdCk7XG4gICAgcmV0dXJuIFwiXCIgKyBzbGljZWQuam9pbihzZXBhcmF0b3IpICsgKHRoaW5ncy5sZW5ndGggPiBsaW1pdCA/IFwiICguLi4gYW5kIFwiICsgKHRoaW5ncy5sZW5ndGggLSBsaW1pdCkgKyBcIm1vcmUpXCIgOiBcIlwiKTtcbn1cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IE9iamVjdC5wcm90b3R5cGU7XG59XG5mdW5jdGlvbiBvYmplY3RBc3NpZ24oKSB7XG4gICAgdmFyIHJlcyA9IGFyZ3VtZW50c1swXTtcbiAgICBmb3IgKHZhciBpID0gMSwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSlcbiAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJlc1trZXldID0gc291cmNlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiB2YWx1ZURpZENoYW5nZShjb21wYXJlU3RydWN0dXJhbCwgb2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgcmV0dXJuIGNvbXBhcmVTdHJ1Y3R1cmFsXG4gICAgICAgID8gIWRlZXBFcXVhbHMob2xkVmFsdWUsIG5ld1ZhbHVlKVxuICAgICAgICA6IG9sZFZhbHVlICE9PSBuZXdWYWx1ZTtcbn1cbmZ1bmN0aW9uIG1ha2VOb25FbnVtZXJhYmxlKG9iamVjdCwgcHJvcE5hbWVzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWRkSGlkZGVuUHJvcChvYmplY3QsIHByb3BOYW1lc1tpXSwgb2JqZWN0W3Byb3BOYW1lc1tpXV0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZEhpZGRlblByb3Aob2JqZWN0LCBwcm9wTmFtZSwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wTmFtZSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSk7XG59XG5mdW5jdGlvbiBhZGRIaWRkZW5GaW5hbFByb3Aob2JqZWN0LCBwcm9wTmFtZSwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wTmFtZSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGlzUHJvcGVydHlDb25maWd1cmFibGUob2JqZWN0LCBwcm9wKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcCk7XG4gICAgcmV0dXJuICFkZXNjcmlwdG9yIHx8IChkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSAhPT0gZmFsc2UgJiYgZGVzY3JpcHRvci53cml0YWJsZSAhPT0gZmFsc2UpO1xufVxuZnVuY3Rpb24gYXNzZXJ0UHJvcGVydHlDb25maWd1cmFibGUob2JqZWN0LCBwcm9wKSB7XG4gICAgaW52YXJpYW50KGlzUHJvcGVydHlDb25maWd1cmFibGUob2JqZWN0LCBwcm9wKSwgXCJDYW5ub3QgbWFrZSBwcm9wZXJ0eSAnXCIgKyBwcm9wICsgXCInIG9ic2VydmFibGUsIGl0IGlzIG5vdCBjb25maWd1cmFibGUgYW5kIHdyaXRhYmxlIGluIHRoZSB0YXJnZXQgb2JqZWN0XCIpO1xufVxuZnVuY3Rpb24gZ2V0RW51bWVyYWJsZUtleXMob2JqKSB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopXG4gICAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGRlZXBFcXVhbHMoYSwgYikge1xuICAgIGlmIChhID09PSBudWxsICYmIGIgPT09IG51bGwpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgYUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGEpIHx8IGlzT2JzZXJ2YWJsZUFycmF5KGEpO1xuICAgIGlmIChhSXNBcnJheSAhPT0gKEFycmF5LmlzQXJyYXkoYikgfHwgaXNPYnNlcnZhYmxlQXJyYXkoYikpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYUlzQXJyYXkpIHtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICBpZiAoIWRlZXBFcXVhbHMoYVtpXSwgYltpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGEgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGIgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGdldEVudW1lcmFibGVLZXlzKGEpLmxlbmd0aCAhPT0gZ2V0RW51bWVyYWJsZUtleXMoYikubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBwcm9wIGluIGEpIHtcbiAgICAgICAgICAgIGlmICghKHByb3AgaW4gYikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFkZWVwRXF1YWxzKGFbcHJvcF0sIGJbcHJvcF0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGEgPT09IGI7XG59XG52YXIgX2E7XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW14cFlpOXRiMko0TG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lJN1FVRkJRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRWlMQ0ptYVd4bElqb2laMlZ1WlhKaGRHVmtMbXB6SWl3aWMyOTFjbU5sVW05dmRDSTZJaUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWx3aWRYTmxJSE4wY21samRGd2lPMXh1ZG1GeUlGOWZaWGgwWlc1a2N5QTlJQ2gwYUdseklDWW1JSFJvYVhNdVgxOWxlSFJsYm1SektTQjhmQ0JtZFc1amRHbHZiaUFvWkN3Z1lpa2dlMXh1SUNBZ0lHWnZjaUFvZG1GeUlIQWdhVzRnWWlrZ2FXWWdLR0l1YUdGelQzZHVVSEp2Y0dWeWRIa29jQ2twSUdSYmNGMGdQU0JpVzNCZE8xeHVJQ0FnSUdaMWJtTjBhVzl1SUY5ZktDa2dleUIwYUdsekxtTnZibk4wY25WamRHOXlJRDBnWkRzZ2ZWeHVJQ0FnSUdRdWNISnZkRzkwZVhCbElEMGdZaUE5UFQwZ2JuVnNiQ0EvSUU5aWFtVmpkQzVqY21WaGRHVW9ZaWtnT2lBb1gxOHVjSEp2ZEc5MGVYQmxJRDBnWWk1d2NtOTBiM1I1Y0dVc0lHNWxkeUJmWHlncEtUdGNibjA3WEc1eVpXZHBjM1JsY2tkc2IySmhiSE1vS1R0Y2JtVjRjRzl5ZEhNdVpYaDBjbUZ6SUQwZ2UxeHVJQ0FnSUdGc2JHOTNVM1JoZEdWRGFHRnVaMlZ6T2lCaGJHeHZkMU4wWVhSbFEyaGhibWRsY3l4Y2JpQWdJQ0JuWlhSQmRHOXRPaUJuWlhSQmRHOXRMRnh1SUNBZ0lHZGxkRVJsWW5WblRtRnRaVG9nWjJWMFJHVmlkV2RPWVcxbExGeHVJQ0FnSUdkbGRFUmxjR1Z1WkdWdVkzbFVjbVZsT2lCblpYUkVaWEJsYm1SbGJtTjVWSEpsWlN4Y2JpQWdJQ0JuWlhSUFluTmxjblpsY2xSeVpXVTZJR2RsZEU5aWMyVnlkbVZ5VkhKbFpTeGNiaUFnSUNCcGMwTnZiWEIxZEdsdVowUmxjbWwyWVhScGIyNDZJR2x6UTI5dGNIVjBhVzVuUkdWeWFYWmhkR2x2Yml4Y2JpQWdJQ0JwYzFOd2VVVnVZV0pzWldRNklHbHpVM0I1Ulc1aFlteGxaQ3hjYmlBZ0lDQnlaWE5sZEVkc2IySmhiRk4wWVhSbE9pQnlaWE5sZEVkc2IySmhiRk4wWVhSbExGeHVJQ0FnSUhOd2VWSmxjRzl5ZERvZ2MzQjVVbVZ3YjNKMExGeHVJQ0FnSUhOd2VWSmxjRzl5ZEVWdVpEb2djM0I1VW1Wd2IzSjBSVzVrTEZ4dUlDQWdJSE53ZVZKbGNHOXlkRk4wWVhKME9pQnpjSGxTWlhCdmNuUlRkR0Z5ZEN4Y2JpQWdJQ0IwY21GamExUnlZVzV6YVhScGIyNXpPaUIwY21GamExUnlZVzV6YVhScGIyNXpYRzU5TzF4dVpYaHdiM0owY3k1ZklEMGdlMXh1SUNBZ0lHZGxkRUZrYldsdWFYTjBjbUYwYVc5dU9pQm5aWFJCWkcxcGJtbHpkSEpoZEdsdmJpeGNiaUFnSUNCeVpYTmxkRWRzYjJKaGJGTjBZWFJsT2lCeVpYTmxkRWRzYjJKaGJGTjBZWFJsWEc1OU8xeHVablZ1WTNScGIyNGdZWFYwYjNKMWJpaGhjbWN4TENCaGNtY3lMQ0JoY21jektTQjdYRzRnSUNBZ2RtRnlJRzVoYldVc0lIWnBaWGNzSUhOamIzQmxPMXh1SUNBZ0lHbG1JQ2gwZVhCbGIyWWdZWEpuTVNBOVBUMGdYQ0p6ZEhKcGJtZGNJaWtnZTF4dUlDQWdJQ0FnSUNCdVlXMWxJRDBnWVhKbk1UdGNiaUFnSUNBZ0lDQWdkbWxsZHlBOUlHRnlaekk3WEc0Z0lDQWdJQ0FnSUhOamIzQmxJRDBnWVhKbk16dGNiaUFnSUNCOVhHNGdJQ0FnWld4elpTQnBaaUFvZEhsd1pXOW1JR0Z5WnpFZ1BUMDlJRndpWm5WdVkzUnBiMjVjSWlrZ2UxeHVJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1lYSm5NUzV1WVcxbElIeDhJQ2hjSWtGMWRHOXlkVzVBWENJZ0t5Qm5aWFJPWlhoMFNXUW9LU2s3WEc0Z0lDQWdJQ0FnSUhacFpYY2dQU0JoY21jeE8xeHVJQ0FnSUNBZ0lDQnpZMjl3WlNBOUlHRnlaekk3WEc0Z0lDQWdmVnh1SUNBZ0lHRnpjMlZ5ZEZWdWQzSmhjSEJsWkNoMmFXVjNMQ0JjSW1GMWRHOXlkVzRnYldWMGFHOWtjeUJqWVc1dWIzUWdhR0YyWlNCdGIyUnBabWxsY25OY0lpazdYRzRnSUNBZ2FXNTJZWEpwWVc1MEtIUjVjR1Z2WmlCMmFXVjNJRDA5UFNCY0ltWjFibU4wYVc5dVhDSXNJRndpWVhWMGIzSjFiaUJsZUhCbFkzUnpJR0VnWm5WdVkzUnBiMjVjSWlrN1hHNGdJQ0FnYVc1MllYSnBZVzUwS0hacFpYY3ViR1Z1WjNSb0lEMDlQU0F3TENCY0ltRjFkRzl5ZFc0Z1pYaHdaV04wY3lCaElHWjFibU4wYVc5dUlIZHBkR2h2ZFhRZ1lYSm5kVzFsYm5SelhDSXBPMXh1SUNBZ0lHbG1JQ2h6WTI5d1pTbGNiaUFnSUNBZ0lDQWdkbWxsZHlBOUlIWnBaWGN1WW1sdVpDaHpZMjl3WlNrN1hHNGdJQ0FnZG1GeUlISmxZV04wYVc5dUlEMGdibVYzSUZKbFlXTjBhVzl1S0c1aGJXVXNJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTUwY21GamF5aDJhV1YzS1R0Y2JpQWdJQ0I5S1R0Y2JpQWdJQ0J5WldGamRHbHZiaTV6WTJobFpIVnNaU2dwTzF4dUlDQWdJSEpsZEhWeWJpQnlaV0ZqZEdsdmJpNW5aWFJFYVhOd2IzTmxjaWdwTzF4dWZWeHVaWGh3YjNKMGN5NWhkWFJ2Y25WdUlEMGdZWFYwYjNKMWJqdGNibVoxYm1OMGFXOXVJSGRvWlc0b1lYSm5NU3dnWVhKbk1pd2dZWEpuTXl3Z1lYSm5OQ2tnZTF4dUlDQWdJSFpoY2lCdVlXMWxMQ0J3Y21Wa2FXTmhkR1VzSUdWbVptVmpkQ3dnYzJOdmNHVTdYRzRnSUNBZ2FXWWdLSFI1Y0dWdlppQmhjbWN4SUQwOVBTQmNJbk4wY21sdVoxd2lLU0I3WEc0Z0lDQWdJQ0FnSUc1aGJXVWdQU0JoY21jeE8xeHVJQ0FnSUNBZ0lDQndjbVZrYVdOaGRHVWdQU0JoY21jeU8xeHVJQ0FnSUNBZ0lDQmxabVpsWTNRZ1BTQmhjbWN6TzF4dUlDQWdJQ0FnSUNCelkyOXdaU0E5SUdGeVp6UTdYRzRnSUNBZ2ZWeHVJQ0FnSUdWc2MyVWdhV1lnS0hSNWNHVnZaaUJoY21jeElEMDlQU0JjSW1aMWJtTjBhVzl1WENJcElIdGNiaUFnSUNBZ0lDQWdibUZ0WlNBOUlDaGNJbGRvWlc1QVhDSWdLeUJuWlhST1pYaDBTV1FvS1NrN1hHNGdJQ0FnSUNBZ0lIQnlaV1JwWTJGMFpTQTlJR0Z5WnpFN1hHNGdJQ0FnSUNBZ0lHVm1abVZqZENBOUlHRnlaekk3WEc0Z0lDQWdJQ0FnSUhOamIzQmxJRDBnWVhKbk16dGNiaUFnSUNCOVhHNGdJQ0FnZG1GeUlHUnBjM0J2YzJWSmJXMWxaR2xoZEdWc2VTQTlJR1poYkhObE8xeHVJQ0FnSUhaaGNpQmthWE53YjNObGNpQTlJR0YxZEc5eWRXNG9ibUZ0WlN3Z1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb2NISmxaR2xqWVhSbExtTmhiR3dvYzJOdmNHVXBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWkdsemNHOXpaWElwWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdsemNHOXpaWElvS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJR1ZzYzJWY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa2FYTndiM05sU1cxdFpXUnBZWFJsYkhrZ1BTQjBjblZsTzF4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhCeVpYWlZiblJ5WVdOclpXUWdQU0IxYm5SeVlXTnJaV1JUZEdGeWRDZ3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ1pXWm1aV04wTG1OaGJHd29jMk52Y0dVcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZFc1MGNtRmphMlZrUlc1a0tIQnlaWFpWYm5SeVlXTnJaV1FwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnZlNrN1hHNGdJQ0FnYVdZZ0tHUnBjM0J2YzJWSmJXMWxaR2xoZEdWc2VTbGNiaUFnSUNBZ0lDQWdaR2x6Y0c5elpYSW9LVHRjYmlBZ0lDQnlaWFIxY200Z1pHbHpjRzl6WlhJN1hHNTlYRzVsZUhCdmNuUnpMbmRvWlc0Z1BTQjNhR1Z1TzF4dVpuVnVZM1JwYjI0Z1lYVjBiM0oxYmxWdWRHbHNLSEJ5WldScFkyRjBaU3dnWldabVpXTjBMQ0J6WTI5d1pTa2dlMXh1SUNBZ0lHUmxjSEpsWTJGMFpXUW9YQ0pnWVhWMGIzSjFibFZ1ZEdsc1lDQnBjeUJrWlhCeVpXTmhkR1ZrTENCd2JHVmhjMlVnZFhObElHQjNhR1Z1WUM1Y0lpazdYRzRnSUNBZ2NtVjBkWEp1SUhkb1pXNHVZWEJ3Ykhrb2JuVnNiQ3dnWVhKbmRXMWxiblJ6S1R0Y2JuMWNibVY0Y0c5eWRITXVZWFYwYjNKMWJsVnVkR2xzSUQwZ1lYVjBiM0oxYmxWdWRHbHNPMXh1Wm5WdVkzUnBiMjRnWVhWMGIzSjFia0Z6ZVc1aktHRnlaekVzSUdGeVp6SXNJR0Z5WnpNc0lHRnlaelFwSUh0Y2JpQWdJQ0IyWVhJZ2JtRnRaU3dnWm5WdVl5d2daR1ZzWVhrc0lITmpiM0JsTzF4dUlDQWdJR2xtSUNoMGVYQmxiMllnWVhKbk1TQTlQVDBnWENKemRISnBibWRjSWlrZ2UxeHVJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1lYSm5NVHRjYmlBZ0lDQWdJQ0FnWm5WdVl5QTlJR0Z5WnpJN1hHNGdJQ0FnSUNBZ0lHUmxiR0Y1SUQwZ1lYSm5NenRjYmlBZ0lDQWdJQ0FnYzJOdmNHVWdQU0JoY21jME8xeHVJQ0FnSUgxY2JpQWdJQ0JsYkhObElHbG1JQ2gwZVhCbGIyWWdZWEpuTVNBOVBUMGdYQ0ptZFc1amRHbHZibHdpS1NCN1hHNGdJQ0FnSUNBZ0lHNWhiV1VnUFNCaGNtY3hMbTVoYldVZ2ZId2dLRndpUVhWMGIzSjFia0Z6ZVc1alFGd2lJQ3NnWjJWMFRtVjRkRWxrS0NrcE8xeHVJQ0FnSUNBZ0lDQm1kVzVqSUQwZ1lYSm5NVHRjYmlBZ0lDQWdJQ0FnWkdWc1lYa2dQU0JoY21jeU8xeHVJQ0FnSUNBZ0lDQnpZMjl3WlNBOUlHRnlaek03WEc0Z0lDQWdmVnh1SUNBZ0lHbG1JQ2hrWld4aGVTQTlQVDBnZG05cFpDQXdLVnh1SUNBZ0lDQWdJQ0JrWld4aGVTQTlJREU3WEc0Z0lDQWdhV1lnS0hOamIzQmxLVnh1SUNBZ0lDQWdJQ0JtZFc1aklEMGdablZ1WXk1aWFXNWtLSE5qYjNCbEtUdGNiaUFnSUNCMllYSWdhWE5UWTJobFpIVnNaV1FnUFNCbVlXeHpaVHRjYmlBZ0lDQjJZWElnY2lBOUlHNWxkeUJTWldGamRHbHZiaWh1WVcxbExDQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDZ2hhWE5UWTJobFpIVnNaV1FwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2x6VTJOb1pXUjFiR1ZrSUQwZ2RISjFaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lITmxkRlJwYldWdmRYUW9ablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdselUyTm9aV1IxYkdWa0lEMGdabUZzYzJVN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0Z5TG1selJHbHpjRzl6WldRcFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEl1ZEhKaFkyc29ablZ1WXlrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5TENCa1pXeGhlU2s3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5S1R0Y2JpQWdJQ0J5TG5OamFHVmtkV3hsS0NrN1hHNGdJQ0FnY21WMGRYSnVJSEl1WjJWMFJHbHpjRzl6WlhJb0tUdGNibjFjYm1WNGNHOXlkSE11WVhWMGIzSjFia0Z6ZVc1aklEMGdZWFYwYjNKMWJrRnplVzVqTzF4dVpuVnVZM1JwYjI0Z2NtVmhZM1JwYjI0b1lYSm5NU3dnWVhKbk1pd2dZWEpuTXl3Z1lYSm5OQ3dnWVhKbk5Td2dZWEpuTmlrZ2UxeHVJQ0FnSUhaaGNpQnVZVzFsTENCbGVIQnlaWE56YVc5dUxDQmxabVpsWTNRc0lHWnBjbVZKYlcxbFpHbGhkR1ZzZVN3Z1pHVnNZWGtzSUhOamIzQmxPMXh1SUNBZ0lHbG1JQ2gwZVhCbGIyWWdZWEpuTVNBOVBUMGdYQ0p6ZEhKcGJtZGNJaWtnZTF4dUlDQWdJQ0FnSUNCdVlXMWxJRDBnWVhKbk1UdGNiaUFnSUNBZ0lDQWdaWGh3Y21WemMybHZiaUE5SUdGeVp6STdYRzRnSUNBZ0lDQWdJR1ZtWm1WamRDQTlJR0Z5WnpNN1hHNGdJQ0FnSUNBZ0lHWnBjbVZKYlcxbFpHbGhkR1ZzZVNBOUlHRnlaelE3WEc0Z0lDQWdJQ0FnSUdSbGJHRjVJRDBnWVhKbk5UdGNiaUFnSUNBZ0lDQWdjMk52Y0dVZ1BTQmhjbWMyTzF4dUlDQWdJSDFjYmlBZ0lDQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ2JtRnRaU0E5SUdGeVp6RXVibUZ0WlNCOGZDQmhjbWN5TG01aGJXVWdmSHdnS0Z3aVVtVmhZM1JwYjI1QVhDSWdLeUJuWlhST1pYaDBTV1FvS1NrN1hHNGdJQ0FnSUNBZ0lHVjRjSEpsYzNOcGIyNGdQU0JoY21jeE8xeHVJQ0FnSUNBZ0lDQmxabVpsWTNRZ1BTQmhjbWN5TzF4dUlDQWdJQ0FnSUNCbWFYSmxTVzF0WldScFlYUmxiSGtnUFNCaGNtY3pPMXh1SUNBZ0lDQWdJQ0JrWld4aGVTQTlJR0Z5WnpRN1hHNGdJQ0FnSUNBZ0lITmpiM0JsSUQwZ1lYSm5OVHRjYmlBZ0lDQjlYRzRnSUNBZ2FXWWdLR1pwY21WSmJXMWxaR2xoZEdWc2VTQTlQVDBnZG05cFpDQXdLVnh1SUNBZ0lDQWdJQ0JtYVhKbFNXMXRaV1JwWVhSbGJIa2dQU0JtWVd4elpUdGNiaUFnSUNCcFppQW9aR1ZzWVhrZ1BUMDlJSFp2YVdRZ01DbGNiaUFnSUNBZ0lDQWdaR1ZzWVhrZ1BTQXdPMXh1SUNBZ0lIWmhjaUJmWVNBOUlHZGxkRlpoYkhWbFRXOWtaVVp5YjIxV1lXeDFaU2hsZUhCeVpYTnphVzl1TENCV1lXeDFaVTF2WkdVdVVtVm1aWEpsYm1ObEtTd2dkbUZzZFdWTmIyUmxJRDBnWDJGYk1GMHNJSFZ1ZDNKaGNIQmxaRVY0Y0hKbGMzTnBiMjRnUFNCZllWc3hYVHRjYmlBZ0lDQjJZWElnWTI5dGNHRnlaVk4wY25WamRIVnlZV3dnUFNCMllXeDFaVTF2WkdVZ1BUMDlJRlpoYkhWbFRXOWtaUzVUZEhKMVkzUjFjbVU3WEc0Z0lDQWdhV1lnS0hOamIzQmxLU0I3WEc0Z0lDQWdJQ0FnSUhWdWQzSmhjSEJsWkVWNGNISmxjM05wYjI0Z1BTQjFibmR5WVhCd1pXUkZlSEJ5WlhOemFXOXVMbUpwYm1Rb2MyTnZjR1VwTzF4dUlDQWdJQ0FnSUNCbFptWmxZM1FnUFNCaFkzUnBiMjRvYm1GdFpTd2daV1ptWldOMExtSnBibVFvYzJOdmNHVXBLVHRjYmlBZ0lDQjlYRzRnSUNBZ2RtRnlJR1pwY25OMFZHbHRaU0E5SUhSeWRXVTdYRzRnSUNBZ2RtRnlJR2x6VTJOb1pXUjFiR1ZrSUQwZ1ptRnNjMlU3WEc0Z0lDQWdkbUZ5SUc1bGVIUldZV3gxWlNBOUlIVnVaR1ZtYVc1bFpEdGNiaUFnSUNCbWRXNWpkR2x2YmlCeVpXRmpkR2x2YmxKMWJtNWxjaWdwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLSEl1YVhORWFYTndiM05sWkNsY2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJqdGNiaUFnSUNBZ0lDQWdkbUZ5SUdOb1lXNW5aV1FnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnY2k1MGNtRmpheWhtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2RpQTlJSFZ1ZDNKaGNIQmxaRVY0Y0hKbGMzTnBiMjRvS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJR05vWVc1blpXUWdQU0IyWVd4MVpVUnBaRU5vWVc1blpTaGpiMjF3WVhKbFUzUnlkV04wZFhKaGJDd2dibVY0ZEZaaGJIVmxMQ0IyS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJRzVsZUhSV1lXeDFaU0E5SUhZN1hHNGdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdJQ0JwWmlBb1ptbHljM1JVYVcxbElDWW1JR1pwY21WSmJXMWxaR2xoZEdWc2VTbGNiaUFnSUNBZ0lDQWdJQ0FnSUdWbVptVmpkQ2h1WlhoMFZtRnNkV1VwTzF4dUlDQWdJQ0FnSUNCcFppQW9JV1pwY25OMFZHbHRaU0FtSmlCamFHRnVaMlZrSUQwOVBTQjBjblZsS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdaV1ptWldOMEtHNWxlSFJXWVd4MVpTazdYRzRnSUNBZ0lDQWdJR2xtSUNobWFYSnpkRlJwYldVcFhHNGdJQ0FnSUNBZ0lDQWdJQ0JtYVhKemRGUnBiV1VnUFNCbVlXeHpaVHRjYmlBZ0lDQjlYRzRnSUNBZ2RtRnlJSElnUFNCdVpYY2dVbVZoWTNScGIyNG9ibUZ0WlN3Z1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb1pHVnNZWGtnUENBeEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpXRmpkR2x2YmxKMWJtNWxjaWdwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lHVnNjMlVnYVdZZ0tDRnBjMU5qYUdWa2RXeGxaQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdhWE5UWTJobFpIVnNaV1FnUFNCMGNuVmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2MyVjBWR2x0Wlc5MWRDaG1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVhOVFkyaGxaSFZzWldRZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpXRmpkR2x2YmxKMWJtNWxjaWdwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmU3dnWkdWc1lYa3BPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdmU2s3WEc0Z0lDQWdjaTV6WTJobFpIVnNaU2dwTzF4dUlDQWdJSEpsZEhWeWJpQnlMbWRsZEVScGMzQnZjMlZ5S0NrN1hHNTlYRzVsZUhCdmNuUnpMbkpsWVdOMGFXOXVJRDBnY21WaFkzUnBiMjQ3WEc1MllYSWdZMjl0Y0hWMFpXUkVaV052Y21GMGIzSWdQU0JqY21WaGRHVkRiR0Z6YzFCeWIzQmxjblI1UkdWamIzSmhkRzl5S0daMWJtTjBhVzl1SUNoMFlYSm5aWFFzSUc1aGJXVXNJRjhzSUdSbFkyOXlZWFJ2Y2tGeVozTXNJRzl5YVdkcGJtRnNSR1Z6WTNKcGNIUnZjaWtnZTF4dUlDQWdJSFpoY2lCaVlYTmxWbUZzZFdVZ1BTQnZjbWxuYVc1aGJFUmxjMk55YVhCMGIzSXVaMlYwTzF4dUlDQWdJR2x1ZG1GeWFXRnVkQ2gwZVhCbGIyWWdZbUZ6WlZaaGJIVmxJRDA5UFNCY0ltWjFibU4wYVc5dVhDSXNJRndpUUdOdmJYQjFkR1ZrSUdOaGJpQnZibXg1SUdKbElIVnpaV1FnYjI0Z1oyVjBkR1Z5SUdaMWJtTjBhVzl1Y3l3Z2JHbHJaVG9nSjBCamIyMXdkWFJsWkNCblpYUWdiWGxRY205d2N5Z3BJSHNnY21WMGRYSnVJQzR1TGpzZ2ZTZGNJaWs3WEc0Z0lDQWdkbUZ5SUdOdmJYQmhjbVZUZEhKMVkzUjFjbUZzSUQwZ1ptRnNjMlU3WEc0Z0lDQWdhV1lnS0dSbFkyOXlZWFJ2Y2tGeVozTWdKaVlnWkdWamIzSmhkRzl5UVhKbmN5NXNaVzVuZEdnZ1BUMDlJREVnSmlZZ1pHVmpiM0poZEc5eVFYSm5jMXN3WFM1aGMxTjBjblZqZEhWeVpTQTlQVDBnZEhKMVpTbGNiaUFnSUNBZ0lDQWdZMjl0Y0dGeVpWTjBjblZqZEhWeVlXd2dQU0IwY25WbE8xeHVJQ0FnSUhaaGNpQmhaRzBnUFNCaGMwOWljMlZ5ZG1GaWJHVlBZbXBsWTNRb2RHRnlaMlYwTENCMWJtUmxabWx1WldRc0lGWmhiSFZsVFc5a1pTNVNaV04xY25OcGRtVXBPMXh1SUNBZ0lHUmxabWx1WlU5aWMyVnlkbUZpYkdWUWNtOXdaWEowZVNoaFpHMHNJRzVoYldVc0lHTnZiWEJoY21WVGRISjFZM1IxY21Gc0lEOGdZWE5UZEhKMVkzUjFjbVVvWW1GelpWWmhiSFZsS1NBNklHSmhjMlZXWVd4MVpTd2dabUZzYzJVcE8xeHVmU3dnWm5WdVkzUnBiMjRnS0c1aGJXVXBJSHRjYmlBZ0lDQnlaWFIxY200Z2RHaHBjeTRrYlc5aWVDNTJZV3gxWlhOYmJtRnRaVjB1WjJWMEtDazdYRzU5TENCMGFISnZkMmx1WjBOdmJYQjFkR1ZrVm1Gc2RXVlRaWFIwWlhJc0lHWmhiSE5sTENCMGNuVmxLVHRjYm1aMWJtTjBhVzl1SUdOdmJYQjFkR1ZrS0hSaGNtZGxkRTl5Ulhod2Npd2dhMlY1VDNKVFkyOXdaU3dnWW1GelpVUmxjMk55YVhCMGIzSXNJRzl3ZEdsdmJuTXBJSHRjYmlBZ0lDQnBaaUFvWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0E4SURNZ0ppWWdkSGx3Wlc5bUlIUmhjbWRsZEU5eVJYaHdjaUE5UFQwZ1hDSm1kVzVqZEdsdmJsd2lLVnh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdZMjl0Y0hWMFpXUkZlSEJ5S0hSaGNtZGxkRTl5Ulhod2Npd2dhMlY1VDNKVFkyOXdaU2s3WEc0Z0lDQWdhVzUyWVhKcFlXNTBLQ0ZpWVhObFJHVnpZM0pwY0hSdmNpQjhmQ0FoWW1GelpVUmxjMk55YVhCMGIzSXVjMlYwTENCY0lrQnZZbk5sY25aaFlteGxJSEJ5YjNCbGNuUnBaWE1nWTJGdWJtOTBJR2hoZG1VZ1lTQnpaWFIwWlhJNklGd2lJQ3NnYTJWNVQzSlRZMjl3WlNrN1hHNGdJQ0FnY21WMGRYSnVJR052YlhCMWRHVmtSR1ZqYjNKaGRHOXlMbUZ3Y0d4NUtHNTFiR3dzSUdGeVozVnRaVzUwY3lrN1hHNTlYRzVsZUhCdmNuUnpMbU52YlhCMWRHVmtJRDBnWTI5dGNIVjBaV1E3WEc1bWRXNWpkR2x2YmlCamIyMXdkWFJsWkVWNGNISW9aWGh3Y2l3Z2MyTnZjR1VwSUh0Y2JpQWdJQ0IyWVhJZ1gyRWdQU0JuWlhSV1lXeDFaVTF2WkdWR2NtOXRWbUZzZFdVb1pYaHdjaXdnVm1Gc2RXVk5iMlJsTGxKbFkzVnljMmwyWlNrc0lHMXZaR1VnUFNCZllWc3dYU3dnZG1Gc2RXVWdQU0JmWVZzeFhUdGNiaUFnSUNCeVpYUjFjbTRnYm1WM0lFTnZiWEIxZEdWa1ZtRnNkV1VvZG1Gc2RXVXNJSE5qYjNCbExDQnRiMlJsSUQwOVBTQldZV3gxWlUxdlpHVXVVM1J5ZFdOMGRYSmxMQ0IyWVd4MVpTNXVZVzFsS1R0Y2JuMWNibVoxYm1OMGFXOXVJSFJvY205M2FXNW5RMjl0Y0hWMFpXUldZV3gxWlZObGRIUmxjaWdwSUh0Y2JpQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9YQ0piUTI5dGNIVjBaV1JXWVd4MVpWMGdTWFFnYVhNZ2JtOTBJR0ZzYkc5M1pXUWdkRzhnWVhOemFXZHVJRzVsZHlCMllXeDFaWE1nZEc4Z1kyOXRjSFYwWldRZ2NISnZjR1Z5ZEdsbGN5NWNJaWs3WEc1OVhHNW1kVzVqZEdsdmJpQmpjbVZoZEdWVWNtRnVjMlp2Y20xbGNpaDBjbUZ1YzJadmNtMWxjaXdnYjI1RGJHVmhiblZ3S1NCN1hHNGdJQ0FnYVc1MllYSnBZVzUwS0hSNWNHVnZaaUIwY21GdWMyWnZjbTFsY2lBOVBUMGdYQ0ptZFc1amRHbHZibHdpSUNZbUlIUnlZVzV6Wm05eWJXVnlMbXhsYm1kMGFDQTlQVDBnTVN3Z1hDSmpjbVZoZEdWVWNtRnVjMlp2Y20xbGNpQmxlSEJsWTNSeklHRWdablZ1WTNScGIyNGdkR2hoZENCaFkyTmxjSFJ6SUc5dVpTQmhjbWQxYldWdWRGd2lLVHRjYmlBZ0lDQjJZWElnYjJKcVpXTjBRMkZqYUdVZ1BTQjdmVHRjYmlBZ0lDQjJZWElnY21WelpYUkpaQ0E5SUdkc2IySmhiRk4wWVhSbExuSmxjMlYwU1dRN1hHNGdJQ0FnZG1GeUlGUnlZVzV6Wm05eWJXVnlJRDBnS0daMWJtTjBhVzl1SUNoZmMzVndaWElwSUh0Y2JpQWdJQ0FnSUNBZ1gxOWxlSFJsYm1SektGUnlZVzV6Wm05eWJXVnlMQ0JmYzNWd1pYSXBPMXh1SUNBZ0lDQWdJQ0JtZFc1amRHbHZiaUJVY21GdWMyWnZjbTFsY2loemIzVnlZMlZKWkdWdWRHbG1hV1Z5TENCemIzVnlZMlZQWW1wbFkzUXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lGOXpkWEJsY2k1allXeHNLSFJvYVhNc0lHWjFibU4wYVc5dUlDZ3BJSHNnY21WMGRYSnVJSFJ5WVc1elptOXliV1Z5S0hOdmRYSmpaVTlpYW1WamRDazdJSDBzSUc1MWJHd3NJR1poYkhObExDQmNJbFJ5WVc1elptOXliV1Z5TFZ3aUlDc2dkSEpoYm5ObWIzSnRaWEl1Ym1GdFpTQXJJRndpTFZ3aUlDc2djMjkxY21ObFNXUmxiblJwWm1sbGNpazdYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk52ZFhKalpVbGtaVzUwYVdacFpYSWdQU0J6YjNWeVkyVkpaR1Z1ZEdsbWFXVnlPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6YjNWeVkyVlBZbXBsWTNRZ1BTQnpiM1Z5WTJWUFltcGxZM1E3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ1ZISmhibk5tYjNKdFpYSXVjSEp2ZEc5MGVYQmxMbTl1UW1WamIyMWxWVzV2WW5ObGNuWmxaQ0E5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnNZWE4wVm1Gc2RXVWdQU0IwYUdsekxuWmhiSFZsTzF4dUlDQWdJQ0FnSUNBZ0lDQWdYM04xY0dWeUxuQnliM1J2ZEhsd1pTNXZia0psWTI5dFpWVnViMkp6WlhKMlpXUXVZMkZzYkNoMGFHbHpLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHUmxiR1YwWlNCdlltcGxZM1JEWVdOb1pWdDBhR2x6TG5OdmRYSmpaVWxrWlc1MGFXWnBaWEpkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0c5dVEyeGxZVzUxY0NsY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmJrTnNaV0Z1ZFhBb2JHRnpkRlpoYkhWbExDQjBhR2x6TG5OdmRYSmpaVTlpYW1WamRDazdYRzRnSUNBZ0lDQWdJSDA3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJVY21GdWMyWnZjbTFsY2p0Y2JpQWdJQ0I5S0VOdmJYQjFkR1ZrVm1Gc2RXVXBLVHRjYmlBZ0lDQnlaWFIxY200Z1puVnVZM1JwYjI0Z0tHOWlhbVZqZENrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvY21WelpYUkpaQ0FoUFQwZ1oyeHZZbUZzVTNSaGRHVXVjbVZ6WlhSSlpDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2IySnFaV04wUTJGamFHVWdQU0I3ZlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsYzJWMFNXUWdQU0JuYkc5aVlXeFRkR0YwWlM1eVpYTmxkRWxrTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIWmhjaUJwWkdWdWRHbG1hV1Z5SUQwZ1oyVjBUV1Z0YjJsNllYUnBiMjVKWkNodlltcGxZM1FwTzF4dUlDQWdJQ0FnSUNCMllYSWdjbVZoWTNScGRtVlVjbUZ1YzJadmNtMWxjaUE5SUc5aWFtVmpkRU5oWTJobFcybGtaVzUwYVdacFpYSmRPMXh1SUNBZ0lDQWdJQ0JwWmlBb2NtVmhZM1JwZG1WVWNtRnVjMlp2Y20xbGNpbGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ5WldGamRHbDJaVlJ5WVc1elptOXliV1Z5TG1kbGRDZ3BPMXh1SUNBZ0lDQWdJQ0J5WldGamRHbDJaVlJ5WVc1elptOXliV1Z5SUQwZ2IySnFaV04wUTJGamFHVmJhV1JsYm5ScFptbGxjbDBnUFNCdVpYY2dWSEpoYm5ObWIzSnRaWElvYVdSbGJuUnBabWxsY2l3Z2IySnFaV04wS1R0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhKbFlXTjBhWFpsVkhKaGJuTm1iM0p0WlhJdVoyVjBLQ2s3WEc0Z0lDQWdmVHRjYm4xY2JtVjRjRzl5ZEhNdVkzSmxZWFJsVkhKaGJuTm1iM0p0WlhJZ1BTQmpjbVZoZEdWVWNtRnVjMlp2Y20xbGNqdGNibVoxYm1OMGFXOXVJR2RsZEUxbGJXOXBlbUYwYVc5dVNXUW9iMkpxWldOMEtTQjdYRzRnSUNBZ2FXWWdLRzlpYW1WamRDQTlQVDBnYm5Wc2JDQjhmQ0IwZVhCbGIyWWdiMkpxWldOMElDRTlQU0JjSW05aWFtVmpkRndpS1Z4dUlDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvWENKYmJXOWllRjBnZEhKaGJuTm1iM0p0SUdWNGNHVmpkR1ZrSUhOdmJXVWdhMmx1WkNCdlppQnZZbXBsWTNRc0lHZHZkRG9nWENJZ0t5QnZZbXBsWTNRcE8xeHVJQ0FnSUhaaGNpQjBhV1FnUFNCdlltcGxZM1F1SkhSeVlXNXpabTl5YlVsa08xeHVJQ0FnSUdsbUlDaDBhV1FnUFQwOUlIVnVaR1ZtYVc1bFpDa2dlMXh1SUNBZ0lDQWdJQ0IwYVdRZ1BTQm5aWFJPWlhoMFNXUW9LVHRjYmlBZ0lDQWdJQ0FnWVdSa1NHbGtaR1Z1VUhKdmNDaHZZbXBsWTNRc0lGd2lKSFJ5WVc1elptOXliVWxrWENJc0lIUnBaQ2s3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCMGFXUTdYRzU5WEc1bWRXNWpkR2x2YmlCbGVIQnlLR1Y0Y0hJc0lITmpiM0JsS1NCN1hHNGdJQ0FnYVdZZ0tDRnBjME52YlhCMWRHbHVaMFJsY21sMllYUnBiMjRvS1NsY2JpQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1M1lYSnVLRndpVzIxdlluZ3VaWGh3Y2wwZ0oyVjRjSEluSUhOb2IzVnNaQ0J2Ym14NUlHSmxJSFZ6WldRZ2FXNXphV1JsSUc5MGFHVnlJSEpsWVdOMGFYWmxJR1oxYm1OMGFXOXVjeTVjSWlrN1hHNGdJQ0FnY21WMGRYSnVJR052YlhCMWRHVmtLR1Y0Y0hJc0lITmpiM0JsS1M1blpYUW9LVHRjYm4xY2JtVjRjRzl5ZEhNdVpYaHdjaUE5SUdWNGNISTdYRzVtZFc1amRHbHZiaUJsZUhSbGJtUlBZbk5sY25aaFlteGxLSFJoY21kbGRDa2dlMXh1SUNBZ0lIWmhjaUJ3Y205d1pYSjBhV1Z6SUQwZ1cxMDdYRzRnSUNBZ1ptOXlJQ2gyWVhJZ1gya2dQU0F4T3lCZmFTQThJR0Z5WjNWdFpXNTBjeTVzWlc1bmRHZzdJRjlwS3lzcElIdGNiaUFnSUNBZ0lDQWdjSEp2Y0dWeWRHbGxjMXRmYVNBdElERmRJRDBnWVhKbmRXMWxiblJ6VzE5cFhUdGNiaUFnSUNCOVhHNGdJQ0FnYVc1MllYSnBZVzUwS0dGeVozVnRaVzUwY3k1c1pXNW5kR2dnUGowZ01pd2dYQ0psZUhSbGJtUlBZbk5sY25aaFlteGxJR1Y0Y0dWamRHVmtJRElnYjNJZ2JXOXlaU0JoY21kMWJXVnVkSE5jSWlrN1hHNGdJQ0FnYVc1MllYSnBZVzUwS0hSNWNHVnZaaUIwWVhKblpYUWdQVDA5SUZ3aWIySnFaV04wWENJc0lGd2laWGgwWlc1a1QySnpaWEoyWVdKc1pTQmxlSEJsWTNSeklHRnVJRzlpYW1WamRDQmhjeUJtYVhKemRDQmhjbWQxYldWdWRGd2lLVHRjYmlBZ0lDQnBiblpoY21saGJuUW9JU2gwWVhKblpYUWdhVzV6ZEdGdVkyVnZaaUJQWW5ObGNuWmhZbXhsVFdGd0tTd2dYQ0psZUhSbGJtUlBZbk5sY25aaFlteGxJSE5vYjNWc1pDQnViM1FnWW1VZ2RYTmxaQ0J2YmlCdFlYQnpMQ0IxYzJVZ2JXRndMbTFsY21kbElHbHVjM1JsWVdSY0lpazdYRzRnSUNBZ2NISnZjR1Z5ZEdsbGN5NW1iM0pGWVdOb0tHWjFibU4wYVc5dUlDaHdjbTl3VTJWMEtTQjdYRzRnSUNBZ0lDQWdJR2x1ZG1GeWFXRnVkQ2gwZVhCbGIyWWdjSEp2Y0ZObGRDQTlQVDBnWENKdlltcGxZM1JjSWl3Z1hDSmhiR3dnWVhKbmRXMWxiblJ6SUc5bUlHVjRkR1Z1WkU5aWMyVnlkbUZpYkdVZ2MyaHZkV3hrSUdKbElHOWlhbVZqZEhOY0lpazdYRzRnSUNBZ0lDQWdJR1Y0ZEdWdVpFOWljMlZ5ZG1GaWJHVklaV3h3WlhJb2RHRnlaMlYwTENCd2NtOXdVMlYwTENCV1lXeDFaVTF2WkdVdVVtVmpkWEp6YVhabExDQnVkV3hzS1R0Y2JpQWdJQ0I5S1R0Y2JpQWdJQ0J5WlhSMWNtNGdkR0Z5WjJWME8xeHVmVnh1Wlhod2IzSjBjeTVsZUhSbGJtUlBZbk5sY25aaFlteGxJRDBnWlhoMFpXNWtUMkp6WlhKMllXSnNaVHRjYm1aMWJtTjBhVzl1SUdWNGRHVnVaRTlpYzJWeWRtRmliR1ZJWld4d1pYSW9kR0Z5WjJWMExDQndjbTl3WlhKMGFXVnpMQ0J0YjJSbExDQnVZVzFsS1NCN1hHNGdJQ0FnZG1GeUlHRmtiU0E5SUdGelQySnpaWEoyWVdKc1pVOWlhbVZqZENoMFlYSm5aWFFzSUc1aGJXVXNJRzF2WkdVcE8xeHVJQ0FnSUdadmNpQW9kbUZ5SUd0bGVTQnBiaUJ3Y205d1pYSjBhV1Z6S1Z4dUlDQWdJQ0FnSUNCcFppQW9jSEp2Y0dWeWRHbGxjeTVvWVhOUGQyNVFjbTl3WlhKMGVTaHJaWGtwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHRnlaMlYwSUQwOVBTQndjbTl3WlhKMGFXVnpJQ1ltSUNGcGMxQnliM0JsY25SNVEyOXVabWxuZFhKaFlteGxLSFJoY21kbGRDd2dhMlY1S1NsY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIyNTBhVzUxWlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSE5sZEU5aWMyVnlkbUZpYkdWUFltcGxZM1JKYm5OMFlXNWpaVkJ5YjNCbGNuUjVLR0ZrYlN3Z2EyVjVMQ0J3Y205d1pYSjBhV1Z6VzJ0bGVWMHBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlIUmhjbWRsZER0Y2JuMWNibVoxYm1OMGFXOXVJR2RsZEVSbGNHVnVaR1Z1WTNsVWNtVmxLSFJvYVc1bkxDQndjbTl3WlhKMGVTa2dlMXh1SUNBZ0lISmxkSFZ5YmlCdWIyUmxWRzlFWlhCbGJtUmxibU41VkhKbFpTaG5aWFJCZEc5dEtIUm9hVzVuTENCd2NtOXdaWEowZVNrcE8xeHVmVnh1Wm5WdVkzUnBiMjRnYm05a1pWUnZSR1Z3Wlc1a1pXNWplVlJ5WldVb2JtOWtaU2tnZTF4dUlDQWdJSFpoY2lCeVpYTjFiSFFnUFNCN1hHNGdJQ0FnSUNBZ0lHNWhiV1U2SUc1dlpHVXVibUZ0WlZ4dUlDQWdJSDA3WEc0Z0lDQWdhV1lnS0c1dlpHVXViMkp6WlhKMmFXNW5JQ1ltSUc1dlpHVXViMkp6WlhKMmFXNW5MbXhsYm1kMGFDQStJREFwWEc0Z0lDQWdJQ0FnSUhKbGMzVnNkQzVrWlhCbGJtUmxibU5wWlhNZ1BTQjFibWx4ZFdVb2JtOWtaUzV2WW5ObGNuWnBibWNwTG0xaGNDaHViMlJsVkc5RVpYQmxibVJsYm1ONVZISmxaU2s3WEc0Z0lDQWdjbVYwZFhKdUlISmxjM1ZzZER0Y2JuMWNibVoxYm1OMGFXOXVJR2RsZEU5aWMyVnlkbVZ5VkhKbFpTaDBhR2x1Wnl3Z2NISnZjR1Z5ZEhrcElIdGNiaUFnSUNCeVpYUjFjbTRnYm05a1pWUnZUMkp6WlhKMlpYSlVjbVZsS0dkbGRFRjBiMjBvZEdocGJtY3NJSEJ5YjNCbGNuUjVLU2s3WEc1OVhHNW1kVzVqZEdsdmJpQnViMlJsVkc5UFluTmxjblpsY2xSeVpXVW9ibTlrWlNrZ2UxeHVJQ0FnSUhaaGNpQnlaWE4xYkhRZ1BTQjdYRzRnSUNBZ0lDQWdJRzVoYldVNklHNXZaR1V1Ym1GdFpWeHVJQ0FnSUgwN1hHNGdJQ0FnYVdZZ0tHNXZaR1V1YjJKelpYSjJaWEp6SUNZbUlHNXZaR1V1YjJKelpYSjJaWEp6TG14bGJtZDBhQ0ErSURBcFhHNGdJQ0FnSUNBZ0lISmxjM1ZzZEM1dlluTmxjblpsY25NZ1BTQnViMlJsTG05aWMyVnlkbVZ5Y3k1aGMwRnljbUY1S0NrdWJXRndLRzV2WkdWVWIwOWljMlZ5ZG1WeVZISmxaU2s3WEc0Z0lDQWdjbVYwZFhKdUlISmxjM1ZzZER0Y2JuMWNibVoxYm1OMGFXOXVJR2x1ZEdWeVkyVndkQ2gwYUdsdVp5d2djSEp2Y0U5eVNHRnVaR3hsY2l3Z2FHRnVaR3hsY2lrZ2UxeHVJQ0FnSUdsbUlDaDBlWEJsYjJZZ2FHRnVaR3hsY2lBOVBUMGdYQ0ptZFc1amRHbHZibHdpS1Z4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnYVc1MFpYSmpaWEIwVUhKdmNHVnlkSGtvZEdocGJtY3NJSEJ5YjNCUGNraGhibVJzWlhJc0lHaGhibVJzWlhJcE8xeHVJQ0FnSUdWc2MyVmNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHbHVkR1Z5WTJWd2RFbHVkR1Z5WTJWd2RHRmliR1VvZEdocGJtY3NJSEJ5YjNCUGNraGhibVJzWlhJcE8xeHVmVnh1Wlhod2IzSjBjeTVwYm5SbGNtTmxjSFFnUFNCcGJuUmxjbU5sY0hRN1hHNW1kVzVqZEdsdmJpQnBiblJsY21ObGNIUkpiblJsY21ObGNIUmhZbXhsS0hSb2FXNW5MQ0JvWVc1a2JHVnlLU0I3WEc0Z0lDQWdhV1lnS0dselVHeGhhVzVQWW1wbFkzUW9kR2hwYm1jcElDWW1JQ0ZwYzA5aWMyVnlkbUZpYkdWUFltcGxZM1FvZEdocGJtY3BLU0I3WEc0Z0lDQWdJQ0FnSUdSbGNISmxZMkYwWldRb1hDSlFZWE56YVc1bklIQnNZV2x1SUc5aWFtVmpkSE1nZEc4Z2FXNTBaWEpqWlhCMElDOGdiMkp6WlhKMlpTQnBjeUJrWlhCeVpXTmhkR1ZrSUdGdVpDQjNhV3hzSUdKbElISmxiVzkyWldRZ2FXNGdNeTR3WENJcE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1oyVjBRV1J0YVc1cGMzUnlZWFJwYjI0b2IySnpaWEoyWVdKc1pTaDBhR2x1WnlrcExtbHVkR1Z5WTJWd2RDaG9ZVzVrYkdWeUtUdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJR2RsZEVGa2JXbHVhWE4wY21GMGFXOXVLSFJvYVc1bktTNXBiblJsY21ObGNIUW9hR0Z1Wkd4bGNpazdYRzU5WEc1bWRXNWpkR2x2YmlCcGJuUmxjbU5sY0hSUWNtOXdaWEowZVNoMGFHbHVaeXdnY0hKdmNHVnlkSGtzSUdoaGJtUnNaWElwSUh0Y2JpQWdJQ0JwWmlBb2FYTlFiR0ZwYms5aWFtVmpkQ2gwYUdsdVp5a2dKaVlnSVdselQySnpaWEoyWVdKc1pVOWlhbVZqZENoMGFHbHVaeWtwSUh0Y2JpQWdJQ0FnSUNBZ1pHVndjbVZqWVhSbFpDaGNJbEJoYzNOcGJtY2djR3hoYVc0Z2IySnFaV04wY3lCMGJ5QnBiblJsY21ObGNIUWdMeUJ2WW5ObGNuWmxJR2x6SUdSbGNISmxZMkYwWldRZ1lXNWtJSGRwYkd3Z1ltVWdjbVZ0YjNabFpDQnBiaUF6TGpCY0lpazdYRzRnSUNBZ0lDQWdJR1Y0ZEdWdVpFOWljMlZ5ZG1GaWJHVW9kR2hwYm1jc0lIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhCeWIzQmxjblI1T2lCMGFHbHVaMXR3Y205d1pYSjBlVjFjYmlBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCcGJuUmxjbU5sY0hSUWNtOXdaWEowZVNoMGFHbHVaeXdnY0hKdmNHVnlkSGtzSUdoaGJtUnNaWElwTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z1oyVjBRV1J0YVc1cGMzUnlZWFJwYjI0b2RHaHBibWNzSUhCeWIzQmxjblI1S1M1cGJuUmxjbU5sY0hRb2FHRnVaR3hsY2lrN1hHNTlYRzVtZFc1amRHbHZiaUJwYzA5aWMyVnlkbUZpYkdVb2RtRnNkV1VzSUhCeWIzQmxjblI1S1NCN1hHNGdJQ0FnYVdZZ0tIWmhiSFZsSUQwOVBTQnVkV3hzSUh4OElIWmhiSFZsSUQwOVBTQjFibVJsWm1sdVpXUXBYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdJQ0JwWmlBb2NISnZjR1Z5ZEhrZ0lUMDlJSFZ1WkdWbWFXNWxaQ2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9kbUZzZFdVZ2FXNXpkR0Z1WTJWdlppQlBZbk5sY25aaFlteGxUV0Z3SUh4OElIWmhiSFZsSUdsdWMzUmhibU5sYjJZZ1QySnpaWEoyWVdKc1pVRnljbUY1S1Z4dUlDQWdJQ0FnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtGd2lXMjF2WW5ndWFYTlBZbk5sY25aaFlteGxYU0JwYzA5aWMyVnlkbUZpYkdVb2IySnFaV04wTENCd2NtOXdaWEowZVU1aGJXVXBJR2x6SUc1dmRDQnpkWEJ3YjNKMFpXUWdabTl5SUdGeWNtRjVjeUJoYm1RZ2JXRndjeTRnVlhObElHMWhjQzVvWVhNZ2IzSWdZWEp5WVhrdWJHVnVaM1JvSUdsdWMzUmxZV1F1WENJcE8xeHVJQ0FnSUNBZ0lDQmxiSE5sSUdsbUlDaHBjMDlpYzJWeWRtRmliR1ZQWW1wbFkzUW9kbUZzZFdVcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdieUE5SUhaaGJIVmxMaVJ0YjJKNE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJRzh1ZG1Gc2RXVnpJQ1ltSUNFaGJ5NTJZV3gxWlhOYmNISnZjR1Z5ZEhsZE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlDRWhkbUZzZFdVdUpHMXZZbmdnZkh3Z2RtRnNkV1VnYVc1emRHRnVZMlZ2WmlCQmRHOXRJSHg4SUhaaGJIVmxJR2x1YzNSaGJtTmxiMllnVW1WaFkzUnBiMjRnZkh3Z2RtRnNkV1VnYVc1emRHRnVZMlZ2WmlCRGIyMXdkWFJsWkZaaGJIVmxPMXh1ZlZ4dVpYaHdiM0owY3k1cGMwOWljMlZ5ZG1GaWJHVWdQU0JwYzA5aWMyVnlkbUZpYkdVN1hHNTJZWElnWkdWamIzSmhkRzl5U1cxd2JDQTlJR055WldGMFpVTnNZWE56VUhKdmNHVnlkSGxFWldOdmNtRjBiM0lvWm5WdVkzUnBiMjRnS0hSaGNtZGxkQ3dnYm1GdFpTd2dZbUZ6WlZaaGJIVmxLU0I3WEc0Z0lDQWdkbUZ5SUhCeVpYWkJJRDBnWVd4c2IzZFRkR0YwWlVOb1lXNW5aWE5UZEdGeWRDaDBjblZsS1R0Y2JpQWdJQ0JwWmlBb2RIbHdaVzltSUdKaGMyVldZV3gxWlNBOVBUMGdYQ0ptZFc1amRHbHZibHdpS1Z4dUlDQWdJQ0FnSUNCaVlYTmxWbUZzZFdVZ1BTQmhjMUpsWm1WeVpXNWpaU2hpWVhObFZtRnNkV1VwTzF4dUlDQWdJSFpoY2lCaFpHMGdQU0JoYzA5aWMyVnlkbUZpYkdWUFltcGxZM1FvZEdGeVoyVjBMQ0IxYm1SbFptbHVaV1FzSUZaaGJIVmxUVzlrWlM1U1pXTjFjbk5wZG1VcE8xeHVJQ0FnSUdSbFptbHVaVTlpYzJWeWRtRmliR1ZRY205d1pYSjBlU2hoWkcwc0lHNWhiV1VzSUdKaGMyVldZV3gxWlN3Z2RISjFaU2s3WEc0Z0lDQWdZV3hzYjNkVGRHRjBaVU5vWVc1blpYTkZibVFvY0hKbGRrRXBPMXh1ZlN3Z1puVnVZM1JwYjI0Z0tHNWhiV1VwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k0a2JXOWllQzUyWVd4MVpYTmJibUZ0WlYwdVoyVjBLQ2s3WEc1OUxDQm1kVzVqZEdsdmJpQW9ibUZ0WlN3Z2RtRnNkV1VwSUh0Y2JpQWdJQ0J6WlhSUWNtOXdaWEowZVZaaGJIVmxLSFJvYVhNc0lHNWhiV1VzSUhaaGJIVmxLVHRjYm4wc0lIUnlkV1VzSUdaaGJITmxLVHRjYm1aMWJtTjBhVzl1SUc5aWMyVnlkbUZpYkdWRVpXTnZjbUYwYjNJb2RHRnlaMlYwTENCclpYa3NJR0poYzJWRVpYTmpjbWx3ZEc5eUtTQjdYRzRnSUNBZ2FXNTJZWEpwWVc1MEtHRnlaM1Z0Wlc1MGN5NXNaVzVuZEdnZ1BqMGdNaUFtSmlCaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUR3OUlETXNJRndpU1d4c1pXZGhiQ0JrWldOdmNtRjBiM0lnWTI5dVptbG5YQ0lzSUd0bGVTazdYRzRnSUNBZ1lYTnpaWEowVUhKdmNHVnlkSGxEYjI1bWFXZDFjbUZpYkdVb2RHRnlaMlYwTENCclpYa3BPMXh1SUNBZ0lHbHVkbUZ5YVdGdWRDZ2hZbUZ6WlVSbGMyTnlhWEIwYjNJZ2ZId2dJV0poYzJWRVpYTmpjbWx3ZEc5eUxtZGxkQ3dnWENKQWIySnpaWEoyWVdKc1pTQmpZVzRnYm05MElHSmxJSFZ6WldRZ2IyNGdaMlYwZEdWeWN5d2dkWE5sSUVCamIyMXdkWFJsWkNCcGJuTjBaV0ZrWENJcE8xeHVJQ0FnSUhKbGRIVnliaUJrWldOdmNtRjBiM0pKYlhCc0xtRndjR3g1S0c1MWJHd3NJR0Z5WjNWdFpXNTBjeWs3WEc1OVhHNW1kVzVqZEdsdmJpQnZZbk5sY25aaFlteGxLSFlzSUd0bGVVOXlVMk52Y0dVcElIdGNiaUFnSUNCcFppQW9kaUE5UFQwZ2RtOXBaQ0F3S1NCN0lIWWdQU0IxYm1SbFptbHVaV1E3SUgxY2JpQWdJQ0JwWmlBb2RIbHdaVzltSUdGeVozVnRaVzUwYzFzeFhTQTlQVDBnWENKemRISnBibWRjSWlsY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUc5aWMyVnlkbUZpYkdWRVpXTnZjbUYwYjNJdVlYQndiSGtvYm5Wc2JDd2dZWEpuZFcxbGJuUnpLVHRjYmlBZ0lDQnBiblpoY21saGJuUW9ZWEpuZFcxbGJuUnpMbXhsYm1kMGFDQThJRE1zSUZ3aWIySnpaWEoyWVdKc1pTQmxlSEJsWTNSeklIcGxjbThzSUc5dVpTQnZjaUIwZDI4Z1lYSm5kVzFsYm5SelhDSXBPMXh1SUNBZ0lHbG1JQ2hwYzA5aWMyVnlkbUZpYkdVb2Rpa3BYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjJPMXh1SUNBZ0lIWmhjaUJmWVNBOUlHZGxkRlpoYkhWbFRXOWtaVVp5YjIxV1lXeDFaU2gyTENCV1lXeDFaVTF2WkdVdVVtVmpkWEp6YVhabEtTd2diVzlrWlNBOUlGOWhXekJkTENCMllXeDFaU0E5SUY5aFd6RmRPMXh1SUNBZ0lIWmhjaUJ6YjNWeVkyVlVlWEJsSUQwZ2JXOWtaU0E5UFQwZ1ZtRnNkV1ZOYjJSbExsSmxabVZ5Wlc1alpTQS9JRlpoYkhWbFZIbHdaUzVTWldabGNtVnVZMlVnT2lCblpYUlVlWEJsVDJaV1lXeDFaU2gyWVd4MVpTazdYRzRnSUNBZ2MzZHBkR05vSUNoemIzVnlZMlZVZVhCbEtTQjdYRzRnSUNBZ0lDQWdJR05oYzJVZ1ZtRnNkV1ZVZVhCbExrRnljbUY1T2x4dUlDQWdJQ0FnSUNCallYTmxJRlpoYkhWbFZIbHdaUzVRYkdGcGJrOWlhbVZqZERwY2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnRZV3RsUTJocGJHUlBZbk5sY25aaFlteGxLSFpoYkhWbExDQnRiMlJsS1R0Y2JpQWdJQ0FnSUNBZ1kyRnpaU0JXWVd4MVpWUjVjR1V1VW1WbVpYSmxibU5sT2x4dUlDQWdJQ0FnSUNCallYTmxJRlpoYkhWbFZIbHdaUzVEYjIxd2JHVjRUMkpxWldOME9seHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJRzVsZHlCUFluTmxjblpoWW14bFZtRnNkV1VvZG1Gc2RXVXNJRzF2WkdVcE8xeHVJQ0FnSUNBZ0lDQmpZWE5sSUZaaGJIVmxWSGx3WlM1RGIyMXdiR1Y0Um5WdVkzUnBiMjQ2WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb1hDSmJiVzlpZUM1dlluTmxjblpoWW14bFhTQlVieUJpWlNCaFlteGxJSFJ2SUcxaGEyVWdZU0JtZFc1amRHbHZiaUJ5WldGamRHbDJaU0JwZENCemFHOTFiR1FnYm05MElHaGhkbVVnWVhKbmRXMWxiblJ6TGlCSlppQjViM1VnYm1WbFpDQmhiaUJ2WW5ObGNuWmhZbXhsSUhKbFptVnlaVzVqWlNCMGJ5QmhJR1oxYm1OMGFXOXVMQ0IxYzJVZ1lHOWljMlZ5ZG1GaWJHVW9ZWE5TWldabGNtVnVZMlVvWmlrcFlGd2lLVHRjYmlBZ0lDQWdJQ0FnWTJGelpTQldZV3gxWlZSNWNHVXVWbWxsZDBaMWJtTjBhVzl1T2x4dUlDQWdJQ0FnSUNBZ0lDQWdaR1Z3Y21WallYUmxaQ2hjSWxWelpTQmdZMjl0Y0hWMFpXUW9aWGh3Y2lsZ0lHbHVjM1JsWVdRZ2IyWWdZRzlpYzJWeWRtRmliR1VvWlhod2NpbGdYQ0lwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHTnZiWEIxZEdWa0tIWXNJR3RsZVU5eVUyTnZjR1VwTzF4dUlDQWdJSDFjYmlBZ0lDQnBiblpoY21saGJuUW9abUZzYzJVc0lGd2lTV3hzWldkaGJDQlRkR0YwWlZ3aUtUdGNibjFjYm1WNGNHOXlkSE11YjJKelpYSjJZV0pzWlNBOUlHOWljMlZ5ZG1GaWJHVTdYRzUyWVhJZ1ZtRnNkV1ZVZVhCbE8xeHVLR1oxYm1OMGFXOXVJQ2hXWVd4MVpWUjVjR1VwSUh0Y2JpQWdJQ0JXWVd4MVpWUjVjR1ZiVm1Gc2RXVlVlWEJsVzF3aVVtVm1aWEpsYm1ObFhDSmRJRDBnTUYwZ1BTQmNJbEpsWm1WeVpXNWpaVndpTzF4dUlDQWdJRlpoYkhWbFZIbHdaVnRXWVd4MVpWUjVjR1ZiWENKUWJHRnBiazlpYW1WamRGd2lYU0E5SURGZElEMGdYQ0pRYkdGcGJrOWlhbVZqZEZ3aU8xeHVJQ0FnSUZaaGJIVmxWSGx3WlZ0V1lXeDFaVlI1Y0dWYlhDSkRiMjF3YkdWNFQySnFaV04wWENKZElEMGdNbDBnUFNCY0lrTnZiWEJzWlhoUFltcGxZM1JjSWp0Y2JpQWdJQ0JXWVd4MVpWUjVjR1ZiVm1Gc2RXVlVlWEJsVzF3aVFYSnlZWGxjSWwwZ1BTQXpYU0E5SUZ3aVFYSnlZWGxjSWp0Y2JpQWdJQ0JXWVd4MVpWUjVjR1ZiVm1Gc2RXVlVlWEJsVzF3aVZtbGxkMFoxYm1OMGFXOXVYQ0pkSUQwZ05GMGdQU0JjSWxacFpYZEdkVzVqZEdsdmJsd2lPMXh1SUNBZ0lGWmhiSFZsVkhsd1pWdFdZV3gxWlZSNWNHVmJYQ0pEYjIxd2JHVjRSblZ1WTNScGIyNWNJbDBnUFNBMVhTQTlJRndpUTI5dGNHeGxlRVoxYm1OMGFXOXVYQ0k3WEc1OUtTaFdZV3gxWlZSNWNHVWdmSHdnS0ZaaGJIVmxWSGx3WlNBOUlIdDlLU2s3WEc1bWRXNWpkR2x2YmlCblpYUlVlWEJsVDJaV1lXeDFaU2gyWVd4MVpTa2dlMXh1SUNBZ0lHbG1JQ2gyWVd4MVpTQTlQVDBnYm5Wc2JDQjhmQ0IyWVd4MVpTQTlQVDBnZFc1a1pXWnBibVZrS1Z4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnVm1Gc2RXVlVlWEJsTGxKbFptVnlaVzVqWlR0Y2JpQWdJQ0JwWmlBb2RIbHdaVzltSUhaaGJIVmxJRDA5UFNCY0ltWjFibU4wYVc5dVhDSXBYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjJZV3gxWlM1c1pXNW5kR2dnUHlCV1lXeDFaVlI1Y0dVdVEyOXRjR3hsZUVaMWJtTjBhVzl1SURvZ1ZtRnNkV1ZVZVhCbExsWnBaWGRHZFc1amRHbHZianRjYmlBZ0lDQnBaaUFvUVhKeVlYa3VhWE5CY25KaGVTaDJZV3gxWlNrZ2ZId2dkbUZzZFdVZ2FXNXpkR0Z1WTJWdlppQlBZbk5sY25aaFlteGxRWEp5WVhrcFhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCV1lXeDFaVlI1Y0dVdVFYSnlZWGs3WEc0Z0lDQWdhV1lnS0hSNWNHVnZaaUIyWVd4MVpTQTlQVDBnWENKdlltcGxZM1JjSWlsY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdselVHeGhhVzVQWW1wbFkzUW9kbUZzZFdVcElEOGdWbUZzZFdWVWVYQmxMbEJzWVdsdVQySnFaV04wSURvZ1ZtRnNkV1ZVZVhCbExrTnZiWEJzWlhoUFltcGxZM1E3WEc0Z0lDQWdjbVYwZFhKdUlGWmhiSFZsVkhsd1pTNVNaV1psY21WdVkyVTdYRzU5WEc1bWRXNWpkR2x2YmlCdlluTmxjblpsS0hSb2FXNW5MQ0J3Y205d1QzSkRZaXdnWTJKUGNrWnBjbVVzSUdacGNtVkpiVzFsWkdsaGRHVnNlU2tnZTF4dUlDQWdJR2xtSUNoMGVYQmxiMllnWTJKUGNrWnBjbVVnUFQwOUlGd2lablZ1WTNScGIyNWNJaWxjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRzlpYzJWeWRtVlBZbk5sY25aaFlteGxVSEp2Y0dWeWRIa29kR2hwYm1jc0lIQnliM0JQY2tOaUxDQmpZazl5Um1seVpTd2dabWx5WlVsdGJXVmthV0YwWld4NUtUdGNiaUFnSUNCbGJITmxYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnZZbk5sY25abFQySnpaWEoyWVdKc1pTaDBhR2x1Wnl3Z2NISnZjRTl5UTJJc0lHTmlUM0pHYVhKbEtUdGNibjFjYm1WNGNHOXlkSE11YjJKelpYSjJaU0E5SUc5aWMyVnlkbVU3WEc1bWRXNWpkR2x2YmlCdlluTmxjblpsVDJKelpYSjJZV0pzWlNoMGFHbHVaeXdnYkdsemRHVnVaWElzSUdacGNtVkpiVzFsWkdsaGRHVnNlU2tnZTF4dUlDQWdJR2xtSUNocGMxQnNZV2x1VDJKcVpXTjBLSFJvYVc1bktTQW1KaUFoYVhOUFluTmxjblpoWW14bFQySnFaV04wS0hSb2FXNW5LU2tnZTF4dUlDQWdJQ0FnSUNCa1pYQnlaV05oZEdWa0tGd2lVR0Z6YzJsdVp5QndiR0ZwYmlCdlltcGxZM1J6SUhSdklHbHVkR1Z5WTJWd2RDQXZJRzlpYzJWeWRtVWdhWE1nWkdWd2NtVmpZWFJsWkNCaGJtUWdkMmxzYkNCaVpTQnlaVzF2ZG1Wa0lHbHVJRE11TUZ3aUtUdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHZGxkRUZrYldsdWFYTjBjbUYwYVc5dUtHOWljMlZ5ZG1GaWJHVW9kR2hwYm1jcEtTNXZZbk5sY25abEtHeHBjM1JsYm1WeUxDQm1hWEpsU1cxdFpXUnBZWFJsYkhrcE8xeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdaMlYwUVdSdGFXNXBjM1J5WVhScGIyNG9kR2hwYm1jcExtOWljMlZ5ZG1Vb2JHbHpkR1Z1WlhJc0lHWnBjbVZKYlcxbFpHbGhkR1ZzZVNrN1hHNTlYRzVtZFc1amRHbHZiaUJ2WW5ObGNuWmxUMkp6WlhKMllXSnNaVkJ5YjNCbGNuUjVLSFJvYVc1bkxDQndjbTl3WlhKMGVTd2diR2x6ZEdWdVpYSXNJR1pwY21WSmJXMWxaR2xoZEdWc2VTa2dlMXh1SUNBZ0lHbG1JQ2hwYzFCc1lXbHVUMkpxWldOMEtIUm9hVzVuS1NBbUppQWhhWE5QWW5ObGNuWmhZbXhsVDJKcVpXTjBLSFJvYVc1bktTa2dlMXh1SUNBZ0lDQWdJQ0JrWlhCeVpXTmhkR1ZrS0Z3aVVHRnpjMmx1WnlCd2JHRnBiaUJ2WW1wbFkzUnpJSFJ2SUdsdWRHVnlZMlZ3ZENBdklHOWljMlZ5ZG1VZ2FYTWdaR1Z3Y21WallYUmxaQ0JoYm1RZ2QybHNiQ0JpWlNCeVpXMXZkbVZrSUdsdUlETXVNRndpS1R0Y2JpQWdJQ0FnSUNBZ1pYaDBaVzVrVDJKelpYSjJZV0pzWlNoMGFHbHVaeXdnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjSEp2Y0dWeWRIazZJSFJvYVc1blczQnliM0JsY25SNVhWeHVJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRzlpYzJWeWRtVlBZbk5sY25aaFlteGxVSEp2Y0dWeWRIa29kR2hwYm1jc0lIQnliM0JsY25SNUxDQnNhWE4wWlc1bGNpd2dabWx5WlVsdGJXVmthV0YwWld4NUtUdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJR2RsZEVGa2JXbHVhWE4wY21GMGFXOXVLSFJvYVc1bkxDQndjbTl3WlhKMGVTa3ViMkp6WlhKMlpTaHNhWE4wWlc1bGNpd2dabWx5WlVsdGJXVmthV0YwWld4NUtUdGNibjFjYm1aMWJtTjBhVzl1SUhSdlNsTW9jMjkxY21ObExDQmtaWFJsWTNSRGVXTnNaWE1zSUY5ZllXeHlaV0ZrZVZObFpXNHBJSHRjYmlBZ0lDQnBaaUFvWkdWMFpXTjBRM2xqYkdWeklEMDlQU0IyYjJsa0lEQXBJSHNnWkdWMFpXTjBRM2xqYkdWeklEMGdkSEoxWlRzZ2ZWeHVJQ0FnSUdsbUlDaGZYMkZzY21WaFpIbFRaV1Z1SUQwOVBTQjJiMmxrSURBcElIc2dYMTloYkhKbFlXUjVVMlZsYmlBOUlHNTFiR3c3SUgxY2JpQWdJQ0JtZFc1amRHbHZiaUJqWVdOb1pTaDJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvWkdWMFpXTjBRM2xqYkdWektWeHVJQ0FnSUNBZ0lDQWdJQ0FnWDE5aGJISmxZV1I1VTJWbGJpNXdkWE5vS0Z0emIzVnlZMlVzSUhaaGJIVmxYU2s3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIyWVd4MVpUdGNiaUFnSUNCOVhHNGdJQ0FnYVdZZ0tITnZkWEpqWlNCcGJuTjBZVzVqWlc5bUlFUmhkR1VnZkh3Z2MyOTFjbU5sSUdsdWMzUmhibU5sYjJZZ1VtVm5SWGh3S1Z4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnYzI5MWNtTmxPMXh1SUNBZ0lHbG1JQ2hrWlhSbFkzUkRlV05zWlhNZ0ppWWdYMTloYkhKbFlXUjVVMlZsYmlBOVBUMGdiblZzYkNsY2JpQWdJQ0FnSUNBZ1gxOWhiSEpsWVdSNVUyVmxiaUE5SUZ0ZE8xeHVJQ0FnSUdsbUlDaGtaWFJsWTNSRGVXTnNaWE1nSmlZZ2MyOTFjbU5sSUNFOVBTQnVkV3hzSUNZbUlIUjVjR1Z2WmlCemIzVnlZMlVnUFQwOUlGd2liMkpxWldOMFhDSXBJSHRjYmlBZ0lDQWdJQ0FnWm05eUlDaDJZWElnYVNBOUlEQXNJR3dnUFNCZlgyRnNjbVZoWkhsVFpXVnVMbXhsYm1kMGFEc2dhU0E4SUd3N0lHa3JLeWxjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hmWDJGc2NtVmhaSGxUWldWdVcybGRXekJkSUQwOVBTQnpiM1Z5WTJVcFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUY5ZllXeHlaV0ZrZVZObFpXNWJhVjFiTVYwN1hHNGdJQ0FnZlZ4dUlDQWdJR2xtSUNnaGMyOTFjbU5sS1Z4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnYzI5MWNtTmxPMXh1SUNBZ0lHbG1JQ2hCY25KaGVTNXBjMEZ5Y21GNUtITnZkWEpqWlNrZ2ZId2djMjkxY21ObElHbHVjM1JoYm1ObGIyWWdUMkp6WlhKMllXSnNaVUZ5Y21GNUtTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCeVpYTWdQU0JqWVdOb1pTaGJYU2s3WEc0Z0lDQWdJQ0FnSUhaaGNpQjBiMEZrWkNBOUlITnZkWEpqWlM1dFlYQW9ablZ1WTNScGIyNGdLSFpoYkhWbEtTQjdJSEpsZEhWeWJpQjBiMHBUS0haaGJIVmxMQ0JrWlhSbFkzUkRlV05zWlhNc0lGOWZZV3h5WldGa2VWTmxaVzRwT3lCOUtUdGNiaUFnSUNBZ0lDQWdjbVZ6TG14bGJtZDBhQ0E5SUhSdlFXUmtMbXhsYm1kMGFEdGNiaUFnSUNBZ0lDQWdabTl5SUNoMllYSWdhU0E5SURBc0lHd2dQU0IwYjBGa1pDNXNaVzVuZEdnN0lHa2dQQ0JzT3lCcEt5c3BYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYTmJhVjBnUFNCMGIwRmtaRnRwWFR0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhKbGN6dGNiaUFnSUNCOVhHNGdJQ0FnYVdZZ0tITnZkWEpqWlNCcGJuTjBZVzVqWlc5bUlFOWljMlZ5ZG1GaWJHVk5ZWEFwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJSEpsYzE4eElEMGdZMkZqYUdVb2UzMHBPMXh1SUNBZ0lDQWdJQ0J6YjNWeVkyVXVabTl5UldGamFDaG1kVzVqZEdsdmJpQW9kbUZzZFdVc0lHdGxlU2tnZXlCeVpYUjFjbTRnY21Welh6RmJhMlY1WFNBOUlIUnZTbE1vZG1Gc2RXVXNJR1JsZEdWamRFTjVZMnhsY3l3Z1gxOWhiSEpsWVdSNVUyVmxiaWs3SUgwcE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVnpYekU3WEc0Z0lDQWdmVnh1SUNBZ0lHbG1JQ2hwYzA5aWMyVnlkbUZpYkdVb2MyOTFjbU5sS1NBbUppQnpiM1Z5WTJVdUpHMXZZbmdnYVc1emRHRnVZMlZ2WmlCUFluTmxjblpoWW14bFZtRnNkV1VwWEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIwYjBwVEtITnZkWEpqWlNncExDQmtaWFJsWTNSRGVXTnNaWE1zSUY5ZllXeHlaV0ZrZVZObFpXNHBPMXh1SUNBZ0lHbG1JQ2h6YjNWeVkyVWdhVzV6ZEdGdVkyVnZaaUJQWW5ObGNuWmhZbXhsVm1Gc2RXVXBYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjBiMHBUS0hOdmRYSmpaUzVuWlhRb0tTd2daR1YwWldOMFEzbGpiR1Z6TENCZlgyRnNjbVZoWkhsVFpXVnVLVHRjYmlBZ0lDQnBaaUFvZEhsd1pXOW1JSE52ZFhKalpTQTlQVDBnWENKdlltcGxZM1JjSWlrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnY21WeklEMGdZMkZqYUdVb2UzMHBPMXh1SUNBZ0lDQWdJQ0JtYjNJZ0tIWmhjaUJyWlhrZ2FXNGdjMjkxY21ObEtWeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WelcydGxlVjBnUFNCMGIwcFRLSE52ZFhKalpWdHJaWGxkTENCa1pYUmxZM1JEZVdOc1pYTXNJRjlmWVd4eVpXRmtlVk5sWlc0cE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVnpPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnYzI5MWNtTmxPMXh1ZlZ4dVpYaHdiM0owY3k1MGIwcFRJRDBnZEc5S1V6dGNibVoxYm1OMGFXOXVJSFJ2U2xOUFRpaHpiM1Z5WTJVc0lHUmxkR1ZqZEVONVkyeGxjeXdnWDE5aGJISmxZV1I1VTJWbGJpa2dlMXh1SUNBZ0lHbG1JQ2hrWlhSbFkzUkRlV05zWlhNZ1BUMDlJSFp2YVdRZ01Da2dleUJrWlhSbFkzUkRlV05zWlhNZ1BTQjBjblZsT3lCOVhHNGdJQ0FnYVdZZ0tGOWZZV3h5WldGa2VWTmxaVzRnUFQwOUlIWnZhV1FnTUNrZ2V5QmZYMkZzY21WaFpIbFRaV1Z1SUQwZ2JuVnNiRHNnZlZ4dUlDQWdJR1JsY0hKbFkyRjBaV1FvWENKMGIwcFRUMDRnYVhNZ1pHVndjbVZqWVhSbFpDNGdWWE5sSUhSdlNsTWdhVzV6ZEdWaFpGd2lLVHRjYmlBZ0lDQnlaWFIxY200Z2RHOUtVeTVoY0hCc2VTaHVkV3hzTENCaGNtZDFiV1Z1ZEhNcE8xeHVmVnh1Wlhod2IzSjBjeTUwYjBwVFQwNGdQU0IwYjBwVFQwNDdYRzVtZFc1amRHbHZiaUJzYjJjb2JYTm5LU0I3WEc0Z0lDQWdZMjl1YzI5c1pTNXNiMmNvYlhObktUdGNiaUFnSUNCeVpYUjFjbTRnYlhObk8xeHVmVnh1Wm5WdVkzUnBiMjRnZDJoNVVuVnVLSFJvYVc1bkxDQndjbTl3S1NCN1hHNGdJQ0FnYzNkcGRHTm9JQ2hoY21kMWJXVnVkSE11YkdWdVozUm9LU0I3WEc0Z0lDQWdJQ0FnSUdOaGMyVWdNRHBjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hVzVuSUQwZ1oyeHZZbUZzVTNSaGRHVXVaR1Z5YVhaaGRHbHZibE4wWVdOclcyZHNiMkpoYkZOMFlYUmxMbVJsY21sMllYUnBiMjVUZEdGamF5NXNaVzVuZEdnZ0xTQXhYVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doZEdocGJtY3BYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHeHZaeWhjSW5kb2VWSjFiaWdwSUdOaGJpQnZibXg1SUdKbElIVnpaV1FnYVdZZ1lTQmtaWEpwZG1GMGFXOXVJR2x6SUdGamRHbDJaU3dnYjNJZ1lua2djR0Z6YzJsdVp5QmhiaUJqYjIxd2RYUmxaQ0IyWVd4MVpTQXZJSEpsWVdOMGFXOXVJR1Y0Y0d4cFkybDBiSGt1SUVsbUlIbHZkU0JwYm5admEyVmtJSGRvZVZKMWJpQm1jbTl0SUdsdWMybGtaU0JoSUdOdmJYQjFkR0YwYVc5dU95QjBhR1VnWTI5dGNIVjBZWFJwYjI0Z2FYTWdZM1Z5Y21WdWRHeDVJSE4xYzNCbGJtUmxaQ0JpZFhRZ2NtVXRaWFpoYkhWaGRHbHVaeUJpWldOaGRYTmxJSE52YldWaWIyUjVJSEpsY1hWbGMzUmxaQ0JwZENkeklIWmhiSFZsTGx3aUtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUdKeVpXRnJPMXh1SUNBZ0lDQWdJQ0JqWVhObElESTZYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHVaeUE5SUdkbGRFRjBiMjBvZEdocGJtY3NJSEJ5YjNBcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnWW5KbFlXczdYRzRnSUNBZ2ZWeHVJQ0FnSUhSb2FXNW5JRDBnWjJWMFFYUnZiU2gwYUdsdVp5azdYRzRnSUNBZ2FXWWdLSFJvYVc1bklHbHVjM1JoYm1ObGIyWWdRMjl0Y0hWMFpXUldZV3gxWlNsY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUd4dlp5aDBhR2x1Wnk1M2FIbFNkVzRvS1NrN1hHNGdJQ0FnWld4elpTQnBaaUFvZEdocGJtY2dhVzV6ZEdGdVkyVnZaaUJTWldGamRHbHZiaWxjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR3h2WnloMGFHbHVaeTUzYUhsU2RXNG9LU2s3WEc0Z0lDQWdaV3h6WlZ4dUlDQWdJQ0FnSUNCcGJuWmhjbWxoYm5Rb1ptRnNjMlVzSUZ3aWQyaDVVblZ1SUdOaGJpQnZibXg1SUdKbElIVnpaV1FnYjI0Z2NtVmhZM1JwYjI1eklHRnVaQ0JqYjIxd2RYUmxaQ0IyWVd4MVpYTmNJaWs3WEc1OVhHNWxlSEJ2Y25SekxuZG9lVkoxYmlBOUlIZG9lVkoxYmp0Y2JuWmhjaUJoWTNScGIyNUdhV1ZzWkVSbFkyOXlZWFJ2Y2lBOUlHTnlaV0YwWlVOc1lYTnpVSEp2Y0dWeWRIbEVaV052Y21GMGIzSW9ablZ1WTNScGIyNGdLSFJoY21kbGRDd2dhMlY1TENCMllXeDFaU3dnWVhKbmN5d2diM0pwWjJsdVlXeEVaWE5qY21sd2RHOXlLU0I3WEc0Z0lDQWdkbUZ5SUdGamRHbHZiazVoYldVZ1BTQW9ZWEpuY3lBbUppQmhjbWR6TG14bGJtZDBhQ0E5UFQwZ01Ta2dQeUJoY21keld6QmRJRG9nS0haaGJIVmxMbTVoYldVZ2ZId2dhMlY1SUh4OElGd2lQSFZ1Ym1GdFpXUWdZV04wYVc5dVBsd2lLVHRjYmlBZ0lDQjJZWElnZDNKaGNIQmxaRUZqZEdsdmJpQTlJR0ZqZEdsdmJpaGhZM1JwYjI1T1lXMWxMQ0IyWVd4MVpTazdYRzRnSUNBZ1lXUmtTR2xrWkdWdVVISnZjQ2gwWVhKblpYUXNJR3RsZVN3Z2QzSmhjSEJsWkVGamRHbHZiaWs3WEc1OUxDQm1kVzVqZEdsdmJpQW9hMlY1S1NCN1hHNGdJQ0FnY21WMGRYSnVJSFJvYVhOYmEyVjVYVHRjYm4wc0lHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQnBiblpoY21saGJuUW9abUZzYzJVc0lGd2lTWFFnYVhNZ2JtOTBJR0ZzYkc5M1pXUWdkRzhnWVhOemFXZHVJRzVsZHlCMllXeDFaWE1nZEc4Z1FHRmpkR2x2YmlCbWFXVnNaSE5jSWlrN1hHNTlMQ0JtWVd4elpTd2dkSEoxWlNrN1hHNW1kVzVqZEdsdmJpQmhZM1JwYjI0b1lYSm5NU3dnWVhKbk1pd2dZWEpuTXl3Z1lYSm5OQ2tnZTF4dUlDQWdJR2xtSUNoaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUQwOVBTQXhJQ1ltSUhSNWNHVnZaaUJoY21jeElEMDlQU0JjSW1aMWJtTjBhVzl1WENJcFhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCaFkzUnBiMjVKYlhCc1pXMWxiblJoZEdsdmJpaGhjbWN4TG01aGJXVWdmSHdnWENJOGRXNXVZVzFsWkNCaFkzUnBiMjQrWENJc0lHRnlaekVwTzF4dUlDQWdJR2xtSUNoaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUQwOVBTQXlJQ1ltSUhSNWNHVnZaaUJoY21jeUlEMDlQU0JjSW1aMWJtTjBhVzl1WENJcFhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCaFkzUnBiMjVKYlhCc1pXMWxiblJoZEdsdmJpaGhjbWN4TENCaGNtY3lLVHRjYmlBZ0lDQnBaaUFvWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0E5UFQwZ01TQW1KaUIwZVhCbGIyWWdZWEpuTVNBOVBUMGdYQ0p6ZEhKcGJtZGNJaWxjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRzVoYldWa1FXTjBhVzl1UkdWamIzSmhkRzl5S0dGeVp6RXBPMXh1SUNBZ0lISmxkSFZ5YmlCdVlXMWxaRUZqZEdsdmJrUmxZMjl5WVhSdmNpaGhjbWN5S1M1aGNIQnNlU2h1ZFd4c0xDQmhjbWQxYldWdWRITXBPMXh1ZlZ4dVpYaHdiM0owY3k1aFkzUnBiMjRnUFNCaFkzUnBiMjQ3WEc1bWRXNWpkR2x2YmlCdVlXMWxaRUZqZEdsdmJrUmxZMjl5WVhSdmNpaHVZVzFsS1NCN1hHNGdJQ0FnY21WMGRYSnVJR1oxYm1OMGFXOXVJQ2gwWVhKblpYUXNJSEJ5YjNBc0lHUmxjMk55YVhCMGIzSXBJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHUmxjMk55YVhCMGIzSWdKaVlnZEhsd1pXOW1JR1JsYzJOeWFYQjBiM0l1ZG1Gc2RXVWdQVDA5SUZ3aVpuVnVZM1JwYjI1Y0lpa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1pHVnpZM0pwY0hSdmNpNTJZV3gxWlNBOUlHRmpkR2x2YmtsdGNHeGxiV1Z1ZEdGMGFXOXVLRzVoYldVc0lHUmxjMk55YVhCMGIzSXVkbUZzZFdVcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnWkdWelkzSnBjSFJ2Y2k1bGJuVnRaWEpoWW14bElEMGdabUZzYzJVN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdaR1Z6WTNKcGNIUnZjanRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWVdOMGFXOXVSbWxsYkdSRVpXTnZjbUYwYjNJb2JtRnRaU2t1WVhCd2JIa29kR2hwY3l3Z1lYSm5kVzFsYm5SektUdGNiaUFnSUNCOU8xeHVmVnh1Wm5WdVkzUnBiMjRnYVhOQlkzUnBiMjRvZEdocGJtY3BJSHRjYmlBZ0lDQnlaWFIxY200Z2RIbHdaVzltSUhSb2FXNW5JRDA5UFNCY0ltWjFibU4wYVc5dVhDSWdKaVlnZEdocGJtY3VhWE5OYjJKNFFXTjBhVzl1SUQwOVBTQjBjblZsTzF4dWZWeHVaWGh3YjNKMGN5NXBjMEZqZEdsdmJpQTlJR2x6UVdOMGFXOXVPMXh1Wm5WdVkzUnBiMjRnY25WdVNXNUJZM1JwYjI0b1lYSm5NU3dnWVhKbk1pd2dZWEpuTXlrZ2UxeHVJQ0FnSUhaaGNpQmhZM1JwYjI1T1lXMWxJRDBnZEhsd1pXOW1JR0Z5WnpFZ1BUMDlJRndpYzNSeWFXNW5YQ0lnUHlCaGNtY3hJRG9nWVhKbk1TNXVZVzFsSUh4OElGd2lQSFZ1Ym1GdFpXUWdZV04wYVc5dVBsd2lPMXh1SUNBZ0lIWmhjaUJtYmlBOUlIUjVjR1Z2WmlCaGNtY3hJRDA5UFNCY0ltWjFibU4wYVc5dVhDSWdQeUJoY21jeElEb2dZWEpuTWp0Y2JpQWdJQ0IyWVhJZ2MyTnZjR1VnUFNCMGVYQmxiMllnWVhKbk1TQTlQVDBnWENKbWRXNWpkR2x2Ymx3aUlEOGdZWEpuTWlBNklHRnlaek03WEc0Z0lDQWdhVzUyWVhKcFlXNTBLSFI1Y0dWdlppQm1iaUE5UFQwZ1hDSm1kVzVqZEdsdmJsd2lMQ0JjSW1CeWRXNUpia0ZqZEdsdmJtQWdaWGh3WldOMGN5QmhJR1oxYm1OMGFXOXVYQ0lwTzF4dUlDQWdJR2x1ZG1GeWFXRnVkQ2htYmk1c1pXNW5kR2dnUFQwOUlEQXNJRndpWUhKMWJrbHVRV04wYVc5dVlDQmxlSEJsWTNSeklHRWdablZ1WTNScGIyNGdkMmwwYUc5MWRDQmhjbWQxYldWdWRITmNJaWs3WEc0Z0lDQWdhVzUyWVhKcFlXNTBLSFI1Y0dWdlppQmhZM1JwYjI1T1lXMWxJRDA5UFNCY0luTjBjbWx1WjF3aUlDWW1JR0ZqZEdsdmJrNWhiV1V1YkdWdVozUm9JRDRnTUN3Z1hDSmhZM1JwYjI1eklITm9iM1ZzWkNCb1lYWmxJSFpoYkdsa0lHNWhiV1Z6TENCbmIzUTZJQ2RjSWlBcklHRmpkR2x2Yms1aGJXVWdLeUJjSWlkY0lpazdYRzRnSUNBZ2NtVjBkWEp1SUdWNFpXTjFkR1ZYY21Gd2NHVmtLR0ZqZEdsdmJrNWhiV1VzSUdadUxDQnpZMjl3WlN3Z2RXNWtaV1pwYm1Wa0tUdGNibjFjYm1WNGNHOXlkSE11Y25WdVNXNUJZM1JwYjI0Z1BTQnlkVzVKYmtGamRHbHZianRjYm1aMWJtTjBhVzl1SUdGamRHbHZia2x0Y0d4bGJXVnVkR0YwYVc5dUtHRmpkR2x2Yms1aGJXVXNJR1p1S1NCN1hHNGdJQ0FnYVc1MllYSnBZVzUwS0hSNWNHVnZaaUJtYmlBOVBUMGdYQ0ptZFc1amRHbHZibHdpTENCY0ltQmhZM1JwYjI1Z0lHTmhiaUJ2Ym14NUlHSmxJR2x1ZG05clpXUWdiMjRnWm5WdVkzUnBiMjV6WENJcE8xeHVJQ0FnSUdsdWRtRnlhV0Z1ZENoMGVYQmxiMllnWVdOMGFXOXVUbUZ0WlNBOVBUMGdYQ0p6ZEhKcGJtZGNJaUFtSmlCaFkzUnBiMjVPWVcxbExteGxibWQwYUNBK0lEQXNJRndpWVdOMGFXOXVjeUJ6YUc5MWJHUWdhR0YyWlNCMllXeHBaQ0J1WVcxbGN5d2daMjkwT2lBblhDSWdLeUJoWTNScGIyNU9ZVzFsSUNzZ1hDSW5YQ0lwTzF4dUlDQWdJSFpoY2lCeVpYTWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCbGVHVmpkWFJsVjNKaGNIQmxaQ2hoWTNScGIyNU9ZVzFsTENCbWJpd2dkR2hwY3l3Z1lYSm5kVzFsYm5SektUdGNiaUFnSUNCOU8xeHVJQ0FnSUhKbGN5NXBjMDF2WW5oQlkzUnBiMjRnUFNCMGNuVmxPMXh1SUNBZ0lISmxkSFZ5YmlCeVpYTTdYRzU5WEc1bWRXNWpkR2x2YmlCbGVHVmpkWFJsVjNKaGNIQmxaQ2hoWTNScGIyNU9ZVzFsTENCbWJpd2djMk52Y0dVc0lHRnlaM01wSUh0Y2JpQWdJQ0IyWVhJZ1pITWdQU0JuYkc5aVlXeFRkR0YwWlM1a1pYSnBkbUYwYVc5dVUzUmhZMnM3WEc0Z0lDQWdhVzUyWVhKcFlXNTBLQ0VvWkhOYlpITXViR1Z1WjNSb0lDMGdNVjBnYVc1emRHRnVZMlZ2WmlCRGIyMXdkWFJsWkZaaGJIVmxLU3dnWENKRGIyMXdkWFJsWkNCMllXeDFaWE1nYjNJZ2RISmhibk5tYjNKdFpYSnpJSE5vYjNWc1pDQnViM1FnYVc1MmIydGxJR0ZqZEdsdmJuTWdiM0lnZEhKcFoyZGxjaUJ2ZEdobGNpQnphV1JsSUdWbVptVmpkSE5jSWlrN1hHNGdJQ0FnZG1GeUlHNXZkR2xtZVZOd2VTQTlJR2x6VTNCNVJXNWhZbXhsWkNncE8xeHVJQ0FnSUhaaGNpQnpkR0Z5ZEZScGJXVTdYRzRnSUNBZ2FXWWdLRzV2ZEdsbWVWTndlU2tnZTF4dUlDQWdJQ0FnSUNCemRHRnlkRlJwYldVZ1BTQkVZWFJsTG01dmR5Z3BPMXh1SUNBZ0lDQWdJQ0IyWVhJZ2JDQTlJQ2hoY21keklDWW1JR0Z5WjNNdWJHVnVaM1JvS1NCOGZDQXdPMXh1SUNBZ0lDQWdJQ0IyWVhJZ1pteGhkSFJsYm1SQmNtZHpJRDBnYm1WM0lFRnljbUY1S0d3cE8xeHVJQ0FnSUNBZ0lDQnBaaUFvYkNBK0lEQXBYRzRnSUNBZ0lDQWdJQ0FnSUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnYVNBOElHdzdJR2tyS3lsY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbWJHRjBkR1Z1WkVGeVozTmJhVjBnUFNCaGNtZHpXMmxkTzF4dUlDQWdJQ0FnSUNCemNIbFNaWEJ2Y25SVGRHRnlkQ2g3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBlWEJsT2lCY0ltRmpkR2x2Ymx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpUb2dZV04wYVc5dVRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHWnVPaUJtYml4Y2JpQWdJQ0FnSUNBZ0lDQWdJSFJoY21kbGREb2djMk52Y0dVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0JoY21kMWJXVnVkSE02SUdac1lYUjBaVzVrUVhKbmMxeHVJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQjlYRzRnSUNBZ2RtRnlJSEJ5WlhaVmJuUnlZV05yWldRZ1BTQjFiblJ5WVdOclpXUlRkR0Z5ZENncE8xeHVJQ0FnSUhSeVlXNXpZV04wYVc5dVUzUmhjblFvWVdOMGFXOXVUbUZ0WlN3Z2MyTnZjR1VzSUdaaGJITmxLVHRjYmlBZ0lDQjJZWElnY0hKbGRrRnNiRzkzVTNSaGRHVkRhR0Z1WjJWeklEMGdZV3hzYjNkVGRHRjBaVU5vWVc1blpYTlRkR0Z5ZENoMGNuVmxLVHRjYmlBZ0lDQjBjbmtnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWm00dVlYQndiSGtvYzJOdmNHVXNJR0Z5WjNNcE8xeHVJQ0FnSUgxY2JpQWdJQ0JtYVc1aGJHeDVJSHRjYmlBZ0lDQWdJQ0FnWVd4c2IzZFRkR0YwWlVOb1lXNW5aWE5GYm1Rb2NISmxka0ZzYkc5M1UzUmhkR1ZEYUdGdVoyVnpLVHRjYmlBZ0lDQWdJQ0FnZEhKaGJuTmhZM1JwYjI1RmJtUW9abUZzYzJVcE8xeHVJQ0FnSUNBZ0lDQjFiblJ5WVdOclpXUkZibVFvY0hKbGRsVnVkSEpoWTJ0bFpDazdYRzRnSUNBZ0lDQWdJR2xtSUNodWIzUnBabmxUY0hrcFhHNGdJQ0FnSUNBZ0lDQWdJQ0J6Y0hsU1pYQnZjblJGYm1Rb2V5QjBhVzFsT2lCRVlYUmxMbTV2ZHlncElDMGdjM1JoY25SVWFXMWxJSDBwTzF4dUlDQWdJSDFjYm4xY2JtWjFibU4wYVc5dUlIVnpaVk4wY21samRDaHpkSEpwWTNRcElIdGNiaUFnSUNCcGJuWmhjbWxoYm5Rb1oyeHZZbUZzVTNSaGRHVXVaR1Z5YVhaaGRHbHZibE4wWVdOckxteGxibWQwYUNBOVBUMGdNQ3dnWENKSmRDQnBjeUJ1YjNRZ1lXeHNiM2RsWkNCMGJ5QnpaWFFnWUhWelpWTjBjbWxqZEdBZ2QyaGxiaUJoSUdSbGNtbDJZWFJwYjI0Z2FYTWdjblZ1Ym1sdVoxd2lLVHRjYmlBZ0lDQm5iRzlpWVd4VGRHRjBaUzV6ZEhKcFkzUk5iMlJsSUQwZ2MzUnlhV04wTzF4dUlDQWdJR2RzYjJKaGJGTjBZWFJsTG1Gc2JHOTNVM1JoZEdWRGFHRnVaMlZ6SUQwZ0lYTjBjbWxqZER0Y2JuMWNibVY0Y0c5eWRITXVkWE5sVTNSeWFXTjBJRDBnZFhObFUzUnlhV04wTzF4dVpuVnVZM1JwYjI0Z1lXeHNiM2RUZEdGMFpVTm9ZVzVuWlhNb1lXeHNiM2RUZEdGMFpVTm9ZVzVuWlhNc0lHWjFibU1wSUh0Y2JpQWdJQ0IyWVhJZ2NISmxkaUE5SUdGc2JHOTNVM1JoZEdWRGFHRnVaMlZ6VTNSaGNuUW9ZV3hzYjNkVGRHRjBaVU5vWVc1blpYTXBPMXh1SUNBZ0lIWmhjaUJ5WlhNZ1BTQm1kVzVqS0NrN1hHNGdJQ0FnWVd4c2IzZFRkR0YwWlVOb1lXNW5aWE5GYm1Rb2NISmxkaWs3WEc0Z0lDQWdjbVYwZFhKdUlISmxjenRjYm4xY2JtWjFibU4wYVc5dUlHRnNiRzkzVTNSaGRHVkRhR0Z1WjJWelUzUmhjblFvWVd4c2IzZFRkR0YwWlVOb1lXNW5aWE1wSUh0Y2JpQWdJQ0IyWVhJZ2NISmxkaUE5SUdkc2IySmhiRk4wWVhSbExtRnNiRzkzVTNSaGRHVkRhR0Z1WjJWek8xeHVJQ0FnSUdkc2IySmhiRk4wWVhSbExtRnNiRzkzVTNSaGRHVkRhR0Z1WjJWeklEMGdZV3hzYjNkVGRHRjBaVU5vWVc1blpYTTdYRzRnSUNBZ2NtVjBkWEp1SUhCeVpYWTdYRzU5WEc1bWRXNWpkR2x2YmlCaGJHeHZkMU4wWVhSbFEyaGhibWRsYzBWdVpDaHdjbVYyS1NCN1hHNGdJQ0FnWjJ4dlltRnNVM1JoZEdVdVlXeHNiM2RUZEdGMFpVTm9ZVzVuWlhNZ1BTQndjbVYyTzF4dWZWeHVablZ1WTNScGIyNGdjSEp2Y0dGbllYUmxRWFJ2YlZKbFlXUjVLR0YwYjIwcElIdGNiaUFnSUNCcGJuWmhjbWxoYm5Rb1lYUnZiUzVwYzBScGNuUjVMQ0JjSW1GMGIyMGdibTkwSUdScGNuUjVYQ0lwTzF4dUlDQWdJR0YwYjIwdWFYTkVhWEowZVNBOUlHWmhiSE5sTzF4dUlDQWdJSEJ5YjNCaFoyRjBaVkpsWVdScGJtVnpjeWhoZEc5dExDQjBjblZsS1R0Y2JuMWNiblpoY2lCQmRHOXRJRDBnS0daMWJtTjBhVzl1SUNncElIdGNiaUFnSUNCbWRXNWpkR2x2YmlCQmRHOXRLRzVoYldVc0lHOXVRbVZqYjIxbFQySnpaWEoyWldRc0lHOXVRbVZqYjIxbFZXNXZZbk5sY25abFpDa2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb2JtRnRaU0E5UFQwZ2RtOXBaQ0F3S1NCN0lHNWhiV1VnUFNCY0lrRjBiMjFBWENJZ0t5Qm5aWFJPWlhoMFNXUW9LVHNnZlZ4dUlDQWdJQ0FnSUNCcFppQW9iMjVDWldOdmJXVlBZbk5sY25abFpDQTlQVDBnZG05cFpDQXdLU0I3SUc5dVFtVmpiMjFsVDJKelpYSjJaV1FnUFNCdWIyOXdPeUI5WEc0Z0lDQWdJQ0FnSUdsbUlDaHZia0psWTI5dFpWVnViMkp6WlhKMlpXUWdQVDA5SUhadmFXUWdNQ2tnZXlCdmJrSmxZMjl0WlZWdWIySnpaWEoyWldRZ1BTQnViMjl3T3lCOVhHNGdJQ0FnSUNBZ0lIUm9hWE11Ym1GdFpTQTlJRzVoYldVN1hHNGdJQ0FnSUNBZ0lIUm9hWE11YjI1Q1pXTnZiV1ZQWW5ObGNuWmxaQ0E5SUc5dVFtVmpiMjFsVDJKelpYSjJaV1E3WEc0Z0lDQWdJQ0FnSUhSb2FYTXViMjVDWldOdmJXVlZibTlpYzJWeWRtVmtJRDBnYjI1Q1pXTnZiV1ZWYm05aWMyVnlkbVZrTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbWx6UkdseWRIa2dQU0JtWVd4elpUdGNiaUFnSUNBZ0lDQWdkR2hwY3k1emRHRnNaVTlpYzJWeWRtVnljeUE5SUZ0ZE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG05aWMyVnlkbVZ5Y3lBOUlHNWxkeUJUYVcxd2JHVlRaWFFvS1R0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVrYVdabVZtRnNkV1VnUFNBd08xeHVJQ0FnSUNBZ0lDQjBhR2x6TG14aGMzUkJZMk5sYzNObFpFSjVJRDBnTUR0Y2JpQWdJQ0I5WEc0Z0lDQWdRWFJ2YlM1d2NtOTBiM1I1Y0dVdWNtVndiM0owVDJKelpYSjJaV1FnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJSEpsY0c5eWRFOWljMlZ5ZG1Wa0tIUm9hWE1wTzF4dUlDQWdJSDA3WEc0Z0lDQWdRWFJ2YlM1d2NtOTBiM1I1Y0dVdWNtVndiM0owUTJoaGJtZGxaQ0E5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdhV1lnS0NGMGFHbHpMbWx6UkdseWRIa3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y21Wd2IzSjBVM1JoYkdVb0tUdGNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjbVZ3YjNKMFVtVmhaSGtvS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUgwN1hHNGdJQ0FnUVhSdmJTNXdjbTkwYjNSNWNHVXVjbVZ3YjNKMFUzUmhiR1VnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJR2xtSUNnaGRHaHBjeTVwYzBScGNuUjVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1selJHbHlkSGtnUFNCMGNuVmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NISnZjR0ZuWVhSbFUzUmhiR1Z1WlhOektIUm9hWE1wTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnZlR0Y2JpQWdJQ0JCZEc5dExuQnliM1J2ZEhsd1pTNXlaWEJ2Y25SU1pXRmtlU0E5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdhVzUyWVhKcFlXNTBLSFJvYVhNdWFYTkVhWEowZVN3Z1hDSmhkRzl0SUc1dmRDQmthWEowZVZ3aUtUdGNiaUFnSUNBZ0lDQWdhV1lnS0dkc2IySmhiRk4wWVhSbExtbHVWSEpoYm5OaFkzUnBiMjRnUGlBd0tWeHVJQ0FnSUNBZ0lDQWdJQ0FnWjJ4dlltRnNVM1JoZEdVdVkyaGhibWRsWkVGMGIyMXpMbkIxYzJnb2RHaHBjeWs3WEc0Z0lDQWdJQ0FnSUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NISnZjR0ZuWVhSbFFYUnZiVkpsWVdSNUtIUm9hWE1wTzF4dUlDQWdJQ0FnSUNBZ0lDQWdjblZ1VW1WaFkzUnBiMjV6S0NrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNCOU8xeHVJQ0FnSUVGMGIyMHVjSEp2ZEc5MGVYQmxMblJ2VTNSeWFXNW5JRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTV1WVcxbE8xeHVJQ0FnSUgwN1hHNGdJQ0FnY21WMGRYSnVJRUYwYjIwN1hHNTlLQ2twTzF4dVpYaHdiM0owY3k1QmRHOXRJRDBnUVhSdmJUdGNiblpoY2lCRGIyMXdkWFJsWkZaaGJIVmxJRDBnS0daMWJtTjBhVzl1SUNncElIdGNiaUFnSUNCbWRXNWpkR2x2YmlCRGIyMXdkWFJsWkZaaGJIVmxLR1JsY21sMllYUnBiMjRzSUhOamIzQmxMQ0JqYjIxd1lYSmxVM1J5ZFdOMGRYSmhiQ3dnYm1GdFpTa2dlMXh1SUNBZ0lDQWdJQ0IwYUdsekxtUmxjbWwyWVhScGIyNGdQU0JrWlhKcGRtRjBhVzl1TzF4dUlDQWdJQ0FnSUNCMGFHbHpMbk5qYjNCbElEMGdjMk52Y0dVN1hHNGdJQ0FnSUNBZ0lIUm9hWE11WTI5dGNHRnlaVk4wY25WamRIVnlZV3dnUFNCamIyMXdZWEpsVTNSeWRXTjBkWEpoYkR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVwYzB4aGVua2dQU0IwY25WbE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG1selEyOXRjSFYwYVc1bklEMGdabUZzYzJVN1hHNGdJQ0FnSUNBZ0lIUm9hWE11YzNSaGJHVlBZbk5sY25abGNuTWdQU0JiWFR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTV2WW5ObGNuWmxjbk1nUFNCdVpYY2dVMmx0Y0d4bFUyVjBLQ2s3WEc0Z0lDQWdJQ0FnSUhSb2FYTXViMkp6WlhKMmFXNW5JRDBnVzEwN1hHNGdJQ0FnSUNBZ0lIUm9hWE11WkdsbVpsWmhiSFZsSUQwZ01EdGNiaUFnSUNBZ0lDQWdkR2hwY3k1eWRXNUpaQ0E5SURBN1hHNGdJQ0FnSUNBZ0lIUm9hWE11YkdGemRFRmpZMlZ6YzJWa1Fua2dQU0F3TzF4dUlDQWdJQ0FnSUNCMGFHbHpMblZ1WW05MWJtUkVaWEJ6UTI5MWJuUWdQU0F3TzF4dUlDQWdJQ0FnSUNCMGFHbHpMbDlmYldGd2FXUWdQU0JjSWlOY0lpQXJJR2RsZEU1bGVIUkpaQ2dwTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbVJsY0dWdVpHVnVZM2xEYUdGdVoyVkRiM1Z1ZENBOUlEQTdYRzRnSUNBZ0lDQWdJSFJvYVhNdVpHVndaVzVrWlc1amVWTjBZV3hsUTI5MWJuUWdQU0F3TzF4dUlDQWdJQ0FnSUNCMGFHbHpMblpoYkhWbElEMGdkVzVrWldacGJtVmtPMXh1SUNBZ0lDQWdJQ0IwYUdsekxtNWhiV1VnUFNCdVlXMWxJSHg4SUZ3aVEyOXRjSFYwWldSV1lXeDFaVUJjSWlBcklHZGxkRTVsZUhSSlpDZ3BPMXh1SUNBZ0lIMWNiaUFnSUNCRGIyMXdkWFJsWkZaaGJIVmxMbkJ5YjNSdmRIbHdaUzV3WldWcklEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbWx6UTI5dGNIVjBhVzVuSUQwZ2RISjFaVHRjYmlBZ0lDQWdJQ0FnZG1GeUlIQnlaWFpCYkd4dmQxTjBZWFJsUTJoaGJtZGxjeUE5SUdGc2JHOTNVM1JoZEdWRGFHRnVaMlZ6VTNSaGNuUW9abUZzYzJVcE8xeHVJQ0FnSUNBZ0lDQjJZWElnY21WeklEMGdkR2hwY3k1a1pYSnBkbUYwYVc5dUxtTmhiR3dvZEdocGN5NXpZMjl3WlNrN1hHNGdJQ0FnSUNBZ0lHRnNiRzkzVTNSaGRHVkRhR0Z1WjJWelJXNWtLSEJ5WlhaQmJHeHZkMU4wWVhSbFEyaGhibWRsY3lrN1hHNGdJQ0FnSUNBZ0lIUm9hWE11YVhORGIyMXdkWFJwYm1jZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhKbGN6dGNiaUFnSUNCOU8xeHVJQ0FnSUR0Y2JpQWdJQ0JEYjIxd2RYUmxaRlpoYkhWbExuQnliM1J2ZEhsd1pTNXZia0psWTI5dFpVOWljMlZ5ZG1Wa0lEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJSDA3WEc0Z0lDQWdRMjl0Y0hWMFpXUldZV3gxWlM1d2NtOTBiM1I1Y0dVdWIyNUNaV052YldWVmJtOWljMlZ5ZG1Wa0lEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNCamJHVmhjazlpYzJWeWRtbHVaeWgwYUdsektUdGNiaUFnSUNBZ0lDQWdkR2hwY3k1cGMweGhlbmtnUFNCMGNuVmxPMXh1SUNBZ0lDQWdJQ0IwYUdsekxuWmhiSFZsSUQwZ2RXNWtaV1pwYm1Wa08xeHVJQ0FnSUgwN1hHNGdJQ0FnUTI5dGNIVjBaV1JXWVd4MVpTNXdjbTkwYjNSNWNHVXViMjVFWlhCbGJtUmxibU5wWlhOU1pXRmtlU0E5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUdOb1lXNW5aV1FnUFNCMGFHbHpMblJ5WVdOclFXNWtRMjl0Y0hWMFpTZ3BPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdZMmhoYm1kbFpEdGNiaUFnSUNCOU8xeHVJQ0FnSUVOdmJYQjFkR1ZrVm1Gc2RXVXVjSEp2ZEc5MGVYQmxMbWRsZENBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnYVc1MllYSnBZVzUwS0NGMGFHbHpMbWx6UTI5dGNIVjBhVzVuTENCY0lrTjVZMnhsSUdSbGRHVmpkR1ZrSUdsdUlHTnZiWEIxZEdGMGFXOXVJRndpSUNzZ2RHaHBjeTV1WVcxbExDQjBhR2x6TG1SbGNtbDJZWFJwYjI0cE8xeHVJQ0FnSUNBZ0lDQnlaWEJ2Y25SUFluTmxjblpsWkNoMGFHbHpLVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11WkdWd1pXNWtaVzVqZVZOMFlXeGxRMjkxYm5RZ1BpQXdLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTV3WldWcktDazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11YVhOTVlYcDVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYVhORGIyMXdkWFJwYm1kRVpYSnBkbUYwYVc5dUtDa3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtbHpUR0Y2ZVNBOUlHWmhiSE5sTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVkSEpoWTJ0QmJtUkRiMjF3ZFhSbEtDazdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTV3WldWcktDazdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11ZG1Gc2RXVTdYRzRnSUNBZ2ZUdGNiaUFnSUNCRGIyMXdkWFJsWkZaaGJIVmxMbkJ5YjNSdmRIbHdaUzV6WlhRZ1BTQm1kVzVqZEdsdmJpQW9YeWtnZTF4dUlDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvWENKYlEyOXRjSFYwWldSV1lXeDFaU0FuWENJZ0t5QnVZVzFsSUNzZ1hDSW5YU0JKZENCcGN5QnViM1FnY0c5emMybGliR1VnZEc4Z1lYTnphV2R1SUdFZ2JtVjNJSFpoYkhWbElIUnZJR0VnWTI5dGNIVjBaV1FnZG1Gc2RXVXVYQ0lwTzF4dUlDQWdJSDA3WEc0Z0lDQWdRMjl0Y0hWMFpXUldZV3gxWlM1d2NtOTBiM1I1Y0dVdWRISmhZMnRCYm1SRGIyMXdkWFJsSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb2FYTlRjSGxGYm1GaWJHVmtLQ2twSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSE53ZVZKbGNHOXlkQ2g3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjJKcVpXTjBPaUIwYUdsekxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUjVjR1U2SUZ3aVkyOXRjSFYwWlZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHWnVPaUIwYUdsekxtUmxjbWwyWVhScGIyNHNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR0Z5WjJWME9pQjBhR2x6TG5OamIzQmxYRzRnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0IyWVhJZ2IyeGtWbUZzZFdVZ1BTQjBhR2x6TG5aaGJIVmxPMXh1SUNBZ0lDQWdJQ0IyWVhJZ2JtVjNWbUZzZFdVZ1BTQjBhR2x6TG5aaGJIVmxJRDBnZEhKaFkydEVaWEpwZG1Wa1JuVnVZM1JwYjI0b2RHaHBjeXdnZEdocGN5NXdaV1ZyS1R0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhaaGJIVmxSR2xrUTJoaGJtZGxLSFJvYVhNdVkyOXRjR0Z5WlZOMGNuVmpkSFZ5WVd3c0lHNWxkMVpoYkhWbExDQnZiR1JXWVd4MVpTazdYRzRnSUNBZ2ZUdGNiaUFnSUNCRGIyMXdkWFJsWkZaaGJIVmxMbkJ5YjNSdmRIbHdaUzV2WW5ObGNuWmxJRDBnWm5WdVkzUnBiMjRnS0d4cGMzUmxibVZ5TENCbWFYSmxTVzF0WldScFlYUmxiSGtwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJRjkwYUdseklEMGdkR2hwY3p0Y2JpQWdJQ0FnSUNBZ2RtRnlJR1pwY25OMFZHbHRaU0E5SUhSeWRXVTdYRzRnSUNBZ0lDQWdJSFpoY2lCd2NtVjJWbUZzZFdVZ1BTQjFibVJsWm1sdVpXUTdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmhkWFJ2Y25WdUtHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ1WlhkV1lXeDFaU0E5SUY5MGFHbHpMbWRsZENncE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRm1hWEp6ZEZScGJXVWdmSHdnWm1seVpVbHRiV1ZrYVdGMFpXeDVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlIQnlaWFpWSUQwZ2RXNTBjbUZqYTJWa1UzUmhjblFvS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2FYTjBaVzVsY2lodVpYZFdZV3gxWlN3Z2NISmxkbFpoYkhWbEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjFiblJ5WVdOclpXUkZibVFvY0hKbGRsVXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnWm1seWMzUlVhVzFsSUQwZ1ptRnNjMlU3WEc0Z0lDQWdJQ0FnSUNBZ0lDQndjbVYyVm1Gc2RXVWdQU0J1WlhkV1lXeDFaVHRjYmlBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnZlR0Y2JpQWdJQ0JEYjIxd2RYUmxaRlpoYkhWbExuQnliM1J2ZEhsd1pTNTBiMHBUVDA0Z1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxtZGxkQ2dwTzF4dUlDQWdJSDA3WEc0Z0lDQWdRMjl0Y0hWMFpXUldZV3gxWlM1d2NtOTBiM1I1Y0dVdWRHOVRkSEpwYm1jZ1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxtNWhiV1VnS3lCY0lsdGNJaUFySUhSb2FYTXVaR1Z5YVhaaGRHbHZiaTUwYjFOMGNtbHVaeWdwSUNzZ1hDSmRYQ0k3WEc0Z0lDQWdmVHRjYmlBZ0lDQkRiMjF3ZFhSbFpGWmhiSFZsTG5CeWIzUnZkSGx3WlM1M2FIbFNkVzRnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCcGMxUnlZV05yYVc1bklEMGdaMnh2WW1Gc1UzUmhkR1V1WkdWeWFYWmhkR2x2YmxOMFlXTnJMbXhsYm1kMGFDQStJREE3WEc0Z0lDQWdJQ0FnSUhaaGNpQnZZbk5sY25acGJtY2dQU0IxYm1seGRXVW9kR2hwY3k1dlluTmxjblpwYm1jcExtMWhjQ2htZFc1amRHbHZiaUFvWkdWd0tTQjdJSEpsZEhWeWJpQmtaWEF1Ym1GdFpUc2dmU2s3WEc0Z0lDQWdJQ0FnSUhaaGNpQnZZbk5sY25abGNuTWdQU0IxYm1seGRXVW9kR2hwY3k1dlluTmxjblpsY25NdVlYTkJjbkpoZVNncEtTNXRZWEFvWm5WdVkzUnBiMjRnS0dSbGNDa2dleUJ5WlhSMWNtNGdaR1Z3TG01aGJXVTdJSDBwTzF4dUlDQWdJQ0FnSUNCMllYSWdjblZ1VW1WaGMyOXVJRDBnS0hSb2FYTXVhWE5EYjIxd2RYUnBibWRjYmlBZ0lDQWdJQ0FnSUNBZ0lEOGdhWE5VY21GamEybHVaMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRDhnZEdocGN5NXZZbk5sY25abGNuTXViR1Z1WjNSb0lENGdNRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBL0lGSjFibEpsWVhOdmJpNUpUbFpCVEVsRVFWUkZSRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBNklGSjFibEpsWVhOdmJpNVNSVkZWU1ZKRlJGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lEb2dVblZ1VW1WaGMyOXVMbEJGUlV0Y2JpQWdJQ0FnSUNBZ0lDQWdJRG9nVW5WdVVtVmhjMjl1TGs1UFZGOVNWVTVPU1U1SEtUdGNiaUFnSUNBZ0lDQWdhV1lnS0hKMWJsSmxZWE52YmlBOVBUMGdVblZ1VW1WaGMyOXVMbEpGVVZWSlVrVkVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnY21WeGRXbHlaV1JDZVNBOUlHZHNiMkpoYkZOMFlYUmxMbVJsY21sMllYUnBiMjVUZEdGamExdG5iRzlpWVd4VGRHRjBaUzVrWlhKcGRtRjBhVzl1VTNSaFkyc3ViR1Z1WjNSb0lDMGdNbDA3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvY21WeGRXbHlaV1JDZVNsY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdlluTmxjblpsY25NdWNIVnphQ2h5WlhGMWFYSmxaRUo1TG01aGJXVXBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUFvS0Z3aVhGeHVWMmg1VW5WdVB5QmpiMjF3ZFhSaGRHbHZiaUFuWENJZ0t5QjBhR2x6TG01aGJXVWdLeUJjSWljNlhGeHVJQ29nVW5WdWJtbHVaeUJpWldOaGRYTmxPaUJjSWlBcklISjFibEpsWVhOdmJsUmxlSFJ6VzNKMWJsSmxZWE52YmwwZ0t5QmNJaUJjSWlBcklDZ29jblZ1VW1WaGMyOXVJRDA5UFNCU2RXNVNaV0Z6YjI0dVRrOVVYMUpWVGs1SlRrY3BJQ1ltSUhSb2FYTXVaR1Z3Wlc1a1pXNWplVk4wWVd4bFEyOTFiblFnUGlBd0lEOGdYQ0lvWVNCdVpYaDBJSEoxYmlCcGN5QnpZMmhsWkhWc1pXUXBYQ0lnT2lCY0lsd2lLU0FySUZ3aVhGeHVYQ0lwSUN0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ2gwYUdsekxtbHpUR0Y2ZVZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUQ5Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0lnS2lCVWFHbHpJR052YlhCMWRHRjBhVzl1SUdseklITjFjM0JsYm1SbFpDQW9ibTkwSUdsdUlIVnpaU0JpZVNCaGJua2djbVZoWTNScGIyNHBJR0Z1WkNCM2IyNG5kQ0J5ZFc0Z1lYVjBiMjFoZEdsallXeHNlUzVjWEc1Y1hIUkVhV1J1SjNRZ1pYaHdaV04wSUhSb2FYTWdZMjl0Y0hWMFlYUnBiMjRnZEc4Z1ltVWdjM1Z6Y0dWdVpHVmtJR0YwSUhSb2FYTWdjRzlwYm5RL1hGeHVYRngwSUNBeExpQk5ZV3RsSUhOMWNtVWdkR2hwY3lCamIyMXdkWFJoZEdsdmJpQnBjeUIxYzJWa0lHSjVJR0VnY21WaFkzUnBiMjRnS0hKbFlXTjBhVzl1TENCaGRYUnZjblZ1TENCdlluTmxjblpsY2lrdVhGeHVYRngwSUNBeUxpQkRhR1ZqYXlCM2FHVjBhR1Z5SUhsdmRTQmhjbVVnZFhOcGJtY2dkR2hwY3lCamIyMXdkWFJoZEdsdmJpQnplVzVqYUhKdmJtOTFjMng1SUNocGJpQjBhR1VnYzJGdFpTQnpkR0ZqYXlCaGN5QjBhR1Y1SUhKbFlXTjBhVzl1SUhSb1lYUWdibVZsWkhNZ2FYUXBMbHhjYmx3aVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ09seHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWlBcUlGUm9hWE1nWTI5dGNIVjBZWFJwYjI0Z2QybHNiQ0J5WlMxeWRXNGdhV1lnWVc1NUlHOW1JSFJvWlNCbWIyeHNiM2RwYm1jZ2IySnpaWEoyWVdKc1pYTWdZMmhoYm1kbGN6cGNYRzRnSUNBZ1hDSWdLeUJxYjJsdVUzUnlhVzVuY3lodlluTmxjblpwYm1jcElDc2dYQ0pjWEc0Z0lDQWdYQ0lnS3lBb0tIUm9hWE11YVhORGIyMXdkWFJwYm1jZ0ppWWdhWE5VY21GamEybHVaeWtnUHlCY0lpQW9MaTR1SUc5eUlHRnVlU0J2WW5ObGNuWmhZbXhsSUdGalkyVnpjMlZrSUdSMWNtbHVaeUIwYUdVZ2NtVnRZV2x1WkdWeUlHOW1JSFJvWlNCamRYSnlaVzUwSUhKMWJpbGNJaUE2SUZ3aVhDSXBJQ3NnWENKY1hHNWNYSFJOYVhOemFXNW5JR2wwWlcxeklHbHVJSFJvYVhNZ2JHbHpkRDljWEc1Y1hIUWdJREV1SUVOb1pXTnJJSGRvWlhSb1pYSWdZV3hzSUhWelpXUWdkbUZzZFdWeklHRnlaU0J3Y205d1pYSnNlU0J0WVhKclpXUWdZWE1nYjJKelpYSjJZV0pzWlNBb2RYTmxJR2x6VDJKelpYSjJZV0pzWlNCMGJ5QjJaWEpwWm5rcFhGeHVYRngwSUNBeUxpQk5ZV3RsSUhOMWNtVWdlVzkxSUdScFpHNG5kQ0JrWlhKbFptVnlaVzVqWlNCMllXeDFaWE1nZEc5dklHVmhjbXg1TGlCTmIySllJRzlpYzJWeWRtVnpJSEJ5YjNCekxDQnViM1FnY0hKcGJXbDBhWFpsY3k0Z1JTNW5PaUIxYzJVZ0ozQmxjbk52Ymk1dVlXMWxKeUJwYm5OMFpXRmtJRzltSUNkdVlXMWxKeUJwYmlCNWIzVnlJR052YlhCMWRHRjBhVzl1TGx4Y2JpQWdLaUJKWmlCMGFHVWdiM1YwWTI5dFpTQnZaaUIwYUdseklHTnZiWEIxZEdGMGFXOXVJR05vWVc1blpYTXNJSFJvWlNCbWIyeHNiM2RwYm1jZ2IySnpaWEoyWlhKeklIZHBiR3dnWW1VZ2NtVXRjblZ1T2x4Y2JpQWdJQ0JjSWlBcklHcHZhVzVUZEhKcGJtZHpLRzlpYzJWeWRtVnljeWtnS3lCY0lseGNibHdpS1NrN1hHNGdJQ0FnZlR0Y2JpQWdJQ0J5WlhSMWNtNGdRMjl0Y0hWMFpXUldZV3gxWlR0Y2JuMG9LU2s3WEc1MllYSWdVblZ1VW1WaGMyOXVPMXh1S0daMWJtTjBhVzl1SUNoU2RXNVNaV0Z6YjI0cElIdGNiaUFnSUNCU2RXNVNaV0Z6YjI1YlVuVnVVbVZoYzI5dVcxd2lVRVZGUzF3aVhTQTlJREJkSUQwZ1hDSlFSVVZMWENJN1hHNGdJQ0FnVW5WdVVtVmhjMjl1VzFKMWJsSmxZWE52Ymx0Y0lrbE9Wa0ZNU1VSQlZFVkVYQ0pkSUQwZ01WMGdQU0JjSWtsT1ZrRk1TVVJCVkVWRVhDSTdYRzRnSUNBZ1VuVnVVbVZoYzI5dVcxSjFibEpsWVhOdmJsdGNJbEpGVVZWSlVrVkVYQ0pkSUQwZ01sMGdQU0JjSWxKRlVWVkpVa1ZFWENJN1hHNGdJQ0FnVW5WdVVtVmhjMjl1VzFKMWJsSmxZWE52Ymx0Y0lrNVBWRjlTVlU1T1NVNUhYQ0pkSUQwZ00xMGdQU0JjSWs1UFZGOVNWVTVPU1U1SFhDSTdYRzU5S1NoU2RXNVNaV0Z6YjI0Z2ZId2dLRkoxYmxKbFlYTnZiaUE5SUh0OUtTazdYRzUyWVhJZ2NuVnVVbVZoYzI5dVZHVjRkSE1nUFNBb1gyRWdQU0I3ZlN4Y2JpQWdJQ0JmWVZ0U2RXNVNaV0Z6YjI0dVVFVkZTMTBnUFNCY0lsdHdaV1ZyWFNCVWFHVWdkbUZzZFdVZ2IyWWdkR2hwY3lCamIyMXdkWFJsWkNCMllXeDFaU0IzWVhNZ2NtVnhkV1Z6ZEdWa0lHOTFkSE5wWkdVZ1lXNGdjbVZoWTNScGIyNWNJaXhjYmlBZ0lDQmZZVnRTZFc1U1pXRnpiMjR1U1U1V1FVeEpSRUZVUlVSZElEMGdYQ0piYVc1MllXeHBaR0YwWldSZElGTnZiV1VnYjJKelpYSjJZV0pzWlhNZ2RYTmxaQ0JpZVNCMGFHbHpJR052YlhCMWRHRjBhVzl1SUdScFpDQmphR0Z1WjJWY0lpeGNiaUFnSUNCZllWdFNkVzVTWldGemIyNHVVa1ZSVlVsU1JVUmRJRDBnWENKYmMzUmhjblJsWkYwZ1ZHaHBjeUJqYjIxd2RYUmhkR2x2YmlCcGN5QnlaWEYxYVhKbFpDQmllU0JoYm05MGFHVnlJR052YlhCMWRHVmtJSFpoYkhWbElDOGdjbVZoWTNScGIyNWNJaXhjYmlBZ0lDQmZZVnRTZFc1U1pXRnpiMjR1VGs5VVgxSlZUazVKVGtkZElEMGdYQ0piYVdSc1pWMGdWR2hwY3lCamIyMXdkWFJwYjI0Z2FYTWdZM1Z5Y21WdWRHeDVJRzV2ZENCeWRXNXVhVzVuWENJc1hHNGdJQ0FnWDJGY2JpazdYRzVtZFc1amRHbHZiaUJwYzBOdmJYQjFkR2x1WjBSbGNtbDJZWFJwYjI0b0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUdkc2IySmhiRk4wWVhSbExtUmxjbWwyWVhScGIyNVRkR0ZqYXk1c1pXNW5kR2dnUGlBd1hHNGdJQ0FnSUNBZ0lDWW1JR2RzYjJKaGJGTjBZWFJsTG1selZISmhZMnRwYm1jN1hHNTlYRzVtZFc1amRHbHZiaUJqYUdWamEwbG1VM1JoZEdWTmIyUnBabWxqWVhScGIyNXpRWEpsUVd4c2IzZGxaQ2dwSUh0Y2JpQWdJQ0JwWmlBb0lXZHNiMkpoYkZOMFlYUmxMbUZzYkc5M1UzUmhkR1ZEYUdGdVoyVnpLU0I3WEc0Z0lDQWdJQ0FnSUdsdWRtRnlhV0Z1ZENobVlXeHpaU3dnWjJ4dlltRnNVM1JoZEdVdWMzUnlhV04wVFc5a1pWeHVJQ0FnSUNBZ0lDQWdJQ0FnUHlCY0lrbDBJR2x6SUc1dmRDQmhiR3h2ZDJWa0lIUnZJR055WldGMFpTQnZjaUJqYUdGdVoyVWdjM1JoZEdVZ2IzVjBjMmxrWlNCaGJpQmdZV04wYVc5dVlDQjNhR1Z1SUUxdllsZ2dhWE1nYVc0Z2MzUnlhV04wSUcxdlpHVXVJRmR5WVhBZ2RHaGxJR04xY25KbGJuUWdiV1YwYUc5a0lHbHVJR0JoWTNScGIyNWdJR2xtSUhSb2FYTWdjM1JoZEdVZ1kyaGhibWRsSUdseklHbHVkR1Z1WkdWa1hDSmNiaUFnSUNBZ0lDQWdJQ0FnSURvZ1hDSkpkQ0JwY3lCdWIzUWdZV3hzYjNkbFpDQjBieUJqYUdGdVoyVWdkR2hsSUhOMFlYUmxJSGRvWlc0Z1lTQmpiMjF3ZFhSbFpDQjJZV3gxWlNCdmNpQjBjbUZ1YzJadmNtMWxjaUJwY3lCaVpXbHVaeUJsZG1Gc2RXRjBaV1F1SUZWelpTQW5ZWFYwYjNKMWJpY2dkRzhnWTNKbFlYUmxJSEpsWVdOMGFYWmxJR1oxYm1OMGFXOXVjeUIzYVhSb0lITnBaR1V0WldabVpXTjBjeTVjSWlrN1hHNGdJQ0FnZlZ4dWZWeHVablZ1WTNScGIyNGdibTkwYVdaNVJHVndaVzVrWlc1amVWTjBZV3hsS0dSbGNtbDJZWFJwYjI0cElIdGNiaUFnSUNCcFppQW9LeXRrWlhKcGRtRjBhVzl1TG1SbGNHVnVaR1Z1WTNsVGRHRnNaVU52ZFc1MElEMDlQU0F4S1NCN1hHNGdJQ0FnSUNBZ0lIQnliM0JoWjJGMFpWTjBZV3hsYm1WemN5aGtaWEpwZG1GMGFXOXVLVHRjYmlBZ0lDQjlYRzU5WEc1bWRXNWpkR2x2YmlCdWIzUnBabmxFWlhCbGJtUmxibU41VW1WaFpIa29aR1Z5YVhaaGRHbHZiaXdnWkdWd1pXNWtaVzVqZVVScFpFTm9ZVzVuWlNrZ2UxeHVJQ0FnSUdsdWRtRnlhV0Z1ZENoa1pYSnBkbUYwYVc5dUxtUmxjR1Z1WkdWdVkzbFRkR0ZzWlVOdmRXNTBJRDRnTUN3Z1hDSjFibVY0Y0dWamRHVmtJSEpsWVdSNUlHNXZkR2xtYVdOaGRHbHZibHdpS1R0Y2JpQWdJQ0JwWmlBb1pHVndaVzVrWlc1amVVUnBaRU5vWVc1blpTbGNiaUFnSUNBZ0lDQWdaR1Z5YVhaaGRHbHZiaTVrWlhCbGJtUmxibU41UTJoaGJtZGxRMjkxYm5RZ0t6MGdNVHRjYmlBZ0lDQnBaaUFvTFMxa1pYSnBkbUYwYVc5dUxtUmxjR1Z1WkdWdVkzbFRkR0ZzWlVOdmRXNTBJRDA5UFNBd0tTQjdYRzRnSUNBZ0lDQWdJR2xtSUNoa1pYSnBkbUYwYVc5dUxtUmxjR1Z1WkdWdVkzbERhR0Z1WjJWRGIzVnVkQ0ErSURBcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdSbGNtbDJZWFJwYjI0dVpHVndaVzVrWlc1amVVTm9ZVzVuWlVOdmRXNTBJRDBnTUR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCamFHRnVaMlZrSUQwZ1pHVnlhWFpoZEdsdmJpNXZia1JsY0dWdVpHVnVZMmxsYzFKbFlXUjVLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQndjbTl3WVdkaGRHVlNaV0ZrYVc1bGMzTW9aR1Z5YVhaaGRHbHZiaXdnWTJoaGJtZGxaQ2s3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQndjbTl3WVdkaGRHVlNaV0ZrYVc1bGMzTW9aR1Z5YVhaaGRHbHZiaXdnWm1Gc2MyVXBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdmVnh1ZlZ4dVpuVnVZM1JwYjI0Z2RISmhZMnRFWlhKcGRtVmtSblZ1WTNScGIyNG9aR1Z5YVhaaGRHbHZiaXdnWmlrZ2UxeHVJQ0FnSUhaaGNpQndjbVYyVDJKelpYSjJhVzVuSUQwZ1pHVnlhWFpoZEdsdmJpNXZZbk5sY25acGJtYzdYRzRnSUNBZ1pHVnlhWFpoZEdsdmJpNXZZbk5sY25acGJtY2dQU0J1WlhjZ1FYSnlZWGtvY0hKbGRrOWljMlZ5ZG1sdVp5NXNaVzVuZEdnZ0t5QXhNREFwTzF4dUlDQWdJR1JsY21sMllYUnBiMjR1ZFc1aWIzVnVaRVJsY0hORGIzVnVkQ0E5SURBN1hHNGdJQ0FnWkdWeWFYWmhkR2x2Ymk1eWRXNUpaQ0E5SUNzcloyeHZZbUZzVTNSaGRHVXVjblZ1U1dRN1hHNGdJQ0FnWjJ4dlltRnNVM1JoZEdVdVpHVnlhWFpoZEdsdmJsTjBZV05yTG5CMWMyZ29aR1Z5YVhaaGRHbHZiaWs3WEc0Z0lDQWdkbUZ5SUhCeVpYWlVjbUZqYTJsdVp5QTlJR2RzYjJKaGJGTjBZWFJsTG1selZISmhZMnRwYm1jN1hHNGdJQ0FnWjJ4dlltRnNVM1JoZEdVdWFYTlVjbUZqYTJsdVp5QTlJSFJ5ZFdVN1hHNGdJQ0FnZG1GeUlHaGhjMFY0WTJWd2RHbHZiaUE5SUhSeWRXVTdYRzRnSUNBZ2RtRnlJSEpsYzNWc2REdGNiaUFnSUNCMGNua2dlMXh1SUNBZ0lDQWdJQ0J5WlhOMWJIUWdQU0JtTG1OaGJHd29aR1Z5YVhaaGRHbHZiaWs3WEc0Z0lDQWdJQ0FnSUdoaGMwVjRZMlZ3ZEdsdmJpQTlJR1poYkhObE8xeHVJQ0FnSUgxY2JpQWdJQ0JtYVc1aGJHeDVJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHaGhjMFY0WTJWd2RHbHZiaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUcxbGMzTmhaMlVnUFNBb1hDSmJiVzlpZUYwZ1FXNGdkVzVqWVhWbmFIUWdaWGhqWlhCMGFXOXVJRzlqWTNWeWNtVmtJSGRvYVd4bElHTmhiR04xYkdGMGFXNW5JSGx2ZFhJZ1kyOXRjSFYwWldRZ2RtRnNkV1VzSUdGMWRHOXlkVzRnYjNJZ2RISmhibk5tYjNKdFpYSXVJRTl5SUdsdWMybGtaU0IwYUdVZ2NtVnVaR1Z5S0NrZ2JXVjBhRzlrSUc5bUlHRnVJRzlpYzJWeWRtVnlJR0poYzJWa0lGSmxZV04wSUdOdmJYQnZibVZ1ZEM0Z1hDSWdLMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpVkdobGMyVWdablZ1WTNScGIyNXpJSE5vYjNWc1pDQnVaWFpsY2lCMGFISnZkeUJsZUdObGNIUnBiMjV6SUdGeklFMXZZbGdnZDJsc2JDQnViM1FnWVd4M1lYbHpJR0psSUdGaWJHVWdkRzhnY21WamIzWmxjaUJtY205dElIUm9aVzB1SUZ3aUlDdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQW9YQ0pRYkdWaGMyVWdabWw0SUhSb1pTQmxjbkp2Y2lCeVpYQnZjblJsWkNCaFpuUmxjaUIwYUdseklHMWxjM05oWjJVZ2IzSWdaVzVoWW14bElDZFFZWFZ6WlNCdmJpQW9ZMkYxWjJoMEtTQmxlR05sY0hScGIyNXpKeUJwYmlCNWIzVnlJR1JsWW5WbloyVnlJSFJ2SUdacGJtUWdkR2hsSUhKdmIzUWdZMkYxYzJVdUlFbHVPaUFuWENJZ0t5QmtaWEpwZG1GMGFXOXVMbTVoYldVZ0t5QmNJaWRjSWlrcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHbHpVM0I1Ulc1aFlteGxaQ2dwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzQjVVbVZ3YjNKMEtIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEhsd1pUb2dYQ0psY25KdmNsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdlltcGxZM1E2SUhSb2FYTXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxbGMzTmhaMlU2SUcxbGMzTmhaMlZjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lHTnZibk52YkdVdWQyRnliaWh0WlhOellXZGxLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHUmxjbWwyWVhScGIyNHVkVzVpYjNWdVpFUmxjSE5EYjNWdWRDQTlJREE3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaWEpwZG1GMGFXOXVMbTlpYzJWeWRtbHVaeUE5SUhCeVpYWlBZbk5sY25acGJtYzdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYTmxkRWRzYjJKaGJGTjBZWFJsS0NrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JuYkc5aVlXeFRkR0YwWlM1cGMxUnlZV05yYVc1bklEMGdjSEpsZGxSeVlXTnJhVzVuTzF4dUlDQWdJQ0FnSUNBZ0lDQWdaMnh2WW1Gc1UzUmhkR1V1WkdWeWFYWmhkR2x2YmxOMFlXTnJMbXhsYm1kMGFDQXRQU0F4TzF4dUlDQWdJQ0FnSUNBZ0lDQWdZbWx1WkVSbGNHVnVaR1Z1WTJsbGN5aGtaWEpwZG1GMGFXOXVMQ0J3Y21WMlQySnpaWEoyYVc1bktUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnY21WemRXeDBPMXh1ZlZ4dVpuVnVZM1JwYjI0Z1ltbHVaRVJsY0dWdVpHVnVZMmxsY3loa1pYSnBkbUYwYVc5dUxDQndjbVYyVDJKelpYSjJhVzVuS1NCN1hHNGdJQ0FnZG1GeUlIQnlaWFpNWlc1bmRHZ2dQU0J3Y21WMlQySnpaWEoyYVc1bkxteGxibWQwYUR0Y2JpQWdJQ0IyWVhJZ2IySnpaWEoyYVc1bklEMGdaR1Z5YVhaaGRHbHZiaTV2WW5ObGNuWnBibWM3WEc0Z0lDQWdkbUZ5SUc1bGQweGxibWQwYUNBOUlHOWljMlZ5ZG1sdVp5NXNaVzVuZEdnZ1BTQmtaWEpwZG1GMGFXOXVMblZ1WW05MWJtUkVaWEJ6UTI5MWJuUTdYRzRnSUNBZ1ptOXlJQ2gyWVhJZ2FTQTlJREE3SUdrZ1BDQndjbVYyVEdWdVozUm9PeUJwS3lzcFhHNGdJQ0FnSUNBZ0lIQnlaWFpQWW5ObGNuWnBibWRiYVYwdVpHbG1abFpoYkhWbElEMGdMVEU3WEc0Z0lDQWdabTl5SUNoMllYSWdhU0E5SURBN0lHa2dQQ0J1WlhkTVpXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ1pHVndJRDBnYjJKelpYSjJhVzVuVzJsZE8xeHVJQ0FnSUNBZ0lDQnBaaUFvS0NzclpHVndMbVJwWm1aV1lXeDFaU2tnUGlBd0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCa1pYQXVaR2xtWmxaaGJIVmxJRDBnTUR0Y2JpQWdJQ0FnSUNBZ0lDQWdJR0ZrWkU5aWMyVnlkbVZ5S0dSbGNDd2daR1Z5YVhaaGRHbHZiaWs3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdabTl5SUNoMllYSWdhU0E5SURBN0lHa2dQQ0J3Y21WMlRHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHUmxjQ0E5SUhCeVpYWlBZbk5sY25acGJtZGJhVjA3WEc0Z0lDQWdJQ0FnSUdsbUlDaGtaWEF1WkdsbVpsWmhiSFZsSUR3Z01Da2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1pHVndMbVJwWm1aV1lXeDFaU0E5SURBN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlcxdmRtVlBZbk5sY25abGNpaGtaWEFzSUdSbGNtbDJZWFJwYjI0cE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVmVnh1Wm5WdVkzUnBiMjRnWTJ4bFlYSlBZbk5sY25acGJtY29aR1Z5YVhaaGRHbHZiaWtnZTF4dUlDQWdJSFpoY2lCdlluTWdQU0JrWlhKcGRtRjBhVzl1TG05aWMyVnlkbWx1Wnp0Y2JpQWdJQ0IyWVhJZ2JDQTlJRzlpY3k1c1pXNW5kR2c3WEc0Z0lDQWdabTl5SUNoMllYSWdhU0E5SURBN0lHa2dQQ0JzT3lCcEt5c3BYRzRnSUNBZ0lDQWdJSEpsYlc5MlpVOWljMlZ5ZG1WeUtHOWljMXRwWFN3Z1pHVnlhWFpoZEdsdmJpazdYRzRnSUNBZ2IySnpMbXhsYm1kMGFDQTlJREE3WEc1OVhHNW1kVzVqZEdsdmJpQjFiblJ5WVdOclpXUW9ZV04wYVc5dUtTQjdYRzRnSUNBZ2RtRnlJSEJ5WlhZZ1BTQjFiblJ5WVdOclpXUlRkR0Z5ZENncE8xeHVJQ0FnSUhaaGNpQnlaWE1nUFNCaFkzUnBiMjRvS1R0Y2JpQWdJQ0IxYm5SeVlXTnJaV1JGYm1Rb2NISmxkaWs3WEc0Z0lDQWdjbVYwZFhKdUlISmxjenRjYm4xY2JtVjRjRzl5ZEhNdWRXNTBjbUZqYTJWa0lEMGdkVzUwY21GamEyVmtPMXh1Wm5WdVkzUnBiMjRnZFc1MGNtRmphMlZrVTNSaGNuUW9LU0I3WEc0Z0lDQWdkbUZ5SUhCeVpYWWdQU0JuYkc5aVlXeFRkR0YwWlM1cGMxUnlZV05yYVc1bk8xeHVJQ0FnSUdkc2IySmhiRk4wWVhSbExtbHpWSEpoWTJ0cGJtY2dQU0JtWVd4elpUdGNiaUFnSUNCeVpYUjFjbTRnY0hKbGRqdGNibjFjYm1aMWJtTjBhVzl1SUhWdWRISmhZMnRsWkVWdVpDaHdjbVYyS1NCN1hHNGdJQ0FnWjJ4dlltRnNVM1JoZEdVdWFYTlVjbUZqYTJsdVp5QTlJSEJ5WlhZN1hHNTlYRzUyWVhJZ2NHVnljMmx6ZEdWdWRFdGxlWE1nUFNCYlhDSnRiMko0UjNWcFpGd2lMQ0JjSW5KbGMyVjBTV1JjSWl3Z1hDSnpjSGxNYVhOMFpXNWxjbk5jSWl3Z1hDSnpkSEpwWTNSTmIyUmxYQ0lzSUZ3aWNuVnVTV1JjSWwwN1hHNTJZWElnVFc5aVdFZHNiMkpoYkhNZ1BTQW9ablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJR1oxYm1OMGFXOXVJRTF2WWxoSGJHOWlZV3h6S0NrZ2UxeHVJQ0FnSUNBZ0lDQjBhR2x6TG5abGNuTnBiMjRnUFNBek8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG1SbGNtbDJZWFJwYjI1VGRHRmpheUE5SUZ0ZE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG5KMWJrbGtJRDBnTUR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTV0YjJKNFIzVnBaQ0E5SURBN1hHNGdJQ0FnSUNBZ0lIUm9hWE11YVc1VWNtRnVjMkZqZEdsdmJpQTlJREE3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVhWE5VY21GamEybHVaeUE5SUdaaGJITmxPMXh1SUNBZ0lDQWdJQ0IwYUdsekxtbHpVblZ1Ym1sdVoxSmxZV04wYVc5dWN5QTlJR1poYkhObE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG1Ob1lXNW5aV1JCZEc5dGN5QTlJRnRkTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbkJsYm1ScGJtZFNaV0ZqZEdsdmJuTWdQU0JiWFR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVoYkd4dmQxTjBZWFJsUTJoaGJtZGxjeUE5SUhSeWRXVTdYRzRnSUNBZ0lDQWdJSFJvYVhNdWMzUnlhV04wVFc5a1pTQTlJR1poYkhObE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG5KbGMyVjBTV1FnUFNBd08xeHVJQ0FnSUNBZ0lDQjBhR2x6TG5Od2VVeHBjM1JsYm1WeWN5QTlJRnRkTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z1RXOWlXRWRzYjJKaGJITTdYRzU5S0NrcE8xeHVkbUZ5SUdkc2IySmhiRk4wWVhSbElEMGdLR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0IyWVhJZ2NtVnpJRDBnYm1WM0lFMXZZbGhIYkc5aVlXeHpLQ2s3WEc0Z0lDQWdhV1lnS0dkc2IySmhiQzVmWDIxdlluTmxjblpoWW14bFZISmhZMnRwYm1kVGRHRmpheUI4ZkNCbmJHOWlZV3d1WDE5dGIySnpaWEoyWVdKc1pWWnBaWGRUZEdGamF5bGNiaUFnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtGd2lXMjF2WW5oZElFRnVJR2x1WTI5dGNHRjBhV0pzWlNCMlpYSnphVzl1SUc5bUlHMXZZbk5sY25aaFlteGxJR2x6SUdGc2NtVmhaSGtnYkc5aFpHVmtMbHdpS1R0Y2JpQWdJQ0JwWmlBb1oyeHZZbUZzTGw5ZmJXOWllRWRzYjJKaGJDQW1KaUJuYkc5aVlXd3VYMTl0YjJKNFIyeHZZbUZzTG5abGNuTnBiMjRnSVQwOUlISmxjeTUyWlhKemFXOXVLVnh1SUNBZ0lDQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9YQ0piYlc5aWVGMGdRVzRnYVc1amIyMXdZWFJwWW14bElIWmxjbk5wYjI0Z2IyWWdiVzlpZUNCcGN5QmhiSEpsWVdSNUlHeHZZV1JsWkM1Y0lpazdYRzRnSUNBZ2FXWWdLR2RzYjJKaGJDNWZYMjF2WW5oSGJHOWlZV3dwWEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJuYkc5aVlXd3VYMTl0YjJKNFIyeHZZbUZzTzF4dUlDQWdJSEpsZEhWeWJpQm5iRzlpWVd3dVgxOXRiMko0UjJ4dlltRnNJRDBnY21Wek8xeHVmU2tvS1R0Y2JtWjFibU4wYVc5dUlISmxaMmx6ZEdWeVIyeHZZbUZzY3lncElIdGNibjFjYm1aMWJtTjBhVzl1SUhKbGMyVjBSMnh2WW1Gc1UzUmhkR1VvS1NCN1hHNGdJQ0FnWjJ4dlltRnNVM1JoZEdVdWNtVnpaWFJKWkNzck8xeHVJQ0FnSUhaaGNpQmtaV1poZFd4MFIyeHZZbUZzY3lBOUlHNWxkeUJOYjJKWVIyeHZZbUZzY3lncE8xeHVJQ0FnSUdadmNpQW9kbUZ5SUd0bGVTQnBiaUJrWldaaGRXeDBSMnh2WW1Gc2N5bGNiaUFnSUNBZ0lDQWdhV1lnS0hCbGNuTnBjM1JsYm5STFpYbHpMbWx1WkdWNFQyWW9hMlY1S1NBOVBUMGdMVEVwWEc0Z0lDQWdJQ0FnSUNBZ0lDQm5iRzlpWVd4VGRHRjBaVnRyWlhsZElEMGdaR1ZtWVhWc2RFZHNiMkpoYkhOYmEyVjVYVHRjYmlBZ0lDQm5iRzlpWVd4VGRHRjBaUzVoYkd4dmQxTjBZWFJsUTJoaGJtZGxjeUE5SUNGbmJHOWlZV3hUZEdGMFpTNXpkSEpwWTNSTmIyUmxPMXh1ZlZ4dVpuVnVZM1JwYjI0Z1lXUmtUMkp6WlhKMlpYSW9iMkp6WlhKMllXSnNaU3dnYm05a1pTa2dlMXh1SUNBZ0lIWmhjaUIzWVhORmJYQjBlU0E5SUc5aWMyVnlkbUZpYkdVdWIySnpaWEoyWlhKekxteGxibWQwYUNBOVBUMGdNRHRjYmlBZ0lDQnZZbk5sY25aaFlteGxMbTlpYzJWeWRtVnljeTVoWkdRb2JtOWtaU2s3WEc0Z0lDQWdhV1lnS0hkaGMwVnRjSFI1S1Z4dUlDQWdJQ0FnSUNCdlluTmxjblpoWW14bExtOXVRbVZqYjIxbFQySnpaWEoyWldRb0tUdGNibjFjYm1aMWJtTjBhVzl1SUhKbGJXOTJaVTlpYzJWeWRtVnlLRzlpYzJWeWRtRmliR1VzSUc1dlpHVXBJSHRjYmlBZ0lDQnZZbk5sY25aaFlteGxMbTlpYzJWeWRtVnljeTV5WlcxdmRtVW9ibTlrWlNrN1hHNGdJQ0FnYVdZZ0tHOWljMlZ5ZG1GaWJHVXViMkp6WlhKMlpYSnpMbXhsYm1kMGFDQTlQVDBnTUNsY2JpQWdJQ0FnSUNBZ2IySnpaWEoyWVdKc1pTNXZia0psWTI5dFpWVnViMkp6WlhKMlpXUW9LVHRjYm4xY2JtWjFibU4wYVc5dUlISmxjRzl5ZEU5aWMyVnlkbVZrS0c5aWMyVnlkbUZpYkdVcElIdGNiaUFnSUNCcFppQW9aMnh2WW1Gc1UzUmhkR1V1YVhOVWNtRmphMmx1WnlBOVBUMGdabUZzYzJVcFhHNGdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2JpQWdJQ0IyWVhJZ1pHVnlhWFpoZEdsdmJpQTlJR2RzYjJKaGJGTjBZWFJsTG1SbGNtbDJZWFJwYjI1VGRHRmphMXRuYkc5aVlXeFRkR0YwWlM1a1pYSnBkbUYwYVc5dVUzUmhZMnN1YkdWdVozUm9JQzBnTVYwN1hHNGdJQ0FnYVdZZ0tHUmxjbWwyWVhScGIyNHVjblZ1U1dRZ0lUMDlJRzlpYzJWeWRtRmliR1V1YkdGemRFRmpZMlZ6YzJWa1Fua3BJSHRjYmlBZ0lDQWdJQ0FnYjJKelpYSjJZV0pzWlM1c1lYTjBRV05qWlhOelpXUkNlU0E5SUdSbGNtbDJZWFJwYjI0dWNuVnVTV1E3WEc0Z0lDQWdJQ0FnSUdSbGNtbDJZWFJwYjI0dWIySnpaWEoyYVc1blcyUmxjbWwyWVhScGIyNHVkVzVpYjNWdVpFUmxjSE5EYjNWdWRDc3JYU0E5SUc5aWMyVnlkbUZpYkdVN1hHNGdJQ0FnZlZ4dWZWeHVablZ1WTNScGIyNGdjSEp2Y0dGbllYUmxVM1JoYkdWdVpYTnpLRzlpYzJWeWRtRmliR1VwSUh0Y2JpQWdJQ0IyWVhJZ2IzTWdQU0J2WW5ObGNuWmhZbXhsTG05aWMyVnlkbVZ5Y3k1aGMwRnljbUY1S0NrN1hHNGdJQ0FnZG1GeUlHd2dQU0J2Y3k1c1pXNW5kR2c3WEc0Z0lDQWdabTl5SUNoMllYSWdhU0E5SURBN0lHa2dQQ0JzT3lCcEt5c3BYRzRnSUNBZ0lDQWdJRzV2ZEdsbWVVUmxjR1Z1WkdWdVkzbFRkR0ZzWlNodmMxdHBYU2s3WEc0Z0lDQWdiMkp6WlhKMllXSnNaUzV6ZEdGc1pVOWljMlZ5ZG1WeWN5QTlJRzlpYzJWeWRtRmliR1V1YzNSaGJHVlBZbk5sY25abGNuTXVZMjl1WTJGMEtHOXpLVHRjYm4xY2JtWjFibU4wYVc5dUlIQnliM0JoWjJGMFpWSmxZV1JwYm1WemN5aHZZbk5sY25aaFlteGxMQ0IyWVd4MVpVUnBaRUZqZEhWaGJHeDVRMmhoYm1kbEtTQjdYRzRnSUNBZ2IySnpaWEoyWVdKc1pTNXpkR0ZzWlU5aWMyVnlkbVZ5Y3k1emNHeHBZMlVvTUNrdVptOXlSV0ZqYUNobWRXNWpkR2x2YmlBb2J5a2dleUJ5WlhSMWNtNGdibTkwYVdaNVJHVndaVzVrWlc1amVWSmxZV1I1S0c4c0lIWmhiSFZsUkdsa1FXTjBkV0ZzYkhsRGFHRnVaMlVwT3lCOUtUdGNibjFjYm5aaGNpQkZUVkJVV1Y5RVJWSkpWa0ZVU1U5T1gxTkZWRHRjYm5aaGNpQlNaV0ZqZEdsdmJpQTlJQ2htZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnWm5WdVkzUnBiMjRnVW1WaFkzUnBiMjRvYm1GdFpTd2diMjVKYm5aaGJHbGtZWFJsS1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2h1WVcxbElEMDlQU0IyYjJsa0lEQXBJSHNnYm1GdFpTQTlJRndpVW1WaFkzUnBiMjVBWENJZ0t5Qm5aWFJPWlhoMFNXUW9LVHNnZlZ4dUlDQWdJQ0FnSUNCMGFHbHpMbTVoYldVZ1BTQnVZVzFsTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbTl1U1c1MllXeHBaR0YwWlNBOUlHOXVTVzUyWVd4cFpHRjBaVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NXpkR0ZzWlU5aWMyVnlkbVZ5Y3lBOUlFVk5VRlJaWDBGU1VrRlpPMXh1SUNBZ0lDQWdJQ0IwYUdsekxtOWljMlZ5ZG1WeWN5QTlJRVZOVUZSWlgwUkZVa2xXUVZSSlQwNWZVMFZVSUh4OElDaEZUVkJVV1Y5RVJWSkpWa0ZVU1U5T1gxTkZWQ0E5SUc1bGR5QlRhVzF3YkdWVFpYUW9LU2s3WEc0Z0lDQWdJQ0FnSUhSb2FYTXViMkp6WlhKMmFXNW5JRDBnVzEwN1hHNGdJQ0FnSUNBZ0lIUm9hWE11WkdsbVpsWmhiSFZsSUQwZ01EdGNiaUFnSUNBZ0lDQWdkR2hwY3k1eWRXNUpaQ0E5SURBN1hHNGdJQ0FnSUNBZ0lIUm9hWE11YkdGemRFRmpZMlZ6YzJWa1Fua2dQU0F3TzF4dUlDQWdJQ0FnSUNCMGFHbHpMblZ1WW05MWJtUkVaWEJ6UTI5MWJuUWdQU0F3TzF4dUlDQWdJQ0FnSUNCMGFHbHpMbDlmYldGd2FXUWdQU0JjSWlOY0lpQXJJR2RsZEU1bGVIUkpaQ2dwTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbVJsY0dWdVpHVnVZM2xEYUdGdVoyVkRiM1Z1ZENBOUlEQTdYRzRnSUNBZ0lDQWdJSFJvYVhNdVpHVndaVzVrWlc1amVWTjBZV3hsUTI5MWJuUWdQU0F3TzF4dUlDQWdJQ0FnSUNCMGFHbHpMbWx6UkdsemNHOXpaV1FnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NWZhWE5UWTJobFpIVnNaV1FnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NWZhWE5VY21GamExQmxibVJwYm1jZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVmYVhOU2RXNXVhVzVuSUQwZ1ptRnNjMlU3WEc0Z0lDQWdmVnh1SUNBZ0lGSmxZV04wYVc5dUxuQnliM1J2ZEhsd1pTNXZia0psWTI5dFpVOWljMlZ5ZG1Wa0lEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJSDA3WEc0Z0lDQWdVbVZoWTNScGIyNHVjSEp2ZEc5MGVYQmxMbTl1UW1WamIyMWxWVzV2WW5ObGNuWmxaQ0E5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNCOU8xeHVJQ0FnSUZKbFlXTjBhVzl1TG5CeWIzUnZkSGx3WlM1dmJrUmxjR1Z1WkdWdVkybGxjMUpsWVdSNUlEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbk5qYUdWa2RXeGxLQ2s3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNCOU8xeHVJQ0FnSUZKbFlXTjBhVzl1TG5CeWIzUnZkSGx3WlM1elkyaGxaSFZzWlNBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tDRjBhR2x6TGw5cGMxTmphR1ZrZFd4bFpDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVmYVhOVFkyaGxaSFZzWldRZ1BTQjBjblZsTzF4dUlDQWdJQ0FnSUNBZ0lDQWdaMnh2WW1Gc1UzUmhkR1V1Y0dWdVpHbHVaMUpsWVdOMGFXOXVjeTV3ZFhOb0tIUm9hWE1wTzF4dUlDQWdJQ0FnSUNBZ0lDQWdjblZ1VW1WaFkzUnBiMjV6S0NrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNCOU8xeHVJQ0FnSUZKbFlXTjBhVzl1TG5CeWIzUnZkSGx3WlM1cGMxTmphR1ZrZFd4bFpDQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVaR1Z3Wlc1a1pXNWplVk4wWVd4bFEyOTFiblFnUGlBd0lIeDhJSFJvYVhNdVgybHpVMk5vWldSMWJHVmtPMXh1SUNBZ0lIMDdYRzRnSUNBZ1VtVmhZM1JwYjI0dWNISnZkRzkwZVhCbExuSjFibEpsWVdOMGFXOXVJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvSVhSb2FYTXVhWE5FYVhOd2IzTmxaQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1ZmFYTlRZMmhsWkhWc1pXUWdQU0JtWVd4elpUdGNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVYMmx6VkhKaFkydFFaVzVrYVc1bklEMGdkSEoxWlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWIyNUpiblpoYkdsa1lYUmxLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NWZhWE5VY21GamExQmxibVJwYm1jZ0ppWWdhWE5UY0hsRmJtRmliR1ZrS0NrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpjSGxTWlhCdmNuUW9lMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdlltcGxZM1E2SUhSb2FYTXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSNWNHVTZJRndpYzJOb1pXUjFiR1ZrTFhKbFlXTjBhVzl1WENKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUgwN1hHNGdJQ0FnVW1WaFkzUnBiMjR1Y0hKdmRHOTBlWEJsTG5SeVlXTnJJRDBnWm5WdVkzUnBiMjRnS0dadUtTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCdWIzUnBabmtnUFNCcGMxTndlVVZ1WVdKc1pXUW9LVHRjYmlBZ0lDQWdJQ0FnZG1GeUlITjBZWEowVkdsdFpUdGNiaUFnSUNBZ0lDQWdhV1lnS0c1dmRHbG1lU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjM1JoY25SVWFXMWxJRDBnUkdGMFpTNXViM2NvS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSE53ZVZKbGNHOXlkRk4wWVhKMEtIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZZbXBsWTNRNklIUm9hWE1zWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEhsd1pUb2dYQ0p5WldGamRHbHZibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdadU9pQm1ibHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZEdocGN5NWZhWE5TZFc1dWFXNW5JRDBnZEhKMVpUdGNiaUFnSUNBZ0lDQWdkSEpoWTJ0RVpYSnBkbVZrUm5WdVkzUnBiMjRvZEdocGN5d2dabTRwTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbDlwYzFKMWJtNXBibWNnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NWZhWE5VY21GamExQmxibVJwYm1jZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdWFYTkVhWE53YjNObFpDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1kyeGxZWEpQWW5ObGNuWnBibWNvZEdocGN5azdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnYVdZZ0tHNXZkR2xtZVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYzNCNVVtVndiM0owUlc1a0tIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhVzFsT2lCRVlYUmxMbTV2ZHlncElDMGdjM1JoY25SVWFXMWxYRzRnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lIMDdYRzRnSUNBZ1VtVmhZM1JwYjI0dWNISnZkRzkwZVhCbExtUnBjM0J2YzJVZ1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDZ2hkR2hwY3k1cGMwUnBjM0J2YzJWa0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbWx6UkdsemNHOXpaV1FnUFNCMGNuVmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0YwYUdsekxsOXBjMUoxYm01cGJtY3BYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMnhsWVhKUFluTmxjblpwYm1jb2RHaHBjeWs3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5TzF4dUlDQWdJRkpsWVdOMGFXOXVMbkJ5YjNSdmRIbHdaUzVuWlhSRWFYTndiM05sY2lBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlISWdQU0IwYUdsekxtUnBjM0J2YzJVdVltbHVaQ2gwYUdsektUdGNiaUFnSUNBZ0lDQWdjaTRrYlc5aWVDQTlJSFJvYVhNN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCeU8xeHVJQ0FnSUgwN1hHNGdJQ0FnVW1WaFkzUnBiMjR1Y0hKdmRHOTBlWEJsTG5SdlUzUnlhVzVuSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdYQ0pTWldGamRHbHZibHRjSWlBcklIUm9hWE11Ym1GdFpTQXJJRndpWFZ3aU8xeHVJQ0FnSUgwN1hHNGdJQ0FnVW1WaFkzUnBiMjR1Y0hKdmRHOTBlWEJsTG5kb2VWSjFiaUE5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUc5aWMyVnlkbWx1WnlBOUlIVnVhWEYxWlNoMGFHbHpMbTlpYzJWeWRtbHVaeWt1YldGd0tHWjFibU4wYVc5dUlDaGtaWEFwSUhzZ2NtVjBkWEp1SUdSbGNDNXVZVzFsT3lCOUtUdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlDaGNJbHhjYmxkb2VWSjFiajhnY21WaFkzUnBiMjRnSjF3aUlDc2dkR2hwY3k1dVlXMWxJQ3NnWENJbk9seGNiaUFxSUZOMFlYUjFjem9nVzF3aUlDc2dLSFJvYVhNdWFYTkVhWE53YjNObFpDQS9JRndpYzNSdmNIQmxaRndpSURvZ2RHaHBjeTVmYVhOU2RXNXVhVzVuSUQ4Z1hDSnlkVzV1YVc1blhDSWdPaUIwYUdsekxtbHpVMk5vWldSMWJHVmtLQ2tnUHlCY0luTmphR1ZrZFd4bFpGd2lJRG9nWENKcFpHeGxYQ0lwSUNzZ1hDSmRYRnh1SUNvZ1ZHaHBjeUJ5WldGamRHbHZiaUIzYVd4c0lISmxMWEoxYmlCcFppQmhibmtnYjJZZ2RHaGxJR1p2Ykd4dmQybHVaeUJ2WW5ObGNuWmhZbXhsY3lCamFHRnVaMlZ6T2x4Y2JpQWdJQ0JjSWlBcklHcHZhVzVUZEhKcGJtZHpLRzlpYzJWeWRtbHVaeWtnS3lCY0lseGNiaUFnSUNCY0lpQXJJQ2dvZEdocGN5NWZhWE5TZFc1dWFXNW5LU0EvSUZ3aUlDZ3VMaTRnYjNJZ1lXNTVJRzlpYzJWeWRtRmliR1VnWVdOalpYTnpaV1FnWkhWeWFXNW5JSFJvWlNCeVpXMWhhVzVrWlhJZ2IyWWdkR2hsSUdOMWNuSmxiblFnY25WdUtWd2lJRG9nWENKY0lpa2dLeUJjSWx4Y2JseGNkRTFwYzNOcGJtY2dhWFJsYlhNZ2FXNGdkR2hwY3lCc2FYTjBQMXhjYmx4Y2RDQWdNUzRnUTJobFkyc2dkMmhsZEdobGNpQmhiR3dnZFhObFpDQjJZV3gxWlhNZ1lYSmxJSEJ5YjNCbGNteDVJRzFoY210bFpDQmhjeUJ2WW5ObGNuWmhZbXhsSUNoMWMyVWdhWE5QWW5ObGNuWmhZbXhsSUhSdklIWmxjbWxtZVNsY1hHNWNYSFFnSURJdUlFMWhhMlVnYzNWeVpTQjViM1VnWkdsa2JpZDBJR1JsY21WbVpYSmxibU5sSUhaaGJIVmxjeUIwYjI4Z1pXRnliSGt1SUUxdllsZ2diMkp6WlhKMlpYTWdjSEp2Y0hNc0lHNXZkQ0J3Y21sdGFYUnBkbVZ6TGlCRkxtYzZJSFZ6WlNBbmNHVnljMjl1TG01aGJXVW5JR2x1YzNSbFlXUWdiMllnSjI1aGJXVW5JR2x1SUhsdmRYSWdZMjl0Y0hWMFlYUnBiMjR1WEZ4dVhDSXBPMXh1SUNBZ0lIMDdYRzRnSUNBZ2NtVjBkWEp1SUZKbFlXTjBhVzl1TzF4dWZTZ3BLVHRjYm1WNGNHOXlkSE11VW1WaFkzUnBiMjRnUFNCU1pXRmpkR2x2Ymp0Y2JuWmhjaUJOUVZoZlVrVkJRMVJKVDA1ZlNWUkZVa0ZVU1U5T1V5QTlJREV3TUR0Y2JtWjFibU4wYVc5dUlISjFibEpsWVdOMGFXOXVjeWdwSUh0Y2JpQWdJQ0JwWmlBb1oyeHZZbUZzVTNSaGRHVXVhWE5TZFc1dWFXNW5VbVZoWTNScGIyNXpJRDA5UFNCMGNuVmxJSHg4SUdkc2IySmhiRk4wWVhSbExtbHVWSEpoYm5OaFkzUnBiMjRnUGlBd0tWeHVJQ0FnSUNBZ0lDQnlaWFIxY200N1hHNGdJQ0FnWjJ4dlltRnNVM1JoZEdVdWFYTlNkVzV1YVc1blVtVmhZM1JwYjI1eklEMGdkSEoxWlR0Y2JpQWdJQ0IyWVhJZ1lXeHNVbVZoWTNScGIyNXpJRDBnWjJ4dlltRnNVM1JoZEdVdWNHVnVaR2x1WjFKbFlXTjBhVzl1Y3p0Y2JpQWdJQ0IyWVhJZ2FYUmxjbUYwYVc5dWN5QTlJREE3WEc0Z0lDQWdkMmhwYkdVZ0tHRnNiRkpsWVdOMGFXOXVjeTVzWlc1bmRHZ2dQaUF3S1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2dySzJsMFpYSmhkR2x2Ym5NZ1BUMDlJRTFCV0Y5U1JVRkRWRWxQVGw5SlZFVlNRVlJKVDA1VEtWeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLRndpVW1WaFkzUnBiMjRnWkc5bGMyNG5kQ0JqYjI1MlpYSm5aU0IwYnlCaElITjBZV0pzWlNCemRHRjBaUzRnVUhKdlltRmliSGtnZEdobGNtVWdhWE1nWVNCamVXTnNaU0JwYmlCMGFHVWdjbVZoWTNScGRtVWdablZ1WTNScGIyNDZJRndpSUNzZ1lXeHNVbVZoWTNScGIyNXpXekJkTG5SdlUzUnlhVzVuS0NrcE8xeHVJQ0FnSUNBZ0lDQjJZWElnY21WdFlXbHVhVzVuVW1WaFkzUnBiMjV6SUQwZ1lXeHNVbVZoWTNScGIyNXpMbk53YkdsalpTZ3dLVHRjYmlBZ0lDQWdJQ0FnWm05eUlDaDJZWElnYVNBOUlEQXNJR3dnUFNCeVpXMWhhVzVwYm1kU1pXRmpkR2x2Ym5NdWJHVnVaM1JvT3lCcElEd2diRHNnYVNzcktWeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WdFlXbHVhVzVuVW1WaFkzUnBiMjV6VzJsZExuSjFibEpsWVdOMGFXOXVLQ2s3WEc0Z0lDQWdmVnh1SUNBZ0lHZHNiMkpoYkZOMFlYUmxMbWx6VW5WdWJtbHVaMUpsWVdOMGFXOXVjeUE5SUdaaGJITmxPMXh1ZlZ4dWRtRnlJSE53ZVVWdVlXSnNaV1FnUFNCbVlXeHpaVHRjYm1aMWJtTjBhVzl1SUdselUzQjVSVzVoWW14bFpDZ3BJSHRjYmlBZ0lDQnlaWFIxY200Z2MzQjVSVzVoWW14bFpEdGNibjFjYm1aMWJtTjBhVzl1SUhOd2VWSmxjRzl5ZENobGRtVnVkQ2tnZTF4dUlDQWdJR2xtSUNnaGMzQjVSVzVoWW14bFpDbGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHWmhiSE5sTzF4dUlDQWdJSFpoY2lCc2FYTjBaVzVsY25NZ1BTQm5iRzlpWVd4VGRHRjBaUzV6Y0hsTWFYTjBaVzVsY25NN1hHNGdJQ0FnWm05eUlDaDJZWElnYVNBOUlEQXNJR3dnUFNCc2FYTjBaVzVsY25NdWJHVnVaM1JvT3lCcElEd2diRHNnYVNzcktWeHVJQ0FnSUNBZ0lDQnNhWE4wWlc1bGNuTmJhVjBvWlhabGJuUXBPMXh1ZlZ4dVpuVnVZM1JwYjI0Z2MzQjVVbVZ3YjNKMFUzUmhjblFvWlhabGJuUXBJSHRjYmlBZ0lDQjJZWElnWTJoaGJtZGxJRDBnYjJKcVpXTjBRWE56YVdkdUtIdDlMQ0JsZG1WdWRDd2dleUJ6Y0hsU1pYQnZjblJUZEdGeWREb2dkSEoxWlNCOUtUdGNiaUFnSUNCemNIbFNaWEJ2Y25Rb1kyaGhibWRsS1R0Y2JuMWNiblpoY2lCRlRrUmZSVlpGVGxRZ1BTQjdJSE53ZVZKbGNHOXlkRVZ1WkRvZ2RISjFaU0I5TzF4dVpuVnVZM1JwYjI0Z2MzQjVVbVZ3YjNKMFJXNWtLR05vWVc1blpTa2dlMXh1SUNBZ0lHbG1JQ2hqYUdGdVoyVXBYRzRnSUNBZ0lDQWdJSE53ZVZKbGNHOXlkQ2h2WW1wbFkzUkJjM05wWjI0b2UzMHNJR05vWVc1blpTd2dSVTVFWDBWV1JVNVVLU2s3WEc0Z0lDQWdaV3h6WlZ4dUlDQWdJQ0FnSUNCemNIbFNaWEJ2Y25Rb1JVNUVYMFZXUlU1VUtUdGNibjFjYm1aMWJtTjBhVzl1SUhOd2VTaHNhWE4wWlc1bGNpa2dlMXh1SUNBZ0lHZHNiMkpoYkZOMFlYUmxMbk53ZVV4cGMzUmxibVZ5Y3k1d2RYTm9LR3hwYzNSbGJtVnlLVHRjYmlBZ0lDQnpjSGxGYm1GaWJHVmtJRDBnWjJ4dlltRnNVM1JoZEdVdWMzQjVUR2x6ZEdWdVpYSnpMbXhsYm1kMGFDQStJREE3WEc0Z0lDQWdjbVYwZFhKdUlHOXVZMlVvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnYVdSNElEMGdaMnh2WW1Gc1UzUmhkR1V1YzNCNVRHbHpkR1Z1WlhKekxtbHVaR1Y0VDJZb2JHbHpkR1Z1WlhJcE8xeHVJQ0FnSUNBZ0lDQnBaaUFvYVdSNElDRTlQU0F0TVNsY2JpQWdJQ0FnSUNBZ0lDQWdJR2RzYjJKaGJGTjBZWFJsTG5Od2VVeHBjM1JsYm1WeWN5NXpjR3hwWTJVb2FXUjRMQ0F4S1R0Y2JpQWdJQ0FnSUNBZ2MzQjVSVzVoWW14bFpDQTlJR2RzYjJKaGJGTjBZWFJsTG5Od2VVeHBjM1JsYm1WeWN5NXNaVzVuZEdnZ1BpQXdPMXh1SUNBZ0lIMHBPMXh1ZlZ4dVpYaHdiM0owY3k1emNIa2dQU0J6Y0hrN1hHNW1kVzVqZEdsdmJpQjBjbUZqYTFSeVlXNXphWFJwYjI1ektHOXVVbVZ3YjNKMEtTQjdYRzRnSUNBZ1pHVndjbVZqWVhSbFpDaGNJblJ5WVdOclZISmhibk5wZEdsdmJuTWdhWE1nWkdWd2NtVmpZWFJsWkM0Z1ZYTmxJRzF2WW5ndWMzQjVJR2x1YzNSbFlXUmNJaWs3WEc0Z0lDQWdhV1lnS0hSNWNHVnZaaUJ2YmxKbGNHOXlkQ0E5UFQwZ1hDSmliMjlzWldGdVhDSXBJSHRjYmlBZ0lDQWdJQ0FnWkdWd2NtVmpZWFJsWkNoY0luUnlZV05yVkhKaGJuTnBkR2x2Ym5NZ2IyNXNlU0IwWVd0bGN5QmhJSE5wYm1kc1pTQmpZV3hzWW1GamF5Qm1kVzVqZEdsdmJpNGdTV1lnZVc5MUlHRnlaU0IxYzJsdVp5QjBhR1VnYlc5aWVDMXlaV0ZqZEMxa1pYWjBiMjlzY3l3Z2NHeGxZWE5sSUhWd1pHRjBaU0IwYUdWdElHWnBjbk4wWENJcE8xeHVJQ0FnSUNBZ0lDQnZibEpsY0c5eWRDQTlJR0Z5WjNWdFpXNTBjMXN4WFR0Y2JpQWdJQ0I5WEc0Z0lDQWdhV1lnS0NGdmJsSmxjRzl5ZENrZ2UxeHVJQ0FnSUNBZ0lDQmtaWEJ5WldOaGRHVmtLRndpZEhKaFkydFVjbUZ1YzJsMGFXOXVjeUIzYVhSb2IzVjBJR05oYkd4aVlXTnJJR2hoY3lCaVpXVnVJR1JsY0hKbFkyRjBaV1FnWVc1a0lHbHpJR0VnYm04dGIzQWdibTkzTGlCSlppQjViM1VnWVhKbElIVnphVzVuSUhSb1pTQnRiMko0TFhKbFlXTjBMV1JsZG5SdmIyeHpMQ0J3YkdWaGMyVWdkWEJrWVhSbElIUm9aVzBnWm1seWMzUmNJaWs3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJtZFc1amRHbHZiaUFvS1NCN0lIMDdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJ6Y0hrb2IyNVNaWEJ2Y25RcE8xeHVmVnh1Wm5WdVkzUnBiMjRnZEhKaGJuTmhZM1JwYjI0b1lXTjBhVzl1TENCMGFHbHpRWEpuTENCeVpYQnZjblFwSUh0Y2JpQWdJQ0JwWmlBb2RHaHBjMEZ5WnlBOVBUMGdkbTlwWkNBd0tTQjdJSFJvYVhOQmNtY2dQU0IxYm1SbFptbHVaV1E3SUgxY2JpQWdJQ0JwWmlBb2NtVndiM0owSUQwOVBTQjJiMmxrSURBcElIc2djbVZ3YjNKMElEMGdkSEoxWlRzZ2ZWeHVJQ0FnSUhSeVlXNXpZV04wYVc5dVUzUmhjblFvS0dGamRHbHZiaTV1WVcxbEtTQjhmQ0JjSW1GdWIyNTViVzkxY3lCMGNtRnVjMkZqZEdsdmJsd2lMQ0IwYUdselFYSm5MQ0J5WlhCdmNuUXBPMXh1SUNBZ0lIWmhjaUJ5WlhNZ1BTQmhZM1JwYjI0dVkyRnNiQ2gwYUdselFYSm5LVHRjYmlBZ0lDQjBjbUZ1YzJGamRHbHZia1Z1WkNoeVpYQnZjblFwTzF4dUlDQWdJSEpsZEhWeWJpQnlaWE03WEc1OVhHNWxlSEJ2Y25SekxuUnlZVzV6WVdOMGFXOXVJRDBnZEhKaGJuTmhZM1JwYjI0N1hHNW1kVzVqZEdsdmJpQjBjbUZ1YzJGamRHbHZibE4wWVhKMEtHNWhiV1VzSUhSb2FYTkJjbWNzSUhKbGNHOXlkQ2tnZTF4dUlDQWdJR2xtSUNoMGFHbHpRWEpuSUQwOVBTQjJiMmxrSURBcElIc2dkR2hwYzBGeVp5QTlJSFZ1WkdWbWFXNWxaRHNnZlZ4dUlDQWdJR2xtSUNoeVpYQnZjblFnUFQwOUlIWnZhV1FnTUNrZ2V5QnlaWEJ2Y25RZ1BTQjBjblZsT3lCOVhHNGdJQ0FnWjJ4dlltRnNVM1JoZEdVdWFXNVVjbUZ1YzJGamRHbHZiaUFyUFNBeE8xeHVJQ0FnSUdsbUlDaHlaWEJ2Y25RZ0ppWWdhWE5UY0hsRmJtRmliR1ZrS0NrcElIdGNiaUFnSUNBZ0lDQWdjM0I1VW1Wd2IzSjBVM1JoY25Rb2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZEhsd1pUb2dYQ0owY21GdWMyRmpkR2x2Ymx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdGeVoyVjBPaUIwYUdselFYSm5MRnh1SUNBZ0lDQWdJQ0FnSUNBZ2JtRnRaVG9nYm1GdFpWeHVJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQjlYRzU5WEc1bWRXNWpkR2x2YmlCMGNtRnVjMkZqZEdsdmJrVnVaQ2h5WlhCdmNuUXBJSHRjYmlBZ0lDQnBaaUFvY21Wd2IzSjBJRDA5UFNCMmIybGtJREFwSUhzZ2NtVndiM0owSUQwZ2RISjFaVHNnZlZ4dUlDQWdJR2xtSUNndExXZHNiMkpoYkZOMFlYUmxMbWx1VkhKaGJuTmhZM1JwYjI0Z1BUMDlJREFwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJSFpoYkhWbGN5QTlJR2RzYjJKaGJGTjBZWFJsTG1Ob1lXNW5aV1JCZEc5dGN5NXpjR3hwWTJVb01DazdYRzRnSUNBZ0lDQWdJR1p2Y2lBb2RtRnlJR2tnUFNBd0xDQnNJRDBnZG1Gc2RXVnpMbXhsYm1kMGFEc2dhU0E4SUd3N0lHa3JLeWxjYmlBZ0lDQWdJQ0FnSUNBZ0lIQnliM0JoWjJGMFpVRjBiMjFTWldGa2VTaDJZV3gxWlhOYmFWMHBPMXh1SUNBZ0lDQWdJQ0J5ZFc1U1pXRmpkR2x2Ym5Nb0tUdGNiaUFnSUNCOVhHNGdJQ0FnYVdZZ0tISmxjRzl5ZENBbUppQnBjMU53ZVVWdVlXSnNaV1FvS1NsY2JpQWdJQ0FnSUNBZ2MzQjVVbVZ3YjNKMFJXNWtLQ2s3WEc1OVhHNW1kVzVqZEdsdmJpQm9ZWE5KYm5SbGNtTmxjSFJ2Y25Nb2FXNTBaWEpqWlhCMFlXSnNaU2tnZTF4dUlDQWdJSEpsZEhWeWJpQW9hVzUwWlhKalpYQjBZV0pzWlM1cGJuUmxjbU5sY0hSdmNuTWdKaVlnYVc1MFpYSmpaWEIwWVdKc1pTNXBiblJsY21ObGNIUnZjbk11YkdWdVozUm9JRDRnTUNrN1hHNTlYRzVtZFc1amRHbHZiaUJ5WldkcGMzUmxja2x1ZEdWeVkyVndkRzl5S0dsdWRHVnlZMlZ3ZEdGaWJHVXNJR2hoYm1Sc1pYSXBJSHRjYmlBZ0lDQjJZWElnYVc1MFpYSmpaWEIwYjNKeklEMGdhVzUwWlhKalpYQjBZV0pzWlM1cGJuUmxjbU5sY0hSdmNuTWdmSHdnS0dsdWRHVnlZMlZ3ZEdGaWJHVXVhVzUwWlhKalpYQjBiM0p6SUQwZ1cxMHBPMXh1SUNBZ0lHbHVkR1Z5WTJWd2RHOXljeTV3ZFhOb0tHaGhibVJzWlhJcE8xeHVJQ0FnSUhKbGRIVnliaUJ2Ym1ObEtHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHbGtlQ0E5SUdsdWRHVnlZMlZ3ZEc5eWN5NXBibVJsZUU5bUtHaGhibVJzWlhJcE8xeHVJQ0FnSUNBZ0lDQnBaaUFvYVdSNElDRTlQU0F0TVNsY2JpQWdJQ0FnSUNBZ0lDQWdJR2x1ZEdWeVkyVndkRzl5Y3k1emNHeHBZMlVvYVdSNExDQXhLVHRjYmlBZ0lDQjlLVHRjYm4xY2JtWjFibU4wYVc5dUlHbHVkR1Z5WTJWd2RFTm9ZVzVuWlNocGJuUmxjbU5sY0hSaFlteGxMQ0JqYUdGdVoyVXBJSHRjYmlBZ0lDQjJZWElnY0hKbGRsVWdQU0IxYm5SeVlXTnJaV1JUZEdGeWRDZ3BPMXh1SUNBZ0lIWmhjaUJwYm5SbGNtTmxjSFJ2Y25NZ1BTQnBiblJsY21ObGNIUmhZbXhsTG1sdWRHVnlZMlZ3ZEc5eWN6dGNiaUFnSUNCbWIzSWdLSFpoY2lCcElEMGdNQ3dnYkNBOUlHbHVkR1Z5WTJWd2RHOXljeTVzWlc1bmRHZzdJR2tnUENCc095QnBLeXNwSUh0Y2JpQWdJQ0FnSUNBZ1kyaGhibWRsSUQwZ2FXNTBaWEpqWlhCMGIzSnpXMmxkS0dOb1lXNW5aU2s3WEc0Z0lDQWdJQ0FnSUdsdWRtRnlhV0Z1ZENnaFkyaGhibWRsSUh4OElHTm9ZVzVuWlM1MGVYQmxMQ0JjSWtsdWRHVnlZMlZ3ZENCb1lXNWtiR1Z5Y3lCemFHOTFiR1FnY21WMGRYSnVJRzV2ZEdocGJtY2diM0lnWVNCamFHRnVaMlVnYjJKcVpXTjBYQ0lwTzF4dUlDQWdJQ0FnSUNCcFppQW9JV05vWVc1blpTbGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ1ZFd4c08xeHVJQ0FnSUgxY2JpQWdJQ0IxYm5SeVlXTnJaV1JGYm1Rb2NISmxkbFVwTzF4dUlDQWdJSEpsZEhWeWJpQmphR0Z1WjJVN1hHNTlYRzVtZFc1amRHbHZiaUJvWVhOTWFYTjBaVzVsY25Nb2JHbHpkR1Z1WVdKc1pTa2dlMXh1SUNBZ0lISmxkSFZ5YmlCc2FYTjBaVzVoWW14bExtTm9ZVzVuWlV4cGMzUmxibVZ5Y3lBbUppQnNhWE4wWlc1aFlteGxMbU5vWVc1blpVeHBjM1JsYm1WeWN5NXNaVzVuZEdnZ1BpQXdPMXh1ZlZ4dVpuVnVZM1JwYjI0Z2NtVm5hWE4wWlhKTWFYTjBaVzVsY2loc2FYTjBaVzVoWW14bExDQm9ZVzVrYkdWeUtTQjdYRzRnSUNBZ2RtRnlJR3hwYzNSbGJtVnljeUE5SUd4cGMzUmxibUZpYkdVdVkyaGhibWRsVEdsemRHVnVaWEp6SUh4OElDaHNhWE4wWlc1aFlteGxMbU5vWVc1blpVeHBjM1JsYm1WeWN5QTlJRnRkS1R0Y2JpQWdJQ0JzYVhOMFpXNWxjbk11Y0hWemFDaG9ZVzVrYkdWeUtUdGNiaUFnSUNCeVpYUjFjbTRnYjI1alpTaG1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQnBaSGdnUFNCc2FYTjBaVzVsY25NdWFXNWtaWGhQWmlob1lXNWtiR1Z5S1R0Y2JpQWdJQ0FnSUNBZ2FXWWdLR2xrZUNBaFBUMGdMVEVwWEc0Z0lDQWdJQ0FnSUNBZ0lDQnNhWE4wWlc1bGNuTXVjM0JzYVdObEtHbGtlQ3dnTVNrN1hHNGdJQ0FnZlNrN1hHNTlYRzVtZFc1amRHbHZiaUJ1YjNScFpubE1hWE4wWlc1bGNuTW9iR2x6ZEdWdVlXSnNaU3dnWTJoaGJtZGxLU0I3WEc0Z0lDQWdkbUZ5SUhCeVpYWlZJRDBnZFc1MGNtRmphMlZrVTNSaGNuUW9LVHRjYmlBZ0lDQjJZWElnYkdsemRHVnVaWEp6SUQwZ2JHbHpkR1Z1WVdKc1pTNWphR0Z1WjJWTWFYTjBaVzVsY25NN1hHNGdJQ0FnYVdZZ0tDRnNhWE4wWlc1bGNuTXBYRzRnSUNBZ0lDQWdJSEpsZEhWeWJqdGNiaUFnSUNCc2FYTjBaVzVsY25NZ1BTQnNhWE4wWlc1bGNuTXVjMnhwWTJVb0tUdGNiaUFnSUNCbWIzSWdLSFpoY2lCcElEMGdNQ3dnYkNBOUlHeHBjM1JsYm1WeWN5NXNaVzVuZEdnN0lHa2dQQ0JzT3lCcEt5c3BJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tFRnljbUY1TG1selFYSnlZWGtvWTJoaGJtZGxLU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdiR2x6ZEdWdVpYSnpXMmxkTG1Gd2NHeDVLRzUxYkd3c0lHTm9ZVzVuWlNrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JzYVhOMFpXNWxjbk5iYVYwb1kyaGhibWRsS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0IxYm5SeVlXTnJaV1JGYm1Rb2NISmxkbFVwTzF4dWZWeHVkbUZ5SUZaaGJIVmxUVzlrWlR0Y2JpaG1kVzVqZEdsdmJpQW9WbUZzZFdWTmIyUmxLU0I3WEc0Z0lDQWdWbUZzZFdWTmIyUmxXMVpoYkhWbFRXOWtaVnRjSWxKbFkzVnljMmwyWlZ3aVhTQTlJREJkSUQwZ1hDSlNaV04xY25OcGRtVmNJanRjYmlBZ0lDQldZV3gxWlUxdlpHVmJWbUZzZFdWTmIyUmxXMXdpVW1WbVpYSmxibU5sWENKZElEMGdNVjBnUFNCY0lsSmxabVZ5Wlc1alpWd2lPMXh1SUNBZ0lGWmhiSFZsVFc5a1pWdFdZV3gxWlUxdlpHVmJYQ0pUZEhKMVkzUjFjbVZjSWwwZ1BTQXlYU0E5SUZ3aVUzUnlkV04wZFhKbFhDSTdYRzRnSUNBZ1ZtRnNkV1ZOYjJSbFcxWmhiSFZsVFc5a1pWdGNJa1pzWVhSY0lsMGdQU0F6WFNBOUlGd2lSbXhoZEZ3aU8xeHVmU2tvVm1Gc2RXVk5iMlJsSUh4OElDaFdZV3gxWlUxdlpHVWdQU0I3ZlNrcE8xeHVablZ1WTNScGIyNGdZWE5TWldabGNtVnVZMlVvZG1Gc2RXVXBJSHRjYmlBZ0lDQnlaWFIxY200Z2JtVjNJRUZ6VW1WbVpYSmxibU5sS0haaGJIVmxLVHRjYm4xY2JtVjRjRzl5ZEhNdVlYTlNaV1psY21WdVkyVWdQU0JoYzFKbFptVnlaVzVqWlR0Y2JtWjFibU4wYVc5dUlHRnpVM1J5ZFdOMGRYSmxLSFpoYkhWbEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUc1bGR5QkJjMU4wY25WamRIVnlaU2gyWVd4MVpTazdYRzU5WEc1bGVIQnZjblJ6TG1GelUzUnlkV04wZFhKbElEMGdZWE5UZEhKMVkzUjFjbVU3WEc1bWRXNWpkR2x2YmlCaGMwWnNZWFFvZG1Gc2RXVXBJSHRjYmlBZ0lDQnlaWFIxY200Z2JtVjNJRUZ6Um14aGRDaDJZV3gxWlNrN1hHNTlYRzVsZUhCdmNuUnpMbUZ6Um14aGRDQTlJR0Z6Um14aGREdGNiblpoY2lCQmMxSmxabVZ5Wlc1alpTQTlJQ2htZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnWm5WdVkzUnBiMjRnUVhOU1pXWmxjbVZ1WTJVb2RtRnNkV1VwSUh0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTUyWVd4MVpTQTlJSFpoYkhWbE8xeHVJQ0FnSUNBZ0lDQmhjM05sY25SVmJuZHlZWEJ3WldRb2RtRnNkV1VzSUZ3aVRXOWthV1pwWlhKeklHRnlaU0J1YjNRZ1lXeHNiM2RsWkNCMGJ5QmlaU0J1WlhOMFpXUmNJaWs3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCQmMxSmxabVZ5Wlc1alpUdGNibjBvS1NrN1hHNTJZWElnUVhOVGRISjFZM1IxY21VZ1BTQW9ablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJR1oxYm1OMGFXOXVJRUZ6VTNSeWRXTjBkWEpsS0haaGJIVmxLU0I3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVkbUZzZFdVZ1BTQjJZV3gxWlR0Y2JpQWdJQ0FnSUNBZ1lYTnpaWEowVlc1M2NtRndjR1ZrS0haaGJIVmxMQ0JjSWsxdlpHbG1hV1Z5Y3lCaGNtVWdibTkwSUdGc2JHOTNaV1FnZEc4Z1ltVWdibVZ6ZEdWa1hDSXBPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnUVhOVGRISjFZM1IxY21VN1hHNTlLQ2twTzF4dWRtRnlJRUZ6Um14aGRDQTlJQ2htZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnWm5WdVkzUnBiMjRnUVhOR2JHRjBLSFpoYkhWbEtTQjdYRzRnSUNBZ0lDQWdJSFJvYVhNdWRtRnNkV1VnUFNCMllXeDFaVHRjYmlBZ0lDQWdJQ0FnWVhOelpYSjBWVzUzY21Gd2NHVmtLSFpoYkhWbExDQmNJazF2WkdsbWFXVnljeUJoY21VZ2JtOTBJR0ZzYkc5M1pXUWdkRzhnWW1VZ2JtVnpkR1ZrWENJcE8xeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdRWE5HYkdGME8xeHVmU2dwS1R0Y2JtWjFibU4wYVc5dUlHRnpUV0Z3S0dSaGRHRXNJRzF2WkdsbWFXVnlSblZ1WXlrZ2UxeHVJQ0FnSUhKbGRIVnliaUJ0WVhBb1pHRjBZU3dnYlc5a2FXWnBaWEpHZFc1aktUdGNibjFjYm1WNGNHOXlkSE11WVhOTllYQWdQU0JoYzAxaGNEdGNibVoxYm1OMGFXOXVJR2RsZEZaaGJIVmxUVzlrWlVaeWIyMVdZV3gxWlNoMllXeDFaU3dnWkdWbVlYVnNkRTF2WkdVcElIdGNiaUFnSUNCcFppQW9kbUZzZFdVZ2FXNXpkR0Z1WTJWdlppQkJjMUpsWm1WeVpXNWpaU2xjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRnRXWVd4MVpVMXZaR1V1VW1WbVpYSmxibU5sTENCMllXeDFaUzUyWVd4MVpWMDdYRzRnSUNBZ2FXWWdLSFpoYkhWbElHbHVjM1JoYm1ObGIyWWdRWE5UZEhKMVkzUjFjbVVwWEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJiVm1Gc2RXVk5iMlJsTGxOMGNuVmpkSFZ5WlN3Z2RtRnNkV1V1ZG1Gc2RXVmRPMXh1SUNBZ0lHbG1JQ2gyWVd4MVpTQnBibk4wWVc1alpXOW1JRUZ6Um14aGRDbGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlGdFdZV3gxWlUxdlpHVXVSbXhoZEN3Z2RtRnNkV1V1ZG1Gc2RXVmRPMXh1SUNBZ0lISmxkSFZ5YmlCYlpHVm1ZWFZzZEUxdlpHVXNJSFpoYkhWbFhUdGNibjFjYm1aMWJtTjBhVzl1SUdkbGRGWmhiSFZsVFc5a1pVWnliMjFOYjJScFptbGxja1oxYm1Nb1puVnVZeWtnZTF4dUlDQWdJR2xtSUNobWRXNWpJRDA5UFNCaGMxSmxabVZ5Wlc1alpTbGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlGWmhiSFZsVFc5a1pTNVNaV1psY21WdVkyVTdYRzRnSUNBZ1pXeHpaU0JwWmlBb1puVnVZeUE5UFQwZ1lYTlRkSEoxWTNSMWNtVXBYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQldZV3gxWlUxdlpHVXVVM1J5ZFdOMGRYSmxPMXh1SUNBZ0lHVnNjMlVnYVdZZ0tHWjFibU1nUFQwOUlHRnpSbXhoZENsY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUZaaGJIVmxUVzlrWlM1R2JHRjBPMXh1SUNBZ0lHbHVkbUZ5YVdGdWRDaG1kVzVqSUQwOVBTQjFibVJsWm1sdVpXUXNJRndpUTJGdWJtOTBJR1JsZEdWeWJXbHVaU0IyWVd4MVpTQnRiMlJsSUdaeWIyMGdablZ1WTNScGIyNHVJRkJzWldGelpTQndZWE56SUdsdUlHOXVaU0J2WmlCMGFHVnpaVG9nYlc5aWVDNWhjMUpsWm1WeVpXNWpaU3dnYlc5aWVDNWhjMU4wY25WamRIVnlaU0J2Y2lCdGIySjRMbUZ6Um14aGRDd2daMjkwT2lCY0lpQXJJR1oxYm1NcE8xeHVJQ0FnSUhKbGRIVnliaUJXWVd4MVpVMXZaR1V1VW1WamRYSnphWFpsTzF4dWZWeHVablZ1WTNScGIyNGdiV0ZyWlVOb2FXeGtUMkp6WlhKMllXSnNaU2gyWVd4MVpTd2djR0Z5Wlc1MFRXOWtaU3dnYm1GdFpTa2dlMXh1SUNBZ0lIWmhjaUJqYUdsc1pFMXZaR1U3WEc0Z0lDQWdhV1lnS0dselQySnpaWEoyWVdKc1pTaDJZV3gxWlNrcFhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMllXeDFaVHRjYmlBZ0lDQnpkMmwwWTJnZ0tIQmhjbVZ1ZEUxdlpHVXBJSHRjYmlBZ0lDQWdJQ0FnWTJGelpTQldZV3gxWlUxdlpHVXVVbVZtWlhKbGJtTmxPbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhaaGJIVmxPMXh1SUNBZ0lDQWdJQ0JqWVhObElGWmhiSFZsVFc5a1pTNUdiR0YwT2x4dUlDQWdJQ0FnSUNBZ0lDQWdZWE56WlhKMFZXNTNjbUZ3Y0dWa0tIWmhiSFZsTENCY0lrbDBaVzF6SUdsdWMybGtaU0FuWVhOR2JHRjBKeUJqWVc1dWIzUWdhR0YyWlNCdGIyUnBabWxsY25OY0lpazdYRzRnSUNBZ0lDQWdJQ0FnSUNCamFHbHNaRTF2WkdVZ1BTQldZV3gxWlUxdlpHVXVVbVZtWlhKbGJtTmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ1luSmxZV3M3WEc0Z0lDQWdJQ0FnSUdOaGMyVWdWbUZzZFdWTmIyUmxMbE4wY25WamRIVnlaVHBjYmlBZ0lDQWdJQ0FnSUNBZ0lHRnpjMlZ5ZEZWdWQzSmhjSEJsWkNoMllXeDFaU3dnWENKSmRHVnRjeUJwYm5OcFpHVWdKMkZ6VTNSeWRXTjBkWEpsSnlCallXNXViM1FnYUdGMlpTQnRiMlJwWm1sbGNuTmNJaWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmphR2xzWkUxdlpHVWdQU0JXWVd4MVpVMXZaR1V1VTNSeWRXTjBkWEpsTzF4dUlDQWdJQ0FnSUNBZ0lDQWdZbkpsWVdzN1hHNGdJQ0FnSUNBZ0lHTmhjMlVnVm1Gc2RXVk5iMlJsTGxKbFkzVnljMmwyWlRwY2JpQWdJQ0FnSUNBZ0lDQWdJRjloSUQwZ1oyVjBWbUZzZFdWTmIyUmxSbkp2YlZaaGJIVmxLSFpoYkhWbExDQldZV3gxWlUxdlpHVXVVbVZqZFhKemFYWmxLU3dnWTJocGJHUk5iMlJsSUQwZ1gyRmJNRjBzSUhaaGJIVmxJRDBnWDJGYk1WMDdYRzRnSUNBZ0lDQWdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQWdJQ0FnWkdWbVlYVnNkRHBjYmlBZ0lDQWdJQ0FnSUNBZ0lHbHVkbUZ5YVdGdWRDaG1ZV3h6WlN3Z1hDSkpiR3hsWjJGc0lGTjBZWFJsWENJcE8xeHVJQ0FnSUgxY2JpQWdJQ0JwWmlBb1FYSnlZWGt1YVhOQmNuSmhlU2gyWVd4MVpTa3BYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmpjbVZoZEdWUFluTmxjblpoWW14bFFYSnlZWGtvZG1Gc2RXVXNJR05vYVd4a1RXOWtaU3dnYm1GdFpTazdYRzRnSUNBZ2FXWWdLR2x6VUd4aGFXNVBZbXBsWTNRb2RtRnNkV1VwSUNZbUlFOWlhbVZqZEM1cGMwVjRkR1Z1YzJsaWJHVW9kbUZzZFdVcEtWeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1pYaDBaVzVrVDJKelpYSjJZV0pzWlVobGJIQmxjaWgyWVd4MVpTd2dkbUZzZFdVc0lHTm9hV3hrVFc5a1pTd2dibUZ0WlNrN1hHNGdJQ0FnY21WMGRYSnVJSFpoYkhWbE8xeHVJQ0FnSUhaaGNpQmZZVHRjYm4xY2JtWjFibU4wYVc5dUlHRnpjMlZ5ZEZWdWQzSmhjSEJsWkNoMllXeDFaU3dnYldWemMyRm5aU2tnZTF4dUlDQWdJR2xtSUNoMllXeDFaU0JwYm5OMFlXNWpaVzltSUVGelVtVm1aWEpsYm1ObElIeDhJSFpoYkhWbElHbHVjM1JoYm1ObGIyWWdRWE5UZEhKMVkzUjFjbVVnZkh3Z2RtRnNkV1VnYVc1emRHRnVZMlZ2WmlCQmMwWnNZWFFwWEc0Z0lDQWdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhjSWx0dGIySjRYU0JoYzFOMGNuVmpkSFZ5WlNBdklHRnpVbVZtWlhKbGJtTmxJQzhnWVhOR2JHRjBJR05oYm01dmRDQmlaU0IxYzJWa0lHaGxjbVV1SUZ3aUlDc2diV1Z6YzJGblpTazdYRzU5WEc1MllYSWdjMkZtWVhKcFVISnZkRzkwZVhCbFUyVjBkR1Z5U1c1b1pYSnBkR0Z1WTJWQ2RXY2dQU0FvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUhaaGNpQjJJRDBnWm1Gc2MyVTdYRzRnSUNBZ2RtRnlJSEFnUFNCN2ZUdGNiaUFnSUNCUFltcGxZM1F1WkdWbWFXNWxVSEp2Y0dWeWRIa29jQ3dnWENJd1hDSXNJSHNnYzJWME9pQm1kVzVqZEdsdmJpQW9LU0I3SUhZZ1BTQjBjblZsT3lCOUlIMHBPMXh1SUNBZ0lFOWlhbVZqZEM1amNtVmhkR1VvY0NsYlhDSXdYQ0pkSUQwZ01UdGNiaUFnSUNCeVpYUjFjbTRnZGlBOVBUMGdabUZzYzJVN1hHNTlLU2dwTzF4dWRtRnlJRTlDVTBWU1ZrRkNURVZmUVZKU1FWbGZRbFZHUmtWU1gxTkpXa1VnUFNBd08xeHVkbUZ5SUZOMGRXSkJjbkpoZVNBOUlDaG1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdablZ1WTNScGIyNGdVM1IxWWtGeWNtRjVLQ2tnZTF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z1UzUjFZa0Z5Y21GNU8xeHVmU2dwS1R0Y2JsTjBkV0pCY25KaGVTNXdjbTkwYjNSNWNHVWdQU0JiWFR0Y2JuWmhjaUJQWW5ObGNuWmhZbXhsUVhKeVlYbEJaRzFwYm1semRISmhkR2x2YmlBOUlDaG1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdablZ1WTNScGIyNGdUMkp6WlhKMllXSnNaVUZ5Y21GNVFXUnRhVzVwYzNSeVlYUnBiMjRvYm1GdFpTd2diVzlrWlN3Z1lYSnlZWGtzSUc5M2JtVmtLU0I3WEc0Z0lDQWdJQ0FnSUhSb2FYTXViVzlrWlNBOUlHMXZaR1U3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVZWEp5WVhrZ1BTQmhjbkpoZVR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTV2ZDI1bFpDQTlJRzkzYm1Wa08xeHVJQ0FnSUNBZ0lDQjBhR2x6TG14aGMzUkxibTkzYmt4bGJtZDBhQ0E5SURBN1hHNGdJQ0FnSUNBZ0lIUm9hWE11YVc1MFpYSmpaWEIwYjNKeklEMGdiblZzYkR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVqYUdGdVoyVk1hWE4wWlc1bGNuTWdQU0J1ZFd4c08xeHVJQ0FnSUNBZ0lDQjBhR2x6TG1GMGIyMGdQU0J1WlhjZ1FYUnZiU2h1WVcxbElIeDhJQ2hjSWs5aWMyVnlkbUZpYkdWQmNuSmhlVUJjSWlBcklHZGxkRTVsZUhSSlpDZ3BLU2s3WEc0Z0lDQWdmVnh1SUNBZ0lFOWljMlZ5ZG1GaWJHVkJjbkpoZVVGa2JXbHVhWE4wY21GMGFXOXVMbkJ5YjNSdmRIbHdaUzV0WVd0bFVtVmhZM1JwZG1WQmNuSmhlVWwwWlcwZ1BTQm1kVzVqZEdsdmJpQW9kbUZzZFdVcElIdGNiaUFnSUNBZ0lDQWdZWE56WlhKMFZXNTNjbUZ3Y0dWa0tIWmhiSFZsTENCY0lrRnljbUY1SUhaaGJIVmxjeUJqWVc1dWIzUWdhR0YyWlNCdGIyUnBabWxsY25OY0lpazdYRzRnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbTF2WkdVZ1BUMDlJRlpoYkhWbFRXOWtaUzVHYkdGMElIeDhJSFJvYVhNdWJXOWtaU0E5UFQwZ1ZtRnNkV1ZOYjJSbExsSmxabVZ5Wlc1alpTbGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUIyWVd4MVpUdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHMWhhMlZEYUdsc1pFOWljMlZ5ZG1GaWJHVW9kbUZzZFdVc0lIUm9hWE11Ylc5a1pTd2dkR2hwY3k1aGRHOXRMbTVoYldVZ0t5QmNJbHN1TGwxY0lpazdYRzRnSUNBZ2ZUdGNiaUFnSUNCUFluTmxjblpoWW14bFFYSnlZWGxCWkcxcGJtbHpkSEpoZEdsdmJpNXdjbTkwYjNSNWNHVXVhVzUwWlhKalpYQjBJRDBnWm5WdVkzUnBiMjRnS0doaGJtUnNaWElwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhKbFoybHpkR1Z5U1c1MFpYSmpaWEIwYjNJb2RHaHBjeXdnYUdGdVpHeGxjaWs3WEc0Z0lDQWdmVHRjYmlBZ0lDQlBZbk5sY25aaFlteGxRWEp5WVhsQlpHMXBibWx6ZEhKaGRHbHZiaTV3Y205MGIzUjVjR1V1YjJKelpYSjJaU0E5SUdaMWJtTjBhVzl1SUNoc2FYTjBaVzVsY2l3Z1ptbHlaVWx0YldWa2FXRjBaV3g1S1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2htYVhKbFNXMXRaV1JwWVhSbGJIa2dQVDA5SUhadmFXUWdNQ2tnZXlCbWFYSmxTVzF0WldScFlYUmxiSGtnUFNCbVlXeHpaVHNnZlZ4dUlDQWdJQ0FnSUNCcFppQW9abWx5WlVsdGJXVmthV0YwWld4NUtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCc2FYTjBaVzVsY2loN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IySnFaV04wT2lCMGFHbHpMbUZ5Y21GNUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUjVjR1U2SUZ3aWMzQnNhV05sWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXNWtaWGc2SURBc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1lXUmtaV1E2SUhSb2FYTXVkbUZzZFdWekxuTnNhV05sS0Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1lXUmtaV1JEYjNWdWREb2dkR2hwY3k1MllXeDFaWE11YkdWdVozUm9MRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYlc5MlpXUTZJRnRkTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGJXOTJaV1JEYjNWdWREb2dNRnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSEpsWjJsemRHVnlUR2x6ZEdWdVpYSW9kR2hwY3l3Z2JHbHpkR1Z1WlhJcE8xeHVJQ0FnSUgwN1hHNGdJQ0FnVDJKelpYSjJZV0pzWlVGeWNtRjVRV1J0YVc1cGMzUnlZWFJwYjI0dWNISnZkRzkwZVhCbExtZGxkRUZ5Y21GNVRHVnVaM1JvSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0IwYUdsekxtRjBiMjB1Y21Wd2IzSjBUMkp6WlhKMlpXUW9LVHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWRtRnNkV1Z6TG14bGJtZDBhRHRjYmlBZ0lDQjlPMXh1SUNBZ0lFOWljMlZ5ZG1GaWJHVkJjbkpoZVVGa2JXbHVhWE4wY21GMGFXOXVMbkJ5YjNSdmRIbHdaUzV6WlhSQmNuSmhlVXhsYm1kMGFDQTlJR1oxYm1OMGFXOXVJQ2h1WlhkTVpXNW5kR2dwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLSFI1Y0dWdlppQnVaWGRNWlc1bmRHZ2dJVDA5SUZ3aWJuVnRZbVZ5WENJZ2ZId2dibVYzVEdWdVozUm9JRHdnTUNsY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpaGNJbHR0YjJKNExtRnljbUY1WFNCUGRYUWdiMllnY21GdVoyVTZJRndpSUNzZ2JtVjNUR1Z1WjNSb0tUdGNiaUFnSUNBZ0lDQWdkbUZ5SUdOMWNuSmxiblJNWlc1bmRHZ2dQU0IwYUdsekxuWmhiSFZsY3k1c1pXNW5kR2c3WEc0Z0lDQWdJQ0FnSUdsbUlDaHVaWGRNWlc1bmRHZ2dQVDA5SUdOMWNuSmxiblJNWlc1bmRHZ3BYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTQ3WEc0Z0lDQWdJQ0FnSUdWc2MyVWdhV1lnS0c1bGQweGxibWQwYUNBK0lHTjFjbkpsYm5STVpXNW5kR2dwWEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5Od2JHbGpaVmRwZEdoQmNuSmhlU2hqZFhKeVpXNTBUR1Z1WjNSb0xDQXdMQ0J1WlhjZ1FYSnlZWGtvYm1WM1RHVnVaM1JvSUMwZ1kzVnljbVZ1ZEV4bGJtZDBhQ2twTzF4dUlDQWdJQ0FnSUNCbGJITmxYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk53YkdsalpWZHBkR2hCY25KaGVTaHVaWGRNWlc1bmRHZ3NJR04xY25KbGJuUk1aVzVuZEdnZ0xTQnVaWGRNWlc1bmRHZ3BPMXh1SUNBZ0lIMDdYRzRnSUNBZ1QySnpaWEoyWVdKc1pVRnljbUY1UVdSdGFXNXBjM1J5WVhScGIyNHVjSEp2ZEc5MGVYQmxMblZ3WkdGMFpVRnljbUY1VEdWdVozUm9JRDBnWm5WdVkzUnBiMjRnS0c5c1pFeGxibWQwYUN3Z1pHVnNkR0VwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLRzlzWkV4bGJtZDBhQ0FoUFQwZ2RHaHBjeTVzWVhOMFMyNXZkMjVNWlc1bmRHZ3BYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvWENKYmJXOWllRjBnVFc5a2FXWnBZMkYwYVc5dUlHVjRZMlZ3ZEdsdmJqb2dkR2hsSUdsdWRHVnlibUZzSUhOMGNuVmpkSFZ5WlNCdlppQmhiaUJ2WW5ObGNuWmhZbXhsSUdGeWNtRjVJSGRoY3lCamFHRnVaMlZrTGlCRWFXUWdlVzkxSUhWelpTQndaV1ZyS0NrZ2RHOGdZMmhoYm1kbElHbDBQMXdpS1R0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVzWVhOMFMyNXZkMjVNWlc1bmRHZ2dLejBnWkdWc2RHRTdYRzRnSUNBZ0lDQWdJR2xtSUNoa1pXeDBZU0ErSURBZ0ppWWdiMnhrVEdWdVozUm9JQ3NnWkdWc2RHRWdLeUF4SUQ0Z1QwSlRSVkpXUVVKTVJWOUJVbEpCV1Y5Q1ZVWkdSVkpmVTBsYVJTbGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGMyVnlkbVZCY25KaGVVSjFabVpsY2lodmJHUk1aVzVuZEdnZ0t5QmtaV3gwWVNBcklERXBPMXh1SUNBZ0lIMDdYRzRnSUNBZ1QySnpaWEoyWVdKc1pVRnljbUY1UVdSdGFXNXBjM1J5WVhScGIyNHVjSEp2ZEc5MGVYQmxMbk53YkdsalpWZHBkR2hCY25KaGVTQTlJR1oxYm1OMGFXOXVJQ2hwYm1SbGVDd2daR1ZzWlhSbFEyOTFiblFzSUc1bGQwbDBaVzF6S1NCN1hHNGdJQ0FnSUNBZ0lHTm9aV05yU1daVGRHRjBaVTF2WkdsbWFXTmhkR2x2Ym5OQmNtVkJiR3h2ZDJWa0tDazdYRzRnSUNBZ0lDQWdJSFpoY2lCc1pXNW5kR2dnUFNCMGFHbHpMblpoYkhWbGN5NXNaVzVuZEdnN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hwYm1SbGVDQTlQVDBnZFc1a1pXWnBibVZrS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdhVzVrWlhnZ1BTQXdPMXh1SUNBZ0lDQWdJQ0JsYkhObElHbG1JQ2hwYm1SbGVDQStJR3hsYm1kMGFDbGNiaUFnSUNBZ0lDQWdJQ0FnSUdsdVpHVjRJRDBnYkdWdVozUm9PMXh1SUNBZ0lDQWdJQ0JsYkhObElHbG1JQ2hwYm1SbGVDQThJREFwWEc0Z0lDQWdJQ0FnSUNBZ0lDQnBibVJsZUNBOUlFMWhkR2d1YldGNEtEQXNJR3hsYm1kMGFDQXJJR2x1WkdWNEtUdGNiaUFnSUNBZ0lDQWdhV1lnS0dGeVozVnRaVzUwY3k1c1pXNW5kR2dnUFQwOUlERXBYRzRnSUNBZ0lDQWdJQ0FnSUNCa1pXeGxkR1ZEYjNWdWRDQTlJR3hsYm1kMGFDQXRJR2x1WkdWNE8xeHVJQ0FnSUNBZ0lDQmxiSE5sSUdsbUlDaGtaV3hsZEdWRGIzVnVkQ0E5UFQwZ2RXNWtaV1pwYm1Wa0lIeDhJR1JsYkdWMFpVTnZkVzUwSUQwOVBTQnVkV3hzS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdaR1ZzWlhSbFEyOTFiblFnUFNBd08xeHVJQ0FnSUNBZ0lDQmxiSE5sWEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaV3hsZEdWRGIzVnVkQ0E5SUUxaGRHZ3ViV0Y0S0RBc0lFMWhkR2d1YldsdUtHUmxiR1YwWlVOdmRXNTBMQ0JzWlc1bmRHZ2dMU0JwYm1SbGVDa3BPMXh1SUNBZ0lDQWdJQ0JwWmlBb2JtVjNTWFJsYlhNZ1BUMDlJSFZ1WkdWbWFXNWxaQ2xjYmlBZ0lDQWdJQ0FnSUNBZ0lHNWxkMGwwWlcxeklEMGdXMTA3WEc0Z0lDQWdJQ0FnSUdsbUlDaG9ZWE5KYm5SbGNtTmxjSFJ2Y25Nb2RHaHBjeWtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCamFHRnVaMlVnUFNCcGJuUmxjbU5sY0hSRGFHRnVaMlVvZEdocGN5d2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzlpYW1WamREb2dkR2hwY3k1aGNuSmhlU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwZVhCbE9pQmNJbk53YkdsalpWd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2x1WkdWNE9pQnBibVJsZUN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpXMXZkbVZrUTI5MWJuUTZJR1JsYkdWMFpVTnZkVzUwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdGa1pHVmtPaUJ1WlhkSmRHVnRjMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9JV05vWVc1blpTbGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1JVMVFWRmxmUVZKU1FWazdYRzRnSUNBZ0lDQWdJQ0FnSUNCa1pXeGxkR1ZEYjNWdWRDQTlJR05vWVc1blpTNXlaVzF2ZG1Wa1EyOTFiblE3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnVaWGRKZEdWdGN5QTlJR05vWVc1blpTNWhaR1JsWkR0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQnVaWGRKZEdWdGN5QTlJRzVsZDBsMFpXMXpMbTFoY0NoMGFHbHpMbTFoYTJWU1pXRmpkR2wyWlVGeWNtRjVTWFJsYlN3Z2RHaHBjeWs3WEc0Z0lDQWdJQ0FnSUhaaGNpQnNaVzVuZEdoRVpXeDBZU0E5SUc1bGQwbDBaVzF6TG14bGJtZDBhQ0F0SUdSbGJHVjBaVU52ZFc1ME8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG5Wd1pHRjBaVUZ5Y21GNVRHVnVaM1JvS0d4bGJtZDBhQ3dnYkdWdVozUm9SR1ZzZEdFcE8xeHVJQ0FnSUNBZ0lDQjJZWElnY21WeklEMGdLRjloSUQwZ2RHaHBjeTUyWVd4MVpYTXBMbk53YkdsalpTNWhjSEJzZVNoZllTd2dXMmx1WkdWNExDQmtaV3hsZEdWRGIzVnVkRjB1WTI5dVkyRjBLRzVsZDBsMFpXMXpLU2s3WEc0Z0lDQWdJQ0FnSUdsbUlDaGtaV3hsZEdWRGIzVnVkQ0FoUFQwZ01DQjhmQ0J1WlhkSmRHVnRjeTVzWlc1bmRHZ2dJVDA5SURBcFhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtNXZkR2xtZVVGeWNtRjVVM0JzYVdObEtHbHVaR1Y0TENCdVpYZEpkR1Z0Y3l3Z2NtVnpLVHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSEpsY3p0Y2JpQWdJQ0FnSUNBZ2RtRnlJRjloTzF4dUlDQWdJSDA3WEc0Z0lDQWdUMkp6WlhKMllXSnNaVUZ5Y21GNVFXUnRhVzVwYzNSeVlYUnBiMjR1Y0hKdmRHOTBlWEJsTG01dmRHbG1lVUZ5Y21GNVEyaHBiR1JWY0dSaGRHVWdQU0JtZFc1amRHbHZiaUFvYVc1a1pYZ3NJRzVsZDFaaGJIVmxMQ0J2YkdSV1lXeDFaU2tnZTF4dUlDQWdJQ0FnSUNCMllYSWdibTkwYVdaNVUzQjVJRDBnSVhSb2FYTXViM2R1WldRZ0ppWWdhWE5UY0hsRmJtRmliR1ZrS0NrN1hHNGdJQ0FnSUNBZ0lIWmhjaUJ1YjNScFpua2dQU0JvWVhOTWFYTjBaVzVsY25Nb2RHaHBjeWs3WEc0Z0lDQWdJQ0FnSUhaaGNpQmphR0Z1WjJVZ1BTQnViM1JwWm5rZ2ZId2dibTkwYVdaNVUzQjVJRDhnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdiMkpxWldOME9pQjBhR2x6TG1GeWNtRjVMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2RIbHdaVG9nWENKMWNHUmhkR1ZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJR2x1WkdWNE9pQnBibVJsZUN3Z2JtVjNWbUZzZFdVNklHNWxkMVpoYkhWbExDQnZiR1JXWVd4MVpUb2diMnhrVm1Gc2RXVmNiaUFnSUNBZ0lDQWdmU0E2SUc1MWJHdzdYRzRnSUNBZ0lDQWdJR2xtSUNodWIzUnBabmxUY0hrcFhHNGdJQ0FnSUNBZ0lDQWdJQ0J6Y0hsU1pYQnZjblJUZEdGeWRDaGphR0Z1WjJVcE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG1GMGIyMHVjbVZ3YjNKMFEyaGhibWRsWkNncE8xeHVJQ0FnSUNBZ0lDQnBaaUFvYm05MGFXWjVLVnh1SUNBZ0lDQWdJQ0FnSUNBZ2JtOTBhV1o1VEdsemRHVnVaWEp6S0hSb2FYTXNJR05vWVc1blpTazdYRzRnSUNBZ0lDQWdJR2xtSUNodWIzUnBabmxUY0hrcFhHNGdJQ0FnSUNBZ0lDQWdJQ0J6Y0hsU1pYQnZjblJGYm1Rb0tUdGNiaUFnSUNCOU8xeHVJQ0FnSUU5aWMyVnlkbUZpYkdWQmNuSmhlVUZrYldsdWFYTjBjbUYwYVc5dUxuQnliM1J2ZEhsd1pTNXViM1JwWm5sQmNuSmhlVk53YkdsalpTQTlJR1oxYm1OMGFXOXVJQ2hwYm1SbGVDd2dZV1JrWldRc0lISmxiVzkyWldRcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUc1dmRHbG1lVk53ZVNBOUlDRjBhR2x6TG05M2JtVmtJQ1ltSUdselUzQjVSVzVoWW14bFpDZ3BPMXh1SUNBZ0lDQWdJQ0IyWVhJZ2JtOTBhV1o1SUQwZ2FHRnpUR2x6ZEdWdVpYSnpLSFJvYVhNcE8xeHVJQ0FnSUNBZ0lDQjJZWElnWTJoaGJtZGxJRDBnYm05MGFXWjVJSHg4SUc1dmRHbG1lVk53ZVNBL0lIdGNiaUFnSUNBZ0lDQWdJQ0FnSUc5aWFtVmpkRG9nZEdocGN5NWhjbkpoZVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJSFI1Y0dVNklGd2ljM0JzYVdObFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNCcGJtUmxlRG9nYVc1a1pYZ3NJSEpsYlc5MlpXUTZJSEpsYlc5MlpXUXNJR0ZrWkdWa09pQmhaR1JsWkN4Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsYlc5MlpXUkRiM1Z1ZERvZ2NtVnRiM1psWkM1c1pXNW5kR2dzWEc0Z0lDQWdJQ0FnSUNBZ0lDQmhaR1JsWkVOdmRXNTBPaUJoWkdSbFpDNXNaVzVuZEdoY2JpQWdJQ0FnSUNBZ2ZTQTZJRzUxYkd3N1hHNGdJQ0FnSUNBZ0lHbG1JQ2h1YjNScFpubFRjSGtwWEc0Z0lDQWdJQ0FnSUNBZ0lDQnpjSGxTWlhCdmNuUlRkR0Z5ZENoamFHRnVaMlVwTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbUYwYjIwdWNtVndiM0owUTJoaGJtZGxaQ2dwTzF4dUlDQWdJQ0FnSUNCcFppQW9ibTkwYVdaNUtWeHVJQ0FnSUNBZ0lDQWdJQ0FnYm05MGFXWjVUR2x6ZEdWdVpYSnpLSFJvYVhNc0lHTm9ZVzVuWlNrN1hHNGdJQ0FnSUNBZ0lHbG1JQ2h1YjNScFpubFRjSGtwWEc0Z0lDQWdJQ0FnSUNBZ0lDQnpjSGxTWlhCdmNuUkZibVFvS1R0Y2JpQWdJQ0I5TzF4dUlDQWdJSEpsZEhWeWJpQlBZbk5sY25aaFlteGxRWEp5WVhsQlpHMXBibWx6ZEhKaGRHbHZianRjYm4wb0tTazdYRzUyWVhJZ1QySnpaWEoyWVdKc1pVRnljbUY1SUQwZ0tHWjFibU4wYVc5dUlDaGZjM1Z3WlhJcElIdGNiaUFnSUNCZlgyVjRkR1Z1WkhNb1QySnpaWEoyWVdKc1pVRnljbUY1TENCZmMzVndaWElwTzF4dUlDQWdJR1oxYm1OMGFXOXVJRTlpYzJWeWRtRmliR1ZCY25KaGVTaHBibWwwYVdGc1ZtRnNkV1Z6TENCdGIyUmxMQ0J1WVcxbExDQnZkMjVsWkNrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvYjNkdVpXUWdQVDA5SUhadmFXUWdNQ2tnZXlCdmQyNWxaQ0E5SUdaaGJITmxPeUI5WEc0Z0lDQWdJQ0FnSUY5emRYQmxjaTVqWVd4c0tIUm9hWE1wTzF4dUlDQWdJQ0FnSUNCMllYSWdZV1J0SUQwZ2JtVjNJRTlpYzJWeWRtRmliR1ZCY25KaGVVRmtiV2x1YVhOMGNtRjBhVzl1S0c1aGJXVXNJRzF2WkdVc0lIUm9hWE1zSUc5M2JtVmtLVHRjYmlBZ0lDQWdJQ0FnWVdSa1NHbGtaR1Z1Um1sdVlXeFFjbTl3S0hSb2FYTXNJRndpSkcxdlluaGNJaXdnWVdSdEtUdGNiaUFnSUNBZ0lDQWdhV1lnS0dsdWFYUnBZV3hXWVd4MVpYTWdKaVlnYVc1cGRHbGhiRlpoYkhWbGN5NXNaVzVuZEdncElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdGa2JTNTFjR1JoZEdWQmNuSmhlVXhsYm1kMGFDZ3dMQ0JwYm1sMGFXRnNWbUZzZFdWekxteGxibWQwYUNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JoWkcwdWRtRnNkV1Z6SUQwZ2FXNXBkR2xoYkZaaGJIVmxjeTV0WVhBb1lXUnRMbTFoYTJWU1pXRmpkR2wyWlVGeWNtRjVTWFJsYlN3Z1lXUnRLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHRmtiUzV1YjNScFpubEJjbkpoZVZOd2JHbGpaU2d3TENCaFpHMHVkbUZzZFdWekxuTnNhV05sS0Nrc0lFVk5VRlJaWDBGU1VrRlpLVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHRmtiUzUyWVd4MVpYTWdQU0JiWFR0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQnBaaUFvYzJGbVlYSnBVSEp2ZEc5MGVYQmxVMlYwZEdWeVNXNW9aWEpwZEdGdVkyVkNkV2NwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJRTlpYW1WamRDNWtaV1pwYm1WUWNtOXdaWEowZVNoaFpHMHVZWEp5WVhrc0lGd2lNRndpTENCRlRsUlNXVjh3S1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0JQWW5ObGNuWmhZbXhsUVhKeVlYa3VjSEp2ZEc5MGVYQmxMbWx1ZEdWeVkyVndkQ0E5SUdaMWJtTjBhVzl1SUNob1lXNWtiR1Z5S1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMaVJ0YjJKNExtbHVkR1Z5WTJWd2RDaG9ZVzVrYkdWeUtUdGNiaUFnSUNCOU8xeHVJQ0FnSUU5aWMyVnlkbUZpYkdWQmNuSmhlUzV3Y205MGIzUjVjR1V1YjJKelpYSjJaU0E5SUdaMWJtTjBhVzl1SUNoc2FYTjBaVzVsY2l3Z1ptbHlaVWx0YldWa2FXRjBaV3g1S1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2htYVhKbFNXMXRaV1JwWVhSbGJIa2dQVDA5SUhadmFXUWdNQ2tnZXlCbWFYSmxTVzF0WldScFlYUmxiSGtnUFNCbVlXeHpaVHNnZlZ4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NGtiVzlpZUM1dlluTmxjblpsS0d4cGMzUmxibVZ5TENCbWFYSmxTVzF0WldScFlYUmxiSGtwTzF4dUlDQWdJSDA3WEc0Z0lDQWdUMkp6WlhKMllXSnNaVUZ5Y21GNUxuQnliM1J2ZEhsd1pTNWpiR1ZoY2lBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWMzQnNhV05sS0RBcE8xeHVJQ0FnSUgwN1hHNGdJQ0FnVDJKelpYSjJZV0pzWlVGeWNtRjVMbkJ5YjNSdmRIbHdaUzV5WlhCc1lXTmxJRDBnWm5WdVkzUnBiMjRnS0c1bGQwbDBaVzF6S1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMaVJ0YjJKNExuTndiR2xqWlZkcGRHaEJjbkpoZVNnd0xDQjBhR2x6TGlSdGIySjRMblpoYkhWbGN5NXNaVzVuZEdnc0lHNWxkMGwwWlcxektUdGNiaUFnSUNCOU8xeHVJQ0FnSUU5aWMyVnlkbUZpYkdWQmNuSmhlUzV3Y205MGIzUjVjR1V1ZEc5S1V5QTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVjMnhwWTJVb0tUdGNiaUFnSUNCOU8xeHVJQ0FnSUU5aWMyVnlkbUZpYkdWQmNuSmhlUzV3Y205MGIzUjVjR1V1ZEc5S1UwOU9JRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTUwYjBwVEtDazdYRzRnSUNBZ2ZUdGNiaUFnSUNCUFluTmxjblpoWW14bFFYSnlZWGt1Y0hKdmRHOTBlWEJsTG5CbFpXc2dQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMaVJ0YjJKNExuWmhiSFZsY3p0Y2JpQWdJQ0I5TzF4dUlDQWdJRTlpYzJWeWRtRmliR1ZCY25KaGVTNXdjbTkwYjNSNWNHVXVabWx1WkNBOUlHWjFibU4wYVc5dUlDaHdjbVZrYVdOaGRHVXNJSFJvYVhOQmNtY3NJR1p5YjIxSmJtUmxlQ2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9abkp2YlVsdVpHVjRJRDA5UFNCMmIybGtJREFwSUhzZ1puSnZiVWx1WkdWNElEMGdNRHNnZlZ4dUlDQWdJQ0FnSUNCMGFHbHpMaVJ0YjJKNExtRjBiMjB1Y21Wd2IzSjBUMkp6WlhKMlpXUW9LVHRjYmlBZ0lDQWdJQ0FnZG1GeUlHbDBaVzF6SUQwZ2RHaHBjeTRrYlc5aWVDNTJZV3gxWlhNc0lHd2dQU0JwZEdWdGN5NXNaVzVuZEdnN1hHNGdJQ0FnSUNBZ0lHWnZjaUFvZG1GeUlHa2dQU0JtY205dFNXNWtaWGc3SUdrZ1BDQnNPeUJwS3lzcFhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2NISmxaR2xqWVhSbExtTmhiR3dvZEdocGMwRnlaeXdnYVhSbGJYTmJhVjBzSUdrc0lIUm9hWE1wS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJwZEdWdGMxdHBYVHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFZ1WkdWbWFXNWxaRHRjYmlBZ0lDQjlPMXh1SUNBZ0lFOWljMlZ5ZG1GaWJHVkJjbkpoZVM1d2NtOTBiM1I1Y0dVdWMzQnNhV05sSUQwZ1puVnVZM1JwYjI0Z0tHbHVaR1Y0TENCa1pXeGxkR1ZEYjNWdWRDa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2JtVjNTWFJsYlhNZ1BTQmJYVHRjYmlBZ0lDQWdJQ0FnWm05eUlDaDJZWElnWDJrZ1BTQXlPeUJmYVNBOElHRnlaM1Z0Wlc1MGN5NXNaVzVuZEdnN0lGOXBLeXNwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJRzVsZDBsMFpXMXpXMTlwSUMwZ01sMGdQU0JoY21kMWJXVnVkSE5iWDJsZE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSE4zYVhSamFDQW9ZWEpuZFcxbGJuUnpMbXhsYm1kMGFDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1kyRnpaU0F3T2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJiWFR0Y2JpQWdJQ0FnSUNBZ0lDQWdJR05oYzJVZ01UcGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTRrYlc5aWVDNXpjR3hwWTJWWGFYUm9RWEp5WVhrb2FXNWtaWGdwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdZMkZ6WlNBeU9seHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMaVJ0YjJKNExuTndiR2xqWlZkcGRHaEJjbkpoZVNocGJtUmxlQ3dnWkdWc1pYUmxRMjkxYm5RcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TGlSdGIySjRMbk53YkdsalpWZHBkR2hCY25KaGVTaHBibVJsZUN3Z1pHVnNaWFJsUTI5MWJuUXNJRzVsZDBsMFpXMXpLVHRjYmlBZ0lDQjlPMXh1SUNBZ0lFOWljMlZ5ZG1GaWJHVkJjbkpoZVM1d2NtOTBiM1I1Y0dVdWNIVnphQ0E5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUdsMFpXMXpJRDBnVzEwN1hHNGdJQ0FnSUNBZ0lHWnZjaUFvZG1GeUlGOXBJRDBnTURzZ1gya2dQQ0JoY21kMWJXVnVkSE11YkdWdVozUm9PeUJmYVNzcktTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCcGRHVnRjMXRmYVNBdElEQmRJRDBnWVhKbmRXMWxiblJ6VzE5cFhUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0IyWVhJZ1lXUnRJRDBnZEdocGN5NGtiVzlpZUR0Y2JpQWdJQ0FnSUNBZ1lXUnRMbk53YkdsalpWZHBkR2hCY25KaGVTaGhaRzB1ZG1Gc2RXVnpMbXhsYm1kMGFDd2dNQ3dnYVhSbGJYTXBPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdZV1J0TG5aaGJIVmxjeTVzWlc1bmRHZzdYRzRnSUNBZ2ZUdGNiaUFnSUNCUFluTmxjblpoWW14bFFYSnlZWGt1Y0hKdmRHOTBlWEJsTG5CdmNDQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVjM0JzYVdObEtFMWhkR2d1YldGNEtIUm9hWE11SkcxdlluZ3VkbUZzZFdWekxteGxibWQwYUNBdElERXNJREFwTENBeEtWc3dYVHRjYmlBZ0lDQjlPMXh1SUNBZ0lFOWljMlZ5ZG1GaWJHVkJjbkpoZVM1d2NtOTBiM1I1Y0dVdWMyaHBablFnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG5Od2JHbGpaU2d3TENBeEtWc3dYVHRjYmlBZ0lDQjlPMXh1SUNBZ0lFOWljMlZ5ZG1GaWJHVkJjbkpoZVM1d2NtOTBiM1I1Y0dVdWRXNXphR2xtZENBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHbDBaVzF6SUQwZ1cxMDdYRzRnSUNBZ0lDQWdJR1p2Y2lBb2RtRnlJRjlwSUQwZ01Ec2dYMmtnUENCaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvT3lCZmFTc3JLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBkR1Z0YzF0ZmFTQXRJREJkSUQwZ1lYSm5kVzFsYm5SelcxOXBYVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCMllYSWdZV1J0SUQwZ2RHaHBjeTRrYlc5aWVEdGNiaUFnSUNBZ0lDQWdZV1J0TG5Od2JHbGpaVmRwZEdoQmNuSmhlU2d3TENBd0xDQnBkR1Z0Y3lrN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCaFpHMHVkbUZzZFdWekxteGxibWQwYUR0Y2JpQWdJQ0I5TzF4dUlDQWdJRTlpYzJWeWRtRmliR1ZCY25KaGVTNXdjbTkwYjNSNWNHVXVjbVYyWlhKelpTQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTRrYlc5aWVDNWhkRzl0TG5KbGNHOXlkRTlpYzJWeWRtVmtLQ2s3WEc0Z0lDQWdJQ0FnSUhaaGNpQmpiRzl1WlNBOUlIUm9hWE11YzJ4cFkyVW9LVHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR05zYjI1bExuSmxkbVZ5YzJVdVlYQndiSGtvWTJ4dmJtVXNJR0Z5WjNWdFpXNTBjeWs3WEc0Z0lDQWdmVHRjYmlBZ0lDQlBZbk5sY25aaFlteGxRWEp5WVhrdWNISnZkRzkwZVhCbExuTnZjblFnUFNCbWRXNWpkR2x2YmlBb1kyOXRjR0Z5WlVadUtTQjdYRzRnSUNBZ0lDQWdJSFJvYVhNdUpHMXZZbmd1WVhSdmJTNXlaWEJ2Y25SUFluTmxjblpsWkNncE8xeHVJQ0FnSUNBZ0lDQjJZWElnWTJ4dmJtVWdQU0IwYUdsekxuTnNhV05sS0NrN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCamJHOXVaUzV6YjNKMExtRndjR3g1S0dOc2IyNWxMQ0JoY21kMWJXVnVkSE1wTzF4dUlDQWdJSDA3WEc0Z0lDQWdUMkp6WlhKMllXSnNaVUZ5Y21GNUxuQnliM1J2ZEhsd1pTNXlaVzF2ZG1VZ1BTQm1kVzVqZEdsdmJpQW9kbUZzZFdVcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUdsa2VDQTlJSFJvYVhNdUpHMXZZbmd1ZG1Gc2RXVnpMbWx1WkdWNFQyWW9kbUZzZFdVcE8xeHVJQ0FnSUNBZ0lDQnBaaUFvYVdSNElENGdMVEVwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMzQnNhV05sS0dsa2VDd2dNU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RISjFaVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWm1Gc2MyVTdYRzRnSUNBZ2ZUdGNiaUFnSUNCUFluTmxjblpoWW14bFFYSnlZWGt1Y0hKdmRHOTBlWEJsTG5SdlUzUnlhVzVuSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdYQ0piYlc5aWVDNWhjbkpoZVYwZ1hDSWdLeUJCY25KaGVTNXdjbTkwYjNSNWNHVXVkRzlUZEhKcGJtY3VZWEJ3Ykhrb2RHaHBjeTRrYlc5aWVDNTJZV3gxWlhNc0lHRnlaM1Z0Wlc1MGN5azdYRzRnSUNBZ2ZUdGNiaUFnSUNCUFluTmxjblpoWW14bFFYSnlZWGt1Y0hKdmRHOTBlWEJsTG5SdlRHOWpZV3hsVTNSeWFXNW5JRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1hDSmJiVzlpZUM1aGNuSmhlVjBnWENJZ0t5QkJjbkpoZVM1d2NtOTBiM1I1Y0dVdWRHOU1iMk5oYkdWVGRISnBibWN1WVhCd2JIa29kR2hwY3k0a2JXOWllQzUyWVd4MVpYTXNJR0Z5WjNWdFpXNTBjeWs3WEc0Z0lDQWdmVHRjYmlBZ0lDQnlaWFIxY200Z1QySnpaWEoyWVdKc1pVRnljbUY1TzF4dWZTaFRkSFZpUVhKeVlYa3BLVHRjYm1SbFkyeGhjbVZKZEdWeVlYUnZjaWhQWW5ObGNuWmhZbXhsUVhKeVlYa3VjSEp2ZEc5MGVYQmxMQ0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnY21WMGRYSnVJR0Z5Y21GNVFYTkpkR1Z5WVhSdmNpaDBhR2x6TG5Oc2FXTmxLQ2twTzF4dWZTazdYRzV0WVd0bFRtOXVSVzUxYldWeVlXSnNaU2hQWW5ObGNuWmhZbXhsUVhKeVlYa3VjSEp2ZEc5MGVYQmxMQ0JiWEc0Z0lDQWdYQ0pqYjI1emRISjFZM1J2Y2x3aUxGeHVJQ0FnSUZ3aWIySnpaWEoyWlZ3aUxGeHVJQ0FnSUZ3aVkyeGxZWEpjSWl4Y2JpQWdJQ0JjSW5KbGNHeGhZMlZjSWl4Y2JpQWdJQ0JjSW5SdlNsTlBUbHdpTEZ4dUlDQWdJRndpY0dWbGExd2lMRnh1SUNBZ0lGd2labWx1WkZ3aUxGeHVJQ0FnSUZ3aWMzQnNhV05sWENJc1hHNGdJQ0FnWENKd2RYTm9YQ0lzWEc0Z0lDQWdYQ0p3YjNCY0lpeGNiaUFnSUNCY0luTm9hV1owWENJc1hHNGdJQ0FnWENKMWJuTm9hV1owWENJc1hHNGdJQ0FnWENKeVpYWmxjbk5sWENJc1hHNGdJQ0FnWENKemIzSjBYQ0lzWEc0Z0lDQWdYQ0p5WlcxdmRtVmNJaXhjYmlBZ0lDQmNJblJ2VTNSeWFXNW5YQ0lzWEc0Z0lDQWdYQ0owYjB4dlkyRnNaVk4wY21sdVoxd2lYRzVkS1R0Y2JrOWlhbVZqZEM1a1pXWnBibVZRY205d1pYSjBlU2hQWW5ObGNuWmhZbXhsUVhKeVlYa3VjSEp2ZEc5MGVYQmxMQ0JjSW14bGJtZDBhRndpTENCN1hHNGdJQ0FnWlc1MWJXVnlZV0pzWlRvZ1ptRnNjMlVzWEc0Z0lDQWdZMjl1Wm1sbmRYSmhZbXhsT2lCMGNuVmxMRnh1SUNBZ0lHZGxkRG9nWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTRrYlc5aWVDNW5aWFJCY25KaGVVeGxibWQwYUNncE8xeHVJQ0FnSUgwc1hHNGdJQ0FnYzJWME9pQm1kVzVqZEdsdmJpQW9ibVYzVEdWdVozUm9LU0I3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVKRzF2WW5ndWMyVjBRWEp5WVhsTVpXNW5kR2dvYm1WM1RHVnVaM1JvS1R0Y2JpQWdJQ0I5WEc1OUtUdGNibHRjYmlBZ0lDQmNJbU52Ym1OaGRGd2lMRnh1SUNBZ0lGd2laWFpsY25sY0lpeGNiaUFnSUNCY0ltWnBiSFJsY2x3aUxGeHVJQ0FnSUZ3aVptOXlSV0ZqYUZ3aUxGeHVJQ0FnSUZ3aWFXNWtaWGhQWmx3aUxGeHVJQ0FnSUZ3aWFtOXBibHdpTEZ4dUlDQWdJRndpYkdGemRFbHVaR1Y0VDJaY0lpeGNiaUFnSUNCY0ltMWhjRndpTEZ4dUlDQWdJRndpY21Wa2RXTmxYQ0lzWEc0Z0lDQWdYQ0p5WldSMVkyVlNhV2RvZEZ3aUxGeHVJQ0FnSUZ3aWMyeHBZMlZjSWl4Y2JpQWdJQ0JjSW5OdmJXVmNJbHh1WFM1bWIzSkZZV05vS0daMWJtTjBhVzl1SUNobWRXNWpUbUZ0WlNrZ2UxeHVJQ0FnSUhaaGNpQmlZWE5sUm5WdVl5QTlJRUZ5Y21GNUxuQnliM1J2ZEhsd1pWdG1kVzVqVG1GdFpWMDdYRzRnSUNBZ1lXUmtTR2xrWkdWdVVISnZjQ2hQWW5ObGNuWmhZbXhsUVhKeVlYa3VjSEp2ZEc5MGVYQmxMQ0JtZFc1alRtRnRaU3dnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQjBhR2x6TGlSdGIySjRMbUYwYjIwdWNtVndiM0owVDJKelpYSjJaV1FvS1R0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdKaGMyVkdkVzVqTG1Gd2NHeDVLSFJvYVhNdUpHMXZZbmd1ZG1Gc2RXVnpMQ0JoY21kMWJXVnVkSE1wTzF4dUlDQWdJSDBwTzF4dWZTazdYRzUyWVhJZ1JVNVVVbGxmTUNBOUlIdGNiaUFnSUNCamIyNW1hV2QxY21GaWJHVTZJSFJ5ZFdVc1hHNGdJQ0FnWlc1MWJXVnlZV0pzWlRvZ1ptRnNjMlVzWEc0Z0lDQWdjMlYwT2lCamNtVmhkR1ZCY25KaGVWTmxkSFJsY2lnd0tTeGNiaUFnSUNCblpYUTZJR055WldGMFpVRnljbUY1UjJWMGRHVnlLREFwWEc1OU8xeHVablZ1WTNScGIyNGdZM0psWVhSbFFYSnlZWGxDZFdabVpYSkpkR1Z0S0dsdVpHVjRLU0I3WEc0Z0lDQWdkbUZ5SUhObGRDQTlJR055WldGMFpVRnljbUY1VTJWMGRHVnlLR2x1WkdWNEtUdGNiaUFnSUNCMllYSWdaMlYwSUQwZ1kzSmxZWFJsUVhKeVlYbEhaWFIwWlhJb2FXNWtaWGdwTzF4dUlDQWdJRTlpYW1WamRDNWtaV1pwYm1WUWNtOXdaWEowZVNoUFluTmxjblpoWW14bFFYSnlZWGt1Y0hKdmRHOTBlWEJsTENCY0lsd2lJQ3NnYVc1a1pYZ3NJSHRjYmlBZ0lDQWdJQ0FnWlc1MWJXVnlZV0pzWlRvZ1ptRnNjMlVzWEc0Z0lDQWdJQ0FnSUdOdmJtWnBaM1Z5WVdKc1pUb2dkSEoxWlN4Y2JpQWdJQ0FnSUNBZ2MyVjBPaUJ6WlhRc0lHZGxkRG9nWjJWMFhHNGdJQ0FnZlNrN1hHNTlYRzVtZFc1amRHbHZiaUJqY21WaGRHVkJjbkpoZVZObGRIUmxjaWhwYm1SbGVDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCbWRXNWpkR2x2YmlBb2JtVjNWbUZzZFdVcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUdGa2JTQTlJSFJvYVhNdUpHMXZZbmc3WEc0Z0lDQWdJQ0FnSUhaaGNpQjJZV3gxWlhNZ1BTQmhaRzB1ZG1Gc2RXVnpPMXh1SUNBZ0lDQWdJQ0JoYzNObGNuUlZibmR5WVhCd1pXUW9ibVYzVm1Gc2RXVXNJRndpVFc5a2FXWnBaWEp6SUdOaGJtNXZkQ0JpWlNCMWMyVmtJRzl1SUdGeWNtRjVJSFpoYkhWbGN5NGdSbTl5SUc1dmJpMXlaV0ZqZEdsMlpTQmhjbkpoZVNCMllXeDFaWE1nZFhObElHMWhhMlZTWldGamRHbDJaU2hoYzBac1lYUW9ZWEp5WVhrcEtTNWNJaWs3WEc0Z0lDQWdJQ0FnSUdsbUlDaHBibVJsZUNBOElIWmhiSFZsY3k1c1pXNW5kR2dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR05vWldOclNXWlRkR0YwWlUxdlpHbG1hV05oZEdsdmJuTkJjbVZCYkd4dmQyVmtLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnYjJ4a1ZtRnNkV1VnUFNCMllXeDFaWE5iYVc1a1pYaGRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR2hoYzBsdWRHVnlZMlZ3ZEc5eWN5aGhaRzBwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR05vWVc1blpTQTlJR2x1ZEdWeVkyVndkRU5vWVc1blpTaGhaRzBzSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkSGx3WlRvZ1hDSjFjR1JoZEdWY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjJKcVpXTjBPaUJoWkcwdVlYSnlZWGtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbHVaR1Y0T2lCcGJtUmxlQ3dnYm1WM1ZtRnNkV1U2SUc1bGQxWmhiSFZsWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0ZqYUdGdVoyVXBYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnlianRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1WlhkV1lXeDFaU0E5SUdOb1lXNW5aUzV1WlhkV1lXeDFaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUc1bGQxWmhiSFZsSUQwZ1lXUnRMbTFoYTJWU1pXRmpkR2wyWlVGeWNtRjVTWFJsYlNodVpYZFdZV3gxWlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1kyaGhibWRsWkNBOUlDaGhaRzB1Ylc5a1pTQTlQVDBnVm1Gc2RXVk5iMlJsTGxOMGNuVmpkSFZ5WlNrZ1B5QWhaR1ZsY0VWeGRXRnNjeWh2YkdSV1lXeDFaU3dnYm1WM1ZtRnNkV1VwSURvZ2IyeGtWbUZzZFdVZ0lUMDlJRzVsZDFaaGJIVmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR05vWVc1blpXUXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVd4MVpYTmJhVzVrWlhoZElEMGdibVYzVm1Gc2RXVTdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZV1J0TG01dmRHbG1lVUZ5Y21GNVEyaHBiR1JWY0dSaGRHVW9hVzVrWlhnc0lHNWxkMVpoYkhWbExDQnZiR1JXWVd4MVpTazdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdaV3h6WlNCcFppQW9hVzVrWlhnZ1BUMDlJSFpoYkhWbGN5NXNaVzVuZEdncElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdGa2JTNXpjR3hwWTJWWGFYUm9RWEp5WVhrb2FXNWtaWGdzSURBc0lGdHVaWGRXWVd4MVpWMHBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUdWc2MyVmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhjSWx0dGIySjRMbUZ5Y21GNVhTQkpibVJsZUNCdmRYUWdiMllnWW05MWJtUnpMQ0JjSWlBcklHbHVaR1Y0SUNzZ1hDSWdhWE1nYkdGeVoyVnlJSFJvWVc0Z1hDSWdLeUIyWVd4MVpYTXViR1Z1WjNSb0tUdGNiaUFnSUNCOU8xeHVmVnh1Wm5WdVkzUnBiMjRnWTNKbFlYUmxRWEp5WVhsSFpYUjBaWElvYVc1a1pYZ3BJSHRjYmlBZ0lDQnlaWFIxY200Z1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2FXMXdiQ0E5SUhSb2FYTXVKRzF2WW5nN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hwYlhCc0lDWW1JR2x1WkdWNElEd2dhVzF3YkM1MllXeDFaWE11YkdWdVozUm9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBiWEJzTG1GMGIyMHVjbVZ3YjNKMFQySnpaWEoyWldRb0tUdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJwYlhCc0xuWmhiSFZsYzF0cGJtUmxlRjA3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1M1lYSnVLRndpVzIxdlluZ3VZWEp5WVhsZElFRjBkR1Z0Y0hRZ2RHOGdjbVZoWkNCaGJpQmhjbkpoZVNCcGJtUmxlQ0FvWENJZ0t5QnBibVJsZUNBcklGd2lLU0IwYUdGMElHbHpJRzkxZENCdlppQmliM1Z1WkhNZ0tGd2lJQ3NnYVcxd2JDNTJZV3gxWlhNdWJHVnVaM1JvSUNzZ1hDSXBMaUJRYkdWaGMyVWdZMmhsWTJzZ2JHVnVaM1JvSUdacGNuTjBMaUJQZFhRZ2IyWWdZbTkxYm1RZ2FXNWthV05sY3lCM2FXeHNJRzV2ZENCaVpTQjBjbUZqYTJWa0lHSjVJRTF2WWxoY0lpazdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjFibVJsWm1sdVpXUTdYRzRnSUNBZ2ZUdGNibjFjYm1aMWJtTjBhVzl1SUhKbGMyVnlkbVZCY25KaGVVSjFabVpsY2lodFlYZ3BJSHRjYmlBZ0lDQm1iM0lnS0haaGNpQnBibVJsZUNBOUlFOUNVMFZTVmtGQ1RFVmZRVkpTUVZsZlFsVkdSa1ZTWDFOSldrVTdJR2x1WkdWNElEd2diV0Y0T3lCcGJtUmxlQ3NyS1Z4dUlDQWdJQ0FnSUNCamNtVmhkR1ZCY25KaGVVSjFabVpsY2tsMFpXMG9hVzVrWlhncE8xeHVJQ0FnSUU5Q1UwVlNWa0ZDVEVWZlFWSlNRVmxmUWxWR1JrVlNYMU5KV2tVZ1BTQnRZWGc3WEc1OVhHNXlaWE5sY25abFFYSnlZWGxDZFdabVpYSW9NVEF3TUNrN1hHNW1kVzVqZEdsdmJpQmpjbVZoZEdWUFluTmxjblpoWW14bFFYSnlZWGtvYVc1cGRHbGhiRlpoYkhWbGN5d2diVzlrWlN3Z2JtRnRaU2tnZTF4dUlDQWdJSEpsZEhWeWJpQnVaWGNnVDJKelpYSjJZV0pzWlVGeWNtRjVLR2x1YVhScFlXeFdZV3gxWlhNc0lHMXZaR1VzSUc1aGJXVXBPMXh1ZlZ4dVpuVnVZM1JwYjI0Z1ptRnpkRUZ5Y21GNUtHbHVhWFJwWVd4V1lXeDFaWE1wSUh0Y2JpQWdJQ0JrWlhCeVpXTmhkR1ZrS0Z3aVptRnpkRUZ5Y21GNUlHbHpJR1JsY0hKbFkyRjBaV1F1SUZCc1pXRnpaU0IxYzJVZ1lHOWljMlZ5ZG1GaWJHVW9ZWE5HYkdGMEtGdGRLU2xnWENJcE8xeHVJQ0FnSUhKbGRIVnliaUJqY21WaGRHVlBZbk5sY25aaFlteGxRWEp5WVhrb2FXNXBkR2xoYkZaaGJIVmxjeXdnVm1Gc2RXVk5iMlJsTGtac1lYUXNJRzUxYkd3cE8xeHVmVnh1Wlhod2IzSjBjeTVtWVhOMFFYSnlZWGtnUFNCbVlYTjBRWEp5WVhrN1hHNW1kVzVqZEdsdmJpQnBjMDlpYzJWeWRtRmliR1ZCY25KaGVTaDBhR2x1WnlrZ2UxeHVJQ0FnSUhKbGRIVnliaUIwYUdsdVp5QnBibk4wWVc1alpXOW1JRTlpYzJWeWRtRmliR1ZCY25KaGVUdGNibjFjYm1WNGNHOXlkSE11YVhOUFluTmxjblpoWW14bFFYSnlZWGtnUFNCcGMwOWljMlZ5ZG1GaWJHVkJjbkpoZVR0Y2JuWmhjaUJQWW5ObGNuWmhZbXhsVFdGd1RXRnlhMlZ5SUQwZ2UzMDdYRzUyWVhJZ1QySnpaWEoyWVdKc1pVMWhjQ0E5SUNobWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ1puVnVZM1JwYjI0Z1QySnpaWEoyWVdKc1pVMWhjQ2hwYm1sMGFXRnNSR0YwWVN3Z2RtRnNkV1ZOYjJSbFJuVnVZeWtnZTF4dUlDQWdJQ0FnSUNCMllYSWdYM1JvYVhNZ1BTQjBhR2x6TzF4dUlDQWdJQ0FnSUNCMGFHbHpMaVJ0YjJKNElEMGdUMkp6WlhKMllXSnNaVTFoY0UxaGNtdGxjanRjYmlBZ0lDQWdJQ0FnZEdocGN5NWZaR0YwWVNBOUlIdDlPMXh1SUNBZ0lDQWdJQ0IwYUdsekxsOW9ZWE5OWVhBZ1BTQjdmVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NXVZVzFsSUQwZ1hDSlBZbk5sY25aaFlteGxUV0Z3UUZ3aUlDc2daMlYwVG1WNGRFbGtLQ2s3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVYMnRsZVhNZ1BTQnVaWGNnVDJKelpYSjJZV0pzWlVGeWNtRjVLRzUxYkd3c0lGWmhiSFZsVFc5a1pTNVNaV1psY21WdVkyVXNJSFJvYVhNdWJtRnRaU0FySUZ3aUxtdGxlWE1vS1Z3aUxDQjBjblZsS1R0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVwYm5SbGNtTmxjSFJ2Y25NZ1BTQnVkV3hzTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbU5vWVc1blpVeHBjM1JsYm1WeWN5QTlJRzUxYkd3N1hHNGdJQ0FnSUNBZ0lIUm9hWE11WDNaaGJIVmxUVzlrWlNBOUlHZGxkRlpoYkhWbFRXOWtaVVp5YjIxTmIyUnBabWxsY2taMWJtTW9kbUZzZFdWTmIyUmxSblZ1WXlrN1hHNGdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxsOTJZV3gxWlUxdlpHVWdQVDA5SUZaaGJIVmxUVzlrWlM1R2JHRjBLVnh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVmZG1Gc2RXVk5iMlJsSUQwZ1ZtRnNkV1ZOYjJSbExsSmxabVZ5Wlc1alpUdGNiaUFnSUNBZ0lDQWdZV3hzYjNkVGRHRjBaVU5vWVc1blpYTW9kSEoxWlN3Z1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR2x6VUd4aGFXNVBZbXBsWTNRb2FXNXBkR2xoYkVSaGRHRXBLVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRjkwYUdsekxtMWxjbWRsS0dsdWFYUnBZV3hFWVhSaEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUdWc2MyVWdhV1lnS0VGeWNtRjVMbWx6UVhKeVlYa29hVzVwZEdsaGJFUmhkR0VwS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsdWFYUnBZV3hFWVhSaExtWnZja1ZoWTJnb1puVnVZM1JwYjI0Z0tGOWhLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJyWlhrZ1BTQmZZVnN3WFN3Z2RtRnNkV1VnUFNCZllWc3hYVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUY5MGFHbHpMbk5sZENoclpYa3NJSFpoYkhWbEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnZlZ4dUlDQWdJRTlpYzJWeWRtRmliR1ZOWVhBdWNISnZkRzkwZVhCbExsOW9ZWE1nUFNCbWRXNWpkR2x2YmlBb2EyVjVLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIwZVhCbGIyWWdkR2hwY3k1ZlpHRjBZVnRyWlhsZElDRTlQU0JjSW5WdVpHVm1hVzVsWkZ3aU8xeHVJQ0FnSUgwN1hHNGdJQ0FnVDJKelpYSjJZV0pzWlUxaGNDNXdjbTkwYjNSNWNHVXVhR0Z6SUQwZ1puVnVZM1JwYjI0Z0tHdGxlU2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9JWFJvYVhNdWFYTldZV3hwWkV0bGVTaHJaWGtwS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHWmhiSE5sTzF4dUlDQWdJQ0FnSUNCclpYa2dQU0JjSWx3aUlDc2dhMlY1TzF4dUlDQWdJQ0FnSUNCcFppQW9kR2hwY3k1ZmFHRnpUV0Z3VzJ0bGVWMHBYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NWZhR0Z6VFdGd1cydGxlVjB1WjJWMEtDazdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TGw5MWNHUmhkR1ZJWVhOTllYQkZiblJ5ZVNoclpYa3NJR1poYkhObEtTNW5aWFFvS1R0Y2JpQWdJQ0I5TzF4dUlDQWdJRTlpYzJWeWRtRmliR1ZOWVhBdWNISnZkRzkwZVhCbExuTmxkQ0E5SUdaMWJtTjBhVzl1SUNoclpYa3NJSFpoYkhWbEtTQjdYRzRnSUNBZ0lDQWdJSFJvYVhNdVlYTnpaWEowVm1Gc2FXUkxaWGtvYTJWNUtUdGNiaUFnSUNBZ0lDQWdhMlY1SUQwZ1hDSmNJaUFySUd0bGVUdGNiaUFnSUNBZ0lDQWdkbUZ5SUdoaGMwdGxlU0E5SUhSb2FYTXVYMmhoY3loclpYa3BPMXh1SUNBZ0lDQWdJQ0JoYzNObGNuUlZibmR5WVhCd1pXUW9kbUZzZFdVc0lGd2lXMjF2WW5ndWJXRndMbk5sZEYwZ1JYaHdaV04wWldRZ2RXNTNjbUZ3Y0dWa0lIWmhiSFZsSUhSdklHSmxJR2x1YzJWeWRHVmtJSFJ2SUd0bGVTQW5YQ0lnS3lCclpYa2dLeUJjSWljdUlFbG1JSGx2ZFNCdVpXVmtJSFJ2SUhWelpTQnRiMlJwWm1sbGNuTWdjR0Z6Y3lCMGFHVnRJR0Z6SUhObFkyOXVaQ0JoY21kMWJXVnVkQ0IwYnlCMGFHVWdZMjl1YzNSeWRXTjBiM0pjSWlrN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hvWVhOSmJuUmxjbU5sY0hSdmNuTW9kR2hwY3lrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQmphR0Z1WjJVZ1BTQnBiblJsY21ObGNIUkRhR0Z1WjJVb2RHaHBjeXdnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSNWNHVTZJR2hoYzB0bGVTQS9JRndpZFhCa1lYUmxYQ0lnT2lCY0ltRmtaRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5aWFtVmpkRG9nZEdocGN5eGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVaWGRXWVd4MVpUb2dkbUZzZFdVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtRnRaVG9nYTJWNVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnaFkyaGhibWRsS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnlianRjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhiSFZsSUQwZ1kyaGhibWRsTG01bGQxWmhiSFZsTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lHbG1JQ2hvWVhOTFpYa3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WDNWd1pHRjBaVlpoYkhWbEtHdGxlU3dnZG1Gc2RXVXBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVmWVdSa1ZtRnNkV1VvYTJWNUxDQjJZV3gxWlNrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNCOU8xeHVJQ0FnSUU5aWMyVnlkbUZpYkdWTllYQXVjSEp2ZEc5MGVYQmxMbVJsYkdWMFpTQTlJR1oxYm1OMGFXOXVJQ2hyWlhrcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUY5MGFHbHpJRDBnZEdocGN6dGNiaUFnSUNBZ0lDQWdkR2hwY3k1aGMzTmxjblJXWVd4cFpFdGxlU2hyWlhrcE8xeHVJQ0FnSUNBZ0lDQnJaWGtnUFNCY0lsd2lJQ3NnYTJWNU8xeHVJQ0FnSUNBZ0lDQnBaaUFvYUdGelNXNTBaWEpqWlhCMGIzSnpLSFJvYVhNcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdZMmhoYm1kbElEMGdhVzUwWlhKalpYQjBRMmhoYm1kbEtIUm9hWE1zSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGVYQmxPaUJjSW1SbGJHVjBaVndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5aWFtVmpkRG9nZEdocGN5eGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsT2lCclpYbGNiaUFnSUNBZ0lDQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRmphR0Z1WjJVcFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1TzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxsOW9ZWE1vYTJWNUtTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJRzV2ZEdsbWVWTndlU0E5SUdselUzQjVSVzVoWW14bFpDZ3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJRzV2ZEdsbWVTQTlJR2hoYzB4cGMzUmxibVZ5Y3loMGFHbHpLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJqYUdGdVoyVWdQU0J1YjNScFpua2dmSHdnYm05MGFXWjVVM0I1SUQ4Z2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUjVjR1U2SUZ3aVpHVnNaWFJsWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IySnFaV04wT2lCMGFHbHpMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzlzWkZaaGJIVmxPaUIwYUdsekxsOWtZWFJoVzJ0bGVWMHVkbUZzZFdVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtRnRaVG9nYTJWNVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5SURvZ2JuVnNiRHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h1YjNScFpubFRjSGtwWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNCNVVtVndiM0owVTNSaGNuUW9ZMmhoYm1kbEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUhSeVlXNXpZV04wYVc5dUtHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JmZEdocGN5NWZhMlY1Y3k1eVpXMXZkbVVvYTJWNUtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmZkR2hwY3k1ZmRYQmtZWFJsU0dGelRXRndSVzUwY25rb2EyVjVMQ0JtWVd4elpTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUc5aWMyVnlkbUZpYkdVZ1BTQmZkR2hwY3k1ZlpHRjBZVnRyWlhsZE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOWljMlZ5ZG1GaWJHVXVjMlYwVG1WM1ZtRnNkV1VvZFc1a1pXWnBibVZrS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCZmRHaHBjeTVmWkdGMFlWdHJaWGxkSUQwZ2RXNWtaV1pwYm1Wa08xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlN3Z2RXNWtaV1pwYm1Wa0xDQm1ZV3h6WlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2JtOTBhV1o1S1Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1dmRHbG1lVXhwYzNSbGJtVnljeWgwYUdsekxDQmphR0Z1WjJVcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHNXZkR2xtZVZOd2VTbGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpjSGxTWlhCdmNuUkZibVFvS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUgwN1hHNGdJQ0FnVDJKelpYSjJZV0pzWlUxaGNDNXdjbTkwYjNSNWNHVXVYM1Z3WkdGMFpVaGhjMDFoY0VWdWRISjVJRDBnWm5WdVkzUnBiMjRnS0d0bGVTd2dkbUZzZFdVcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUdWdWRISjVJRDBnZEdocGN5NWZhR0Z6VFdGd1cydGxlVjA3WEc0Z0lDQWdJQ0FnSUdsbUlDaGxiblJ5ZVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnWlc1MGNua3VjMlYwVG1WM1ZtRnNkV1VvZG1Gc2RXVXBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1pXNTBjbmtnUFNCMGFHbHpMbDlvWVhOTllYQmJhMlY1WFNBOUlHNWxkeUJQWW5ObGNuWmhZbXhsVm1Gc2RXVW9kbUZzZFdVc0lGWmhiSFZsVFc5a1pTNVNaV1psY21WdVkyVXNJSFJvYVhNdWJtRnRaU0FySUZ3aUxsd2lJQ3NnYTJWNUlDc2dYQ0kvWENJc0lHWmhiSE5sS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1pXNTBjbms3WEc0Z0lDQWdmVHRjYmlBZ0lDQlBZbk5sY25aaFlteGxUV0Z3TG5CeWIzUnZkSGx3WlM1ZmRYQmtZWFJsVm1Gc2RXVWdQU0JtZFc1amRHbHZiaUFvYm1GdFpTd2dibVYzVm1Gc2RXVXBJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHOWljMlZ5ZG1GaWJHVWdQU0IwYUdsekxsOWtZWFJoVzI1aGJXVmRPMXh1SUNBZ0lDQWdJQ0J1WlhkV1lXeDFaU0E5SUc5aWMyVnlkbUZpYkdVdWNISmxjR0Z5WlU1bGQxWmhiSFZsS0c1bGQxWmhiSFZsS1R0Y2JpQWdJQ0FnSUNBZ2FXWWdLRzVsZDFaaGJIVmxJQ0U5UFNCVlRrTklRVTVIUlVRcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnViM1JwWm5sVGNIa2dQU0JwYzFOd2VVVnVZV0pzWldRb0tUdGNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnViM1JwWm5rZ1BTQm9ZWE5NYVhOMFpXNWxjbk1vZEdocGN5azdYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdZMmhoYm1kbElEMGdibTkwYVdaNUlIeDhJRzV2ZEdsbWVWTndlU0EvSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGVYQmxPaUJjSW5Wd1pHRjBaVndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5aWFtVmpkRG9nZEdocGN5eGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZiR1JXWVd4MVpUb2diMkp6WlhKMllXSnNaUzUyWVd4MVpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsT2lCdVlXMWxMQ0J1WlhkV1lXeDFaVG9nYm1WM1ZtRnNkV1ZjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdPaUJ1ZFd4c08xeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHNXZkR2xtZVZOd2VTbGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpjSGxTWlhCdmNuUlRkR0Z5ZENoamFHRnVaMlVwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdiMkp6WlhKMllXSnNaUzV6WlhST1pYZFdZV3gxWlNodVpYZFdZV3gxWlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2JtOTBhV1o1S1Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1dmRHbG1lVXhwYzNSbGJtVnljeWgwYUdsekxDQmphR0Z1WjJVcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHNXZkR2xtZVZOd2VTbGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpjSGxTWlhCdmNuUkZibVFvS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUgwN1hHNGdJQ0FnVDJKelpYSjJZV0pzWlUxaGNDNXdjbTkwYjNSNWNHVXVYMkZrWkZaaGJIVmxJRDBnWm5WdVkzUnBiMjRnS0c1aGJXVXNJRzVsZDFaaGJIVmxLU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQmZkR2hwY3lBOUlIUm9hWE03WEc0Z0lDQWdJQ0FnSUhSeVlXNXpZV04wYVc5dUtHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ2WW5ObGNuWmhZbXhsSUQwZ1gzUm9hWE11WDJSaGRHRmJibUZ0WlYwZ1BTQnVaWGNnVDJKelpYSjJZV0pzWlZaaGJIVmxLRzVsZDFaaGJIVmxMQ0JmZEdocGN5NWZkbUZzZFdWTmIyUmxMQ0JmZEdocGN5NXVZVzFsSUNzZ1hDSXVYQ0lnS3lCdVlXMWxMQ0JtWVd4elpTazdYRzRnSUNBZ0lDQWdJQ0FnSUNCdVpYZFdZV3gxWlNBOUlHOWljMlZ5ZG1GaWJHVXVkbUZzZFdVN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JmZEdocGN5NWZkWEJrWVhSbFNHRnpUV0Z3Ulc1MGNua29ibUZ0WlN3Z2RISjFaU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmZkR2hwY3k1ZmEyVjVjeTV3ZFhOb0tHNWhiV1VwTzF4dUlDQWdJQ0FnSUNCOUxDQjFibVJsWm1sdVpXUXNJR1poYkhObEtUdGNiaUFnSUNBZ0lDQWdkbUZ5SUc1dmRHbG1lVk53ZVNBOUlHbHpVM0I1Ulc1aFlteGxaQ2dwTzF4dUlDQWdJQ0FnSUNCMllYSWdibTkwYVdaNUlEMGdhR0Z6VEdsemRHVnVaWEp6S0hSb2FYTXBPMXh1SUNBZ0lDQWdJQ0IyWVhJZ1kyaGhibWRsSUQwZ2JtOTBhV1o1SUh4OElHNXZkR2xtZVZOd2VTQS9JSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIUjVjR1U2SUZ3aVlXUmtYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnZZbXBsWTNRNklIUm9hWE1zWEc0Z0lDQWdJQ0FnSUNBZ0lDQnVZVzFsT2lCdVlXMWxMQ0J1WlhkV1lXeDFaVG9nYm1WM1ZtRnNkV1ZjYmlBZ0lDQWdJQ0FnZlNBNklHNTFiR3c3WEc0Z0lDQWdJQ0FnSUdsbUlDaHViM1JwWm5sVGNIa3BYRzRnSUNBZ0lDQWdJQ0FnSUNCemNIbFNaWEJ2Y25SVGRHRnlkQ2hqYUdGdVoyVXBPMXh1SUNBZ0lDQWdJQ0JwWmlBb2JtOTBhV1o1S1Z4dUlDQWdJQ0FnSUNBZ0lDQWdibTkwYVdaNVRHbHpkR1Z1WlhKektIUm9hWE1zSUdOb1lXNW5aU2s3WEc0Z0lDQWdJQ0FnSUdsbUlDaHViM1JwWm5sVGNIa3BYRzRnSUNBZ0lDQWdJQ0FnSUNCemNIbFNaWEJ2Y25SRmJtUW9LVHRjYmlBZ0lDQjlPMXh1SUNBZ0lFOWljMlZ5ZG1GaWJHVk5ZWEF1Y0hKdmRHOTBlWEJsTG1kbGRDQTlJR1oxYm1OMGFXOXVJQ2hyWlhrcElIdGNiaUFnSUNBZ0lDQWdhMlY1SUQwZ1hDSmNJaUFySUd0bGVUdGNiaUFnSUNBZ0lDQWdhV1lnS0hSb2FYTXVhR0Z6S0d0bGVTa3BYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NWZaR0YwWVZ0clpYbGRMbWRsZENncE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RXNWtaV1pwYm1Wa08xeHVJQ0FnSUgwN1hHNGdJQ0FnVDJKelpYSjJZV0pzWlUxaGNDNXdjbTkwYjNSNWNHVXVhMlY1Y3lBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR0Z5Y21GNVFYTkpkR1Z5WVhSdmNpaDBhR2x6TGw5clpYbHpMbk5zYVdObEtDa3BPMXh1SUNBZ0lIMDdYRzRnSUNBZ1QySnpaWEoyWVdKc1pVMWhjQzV3Y205MGIzUjVjR1V1ZG1Gc2RXVnpJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1lYSnlZWGxCYzBsMFpYSmhkRzl5S0hSb2FYTXVYMnRsZVhNdWJXRndLSFJvYVhNdVoyVjBMQ0IwYUdsektTazdYRzRnSUNBZ2ZUdGNiaUFnSUNCUFluTmxjblpoWW14bFRXRndMbkJ5YjNSdmRIbHdaUzVsYm5SeWFXVnpJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnWDNSb2FYTWdQU0IwYUdsek8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1lYSnlZWGxCYzBsMFpYSmhkRzl5S0hSb2FYTXVYMnRsZVhNdWJXRndLR1oxYm1OMGFXOXVJQ2hyWlhrcElIc2djbVYwZFhKdUlGdHJaWGtzSUY5MGFHbHpMbWRsZENoclpYa3BYVHNnZlNrcE8xeHVJQ0FnSUgwN1hHNGdJQ0FnVDJKelpYSjJZV0pzWlUxaGNDNXdjbTkwYjNSNWNHVXVabTl5UldGamFDQTlJR1oxYm1OMGFXOXVJQ2hqWVd4c1ltRmpheXdnZEdocGMwRnlaeWtnZTF4dUlDQWdJQ0FnSUNCMllYSWdYM1JvYVhNZ1BTQjBhR2x6TzF4dUlDQWdJQ0FnSUNCMGFHbHpMbXRsZVhNb0tTNW1iM0pGWVdOb0tHWjFibU4wYVc5dUlDaHJaWGtwSUhzZ2NtVjBkWEp1SUdOaGJHeGlZV05yTG1OaGJHd29kR2hwYzBGeVp5d2dYM1JvYVhNdVoyVjBLR3RsZVNrc0lHdGxlU2s3SUgwcE8xeHVJQ0FnSUgwN1hHNGdJQ0FnVDJKelpYSjJZV0pzWlUxaGNDNXdjbTkwYjNSNWNHVXViV1Z5WjJVZ1BTQm1kVzVqZEdsdmJpQW9iM1JvWlhJcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUY5MGFHbHpJRDBnZEdocGN6dGNiaUFnSUNBZ0lDQWdkSEpoYm5OaFkzUnBiMjRvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHOTBhR1Z5SUdsdWMzUmhibU5sYjJZZ1QySnpaWEoyWVdKc1pVMWhjQ2xjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2ZEdobGNpNXJaWGx6S0NrdVptOXlSV0ZqYUNobWRXNWpkR2x2YmlBb2EyVjVLU0I3SUhKbGRIVnliaUJmZEdocGN5NXpaWFFvYTJWNUxDQnZkR2hsY2k1blpYUW9hMlY1S1NrN0lIMHBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ1pXeHpaVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRTlpYW1WamRDNXJaWGx6S0c5MGFHVnlLUzVtYjNKRllXTm9LR1oxYm1OMGFXOXVJQ2hyWlhrcElIc2djbVYwZFhKdUlGOTBhR2x6TG5ObGRDaHJaWGtzSUc5MGFHVnlXMnRsZVYwcE95QjlLVHRjYmlBZ0lDQWdJQ0FnZlN3Z2RXNWtaV1pwYm1Wa0xDQm1ZV3h6WlNrN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpPMXh1SUNBZ0lIMDdYRzRnSUNBZ1QySnpaWEoyWVdKc1pVMWhjQzV3Y205MGIzUjVjR1V1WTJ4bFlYSWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJmZEdocGN5QTlJSFJvYVhNN1hHNGdJQ0FnSUNBZ0lIUnlZVzV6WVdOMGFXOXVLR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFZ1ZEhKaFkydGxaQ2htZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1gzUm9hWE11YTJWNWN5Z3BMbVp2Y2tWaFkyZ29YM1JvYVhNdVpHVnNaWFJsTENCZmRHaHBjeWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJQ0FnZlN3Z2RXNWtaV1pwYm1Wa0xDQm1ZV3h6WlNrN1hHNGdJQ0FnZlR0Y2JpQWdJQ0JQWW1wbFkzUXVaR1ZtYVc1bFVISnZjR1Z5ZEhrb1QySnpaWEoyWVdKc1pVMWhjQzV3Y205MGIzUjVjR1VzSUZ3aWMybDZaVndpTENCN1hHNGdJQ0FnSUNBZ0lHZGxkRG9nWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdVgydGxlWE11YkdWdVozUm9PMXh1SUNBZ0lDQWdJQ0I5TEZ4dUlDQWdJQ0FnSUNCbGJuVnRaWEpoWW14bE9pQjBjblZsTEZ4dUlDQWdJQ0FnSUNCamIyNW1hV2QxY21GaWJHVTZJSFJ5ZFdWY2JpQWdJQ0I5S1R0Y2JpQWdJQ0JQWW5ObGNuWmhZbXhsVFdGd0xuQnliM1J2ZEhsd1pTNTBiMHBUSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ1gzUm9hWE1nUFNCMGFHbHpPMXh1SUNBZ0lDQWdJQ0IyWVhJZ2NtVnpJRDBnZTMwN1hHNGdJQ0FnSUNBZ0lIUm9hWE11YTJWNWN5Z3BMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNGdLR3RsZVNrZ2V5QnlaWFIxY200Z2NtVnpXMnRsZVYwZ1BTQmZkR2hwY3k1blpYUW9hMlY1S1RzZ2ZTazdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnlaWE03WEc0Z0lDQWdmVHRjYmlBZ0lDQlBZbk5sY25aaFlteGxUV0Z3TG5CeWIzUnZkSGx3WlM1MGIwcHpJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQmtaWEJ5WldOaGRHVmtLRndpZEc5S2N5QnBjeUJrWlhCeVpXTmhkR1ZrTENCMWMyVWdkRzlLVXlCcGJuTjBaV0ZrWENJcE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTUwYjBwVEtDazdYRzRnSUNBZ2ZUdGNiaUFnSUNCUFluTmxjblpoWW14bFRXRndMbkJ5YjNSdmRIbHdaUzUwYjBwVFQwNGdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMblJ2U2xNb0tUdGNiaUFnSUNCOU8xeHVJQ0FnSUU5aWMyVnlkbUZpYkdWTllYQXVjSEp2ZEc5MGVYQmxMbWx6Vm1Gc2FXUkxaWGtnUFNCbWRXNWpkR2x2YmlBb2EyVjVLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaHJaWGtnUFQwOUlHNTFiR3dnZkh3Z2EyVjVJRDA5UFNCMWJtUmxabWx1WldRcFhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdabUZzYzJVN1hHNGdJQ0FnSUNBZ0lHbG1JQ2gwZVhCbGIyWWdhMlY1SUNFOVBTQmNJbk4wY21sdVoxd2lJQ1ltSUhSNWNHVnZaaUJyWlhrZ0lUMDlJRndpYm5WdFltVnlYQ0lnSmlZZ2RIbHdaVzltSUd0bGVTQWhQVDBnWENKaWIyOXNaV0Z1WENJcFhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdabUZzYzJVN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGNuVmxPMXh1SUNBZ0lIMDdYRzRnSUNBZ1QySnpaWEoyWVdKc1pVMWhjQzV3Y205MGIzUjVjR1V1WVhOelpYSjBWbUZzYVdSTFpYa2dQU0JtZFc1amRHbHZiaUFvYTJWNUtTQjdYRzRnSUNBZ0lDQWdJR2xtSUNnaGRHaHBjeTVwYzFaaGJHbGtTMlY1S0d0bGVTa3BYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvWENKYmJXOWllQzV0WVhCZElFbHVkbUZzYVdRZ2EyVjVPaUFuWENJZ0t5QnJaWGtnS3lCY0lpZGNJaWs3WEc0Z0lDQWdmVHRjYmlBZ0lDQlBZbk5sY25aaFlteGxUV0Z3TG5CeWIzUnZkSGx3WlM1MGIxTjBjbWx1WnlBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlGOTBhR2x6SUQwZ2RHaHBjenRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWJtRnRaU0FySUZ3aVczc2dYQ0lnS3lCMGFHbHpMbXRsZVhNb0tTNXRZWEFvWm5WdVkzUnBiMjRnS0d0bGVTa2dleUJ5WlhSMWNtNGdLR3RsZVNBcklGd2lPaUJjSWlBcklDaGNJbHdpSUNzZ1gzUm9hWE11WjJWMEtHdGxlU2twS1RzZ2ZTa3VhbTlwYmloY0lpd2dYQ0lwSUNzZ1hDSWdmVjFjSWp0Y2JpQWdJQ0I5TzF4dUlDQWdJRTlpYzJWeWRtRmliR1ZOWVhBdWNISnZkRzkwZVhCbExtOWljMlZ5ZG1VZ1BTQm1kVzVqZEdsdmJpQW9iR2x6ZEdWdVpYSXNJR1pwY21WSmJXMWxaR2xoZEdWc2VTa2dlMXh1SUNBZ0lDQWdJQ0JwYm5aaGNtbGhiblFvWm1seVpVbHRiV1ZrYVdGMFpXeDVJQ0U5UFNCMGNuVmxMQ0JjSW1CdlluTmxjblpsWUNCa2IyVnpiaWQwSUhOMWNIQnZjblFnZEdobElHWnBjbVVnYVcxdFpXUnBZWFJsYkhrZ2NISnZjR1Z5ZEhrZ1ptOXlJRzlpYzJWeWRtRmliR1VnYldGd2N5NWNJaWs3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ5WldkcGMzUmxja3hwYzNSbGJtVnlLSFJvYVhNc0lHeHBjM1JsYm1WeUtUdGNiaUFnSUNCOU8xeHVJQ0FnSUU5aWMyVnlkbUZpYkdWTllYQXVjSEp2ZEc5MGVYQmxMbWx1ZEdWeVkyVndkQ0E5SUdaMWJtTjBhVzl1SUNob1lXNWtiR1Z5S1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCeVpXZHBjM1JsY2tsdWRHVnlZMlZ3ZEc5eUtIUm9hWE1zSUdoaGJtUnNaWElwTzF4dUlDQWdJSDA3WEc0Z0lDQWdjbVYwZFhKdUlFOWljMlZ5ZG1GaWJHVk5ZWEE3WEc1OUtDa3BPMXh1Wlhod2IzSjBjeTVQWW5ObGNuWmhZbXhsVFdGd0lEMGdUMkp6WlhKMllXSnNaVTFoY0R0Y2JtUmxZMnhoY21WSmRHVnlZWFJ2Y2loUFluTmxjblpoWW14bFRXRndMbkJ5YjNSdmRIbHdaU3dnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUhKbGRIVnliaUIwYUdsekxtVnVkSEpwWlhNb0tUdGNibjBwTzF4dVpuVnVZM1JwYjI0Z2JXRndLR2x1YVhScFlXeFdZV3gxWlhNc0lIWmhiSFZsVFc5a2FXWnBaWElwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdibVYzSUU5aWMyVnlkbUZpYkdWTllYQW9hVzVwZEdsaGJGWmhiSFZsY3l3Z2RtRnNkV1ZOYjJScFptbGxjaWs3WEc1OVhHNWxlSEJ2Y25SekxtMWhjQ0E5SUcxaGNEdGNibVoxYm1OMGFXOXVJR2x6VDJKelpYSjJZV0pzWlUxaGNDaDBhR2x1WnlrZ2UxeHVJQ0FnSUhKbGRIVnliaUIwYUdsdVp5QnBibk4wWVc1alpXOW1JRTlpYzJWeWRtRmliR1ZOWVhBN1hHNTlYRzVsZUhCdmNuUnpMbWx6VDJKelpYSjJZV0pzWlUxaGNDQTlJR2x6VDJKelpYSjJZV0pzWlUxaGNEdGNiblpoY2lCUFluTmxjblpoWW14bFQySnFaV04wUVdSdGFXNXBjM1J5WVhScGIyNGdQU0FvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUdaMWJtTjBhVzl1SUU5aWMyVnlkbUZpYkdWUFltcGxZM1JCWkcxcGJtbHpkSEpoZEdsdmJpaDBZWEpuWlhRc0lHNWhiV1VzSUcxdlpHVXBJSHRjYmlBZ0lDQWdJQ0FnZEdocGN5NTBZWEpuWlhRZ1BTQjBZWEpuWlhRN1hHNGdJQ0FnSUNBZ0lIUm9hWE11Ym1GdFpTQTlJRzVoYldVN1hHNGdJQ0FnSUNBZ0lIUm9hWE11Ylc5a1pTQTlJRzF2WkdVN1hHNGdJQ0FnSUNBZ0lIUm9hWE11ZG1Gc2RXVnpJRDBnZTMwN1hHNGdJQ0FnSUNBZ0lIUm9hWE11WTJoaGJtZGxUR2x6ZEdWdVpYSnpJRDBnYm5Wc2JEdGNiaUFnSUNBZ0lDQWdkR2hwY3k1cGJuUmxjbU5sY0hSdmNuTWdQU0J1ZFd4c08xeHVJQ0FnSUgxY2JpQWdJQ0JQWW5ObGNuWmhZbXhsVDJKcVpXTjBRV1J0YVc1cGMzUnlZWFJwYjI0dWNISnZkRzkwZVhCbExtOWljMlZ5ZG1VZ1BTQm1kVzVqZEdsdmJpQW9ZMkZzYkdKaFkyc3NJR1pwY21WSmJXMWxaR2xoZEdWc2VTa2dlMXh1SUNBZ0lDQWdJQ0JwYm5aaGNtbGhiblFvWm1seVpVbHRiV1ZrYVdGMFpXeDVJQ0U5UFNCMGNuVmxMQ0JjSW1CdlluTmxjblpsWUNCa2IyVnpiaWQwSUhOMWNIQnZjblFnZEdobElHWnBjbVVnYVcxdFpXUnBZWFJsYkhrZ2NISnZjR1Z5ZEhrZ1ptOXlJRzlpYzJWeWRtRmliR1VnYjJKcVpXTjBjeTVjSWlrN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCeVpXZHBjM1JsY2t4cGMzUmxibVZ5S0hSb2FYTXNJR05oYkd4aVlXTnJLVHRjYmlBZ0lDQjlPMXh1SUNBZ0lFOWljMlZ5ZG1GaWJHVlBZbXBsWTNSQlpHMXBibWx6ZEhKaGRHbHZiaTV3Y205MGIzUjVjR1V1YVc1MFpYSmpaWEIwSUQwZ1puVnVZM1JwYjI0Z0tHaGhibVJzWlhJcElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlISmxaMmx6ZEdWeVNXNTBaWEpqWlhCMGIzSW9kR2hwY3l3Z2FHRnVaR3hsY2lrN1hHNGdJQ0FnZlR0Y2JpQWdJQ0J5WlhSMWNtNGdUMkp6WlhKMllXSnNaVTlpYW1WamRFRmtiV2x1YVhOMGNtRjBhVzl1TzF4dWZTZ3BLVHRjYm1aMWJtTjBhVzl1SUdGelQySnpaWEoyWVdKc1pVOWlhbVZqZENoMFlYSm5aWFFzSUc1aGJXVXNJRzF2WkdVcElIdGNiaUFnSUNCcFppQW9iVzlrWlNBOVBUMGdkbTlwWkNBd0tTQjdJRzF2WkdVZ1BTQldZV3gxWlUxdlpHVXVVbVZqZFhKemFYWmxPeUI5WEc0Z0lDQWdhV1lnS0dselQySnpaWEoyWVdKc1pVOWlhbVZqZENoMFlYSm5aWFFwS1Z4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZEdGeVoyVjBMaVJ0YjJKNE8xeHVJQ0FnSUdsbUlDZ2hhWE5RYkdGcGJrOWlhbVZqZENoMFlYSm5aWFFwS1Z4dUlDQWdJQ0FnSUNCdVlXMWxJRDBnZEdGeVoyVjBMbU52Ym5OMGNuVmpkRzl5TG01aGJXVWdLeUJjSWtCY0lpQXJJR2RsZEU1bGVIUkpaQ2dwTzF4dUlDQWdJR2xtSUNnaGJtRnRaU2xjYmlBZ0lDQWdJQ0FnYm1GdFpTQTlJRndpVDJKelpYSjJZV0pzWlU5aWFtVmpkRUJjSWlBcklHZGxkRTVsZUhSSlpDZ3BPMXh1SUNBZ0lIWmhjaUJoWkcwZ1BTQnVaWGNnVDJKelpYSjJZV0pzWlU5aWFtVmpkRUZrYldsdWFYTjBjbUYwYVc5dUtIUmhjbWRsZEN3Z2JtRnRaU3dnYlc5a1pTazdYRzRnSUNBZ1lXUmtTR2xrWkdWdVJtbHVZV3hRY205d0tIUmhjbWRsZEN3Z1hDSWtiVzlpZUZ3aUxDQmhaRzBwTzF4dUlDQWdJSEpsZEhWeWJpQmhaRzA3WEc1OVhHNW1kVzVqZEdsdmJpQnpaWFJQWW5ObGNuWmhZbXhsVDJKcVpXTjBTVzV6ZEdGdVkyVlFjbTl3WlhKMGVTaGhaRzBzSUhCeWIzQk9ZVzFsTENCMllXeDFaU2tnZTF4dUlDQWdJR2xtSUNoaFpHMHVkbUZzZFdWelczQnliM0JPWVcxbFhTbGNiaUFnSUNBZ0lDQWdZV1J0TG5SaGNtZGxkRnR3Y205d1RtRnRaVjBnUFNCMllXeDFaVHRjYmlBZ0lDQmxiSE5sWEc0Z0lDQWdJQ0FnSUdSbFptbHVaVTlpYzJWeWRtRmliR1ZRY205d1pYSjBlU2hoWkcwc0lIQnliM0JPWVcxbExDQjJZV3gxWlN3Z2RISjFaU2s3WEc1OVhHNW1kVzVqZEdsdmJpQmtaV1pwYm1WUFluTmxjblpoWW14bFVISnZjR1Z5ZEhrb1lXUnRMQ0J3Y205d1RtRnRaU3dnYm1WM1ZtRnNkV1VzSUdGelNXNXpkR0Z1WTJWUWNtOXdaWEowZVNrZ2UxeHVJQ0FnSUdsbUlDaGhjMGx1YzNSaGJtTmxVSEp2Y0dWeWRIa3BYRzRnSUNBZ0lDQWdJR0Z6YzJWeWRGQnliM0JsY25SNVEyOXVabWxuZFhKaFlteGxLR0ZrYlM1MFlYSm5aWFFzSUhCeWIzQk9ZVzFsS1R0Y2JpQWdJQ0IyWVhJZ2IySnpaWEoyWVdKc1pUdGNiaUFnSUNCMllYSWdibUZ0WlNBOUlHRmtiUzV1WVcxbElDc2dYQ0l1WENJZ0t5QndjbTl3VG1GdFpUdGNiaUFnSUNCMllYSWdhWE5EYjIxd2RYUmxaQ0E5SUhSeWRXVTdYRzRnSUNBZ2FXWWdLSFI1Y0dWdlppQnVaWGRXWVd4MVpTQTlQVDBnWENKbWRXNWpkR2x2Ymx3aUlDWW1JRzVsZDFaaGJIVmxMbXhsYm1kMGFDQTlQVDBnTUNBbUppQWhhWE5CWTNScGIyNG9ibVYzVm1Gc2RXVXBLVnh1SUNBZ0lDQWdJQ0J2WW5ObGNuWmhZbXhsSUQwZ2JtVjNJRU52YlhCMWRHVmtWbUZzZFdVb2JtVjNWbUZzZFdVc0lHRmtiUzUwWVhKblpYUXNJR1poYkhObExDQnVZVzFsS1R0Y2JpQWdJQ0JsYkhObElHbG1JQ2h1WlhkV1lXeDFaU0JwYm5OMFlXNWpaVzltSUVGelUzUnlkV04wZFhKbElDWW1JSFI1Y0dWdlppQnVaWGRXWVd4MVpTNTJZV3gxWlNBOVBUMGdYQ0ptZFc1amRHbHZibHdpSUNZbUlHNWxkMVpoYkhWbExuWmhiSFZsTG14bGJtZDBhQ0E5UFQwZ01DbGNiaUFnSUNBZ0lDQWdiMkp6WlhKMllXSnNaU0E5SUc1bGR5QkRiMjF3ZFhSbFpGWmhiSFZsS0c1bGQxWmhiSFZsTG5aaGJIVmxMQ0JoWkcwdWRHRnlaMlYwTENCMGNuVmxMQ0J1WVcxbEtUdGNiaUFnSUNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnYVhORGIyMXdkWFJsWkNBOUlHWmhiSE5sTzF4dUlDQWdJQ0FnSUNCcFppQW9hR0Z6U1c1MFpYSmpaWEIwYjNKektHRmtiU2twSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCamFHRnVaMlVnUFNCcGJuUmxjbU5sY0hSRGFHRnVaMlVvWVdSdExDQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiMkpxWldOME9pQmhaRzB1ZEdGeVoyVjBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzVoYldVNklIQnliM0JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUjVjR1U2SUZ3aVlXUmtYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1WM1ZtRnNkV1U2SUc1bGQxWmhiSFZsWEc0Z0lDQWdJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doWTJoaGJtZGxLVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJqdGNiaUFnSUNBZ0lDQWdJQ0FnSUc1bGQxWmhiSFZsSUQwZ1kyaGhibWRsTG01bGQxWmhiSFZsTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lHOWljMlZ5ZG1GaWJHVWdQU0J1WlhjZ1QySnpaWEoyWVdKc1pWWmhiSFZsS0c1bGQxWmhiSFZsTENCaFpHMHViVzlrWlN3Z2JtRnRaU3dnWm1Gc2MyVXBPMXh1SUNBZ0lDQWdJQ0J1WlhkV1lXeDFaU0E5SUc5aWMyVnlkbUZpYkdVdWRtRnNkV1U3WEc0Z0lDQWdmVnh1SUNBZ0lHRmtiUzUyWVd4MVpYTmJjSEp2Y0U1aGJXVmRJRDBnYjJKelpYSjJZV0pzWlR0Y2JpQWdJQ0JwWmlBb1lYTkpibk4wWVc1alpWQnliM0JsY25SNUtTQjdYRzRnSUNBZ0lDQWdJRTlpYW1WamRDNWtaV1pwYm1WUWNtOXdaWEowZVNoaFpHMHVkR0Z5WjJWMExDQndjbTl3VG1GdFpTd2dhWE5EYjIxd2RYUmxaQ0EvSUdkbGJtVnlZWFJsUTI5dGNIVjBaV1JRY205d1EyOXVabWxuS0hCeWIzQk9ZVzFsS1NBNklHZGxibVZ5WVhSbFQySnpaWEoyWVdKc1pWQnliM0JEYjI1bWFXY29jSEp2Y0U1aGJXVXBLVHRjYmlBZ0lDQjlYRzRnSUNBZ2FXWWdLQ0ZwYzBOdmJYQjFkR1ZrS1Z4dUlDQWdJQ0FnSUNCdWIzUnBabmxRY205d1pYSjBlVUZrWkdsMGFXOXVLR0ZrYlN3Z1lXUnRMblJoY21kbGRDd2djSEp2Y0U1aGJXVXNJRzVsZDFaaGJIVmxLVHRjYm4xY2JuWmhjaUJ2WW5ObGNuWmhZbXhsVUhKdmNHVnlkSGxEYjI1bWFXZHpJRDBnZTMwN1hHNTJZWElnWTI5dGNIVjBaV1JRY205d1pYSjBlVU52Ym1acFozTWdQU0I3ZlR0Y2JtWjFibU4wYVc5dUlHZGxibVZ5WVhSbFQySnpaWEoyWVdKc1pWQnliM0JEYjI1bWFXY29jSEp2Y0U1aGJXVXBJSHRjYmlBZ0lDQjJZWElnWTI5dVptbG5JRDBnYjJKelpYSjJZV0pzWlZCeWIzQmxjblI1UTI5dVptbG5jMXR3Y205d1RtRnRaVjA3WEc0Z0lDQWdhV1lnS0dOdmJtWnBaeWxjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR052Ym1acFp6dGNiaUFnSUNCeVpYUjFjbTRnYjJKelpYSjJZV0pzWlZCeWIzQmxjblI1UTI5dVptbG5jMXR3Y205d1RtRnRaVjBnUFNCN1hHNGdJQ0FnSUNBZ0lHTnZibVpwWjNWeVlXSnNaVG9nZEhKMVpTeGNiaUFnSUNBZ0lDQWdaVzUxYldWeVlXSnNaVG9nZEhKMVpTeGNiaUFnSUNBZ0lDQWdaMlYwT2lCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NGtiVzlpZUM1MllXeDFaWE5iY0hKdmNFNWhiV1ZkTG1kbGRDZ3BPMXh1SUNBZ0lDQWdJQ0I5TEZ4dUlDQWdJQ0FnSUNCelpYUTZJR1oxYm1OMGFXOXVJQ2gyS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J6WlhSUWNtOXdaWEowZVZaaGJIVmxLSFJvYVhNc0lIQnliM0JPWVcxbExDQjJLVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJSDA3WEc1OVhHNW1kVzVqZEdsdmJpQm5aVzVsY21GMFpVTnZiWEIxZEdWa1VISnZjRU52Ym1acFp5aHdjbTl3VG1GdFpTa2dlMXh1SUNBZ0lIWmhjaUJqYjI1bWFXY2dQU0JqYjIxd2RYUmxaRkJ5YjNCbGNuUjVRMjl1Wm1sbmMxdHdjbTl3VG1GdFpWMDdYRzRnSUNBZ2FXWWdLR052Ym1acFp5bGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHTnZibVpwWnp0Y2JpQWdJQ0J5WlhSMWNtNGdZMjl0Y0hWMFpXUlFjbTl3WlhKMGVVTnZibVpwWjNOYmNISnZjRTVoYldWZElEMGdlMXh1SUNBZ0lDQWdJQ0JqYjI1bWFXZDFjbUZpYkdVNklIUnlkV1VzWEc0Z0lDQWdJQ0FnSUdWdWRXMWxjbUZpYkdVNklHWmhiSE5sTEZ4dUlDQWdJQ0FnSUNCblpYUTZJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TGlSdGIySjRMblpoYkhWbGMxdHdjbTl3VG1GdFpWMHVaMlYwS0NrN1hHNGdJQ0FnSUNBZ0lIMHNYRzRnSUNBZ0lDQWdJSE5sZERvZ2RHaHliM2RwYm1kRGIyMXdkWFJsWkZaaGJIVmxVMlYwZEdWeVhHNGdJQ0FnZlR0Y2JuMWNibVoxYm1OMGFXOXVJSE5sZEZCeWIzQmxjblI1Vm1Gc2RXVW9hVzV6ZEdGdVkyVXNJRzVoYldVc0lHNWxkMVpoYkhWbEtTQjdYRzRnSUNBZ2RtRnlJR0ZrYlNBOUlHbHVjM1JoYm1ObExpUnRiMko0TzF4dUlDQWdJSFpoY2lCdlluTmxjblpoWW14bElEMGdZV1J0TG5aaGJIVmxjMXR1WVcxbFhUdGNiaUFnSUNCcFppQW9hR0Z6U1c1MFpYSmpaWEIwYjNKektHRmtiU2twSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJR05vWVc1blpTQTlJR2x1ZEdWeVkyVndkRU5vWVc1blpTaGhaRzBzSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFI1Y0dVNklGd2lkWEJrWVhSbFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNCdlltcGxZM1E2SUdsdWMzUmhibU5sTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdibUZ0WlRvZ2JtRnRaU3dnYm1WM1ZtRnNkV1U2SUc1bGQxWmhiSFZsWEc0Z0lDQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ0lDQnBaaUFvSVdOb1lXNW5aU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2JpQWdJQ0FnSUNBZ2JtVjNWbUZzZFdVZ1BTQmphR0Z1WjJVdWJtVjNWbUZzZFdVN1hHNGdJQ0FnZlZ4dUlDQWdJRzVsZDFaaGJIVmxJRDBnYjJKelpYSjJZV0pzWlM1d2NtVndZWEpsVG1WM1ZtRnNkV1VvYm1WM1ZtRnNkV1VwTzF4dUlDQWdJR2xtSUNodVpYZFdZV3gxWlNBaFBUMGdWVTVEU0VGT1IwVkVLU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQnViM1JwWm5rZ1BTQm9ZWE5NYVhOMFpXNWxjbk1vWVdSdEtUdGNiaUFnSUNBZ0lDQWdkbUZ5SUc1dmRHbG1lVk53ZVNBOUlHbHpVM0I1Ulc1aFlteGxaQ2dwTzF4dUlDQWdJQ0FnSUNCMllYSWdZMmhoYm1kbElEMGdibTkwYVdaNVRHbHpkR1Z1WlhKeklIeDhJR2hoYzB4cGMzUmxibVZ5Y3lBL0lIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhSNWNHVTZJRndpZFhCa1lYUmxYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnZZbXBsWTNRNklHbHVjM1JoYm1ObExGeHVJQ0FnSUNBZ0lDQWdJQ0FnYjJ4a1ZtRnNkV1U2SUc5aWMyVnlkbUZpYkdVdWRtRnNkV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnVZVzFsT2lCdVlXMWxMQ0J1WlhkV1lXeDFaVG9nYm1WM1ZtRnNkV1ZjYmlBZ0lDQWdJQ0FnZlNBNklHNTFiR3c3WEc0Z0lDQWdJQ0FnSUdsbUlDaHViM1JwWm5sVGNIa3BYRzRnSUNBZ0lDQWdJQ0FnSUNCemNIbFNaWEJ2Y25SVGRHRnlkQ2hqYUdGdVoyVXBPMXh1SUNBZ0lDQWdJQ0J2WW5ObGNuWmhZbXhsTG5ObGRFNWxkMVpoYkhWbEtHNWxkMVpoYkhWbEtUdGNiaUFnSUNBZ0lDQWdhV1lnS0c1dmRHbG1lU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lHNXZkR2xtZVV4cGMzUmxibVZ5Y3loaFpHMHNJR05vWVc1blpTazdYRzRnSUNBZ0lDQWdJR2xtSUNodWIzUnBabmxUY0hrcFhHNGdJQ0FnSUNBZ0lDQWdJQ0J6Y0hsU1pYQnZjblJGYm1Rb0tUdGNiaUFnSUNCOVhHNTlYRzVtZFc1amRHbHZiaUJ1YjNScFpubFFjbTl3WlhKMGVVRmtaR2wwYVc5dUtHRmtiU3dnYjJKcVpXTjBMQ0J1WVcxbExDQnVaWGRXWVd4MVpTa2dlMXh1SUNBZ0lIWmhjaUJ1YjNScFpua2dQU0JvWVhOTWFYTjBaVzVsY25Nb1lXUnRLVHRjYmlBZ0lDQjJZWElnYm05MGFXWjVVM0I1SUQwZ2FYTlRjSGxGYm1GaWJHVmtLQ2s3WEc0Z0lDQWdkbUZ5SUdOb1lXNW5aU0E5SUc1dmRHbG1lU0I4ZkNCdWIzUnBabmxUY0hrZ1B5QjdYRzRnSUNBZ0lDQWdJSFI1Y0dVNklGd2lZV1JrWENJc1hHNGdJQ0FnSUNBZ0lHOWlhbVZqZERvZ2IySnFaV04wTENCdVlXMWxPaUJ1WVcxbExDQnVaWGRXWVd4MVpUb2dibVYzVm1Gc2RXVmNiaUFnSUNCOUlEb2diblZzYkR0Y2JpQWdJQ0JwWmlBb2JtOTBhV1o1VTNCNUtWeHVJQ0FnSUNBZ0lDQnpjSGxTWlhCdmNuUlRkR0Z5ZENoamFHRnVaMlVwTzF4dUlDQWdJR2xtSUNodWIzUnBabmtwWEc0Z0lDQWdJQ0FnSUc1dmRHbG1lVXhwYzNSbGJtVnljeWhoWkcwc0lHTm9ZVzVuWlNrN1hHNGdJQ0FnYVdZZ0tHNXZkR2xtZVZOd2VTbGNiaUFnSUNBZ0lDQWdjM0I1VW1Wd2IzSjBSVzVrS0NrN1hHNTlYRzVtZFc1amRHbHZiaUJwYzA5aWMyVnlkbUZpYkdWUFltcGxZM1FvZEdocGJtY3BJSHRjYmlBZ0lDQnBaaUFvZEhsd1pXOW1JSFJvYVc1bklEMDlQU0JjSW05aWFtVmpkRndpSUNZbUlIUm9hVzVuSUNFOVBTQnVkV3hzS1NCN1hHNGdJQ0FnSUNBZ0lISjFia3hoZW5sSmJtbDBhV0ZzYVhwbGNuTW9kR2hwYm1jcE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBibWN1SkcxdlluZ2dhVzV6ZEdGdVkyVnZaaUJQWW5ObGNuWmhZbXhsVDJKcVpXTjBRV1J0YVc1cGMzUnlZWFJwYjI0N1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JuMWNibVY0Y0c5eWRITXVhWE5QWW5ObGNuWmhZbXhsVDJKcVpXTjBJRDBnYVhOUFluTmxjblpoWW14bFQySnFaV04wTzF4dWRtRnlJRlZPUTBoQlRrZEZSQ0E5SUh0OU8xeHVkbUZ5SUU5aWMyVnlkbUZpYkdWV1lXeDFaU0E5SUNobWRXNWpkR2x2YmlBb1gzTjFjR1Z5S1NCN1hHNGdJQ0FnWDE5bGVIUmxibVJ6S0U5aWMyVnlkbUZpYkdWV1lXeDFaU3dnWDNOMWNHVnlLVHRjYmlBZ0lDQm1kVzVqZEdsdmJpQlBZbk5sY25aaFlteGxWbUZzZFdVb2RtRnNkV1VzSUcxdlpHVXNJRzVoYldVc0lHNXZkR2xtZVZOd2VTa2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb2JtRnRaU0E5UFQwZ2RtOXBaQ0F3S1NCN0lHNWhiV1VnUFNCY0lrOWljMlZ5ZG1GaWJHVldZV3gxWlVCY0lpQXJJR2RsZEU1bGVIUkpaQ2dwT3lCOVhHNGdJQ0FnSUNBZ0lHbG1JQ2h1YjNScFpubFRjSGtnUFQwOUlIWnZhV1FnTUNrZ2V5QnViM1JwWm5sVGNIa2dQU0IwY25WbE95QjlYRzRnSUNBZ0lDQWdJRjl6ZFhCbGNpNWpZV3hzS0hSb2FYTXNJRzVoYldVcE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG0xdlpHVWdQU0J0YjJSbE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG1oaGMxVnVjbVZ3YjNKMFpXUkRhR0Z1WjJVZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTUyWVd4MVpTQTlJSFZ1WkdWbWFXNWxaRHRjYmlBZ0lDQWdJQ0FnZG1GeUlGOWhJRDBnWjJWMFZtRnNkV1ZOYjJSbFJuSnZiVlpoYkhWbEtIWmhiSFZsTENCV1lXeDFaVTF2WkdVdVVtVmpkWEp6YVhabEtTd2dZMmhwYkdSdGIyUmxJRDBnWDJGYk1GMHNJSFZ1ZDNKaGNIQmxaRlpoYkhWbElEMGdYMkZiTVYwN1hHNGdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxtMXZaR1VnUFQwOUlGWmhiSFZsVFc5a1pTNVNaV04xY25OcGRtVXBYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTF2WkdVZ1BTQmphR2xzWkcxdlpHVTdYRzRnSUNBZ0lDQWdJSFJvYVhNdWRtRnNkV1VnUFNCdFlXdGxRMmhwYkdSUFluTmxjblpoWW14bEtIVnVkM0poY0hCbFpGWmhiSFZsTENCMGFHbHpMbTF2WkdVc0lIUm9hWE11Ym1GdFpTazdYRzRnSUNBZ0lDQWdJR2xtSUNodWIzUnBabmxUY0hrZ0ppWWdhWE5UY0hsRmJtRmliR1ZrS0NrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhOd2VWSmxjRzl5ZENoN0lIUjVjR1U2SUZ3aVkzSmxZWFJsWENJc0lHOWlhbVZqZERvZ2RHaHBjeXdnYm1WM1ZtRnNkV1U2SUhSb2FYTXVkbUZzZFdVZ2ZTazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUNBZ1QySnpaWEoyWVdKc1pWWmhiSFZsTG5CeWIzUnZkSGx3WlM1elpYUWdQU0JtZFc1amRHbHZiaUFvYm1WM1ZtRnNkV1VwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJRzlzWkZaaGJIVmxJRDBnZEdocGN5NTJZV3gxWlR0Y2JpQWdJQ0FnSUNBZ2JtVjNWbUZzZFdVZ1BTQjBhR2x6TG5CeVpYQmhjbVZPWlhkV1lXeDFaU2h1WlhkV1lXeDFaU2s3WEc0Z0lDQWdJQ0FnSUdsbUlDaHVaWGRXWVd4MVpTQWhQVDBnVlU1RFNFRk9SMFZFS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2JtOTBhV1o1VTNCNUlEMGdhWE5UY0hsRmJtRmliR1ZrS0NrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2JtOTBhV1o1VTNCNUtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM0I1VW1Wd2IzSjBVM1JoY25Rb2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwZVhCbE9pQmNJblZ3WkdGMFpWd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdlltcGxZM1E2SUhSb2FYTXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1bGQxWmhiSFZsT2lCdVpYZFdZV3gxWlN3Z2IyeGtWbUZzZFdVNklHOXNaRlpoYkhWbFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxkRTVsZDFaaGJIVmxLRzVsZDFaaGJIVmxLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h1YjNScFpubFRjSGtwWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNCNVVtVndiM0owUlc1a0tDazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQjlPMXh1SUNBZ0lFOWljMlZ5ZG1GaWJHVldZV3gxWlM1d2NtOTBiM1I1Y0dVdWNISmxjR0Z5WlU1bGQxWmhiSFZsSUQwZ1puVnVZM1JwYjI0Z0tHNWxkMVpoYkhWbEtTQjdYRzRnSUNBZ0lDQWdJR0Z6YzJWeWRGVnVkM0poY0hCbFpDaHVaWGRXWVd4MVpTd2dYQ0pOYjJScFptbGxjbk1nWTJGdWJtOTBJR0psSUhWelpXUWdiMjRnYm05dUxXbHVhWFJwWVd3Z2RtRnNkV1Z6TGx3aUtUdGNiaUFnSUNBZ0lDQWdZMmhsWTJ0SlpsTjBZWFJsVFc5a2FXWnBZMkYwYVc5dWMwRnlaVUZzYkc5M1pXUW9LVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHaGhjMGx1ZEdWeVkyVndkRzl5Y3loMGFHbHpLU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdOb1lXNW5aU0E5SUdsdWRHVnlZMlZ3ZEVOb1lXNW5aU2gwYUdsekxDQjdJRzlpYW1WamREb2dkR2hwY3l3Z2RIbHdaVG9nWENKMWNHUmhkR1ZjSWl3Z2JtVjNWbUZzZFdVNklHNWxkMVpoYkhWbElIMHBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0ZqYUdGdVoyVXBYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlGVk9RMGhCVGtkRlJEdGNiaUFnSUNBZ0lDQWdJQ0FnSUc1bGQxWmhiSFZsSUQwZ1kyaGhibWRsTG01bGQxWmhiSFZsTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIWmhjaUJqYUdGdVoyVmtJRDBnZG1Gc2RXVkVhV1JEYUdGdVoyVW9kR2hwY3k1dGIyUmxJRDA5UFNCV1lXeDFaVTF2WkdVdVUzUnlkV04wZFhKbExDQjBhR2x6TG5aaGJIVmxMQ0J1WlhkV1lXeDFaU2s3WEc0Z0lDQWdJQ0FnSUdsbUlDaGphR0Z1WjJWa0tWeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJRzFoYTJWRGFHbHNaRTlpYzJWeWRtRmliR1VvYm1WM1ZtRnNkV1VzSUhSb2FYTXViVzlrWlN3Z2RHaHBjeTV1WVcxbEtUdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlGVk9RMGhCVGtkRlJEdGNiaUFnSUNCOU8xeHVJQ0FnSUU5aWMyVnlkbUZpYkdWV1lXeDFaUzV3Y205MGIzUjVjR1V1YzJWMFRtVjNWbUZzZFdVZ1BTQm1kVzVqZEdsdmJpQW9ibVYzVm1Gc2RXVXBJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHOXNaRlpoYkhWbElEMGdkR2hwY3k1MllXeDFaVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NTJZV3gxWlNBOUlHNWxkMVpoYkhWbE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG5KbGNHOXlkRU5vWVc1blpXUW9LVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHaGhjMHhwYzNSbGJtVnljeWgwYUdsektTbGNiaUFnSUNBZ0lDQWdJQ0FnSUc1dmRHbG1lVXhwYzNSbGJtVnljeWgwYUdsekxDQmJibVYzVm1Gc2RXVXNJRzlzWkZaaGJIVmxYU2s3WEc0Z0lDQWdmVHRjYmlBZ0lDQlBZbk5sY25aaFlteGxWbUZzZFdVdWNISnZkRzkwZVhCbExtZGxkQ0E5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdkR2hwY3k1eVpYQnZjblJQWW5ObGNuWmxaQ2dwTzF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NTJZV3gxWlR0Y2JpQWdJQ0I5TzF4dUlDQWdJRTlpYzJWeWRtRmliR1ZXWVd4MVpTNXdjbTkwYjNSNWNHVXVhVzUwWlhKalpYQjBJRDBnWm5WdVkzUnBiMjRnS0doaGJtUnNaWElwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhKbFoybHpkR1Z5U1c1MFpYSmpaWEIwYjNJb2RHaHBjeXdnYUdGdVpHeGxjaWs3WEc0Z0lDQWdmVHRjYmlBZ0lDQlBZbk5sY25aaFlteGxWbUZzZFdVdWNISnZkRzkwZVhCbExtOWljMlZ5ZG1VZ1BTQm1kVzVqZEdsdmJpQW9iR2x6ZEdWdVpYSXNJR1pwY21WSmJXMWxaR2xoZEdWc2VTa2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb1ptbHlaVWx0YldWa2FXRjBaV3g1S1Z4dUlDQWdJQ0FnSUNBZ0lDQWdiR2x6ZEdWdVpYSW9kR2hwY3k1MllXeDFaU3dnZFc1a1pXWnBibVZrS1R0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhKbFoybHpkR1Z5VEdsemRHVnVaWElvZEdocGN5d2diR2x6ZEdWdVpYSXBPMXh1SUNBZ0lIMDdYRzRnSUNBZ1QySnpaWEoyWVdKc1pWWmhiSFZsTG5CeWIzUnZkSGx3WlM1MGIwcFRUMDRnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG1kbGRDZ3BPMXh1SUNBZ0lIMDdYRzRnSUNBZ1QySnpaWEoyWVdKc1pWWmhiSFZsTG5CeWIzUnZkSGx3WlM1MGIxTjBjbWx1WnlBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWJtRnRaU0FySUZ3aVcxd2lJQ3NnZEdocGN5NTJZV3gxWlNBcklGd2lYVndpTzF4dUlDQWdJSDA3WEc0Z0lDQWdjbVYwZFhKdUlFOWljMlZ5ZG1GaWJHVldZV3gxWlR0Y2JuMG9RWFJ2YlNrcE8xeHVablZ1WTNScGIyNGdaMlYwUVhSdmJTaDBhR2x1Wnl3Z2NISnZjR1Z5ZEhrcElIdGNiaUFnSUNCcFppQW9kSGx3Wlc5bUlIUm9hVzVuSUQwOVBTQmNJbTlpYW1WamRGd2lJQ1ltSUhSb2FXNW5JQ0U5UFNCdWRXeHNLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaHBjMDlpYzJWeWRtRmliR1ZCY25KaGVTaDBhR2x1WnlrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsdWRtRnlhV0Z1ZENod2NtOXdaWEowZVNBOVBUMGdkVzVrWldacGJtVmtMQ0JjSWtsMElHbHpJRzV2ZENCd2IzTnphV0pzWlNCMGJ5Qm5aWFFnYVc1a1pYZ2dZWFJ2YlhNZ1puSnZiU0JoY25KaGVYTmNJaWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBibWN1SkcxdlluZ3VZWFJ2YlR0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQnBaaUFvYVhOUFluTmxjblpoWW14bFRXRndLSFJvYVc1bktTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSEJ5YjNCbGNuUjVJRDA5UFNCMWJtUmxabWx1WldRcFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdkbGRFRjBiMjBvZEdocGJtY3VYMnRsZVhNcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHOWljMlZ5ZG1GaWJHVmZNU0E5SUhSb2FXNW5MbDlrWVhSaFczQnliM0JsY25SNVhTQjhmQ0IwYUdsdVp5NWZhR0Z6VFdGd1czQnliM0JsY25SNVhUdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsdWRtRnlhV0Z1ZENnaElXOWljMlZ5ZG1GaWJHVmZNU3dnWENKMGFHVWdaVzUwY25rZ0oxd2lJQ3NnY0hKdmNHVnlkSGtnS3lCY0lpY2daRzlsY3lCdWIzUWdaWGhwYzNRZ2FXNGdkR2hsSUc5aWMyVnlkbUZpYkdVZ2JXRndJQ2RjSWlBcklHZGxkRVJsWW5WblRtRnRaU2gwYUdsdVp5a2dLeUJjSWlkY0lpazdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYjJKelpYSjJZV0pzWlY4eE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSEoxYmt4aGVubEpibWwwYVdGc2FYcGxjbk1vZEdocGJtY3BPMXh1SUNBZ0lDQWdJQ0JwWmlBb2FYTlBZbk5sY25aaFlteGxUMkpxWldOMEtIUm9hVzVuS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVc1MllYSnBZVzUwS0NFaGNISnZjR1Z5ZEhrc0lGd2ljR3hsWVhObElITndaV05wWm5rZ1lTQndjbTl3WlhKMGVWd2lLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ2WW5ObGNuWmhZbXhsWHpJZ1BTQjBhR2x1Wnk0a2JXOWllQzUyWVd4MVpYTmJjSEp2Y0dWeWRIbGRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXNTJZWEpwWVc1MEtDRWhiMkp6WlhKMllXSnNaVjh5TENCY0ltNXZJRzlpYzJWeWRtRmliR1VnY0hKdmNHVnlkSGtnSjF3aUlDc2djSEp2Y0dWeWRIa2dLeUJjSWljZ1ptOTFibVFnYjI0Z2RHaGxJRzlpYzJWeWRtRmliR1VnYjJKcVpXTjBJQ2RjSWlBcklHZGxkRVJsWW5WblRtRnRaU2gwYUdsdVp5a2dLeUJjSWlkY0lpazdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYjJKelpYSjJZV0pzWlY4eU8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJR2xtSUNoMGFHbHVaeUJwYm5OMFlXNWpaVzltSUVGMGIyMGdmSHdnZEdocGJtY2dhVzV6ZEdGdVkyVnZaaUJEYjIxd2RYUmxaRlpoYkhWbElIeDhJSFJvYVc1bklHbHVjM1JoYm1ObGIyWWdVbVZoWTNScGIyNHBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHVaenRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ0lDQmxiSE5sSUdsbUlDaDBlWEJsYjJZZ2RHaHBibWNnUFQwOUlGd2lablZ1WTNScGIyNWNJaWtnZTF4dUlDQWdJQ0FnSUNCcFppQW9kR2hwYm1jdUpHMXZZbmdnYVc1emRHRnVZMlZ2WmlCU1pXRmpkR2x2YmlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVc1bkxpUnRiMko0TzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQWdJR2x1ZG1GeWFXRnVkQ2htWVd4elpTd2dYQ0pEWVc1dWIzUWdiMkowWVdsdUlHRjBiMjBnWm5KdmJTQmNJaUFySUhSb2FXNW5LVHRjYm4xY2JtWjFibU4wYVc5dUlHZGxkRUZrYldsdWFYTjBjbUYwYVc5dUtIUm9hVzVuTENCd2NtOXdaWEowZVNrZ2UxeHVJQ0FnSUdsdWRtRnlhV0Z1ZENoMGFHbHVaeXdnWENKRmVIQmxZM1JwYjI0Z2MyOXRaU0J2WW1wbFkzUmNJaWs3WEc0Z0lDQWdhV1lnS0hCeWIzQmxjblI1SUNFOVBTQjFibVJsWm1sdVpXUXBYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQm5aWFJCWkcxcGJtbHpkSEpoZEdsdmJpaG5aWFJCZEc5dEtIUm9hVzVuTENCd2NtOXdaWEowZVNrcE8xeHVJQ0FnSUdsbUlDaDBhR2x1WnlCcGJuTjBZVzVqWlc5bUlFRjBiMjBnZkh3Z2RHaHBibWNnYVc1emRHRnVZMlZ2WmlCRGIyMXdkWFJsWkZaaGJIVmxJSHg4SUhSb2FXNW5JR2x1YzNSaGJtTmxiMllnVW1WaFkzUnBiMjRwWEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsdVp6dGNiaUFnSUNCcFppQW9hWE5QWW5ObGNuWmhZbXhsVFdGd0tIUm9hVzVuS1NsY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FXNW5PMXh1SUNBZ0lISjFia3hoZW5sSmJtbDBhV0ZzYVhwbGNuTW9kR2hwYm1jcE8xeHVJQ0FnSUdsbUlDaDBhR2x1Wnk0a2JXOWllQ2xjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVc1bkxpUnRiMko0TzF4dUlDQWdJR2x1ZG1GeWFXRnVkQ2htWVd4elpTd2dYQ0pEWVc1dWIzUWdiMkowWVdsdUlHRmtiV2x1YVhOMGNtRjBhVzl1SUdaeWIyMGdYQ0lnS3lCMGFHbHVaeWs3WEc1OVhHNW1kVzVqZEdsdmJpQm5aWFJFWldKMVowNWhiV1VvZEdocGJtY3NJSEJ5YjNCbGNuUjVLU0I3WEc0Z0lDQWdkbUZ5SUc1aGJXVmtPMXh1SUNBZ0lHbG1JQ2h3Y205d1pYSjBlU0FoUFQwZ2RXNWtaV1pwYm1Wa0tWeHVJQ0FnSUNBZ0lDQnVZVzFsWkNBOUlHZGxkRUYwYjIwb2RHaHBibWNzSUhCeWIzQmxjblI1S1R0Y2JpQWdJQ0JsYkhObElHbG1JQ2hwYzA5aWMyVnlkbUZpYkdWUFltcGxZM1FvZEdocGJtY3BJSHg4SUdselQySnpaWEoyWVdKc1pVMWhjQ2gwYUdsdVp5a3BYRzRnSUNBZ0lDQWdJRzVoYldWa0lEMGdaMlYwUVdSdGFXNXBjM1J5WVhScGIyNG9kR2hwYm1jcE8xeHVJQ0FnSUdWc2MyVmNiaUFnSUNBZ0lDQWdibUZ0WldRZ1BTQm5aWFJCZEc5dEtIUm9hVzVuS1R0Y2JpQWdJQ0J5WlhSMWNtNGdibUZ0WldRdWJtRnRaVHRjYm4xY2JtWjFibU4wYVc5dUlHTnlaV0YwWlVOc1lYTnpVSEp2Y0dWeWRIbEVaV052Y21GMGIzSW9iMjVKYm1sMGFXRnNhWHBsTENCblpYUXNJSE5sZEN3Z1pXNTFiV1Z5WVdKc1pTd2dZV3hzYjNkRGRYTjBiMjFCY21kMWJXVnVkSE1wSUh0Y2JpQWdJQ0JtZFc1amRHbHZiaUJqYkdGemMxQnliM0JsY25SNVJHVmpiM0poZEc5eUtIUmhjbWRsZEN3Z2EyVjVMQ0JrWlhOamNtbHdkRzl5TENCamRYTjBiMjFCY21kektTQjdYRzRnSUNBZ0lDQWdJR2x1ZG1GeWFXRnVkQ2hoYkd4dmQwTjFjM1J2YlVGeVozVnRaVzUwY3lCOGZDQnhkV0ZqYTNOTWFXdGxRVVJsWTI5eVlYUnZjaWhoY21kMWJXVnVkSE1wTENCY0lsUm9hWE1nWm5WdVkzUnBiMjRnYVhNZ1lTQmtaV052Y21GMGIzSXNJR0oxZENCcGRDQjNZWE51SjNRZ2FXNTJiMnRsWkNCc2FXdGxJR0VnWkdWamIzSmhkRzl5WENJcE8xeHVJQ0FnSUNBZ0lDQnBaaUFvSVdSbGMyTnlhWEIwYjNJcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnVaWGRFWlhOamNtbHdkRzl5SUQwZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHVnVkVzFsY21GaWJHVTZJR1Z1ZFcxbGNtRmliR1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTI5dVptbG5kWEpoWW14bE9pQjBjblZsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkbGREb2dablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVhSb2FYTXVYMTl0YjJKNFNXNXBkR2xoYkdsNlpXUlFjbTl3Y3lCOGZDQjBhR2x6TGw5ZmJXOWllRWx1YVhScFlXeHBlbVZrVUhKdmNITmJhMlY1WFNBaFBUMGdkSEoxWlNsY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSNWNHVnpZM0pwY0hSSmJtbDBhV0ZzYVhwbFVISnZjR1Z5ZEhrb2RHaHBjeXdnYTJWNUxDQjFibVJsWm1sdVpXUXNJRzl1U1c1cGRHbGhiR2w2WlN3Z1kzVnpkRzl0UVhKbmN5d2daR1Z6WTNKcGNIUnZjaWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCblpYUXVZMkZzYkNoMGFHbHpMQ0JyWlhrcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMHNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMlYwT2lCbWRXNWpkR2x2YmlBb2Rpa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9JWFJvYVhNdVgxOXRiMko0U1c1cGRHbGhiR2w2WldSUWNtOXdjeUI4ZkNCMGFHbHpMbDlmYlc5aWVFbHVhWFJwWVd4cGVtVmtVSEp2Y0hOYmEyVjVYU0FoUFQwZ2RISjFaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEhsd1pYTmpjbWx3ZEVsdWFYUnBZV3hwZW1WUWNtOXdaWEowZVNoMGFHbHpMQ0JyWlhrc0lIWXNJRzl1U1c1cGRHbGhiR2w2WlN3Z1kzVnpkRzl0UVhKbmN5d2daR1Z6WTNKcGNIUnZjaWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpaWFF1WTJGc2JDaDBhR2x6TENCclpYa3NJSFlwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZUdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaGhjbWQxYldWdWRITXViR1Z1WjNSb0lEd2dNeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUU5aWFtVmpkQzVrWldacGJtVlFjbTl3WlhKMGVTaDBZWEpuWlhRc0lHdGxlU3dnYm1WM1JHVnpZM0pwY0hSdmNpazdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdibVYzUkdWelkzSnBjSFJ2Y2p0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnaGRHRnlaMlYwTG1oaGMwOTNibEJ5YjNCbGNuUjVLRndpWDE5dGIySjRUR0Y2ZVVsdWFYUnBZV3hwZW1WeWMxd2lLU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdGa1pFaHBaR1JsYmxCeWIzQW9kR0Z5WjJWMExDQmNJbDlmYlc5aWVFeGhlbmxKYm1sMGFXRnNhWHBsY25OY0lpd2dLSFJoY21kbGRDNWZYMjF2WW5oTVlYcDVTVzVwZEdsaGJHbDZaWEp6SUNZbUlIUmhjbWRsZEM1ZlgyMXZZbmhNWVhwNVNXNXBkR2xoYkdsNlpYSnpMbk5zYVdObEtDa3BJSHg4SUZ0ZEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCMllXeDFaVjh4SUQwZ1pHVnpZM0pwY0hSdmNpNTJZV3gxWlN3Z2FXNXBkR2xoYkdsNlpYSmZNU0E5SUdSbGMyTnlhWEIwYjNJdWFXNXBkR2xoYkdsNlpYSTdYRzRnSUNBZ0lDQWdJQ0FnSUNCMFlYSm5aWFF1WDE5dGIySjRUR0Y2ZVVsdWFYUnBZV3hwZW1WeWN5NXdkWE5vS0daMWJtTjBhVzl1SUNocGJuTjBZVzVqWlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOXVTVzVwZEdsaGJHbDZaU2hwYm5OMFlXNWpaU3dnYTJWNUxDQW9hVzVwZEdsaGJHbDZaWEpmTVNBL0lHbHVhWFJwWVd4cGVtVnlYekV1WTJGc2JDaHBibk4wWVc1alpTa2dPaUIyWVd4MVpWOHhLU3dnWTNWemRHOXRRWEpuY3l3Z1pHVnpZM0pwY0hSdmNpazdYRzRnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUI3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWlc1MWJXVnlZV0pzWlRvZ1pXNTFiV1Z5WVdKc1pTd2dZMjl1Wm1sbmRYSmhZbXhsT2lCMGNuVmxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2RsZERvZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1ZlgyMXZZbmhFYVdSU2RXNU1ZWHA1U1c1cGRHbGhiR2w2WlhKeklDRTlQU0IwY25WbEtWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NuVnVUR0Y2ZVVsdWFYUnBZV3hwZW1WeWN5aDBhR2x6S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHZGxkQzVqWVd4c0tIUm9hWE1zSUd0bGVTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6WlhRNklHWjFibU4wYVc5dUlDaDJLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxsOWZiVzlpZUVScFpGSjFia3hoZW5sSmJtbDBhV0ZzYVhwbGNuTWdJVDA5SUhSeWRXVXBYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlkVzVNWVhwNVNXNXBkR2xoYkdsNlpYSnpLSFJvYVhNcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6WlhRdVkyRnNiQ2gwYUdsekxDQnJaWGtzSUhZcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUgwN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJQ0FnYVdZZ0tHRnNiRzkzUTNWemRHOXRRWEpuZFcxbGJuUnpLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2NYVmhZMnR6VEdsclpVRkVaV052Y21GMGIzSW9ZWEpuZFcxbGJuUnpLU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdZMnhoYzNOUWNtOXdaWEowZVVSbFkyOXlZWFJ2Y2k1aGNIQnNlU2h1ZFd4c0xDQmhjbWQxYldWdWRITXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJRzkxZEdWeVFYSm5jeUE5SUdGeVozVnRaVzUwY3p0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQm1kVzVqZEdsdmJpQW9kR0Z5WjJWMExDQnJaWGtzSUdSbGMyTnlhWEIwYjNJcElIc2djbVYwZFhKdUlHTnNZWE56VUhKdmNHVnlkSGxFWldOdmNtRjBiM0lvZEdGeVoyVjBMQ0JyWlhrc0lHUmxjMk55YVhCMGIzSXNJRzkxZEdWeVFYSm5jeWs3SUgwN1hHNGdJQ0FnSUNBZ0lIMDdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJqYkdGemMxQnliM0JsY25SNVJHVmpiM0poZEc5eU8xeHVmVnh1Wm5WdVkzUnBiMjRnZEhsd1pYTmpjbWx3ZEVsdWFYUnBZV3hwZW1WUWNtOXdaWEowZVNocGJuTjBZVzVqWlN3Z2EyVjVMQ0IyTENCdmJrbHVhWFJwWVd4cGVtVXNJR04xYzNSdmJVRnlaM01zSUdKaGMyVkVaWE5qY21sd2RHOXlLU0I3WEc0Z0lDQWdhV1lnS0NGcGJuTjBZVzVqWlM1b1lYTlBkMjVRY205d1pYSjBlU2hjSWw5ZmJXOWllRWx1YVhScFlXeHBlbVZrVUhKdmNITmNJaWtwWEc0Z0lDQWdJQ0FnSUdGa1pFaHBaR1JsYmxCeWIzQW9hVzV6ZEdGdVkyVXNJRndpWDE5dGIySjRTVzVwZEdsaGJHbDZaV1JRY205d2Mxd2lMQ0I3ZlNrN1hHNGdJQ0FnYVc1emRHRnVZMlV1WDE5dGIySjRTVzVwZEdsaGJHbDZaV1JRY205d2MxdHJaWGxkSUQwZ2RISjFaVHRjYmlBZ0lDQnZia2x1YVhScFlXeHBlbVVvYVc1emRHRnVZMlVzSUd0bGVTd2dkaXdnWTNWemRHOXRRWEpuY3l3Z1ltRnpaVVJsYzJOeWFYQjBiM0lwTzF4dWZWeHVablZ1WTNScGIyNGdjblZ1VEdGNmVVbHVhWFJwWVd4cGVtVnljeWhwYm5OMFlXNWpaU2tnZTF4dUlDQWdJR2xtSUNocGJuTjBZVzVqWlM1ZlgyMXZZbmhFYVdSU2RXNU1ZWHA1U1c1cGRHbGhiR2w2WlhKeklEMDlQU0IwY25WbEtWeHVJQ0FnSUNBZ0lDQnlaWFIxY200N1hHNGdJQ0FnYVdZZ0tHbHVjM1JoYm1ObExsOWZiVzlpZUV4aGVubEpibWwwYVdGc2FYcGxjbk1wSUh0Y2JpQWdJQ0FnSUNBZ1lXUmtTR2xrWkdWdVVISnZjQ2hwYm5OMFlXNWpaU3dnWENKZlgyMXZZbmhFYVdSU2RXNU1ZWHA1U1c1cGRHbGhiR2w2WlhKelhDSXNJSFJ5ZFdVcE8xeHVJQ0FnSUNBZ0lDQnBibk4wWVc1alpTNWZYMjF2WW5oRWFXUlNkVzVNWVhwNVNXNXBkR2xoYkdsNlpYSnpJQ1ltSUdsdWMzUmhibU5sTGw5ZmJXOWllRXhoZW5sSmJtbDBhV0ZzYVhwbGNuTXVabTl5UldGamFDaG1kVzVqZEdsdmJpQW9hVzVwZEdsaGJHbDZaWElwSUhzZ2NtVjBkWEp1SUdsdWFYUnBZV3hwZW1WeUtHbHVjM1JoYm1ObEtUc2dmU2s3WEc0Z0lDQWdmVnh1ZlZ4dVpuVnVZM1JwYjI0Z2NYVmhZMnR6VEdsclpVRkVaV052Y21GMGIzSW9ZWEpuY3lrZ2UxeHVJQ0FnSUhKbGRIVnliaUFvWVhKbmN5NXNaVzVuZEdnZ1BUMDlJRElnZkh3Z1lYSm5jeTVzWlc1bmRHZ2dQVDA5SURNcElDWW1JSFI1Y0dWdlppQmhjbWR6V3pGZElEMDlQU0JjSW5OMGNtbHVaMXdpTzF4dWZWeHVablZ1WTNScGIyNGdhWFJsY21GMGIzSlRlVzFpYjJ3b0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUNoMGVYQmxiMllnVTNsdFltOXNJRDA5UFNCY0ltWjFibU4wYVc5dVhDSWdKaVlnVTNsdFltOXNMbWwwWlhKaGRHOXlLU0I4ZkNCY0lrQkFhWFJsY21GMGIzSmNJanRjYm4xY2JuWmhjaUJKVTE5SlZFVlNRVlJKVGtkZlRVRlNTMFZTSUQwZ1hDSmZYeVFrYVhSbGNtRjBhVzVuWENJN1hHNW1kVzVqZEdsdmJpQmhjbkpoZVVGelNYUmxjbUYwYjNJb1lYSnlZWGtwSUh0Y2JpQWdJQ0JwYm5aaGNtbGhiblFvWVhKeVlYbGJTVk5mU1ZSRlVrRlVTVTVIWDAxQlVrdEZVbDBnSVQwOUlIUnlkV1VzSUZ3aVNXeHNaV2RoYkNCemRHRjBaVG9nWTJGdWJtOTBJSEpsWTNsamJHVWdZWEp5WVhrZ1lYTWdhWFJsY21GMGIzSmNJaWs3WEc0Z0lDQWdZV1JrU0dsa1pHVnVSbWx1WVd4UWNtOXdLR0Z5Y21GNUxDQkpVMTlKVkVWU1FWUkpUa2RmVFVGU1MwVlNMQ0IwY25WbEtUdGNiaUFnSUNCMllYSWdhV1I0SUQwZ0xURTdYRzRnSUNBZ1lXUmtTR2xrWkdWdVJtbHVZV3hRY205d0tHRnljbUY1TENCY0ltNWxlSFJjSWl3Z1puVnVZM1JwYjI0Z2JtVjRkQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2FXUjRLeXM3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUI3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtiMjVsT2lCcFpIZ2dQajBnZEdocGN5NXNaVzVuZEdnc1hHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVd4MVpUb2dhV1I0SUR3Z2RHaHBjeTVzWlc1bmRHZ2dQeUIwYUdselcybGtlRjBnT2lCMWJtUmxabWx1WldSY2JpQWdJQ0FnSUNBZ2ZUdGNiaUFnSUNCOUtUdGNiaUFnSUNCeVpYUjFjbTRnWVhKeVlYazdYRzU5WEc1bWRXNWpkR2x2YmlCa1pXTnNZWEpsU1hSbGNtRjBiM0lvY0hKdmRHOTBWSGx3WlN3Z2FYUmxjbUYwYjNKR1lXTjBiM0o1S1NCN1hHNGdJQ0FnWVdSa1NHbGtaR1Z1Um1sdVlXeFFjbTl3S0hCeWIzUnZkRlI1Y0dVc0lHbDBaWEpoZEc5eVUzbHRZbTlzS0Nrc0lHbDBaWEpoZEc5eVJtRmpkRzl5ZVNrN1hHNTlYRzUyWVhJZ1UybHRjR3hsVTJWMElEMGdLR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0JtZFc1amRHbHZiaUJUYVcxd2JHVlRaWFFvS1NCN1hHNGdJQ0FnSUNBZ0lIUm9hWE11YzJsNlpTQTlJREE3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVaR0YwWVNBOUlIdDlPMXh1SUNBZ0lIMWNiaUFnSUNCUFltcGxZM1F1WkdWbWFXNWxVSEp2Y0dWeWRIa29VMmx0Y0d4bFUyVjBMbkJ5YjNSdmRIbHdaU3dnWENKc1pXNW5kR2hjSWl3Z2UxeHVJQ0FnSUNBZ0lDQm5aWFE2SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxuTnBlbVU3WEc0Z0lDQWdJQ0FnSUgwc1hHNGdJQ0FnSUNBZ0lHVnVkVzFsY21GaWJHVTZJSFJ5ZFdVc1hHNGdJQ0FnSUNBZ0lHTnZibVpwWjNWeVlXSnNaVG9nZEhKMVpWeHVJQ0FnSUgwcE8xeHVJQ0FnSUZOcGJYQnNaVk5sZEM1d2NtOTBiM1I1Y0dVdVlYTkJjbkpoZVNBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlISmxjeUE5SUc1bGR5QkJjbkpoZVNoMGFHbHpMbk5wZW1VcE8xeHVJQ0FnSUNBZ0lDQjJZWElnYVNBOUlEQTdYRzRnSUNBZ0lDQWdJR1p2Y2lBb2RtRnlJR3RsZVNCcGJpQjBhR2x6TG1SaGRHRXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxjMXRwWFNBOUlIUm9hWE11WkdGMFlWdHJaWGxkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdhU3NyTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCeVpYTTdYRzRnSUNBZ2ZUdGNiaUFnSUNCVGFXMXdiR1ZUWlhRdWNISnZkRzkwZVhCbExtRmtaQ0E5SUdaMWJtTjBhVzl1SUNoMllXeDFaU2tnZTF4dUlDQWdJQ0FnSUNCMllYSWdiU0E5SUhaaGJIVmxMbDlmYldGd2FXUTdYRzRnSUNBZ0lDQWdJR2xtSUNnaEtHMGdhVzRnZEdocGN5NWtZWFJoS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWtZWFJoVzIxZElEMGdkbUZzZFdVN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTnBlbVVyS3p0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUgwN1hHNGdJQ0FnVTJsdGNHeGxVMlYwTG5CeWIzUnZkSGx3WlM1eVpXMXZkbVVnUFNCbWRXNWpkR2x2YmlBb2RtRnNkV1VwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLSFpoYkhWbExsOWZiV0Z3YVdRZ2FXNGdkR2hwY3k1a1lYUmhLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaV3hsZEdVZ2RHaHBjeTVrWVhSaFczWmhiSFZsTGw5ZmJXRndhV1JkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1emFYcGxMUzA3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5TzF4dUlDQWdJSEpsZEhWeWJpQlRhVzF3YkdWVFpYUTdYRzU5S0NrcE8xeHVaWGh3YjNKMGN5NVRhVzF3YkdWVFpYUWdQU0JUYVcxd2JHVlRaWFE3WEc1MllYSWdVMmx0Y0d4bFJYWmxiblJGYldsMGRHVnlJRDBnS0daMWJtTjBhVzl1SUNncElIdGNiaUFnSUNCbWRXNWpkR2x2YmlCVGFXMXdiR1ZGZG1WdWRFVnRhWFIwWlhJb0tTQjdYRzRnSUNBZ0lDQWdJSFJvYVhNdWJHbHpkR1Z1WlhKeklEMGdXMTA3WEc0Z0lDQWdJQ0FnSUdSbGNISmxZMkYwWldRb1hDSmxlSFJ5WVhNdVUybHRjR3hsUlhabGJuUkZiV2wwZEdWeUlHbHpJR1JsY0hKbFkyRjBaV1FnWVc1a0lIZHBiR3dnWW1VZ2NtVnRiM1psWkNCcGJpQjBhR1VnYm1WNGRDQnRZV3B2Y2lCeVpXeGxZWE5sWENJcE8xeHVJQ0FnSUgxY2JpQWdJQ0JUYVcxd2JHVkZkbVZ1ZEVWdGFYUjBaWEl1Y0hKdmRHOTBlWEJsTG1WdGFYUWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJzYVhOMFpXNWxjbk1nUFNCMGFHbHpMbXhwYzNSbGJtVnljeTV6YkdsalpTZ3BPMXh1SUNBZ0lDQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Dd2diQ0E5SUd4cGMzUmxibVZ5Y3k1c1pXNW5kR2c3SUdrZ1BDQnNPeUJwS3lzcFhHNGdJQ0FnSUNBZ0lDQWdJQ0JzYVhOMFpXNWxjbk5iYVYwdVlYQndiSGtvYm5Wc2JDd2dZWEpuZFcxbGJuUnpLVHRjYmlBZ0lDQjlPMXh1SUNBZ0lGTnBiWEJzWlVWMlpXNTBSVzFwZEhSbGNpNXdjbTkwYjNSNWNHVXViMjRnUFNCbWRXNWpkR2x2YmlBb2JHbHpkR1Z1WlhJcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUY5MGFHbHpJRDBnZEdocGN6dGNiaUFnSUNBZ0lDQWdkR2hwY3k1c2FYTjBaVzVsY25NdWNIVnphQ2hzYVhOMFpXNWxjaWs3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ2Ym1ObEtHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJwWkhnZ1BTQmZkR2hwY3k1c2FYTjBaVzVsY25NdWFXNWtaWGhQWmloc2FYTjBaVzVsY2lrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2FXUjRJQ0U5UFNBdE1TbGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmZkR2hwY3k1c2FYTjBaVzVsY25NdWMzQnNhV05sS0dsa2VDd2dNU2s3WEc0Z0lDQWdJQ0FnSUgwcE8xeHVJQ0FnSUgwN1hHNGdJQ0FnVTJsdGNHeGxSWFpsYm5SRmJXbDBkR1Z5TG5CeWIzUnZkSGx3WlM1dmJtTmxJRDBnWm5WdVkzUnBiMjRnS0d4cGMzUmxibVZ5S1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJ6ZFdKelkzSnBjSFJwYjI0Z1BTQjBhR2x6TG05dUtHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lITjFZbk5qY21sd2RHbHZiaWdwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdiR2x6ZEdWdVpYSXVZWEJ3Ykhrb2RHaHBjeXdnWVhKbmRXMWxiblJ6S1R0Y2JpQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnpkV0p6WTNKcGNIUnBiMjQ3WEc0Z0lDQWdmVHRjYmlBZ0lDQnlaWFIxY200Z1UybHRjR3hsUlhabGJuUkZiV2wwZEdWeU8xeHVmU2dwS1R0Y2JtVjRjRzl5ZEhNdVUybHRjR3hsUlhabGJuUkZiV2wwZEdWeUlEMGdVMmx0Y0d4bFJYWmxiblJGYldsMGRHVnlPMXh1ZG1GeUlFVk5VRlJaWDBGU1VrRlpJRDBnVzEwN1hHNVBZbXBsWTNRdVpuSmxaWHBsS0VWTlVGUlpYMEZTVWtGWktUdGNibVoxYm1OMGFXOXVJR2RsZEU1bGVIUkpaQ2dwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdLeXRuYkc5aVlXeFRkR0YwWlM1dGIySjRSM1ZwWkR0Y2JuMWNibVoxYm1OMGFXOXVJR2x1ZG1GeWFXRnVkQ2hqYUdWamF5d2diV1Z6YzJGblpTd2dkR2hwYm1jcElIdGNiaUFnSUNCcFppQW9JV05vWldOcktWeHVJQ0FnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb1hDSmJiVzlpZUYwZ1NXNTJZWEpwWVc1MElHWmhhV3hsWkRvZ1hDSWdLeUJ0WlhOellXZGxJQ3NnS0hSb2FXNW5JRDhnWENJZ2FXNGdKMXdpSUNzZ2RHaHBibWNnS3lCY0lpZGNJaUE2SUZ3aVhDSXBLVHRjYm4xY2JuWmhjaUJrWlhCeVpXTmhkR1ZrVFdWemMyRm5aWE1nUFNCYlhUdGNibVoxYm1OMGFXOXVJR1JsY0hKbFkyRjBaV1FvYlhObktTQjdYRzRnSUNBZ2FXWWdLR1JsY0hKbFkyRjBaV1JOWlhOellXZGxjeTVwYm1SbGVFOW1LRzF6WnlrZ0lUMDlJQzB4S1Z4dUlDQWdJQ0FnSUNCeVpYUjFjbTQ3WEc0Z0lDQWdaR1Z3Y21WallYUmxaRTFsYzNOaFoyVnpMbkIxYzJnb2JYTm5LVHRjYmlBZ0lDQmpiMjV6YjJ4bExtVnljbTl5S0Z3aVcyMXZZbmhkSUVSbGNISmxZMkYwWldRNklGd2lJQ3NnYlhObktUdGNibjFjYm1aMWJtTjBhVzl1SUc5dVkyVW9ablZ1WXlrZ2UxeHVJQ0FnSUhaaGNpQnBiblp2YTJWa0lEMGdabUZzYzJVN1hHNGdJQ0FnY21WMGRYSnVJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLR2x1ZG05clpXUXBYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTQ3WEc0Z0lDQWdJQ0FnSUdsdWRtOXJaV1FnUFNCMGNuVmxPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdablZ1WXk1aGNIQnNlU2gwYUdsekxDQmhjbWQxYldWdWRITXBPMXh1SUNBZ0lIMDdYRzU5WEc1MllYSWdibTl2Y0NBOUlHWjFibU4wYVc5dUlDZ3BJSHNnZlR0Y2JtWjFibU4wYVc5dUlIVnVhWEYxWlNoc2FYTjBLU0I3WEc0Z0lDQWdkbUZ5SUhKbGN5QTlJRnRkTzF4dUlDQWdJR3hwYzNRdVptOXlSV0ZqYUNobWRXNWpkR2x2YmlBb2FYUmxiU2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9jbVZ6TG1sdVpHVjRUMllvYVhSbGJTa2dQVDA5SUMweEtWeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WekxuQjFjMmdvYVhSbGJTazdYRzRnSUNBZ2ZTazdYRzRnSUNBZ2NtVjBkWEp1SUhKbGN6dGNibjFjYm1aMWJtTjBhVzl1SUdwdmFXNVRkSEpwYm1kektIUm9hVzVuY3l3Z2JHbHRhWFFzSUhObGNHRnlZWFJ2Y2lrZ2UxeHVJQ0FnSUdsbUlDaHNhVzFwZENBOVBUMGdkbTlwWkNBd0tTQjdJR3hwYldsMElEMGdNVEF3T3lCOVhHNGdJQ0FnYVdZZ0tITmxjR0Z5WVhSdmNpQTlQVDBnZG05cFpDQXdLU0I3SUhObGNHRnlZWFJ2Y2lBOUlGd2lJQzBnWENJN0lIMWNiaUFnSUNCcFppQW9JWFJvYVc1bmN5bGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlGd2lYQ0k3WEc0Z0lDQWdkbUZ5SUhOc2FXTmxaQ0E5SUhSb2FXNW5jeTV6YkdsalpTZ3dMQ0JzYVcxcGRDazdYRzRnSUNBZ2NtVjBkWEp1SUZ3aVhDSWdLeUJ6YkdsalpXUXVhbTlwYmloelpYQmhjbUYwYjNJcElDc2dLSFJvYVc1bmN5NXNaVzVuZEdnZ1BpQnNhVzFwZENBL0lGd2lJQ2d1TGk0Z1lXNWtJRndpSUNzZ0tIUm9hVzVuY3k1c1pXNW5kR2dnTFNCc2FXMXBkQ2tnS3lCY0ltMXZjbVVwWENJZ09pQmNJbHdpS1R0Y2JuMWNibVoxYm1OMGFXOXVJR2x6VUd4aGFXNVBZbXBsWTNRb2RtRnNkV1VwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkbUZzZFdVZ0lUMDlJRzUxYkd3Z0ppWWdkSGx3Wlc5bUlIWmhiSFZsSUQwOVBTQmNJbTlpYW1WamRGd2lJQ1ltSUU5aWFtVmpkQzVuWlhSUWNtOTBiM1I1Y0dWUFppaDJZV3gxWlNrZ1BUMDlJRTlpYW1WamRDNXdjbTkwYjNSNWNHVTdYRzU5WEc1bWRXNWpkR2x2YmlCdlltcGxZM1JCYzNOcFoyNG9LU0I3WEc0Z0lDQWdkbUZ5SUhKbGN5QTlJR0Z5WjNWdFpXNTBjMXN3WFR0Y2JpQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Td2diQ0E5SUdGeVozVnRaVzUwY3k1c1pXNW5kR2c3SUdrZ1BDQnNPeUJwS3lzcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUhOdmRYSmpaU0E5SUdGeVozVnRaVzUwYzF0cFhUdGNiaUFnSUNBZ0lDQWdabTl5SUNoMllYSWdhMlY1SUdsdUlITnZkWEpqWlNsY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoemIzVnlZMlV1YUdGelQzZHVVSEp2Y0dWeWRIa29hMlY1S1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjMXRyWlhsZElEMGdjMjkxY21ObFcydGxlVjA3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJ5WlhNN1hHNTlYRzVtZFc1amRHbHZiaUIyWVd4MVpVUnBaRU5vWVc1blpTaGpiMjF3WVhKbFUzUnlkV04wZFhKaGJDd2diMnhrVm1Gc2RXVXNJRzVsZDFaaGJIVmxLU0I3WEc0Z0lDQWdjbVYwZFhKdUlHTnZiWEJoY21WVGRISjFZM1IxY21Gc1hHNGdJQ0FnSUNBZ0lEOGdJV1JsWlhCRmNYVmhiSE1vYjJ4a1ZtRnNkV1VzSUc1bGQxWmhiSFZsS1Z4dUlDQWdJQ0FnSUNBNklHOXNaRlpoYkhWbElDRTlQU0J1WlhkV1lXeDFaVHRjYm4xY2JtWjFibU4wYVc5dUlHMWhhMlZPYjI1RmJuVnRaWEpoWW14bEtHOWlhbVZqZEN3Z2NISnZjRTVoYldWektTQjdYRzRnSUNBZ1ptOXlJQ2gyWVhJZ2FTQTlJREE3SUdrZ1BDQndjbTl3VG1GdFpYTXViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUNBZ1lXUmtTR2xrWkdWdVVISnZjQ2h2WW1wbFkzUXNJSEJ5YjNCT1lXMWxjMXRwWFN3Z2IySnFaV04wVzNCeWIzQk9ZVzFsYzF0cFhWMHBPMXh1SUNBZ0lIMWNibjFjYm1aMWJtTjBhVzl1SUdGa1pFaHBaR1JsYmxCeWIzQW9iMkpxWldOMExDQndjbTl3VG1GdFpTd2dkbUZzZFdVcElIdGNiaUFnSUNCUFltcGxZM1F1WkdWbWFXNWxVSEp2Y0dWeWRIa29iMkpxWldOMExDQndjbTl3VG1GdFpTd2dlMXh1SUNBZ0lDQWdJQ0JsYm5WdFpYSmhZbXhsT2lCbVlXeHpaU3hjYmlBZ0lDQWdJQ0FnZDNKcGRHRmliR1U2SUhSeWRXVXNYRzRnSUNBZ0lDQWdJR052Ym1acFozVnlZV0pzWlRvZ2RISjFaU3hjYmlBZ0lDQWdJQ0FnZG1Gc2RXVTZJSFpoYkhWbFhHNGdJQ0FnZlNrN1hHNTlYRzVtZFc1amRHbHZiaUJoWkdSSWFXUmtaVzVHYVc1aGJGQnliM0FvYjJKcVpXTjBMQ0J3Y205d1RtRnRaU3dnZG1Gc2RXVXBJSHRjYmlBZ0lDQlBZbXBsWTNRdVpHVm1hVzVsVUhKdmNHVnlkSGtvYjJKcVpXTjBMQ0J3Y205d1RtRnRaU3dnZTF4dUlDQWdJQ0FnSUNCbGJuVnRaWEpoWW14bE9pQm1ZV3h6WlN4Y2JpQWdJQ0FnSUNBZ2QzSnBkR0ZpYkdVNklHWmhiSE5sTEZ4dUlDQWdJQ0FnSUNCamIyNW1hV2QxY21GaWJHVTZJR1poYkhObExGeHVJQ0FnSUNBZ0lDQjJZV3gxWlRvZ2RtRnNkV1ZjYmlBZ0lDQjlLVHRjYm4xY2JtWjFibU4wYVc5dUlHbHpVSEp2Y0dWeWRIbERiMjVtYVdkMWNtRmliR1VvYjJKcVpXTjBMQ0J3Y205d0tTQjdYRzRnSUNBZ2RtRnlJR1JsYzJOeWFYQjBiM0lnUFNCUFltcGxZM1F1WjJWMFQzZHVVSEp2Y0dWeWRIbEVaWE5qY21sd2RHOXlLRzlpYW1WamRDd2djSEp2Y0NrN1hHNGdJQ0FnY21WMGRYSnVJQ0ZrWlhOamNtbHdkRzl5SUh4OElDaGtaWE5qY21sd2RHOXlMbU52Ym1acFozVnlZV0pzWlNBaFBUMGdabUZzYzJVZ0ppWWdaR1Z6WTNKcGNIUnZjaTUzY21sMFlXSnNaU0FoUFQwZ1ptRnNjMlVwTzF4dWZWeHVablZ1WTNScGIyNGdZWE56WlhKMFVISnZjR1Z5ZEhsRGIyNW1hV2QxY21GaWJHVW9iMkpxWldOMExDQndjbTl3S1NCN1hHNGdJQ0FnYVc1MllYSnBZVzUwS0dselVISnZjR1Z5ZEhsRGIyNW1hV2QxY21GaWJHVW9iMkpxWldOMExDQndjbTl3S1N3Z1hDSkRZVzV1YjNRZ2JXRnJaU0J3Y205d1pYSjBlU0FuWENJZ0t5QndjbTl3SUNzZ1hDSW5JRzlpYzJWeWRtRmliR1VzSUdsMElHbHpJRzV2ZENCamIyNW1hV2QxY21GaWJHVWdZVzVrSUhkeWFYUmhZbXhsSUdsdUlIUm9aU0IwWVhKblpYUWdiMkpxWldOMFhDSXBPMXh1ZlZ4dVpuVnVZM1JwYjI0Z1oyVjBSVzUxYldWeVlXSnNaVXRsZVhNb2IySnFLU0I3WEc0Z0lDQWdkbUZ5SUhKbGN5QTlJRnRkTzF4dUlDQWdJR1p2Y2lBb2RtRnlJR3RsZVNCcGJpQnZZbW9wWEc0Z0lDQWdJQ0FnSUhKbGN5NXdkWE5vS0d0bGVTazdYRzRnSUNBZ2NtVjBkWEp1SUhKbGN6dGNibjFjYm1aMWJtTjBhVzl1SUdSbFpYQkZjWFZoYkhNb1lTd2dZaWtnZTF4dUlDQWdJR2xtSUNoaElEMDlQU0J1ZFd4c0lDWW1JR0lnUFQwOUlHNTFiR3dwWEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIwY25WbE8xeHVJQ0FnSUdsbUlDaGhJRDA5UFNCMWJtUmxabWx1WldRZ0ppWWdZaUE5UFQwZ2RXNWtaV1pwYm1Wa0tWeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RISjFaVHRjYmlBZ0lDQjJZWElnWVVselFYSnlZWGtnUFNCQmNuSmhlUzVwYzBGeWNtRjVLR0VwSUh4OElHbHpUMkp6WlhKMllXSnNaVUZ5Y21GNUtHRXBPMXh1SUNBZ0lHbG1JQ2hoU1hOQmNuSmhlU0FoUFQwZ0tFRnljbUY1TG1selFYSnlZWGtvWWlrZ2ZId2dhWE5QWW5ObGNuWmhZbXhsUVhKeVlYa29ZaWtwS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCbVlXeHpaVHRjYmlBZ0lDQjlYRzRnSUNBZ1pXeHpaU0JwWmlBb1lVbHpRWEp5WVhrcElIdGNiaUFnSUNBZ0lDQWdhV1lnS0dFdWJHVnVaM1JvSUNFOVBTQmlMbXhsYm1kMGFDbGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNBZ0lDQWdabTl5SUNoMllYSWdhU0E5SUdFdWJHVnVaM1JvSUMwZ01Uc2dhU0ErUFNBd095QnBMUzBwWEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVdSbFpYQkZjWFZoYkhNb1lWdHBYU3dnWWx0cFhTa3BYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHWmhiSE5sTzF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZEhKMVpUdGNiaUFnSUNCOVhHNGdJQ0FnWld4elpTQnBaaUFvZEhsd1pXOW1JR0VnUFQwOUlGd2liMkpxWldOMFhDSWdKaVlnZEhsd1pXOW1JR0lnUFQwOUlGd2liMkpxWldOMFhDSXBJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHRWdQVDA5SUc1MWJHd2dmSHdnWWlBOVBUMGdiblZzYkNsY2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ2FXWWdLR2RsZEVWdWRXMWxjbUZpYkdWTFpYbHpLR0VwTG14bGJtZDBhQ0FoUFQwZ1oyVjBSVzUxYldWeVlXSnNaVXRsZVhNb1lpa3ViR1Z1WjNSb0tWeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR1poYkhObE8xeHVJQ0FnSUNBZ0lDQm1iM0lnS0haaGNpQndjbTl3SUdsdUlHRXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doS0hCeWIzQWdhVzRnWWlrcFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdaaGJITmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0ZrWldWd1JYRjFZV3h6S0dGYmNISnZjRjBzSUdKYmNISnZjRjBwS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkSEoxWlR0Y2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlHRWdQVDA5SUdJN1hHNTlYRzUyWVhJZ1gyRTdYRzRpWFgwPSJdfQ==
// Welcome! require() some modules from npm (like you were using browserify)
// and then hit Run Code to run your code on the right side.
// Modules get downloaded from browserify-cdn and bundled in your browser.
const yo = require('yo-yo');
const {observable, autorun, computed} = require("mobx");
const appState = observable({
total: function() { console.log('TOT'); return sumChildren(this.sections) },
sections: [
{
name: 'section 1',
open: true,
values: function() { console.log('ZZ'); return sumChildren(this.categories) },
categories: [
{
name: 'category 1',
open: true,
values: function() { console.log('YY'); return sumChildren(this.extendeds) },
extendeds: [
{
name: 'extended 1',
values: [1,2,3,4,5,6,7,8,9,10,11,12]
},
{
name: 'extended 2',
values: [1,2,3,4,5,6,7,8,9,10,11,12]
},
{
name: 'extended 3',
values: [1,2,3,4,5,6,7,8,9,10,11,12]
},
]
}
]
},
{
name: 'section 2',
open: true,
values: function() { console.log('SEC'); return sumChildren(this.categories) },
categories: [
{
name: 'category 1',
open: true,
values: function() { console.log('CAT'); return sumChildren(this.extendeds) },
extendeds: [
{
name: 'extended 1',
values: [1,2,3,4,5,6,7,8,9,10,11,12]
},
{
name: 'extended 2',
values: [1,2,3,4,5,6,7,8,9,10,11,12]
},
{
name: 'extended 3',
values: [1,2,3,4,5,6,7,8,9,10,11,12]
},
]
}
]
},
]
});
const sumChildren = (children) =>
children
.map(node => node.values)
.reduce((vals1, vals2) =>
vals1.map((v,i) => (v || 0) + (vals2[i] || 0) ), [0,0,0,0,0,0,0,0,0,0,0,0]
)
const onClick = (node, ev) => {
//console.log(computed);
node.open = !node.open
ev.preventDefault()
ev.stopPropagation()
}
const makeRow = (node, klass) =>
yo`<ol>
${[1,2,3,4,5,6,7,8,9,10,11,12].map(month =>
yo`<li>
${klass === 'extended'
? yo`<input value="${node.values[month-1] || 0}" oninput=${ev => node.values[month-1] = parseFloat(ev.target.value) || 0}>`
: node.values[month-1] || 0
}
</li>`
)}
</ol>`
const makeNewChild = (parent, parentClass, e) => {
if(e) e.stopPropagation();
if(parentClass==='category') parent.extendeds.push({name: 'ext', values:Array(12)});
if(parentClass==='section') parent.categories.push({
name: 'cat',
open: true,
values:function() { console.log('CATN', this); return sumChildren(this.extendeds) },
extendeds: []
});
if(parentClass==='root') parent.sections.push({
name: 'sec',
open: true,
values: function() { console.log('ZZ'); return sumChildren(this.categories) },
categories: []
})
}
const renderTitle = () =>
yo`<div class='title'>
Budget Smuggler
</div>`
const renderMonths = () =>
yo`<div class='header'>
<div class='nav'>
<span class='name'>Months</span>
</div>
<div class='new'>
<button class='section' onclick=${makeNewChild.bind(null, appState, 'root')}>+</button>
</div>
<div class='months'>
${makeRow({values:['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']})}
</div>
</div>
`
const makeNode = (node, klass, children) =>
yo`<div class=${klass} onclick=${onClick.bind(null, node)}>
<div class='nav'>
<span class='name'>${node.name}</span>
</div>
<div class='new'>
<button class=${klass} onclick=${makeNewChild.bind(null, node, klass)}>+</button>
</div>
<div class='months'>
${makeRow(node, klass)}
</div>
<div class='children'>
${children || undefined}
</div>
</div>`
const renderTree = sections =>
yo`<div class='root'>
${sections.map(section =>
makeNode(section, 'section',
section.open && section.categories.map(category =>
makeNode(category, 'category',
category.open && category.extendeds && category.extendeds.map(extended =>
makeNode(extended, 'extended')
)
)
)
)
)}
</div>`
const inputComp = state =>
yo`<input value="${state.name}" oninput=${ev => state.name = ev.target.value}>`
const buttonComp = state =>
yo`<button onclick=${ev => state.age++}>Age up!</button>`;
const appComp = state => yo`<div>
<div class='budget'>
${renderTitle()}
${renderMonths()}
${renderTree(state.sections)}
${makeNode({name: 'Total', values: state.total}, 'section total')}
</div>
</div>`;
const ref = document.body.appendChild(document.createElement('div'));
const x = autorun(() => yo.update(ref, appComp(appState)));
//console.log('donex', x);
;}, 0)
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"yo-yo": "1.2.2",
"mobx": "2.4.0"
}
}
<!-- contents of this file will be placed inside the <body> -->
<!-- contents of this file will be placed inside the <head> -->
<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Open+Sans" />
<style>
body {
background-color: #f6704b;
}
.nav {
padding: 5px 0;
}
.title {
background-color: #8e44ad;
border-radius: 5px 5px 0 0;
text-align: center;
margin: -14px;
margin-bottom: 20px;
padding: 5px;
font-size: 24px;
height: 46px;
line-height: 46px;
}
.header {
color: rgba(255, 255, 255, 0.3);
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
margin-bottom: 10px;
}
.total .months {
border-top: 1px solid rgba(0, 0, 0, 0.1);
}
.budget {
padding: 14px;
margin: 50px auto;
width: 82%;
font-family: "Open Sans";
background-color: #354b60;
border-radius: 5px;
color: white;
box-shadow: 0 0 40px 5px rgba(0, 0, 0, .4);
}
button {
background-color: rgba(255, 255, 255, 0.3);
margin: 4px;
border-radius: 8px;
border: none;
height: 18px;
width: 20px;
}
li {
display: block;
}
.section {
margin-top: 8px;
--border: 1px solid red;
}
.category {
--border: 0px solid blue;
}
.extended {
--border: 0px solid grey;
}
.months ol {
display: flex;
margin: 0px
}
.months li {
padding: 4px 14px;
border: 1px solid transparent;
text-align: center;
padding: 4px 0;
width: 40px;
}
.nav {
display: inline-block;
width: 100px;
float: left;
}
.category .name {
margin-left: 7px;
}
.extended .name {
margin-left: 15px;
}
.extended input {
width: 100%;
height: 100%;
padding: 0;
border: none;
text-align: center;
font: inherit;
background-color: inherit;
color: inherit;
}
.new {
float: left;
}
button.extended, button.total {
visibility: hidden;
}
</style>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment